choosit: remove obsolete and unused newsletter connector (#20620)

This commit is contained in:
Frédéric Péters 2018-08-14 17:49:13 +02:00
parent 5bcfe8b690
commit ba53d3a9a5
10 changed files with 29 additions and 332 deletions

View File

@ -1,30 +0,0 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'passerelle.apps.choosit'
label = 'choosit'
def get_after_urls(self):
return None
def get_connector_model(self):
from . import models
return models.ChoositSMSGateway
default_app_config = 'passerelle.apps.choosit.AppConfig'

View File

@ -1,19 +0,0 @@
from django.contrib import admin
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

@ -1,71 +0,0 @@
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)
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

@ -1,14 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import ChoositRegisterGateway
class ChoositRegisterGatewayForm(forms.ModelForm):
class Meta:
model = ChoositRegisterGateway
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(ChoositRegisterGatewayForm, self).save(commit=commit)

View File

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.12 on 2018-08-14 15:48
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('choosit', '0006_auto_20170920_0951'),
]
operations = [
migrations.RemoveField(
model_name='choositregistergateway',
name='newsletters',
),
migrations.RemoveField(
model_name='choositregistergateway',
name='users',
),
migrations.DeleteModel(
name='ChoositRegisterGateway',
),
migrations.DeleteModel(
name='ChoositRegisterNewsletter',
),
]

View File

@ -4,14 +4,11 @@ import requests
from django.utils.translation import ugettext_lazy as _
from django.db import models
from django.core.urlresolvers import reverse
from passerelle.utils.jsonresponse import APIError
from passerelle.base.models import BaseResource
from passerelle.sms import SMSGatewayMixin
from .choosit import ChoositRegisterWS
class ChoositSMSGateway(BaseResource, SMSGatewayMixin):
key = models.CharField(verbose_name=_('Key'), max_length=64)
@ -113,86 +110,3 @@ class ChoositSMSGateway(BaseResource, SMSGatewayMixin):
raise APIError('Choosit error: some destinations failed',
data=zip(destinations, results))
return zip(destinations, results)
class ChoositRegisterNewsletter(models.Model):
name = models.CharField(max_length=16)
description = models.CharField(max_length=128, blank=True)
class Meta:
verbose_name = 'Choosit Registration'
db_table = 'newsletter_choosit'
def __unicode__(self):
return u'%s: %s' % (self.name, self.description or u'<unnamed>')
class ChoositRegisterGateway(BaseResource):
category = _('Newsletter registration')
url = models.CharField(max_length=200)
key = models.CharField(max_length=64)
newsletters = models.ManyToManyField(ChoositRegisterNewsletter, blank=True)
class Meta:
verbose_name = 'Choosit Registration'
db_table = 'registration_choosit'
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
def get_absolute_url(self):
return reverse('choosit-register-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('choosit-register-add')
def get_edit_url(self):
return reverse('choosit-register-edit', kwargs={'slug': self.slug})
def get_delete_url(self):
return reverse('choosit-register-delete', kwargs={'slug': self.slug})
def get_list(self, user):
reg = ChoositRegisterWS(self.url, self.key)
ws = reg.subscriptions(email=user or '')
if 'error' in ws:
raise APIError(ws['error'])
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 user:
if id in subscriptions:
newsletter['transports']['defined'] = ['mail']
else:
newsletter['transports']['defined'] = []
ret.append(newsletter)
return ret
def post(self, user, data):
subscriptions = [row['name'] for row in data if row['transports']]
reg = ChoositRegisterWS(self.url, self.key)
ws = reg.update(subscriptions, user)
return {"message": ws['status']}
def export_json(self):
raise NotImplementedError

View File

@ -1,22 +0,0 @@
{% extends "passerelle/manage/service_view.html" %}
{% load i18n passerelle %}
{% block description %}
<p>
Service URL : {{ object.url }}
</p>
{% endblock %}
{% block endpoints %}
<ul>
<li>{% trans 'Register:' %} <a href="{% url 'choosit-register' slug=object.slug %}"
>{{ site_base_uri }}{% url 'choosit-register' slug=object.slug %}</a> (POST)</li>
</ul>
{% endblock %}
{% block security %}
<p>
{% trans 'Accessing the listings is open, but posting requests is limited to the following API users:' %}
</p>
{% access_rights_table resource=object permission='can_post_request' %}
{% endblock %}

View File

@ -1,14 +0,0 @@
from django.conf.urls import url
from views import *
urlpatterns = [
url(r'^(?P<slug>[\w,-]+)/$', ChoositDetailView.as_view(), name='choosit-view'),
url(r'^register/(?P<slug>[\w,-]+)/$', ChoositRegisterDetailView.as_view(), name='choosit-register-view'),
url(r'^register/(?P<slug>[\w,-]+)/register$', ChoositRegisterView.as_view(), name='choosit-register'),
]
management_urlpatterns = [
url(r'^register/add$', ChoositRegisterCreateView.as_view(), name='choosit-register-add'),
url(r'^register/(?P<slug>[\w,-]+)/edit$', ChoositRegisterUpdateView.as_view(), name='choosit-register-edit'),
url(r'^register/(?P<slug>[\w,-]+)/delete$', ChoositRegisterDeleteView.as_view(), name='choosit-register-delete'),
]

View File

@ -1,67 +0,0 @@
import json
from django.core.urlresolvers import reverse
from django.views.generic.edit import CreateView, UpdateView, DeleteView, View
from django.views.generic.detail import SingleObjectMixin
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from passerelle.base.views import ResourceView
from passerelle import utils
from .models import ChoositSMSGateway, ChoositRegisterGateway
from .forms import ChoositRegisterGatewayForm
class ChoositDetailView(ResourceView):
model = ChoositSMSGateway
template_name = 'passerelle/manage/messages_service_view.html'
class ChoositRegisterDetailView(ResourceView):
model = ChoositRegisterGateway
template_name = 'choosit/choosit_register_detail.html'
class ChoositRegisterCreateView(CreateView):
model = ChoositRegisterGateway
template_name = 'passerelle/manage/service_form.html'
form_class = ChoositRegisterGatewayForm
class ChoositRegisterUpdateView(UpdateView):
model = ChoositRegisterGateway
template_name = 'passerelle/manage/service_form.html'
form_class = ChoositRegisterGatewayForm
class ChoositRegisterDeleteView(DeleteView):
model = ChoositRegisterGateway
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class ChoositRegisterView(View, SingleObjectMixin):
model = ChoositRegisterGateway
@method_decorator(csrf_exempt)
@utils.protected_api('can_post_request')
def dispatch(self, request, *args, **kwargs):
return super(ChoositRegisterView, self).dispatch(request, *args, **kwargs)
@utils.to_json()
@method_decorator(csrf_exempt)
def get(self, request, *args, **kwargs):
user = request.GET.get('user')
assert user, 'missing user parameter'
return {'data': self.get_object().get_list(user)}
@utils.to_json()
def post(self, request, *args, **kwargs):
user = request.GET.get('user')
assert user, 'missing user parameter'
data = json.loads(request.body)
assert isinstance(data, list), 'body must be a JSON list'
return {'data': self.get_object().post(user, data)}

View File

@ -15,7 +15,6 @@ from .urls_utils import decorated_includes, required, app_enabled, manager_requi
from .base.urls import access_urlpatterns
from .plugins import register_apps_urls
from passerelle.apps.choosit import urls as choosit_urls
from passerelle.apps.pastell import urls as pastell_urls
admin.autodiscover()
@ -36,14 +35,6 @@ urlpatterns = [
decorated_includes(manager_required, include(access_urlpatterns))),
]
urlpatterns += required(
app_enabled('choosit'), [
url(r'^choosit/', include(choosit_urls.urlpatterns)),
url(r'^manage/choosit/',
decorated_includes(manager_required, include(choosit_urls.management_urlpatterns))),
]
)
urlpatterns += required(
app_enabled('pastell'), [
url(r'^manage/pastell/',