Projet

Général

Profil

0001-newsletters-newsletter-subscription-cell-12911.patch

Serghei Mihai (congés, retour 15/05), 14 septembre 2016 16:40

Télécharger (14,9 ko)

Voir les différences:

Subject: [PATCH] newsletters: newsletter subscription cell (#12911)

 combo/apps/newsletters/forms.py                    |   9 +-
 .../migrations/0002_newslettersubscriptioncell.py  |  37 ++++++
 combo/apps/newsletters/models.py                   | 143 +++++++++++++--------
 .../newsletters/newsletter_subscription.html       |  18 +++
 combo/apps/newsletters/urls.py                     |   4 +-
 combo/apps/newsletters/views.py                    |  35 ++++-
 6 files changed, 185 insertions(+), 61 deletions(-)
 create mode 100644 combo/apps/newsletters/migrations/0002_newslettersubscriptioncell.py
 create mode 100644 combo/apps/newsletters/templates/newsletters/newsletter_subscription.html
combo/apps/newsletters/forms.py
25 25
        logger = logging.getLogger(__name__)
26 26
        self.user = kwargs.pop('user')
27 27
        self.instance = kwargs.pop('instance')
28
        self.include_labels = None
29
        if 'include_labels' in kwargs:
30
            self.include_labels = kwargs.pop('include_labels')
28 31
        self.themes = set()
29 32
        super(NewslettersManageForm, self).__init__(*args, **kwargs)
30 33

  
......
55 58
                if not self.instance.check_transport(transport['id']):
56 59
                    continue
57 60
                self.themes.add((transport['id'], transport['text']))
58
                choices.append((transport['id'], ''))
61
                if self.include_labels:
62
                    label = newsletter['text']
63
                else:
64
                    label = ''
65
                choices.append((transport['id'], label))
59 66
                if transport in newsletter['transports']:
60 67
                    for subscription in subscriptions:
61 68
                        if subscription['id'] == newsletter['id']:
combo/apps/newsletters/migrations/0002_newslettersubscriptioncell.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import models, migrations
5
import combo.apps.newsletters.models
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('auth', '0001_initial'),
12
        ('data', '0019_create_parent_cells'),
13
        ('newsletters', '0001_initial'),
14
    ]
15

  
16
    operations = [
17
        migrations.CreateModel(
18
            name='NewsletterSubscriptionCell',
19
            fields=[
20
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
21
                ('placeholder', models.CharField(max_length=20)),
22
                ('order', models.PositiveIntegerField()),
23
                ('slug', models.SlugField(verbose_name='Slug', blank=True)),
24
                ('public', models.BooleanField(default=True, verbose_name='Public')),
25
                ('restricted_to_unlogged', models.BooleanField(default=False, verbose_name='Restrict to unlogged users')),
26
                ('title', models.CharField(max_length=128, verbose_name='Title')),
27
                ('url', models.URLField(max_length=128, verbose_name='Newsletters service url')),
28
                ('newsletter', models.CharField(max_length=128, verbose_name='Newsletter')),
29
                ('groups', models.ManyToManyField(to='auth.Group', verbose_name='Groups', blank=True)),
30
                ('page', models.ForeignKey(to='data.Page')),
31
            ],
32
            options={
33
                'verbose_name': 'Newsletter subscription',
34
            },
35
            bases=(combo.apps.newsletters.models.NewslettersMixin, models.Model),
36
        ),
37
    ]
combo/apps/newsletters/models.py
58 58
    pass
59 59

  
60 60

  
61
@register_cell_class
62
class NewslettersCell(CellBase):
63
    title = models.CharField(verbose_name=_('Title'), max_length=128)
64
    url = models.URLField(verbose_name=_('Newsletters service url'),
65
                                     max_length=128)
66
    resources_restrictions = models.CharField(_('resources restrictions'),
67
                                              blank=True, max_length=1024,
68
                                              help_text=_('list of resources(themes) separated by commas'))
69
    transports_restrictions = models.CharField(_('transports restrictions'),
70
                                               blank=True, max_length=1024,
71
                                               help_text=_('list of transports separated by commas'))
61
class NewslettersMixin(object):
72 62

  
73
    template_name = 'newsletters/newsletters.html'
74 63
    user_dependant = True
75 64

  
76 65
    @classmethod
77 66
    def is_enabled(cls):
78 67
        return True
79 68

  
80
    class Meta:
81
        verbose_name = _('Newsletters')
82

  
83
    def get_default_form_class(self):
84
        model_fields = ('title', 'url', 'resources_restrictions',
85
                        'transports_restrictions')
86
        return model_forms.modelform_factory(self.__class__, fields=model_fields)
87

  
88

  
89
    def simplify(self, name):
90
        return slugify(name.strip())
91

  
92
    def get_resources_restrictions(self):
93
        return filter(None, map(self.simplify, self.resources_restrictions.strip().split(',')))
69
    def is_relevant(self, context):
70
        return bool(context.get('user').is_authenticated())
94 71

  
95
    def get_transports_restrictions(self):
96
        return filter(None, map(self.simplify, self.transports_restrictions.strip().split(',')))
72
    def get_newsletters(self, **kwargs):
73
        endpoint = self.url + 'newsletters/'
74
        url = get_signed_url(endpoint, self.url, **kwargs)
75
        response = requests.get(url, verify=False)
76
        if response.ok:
77
            json_response = response.json()
78
            return self.filter_data(json_response['data'])
79
        return []
97 80

  
98 81
    def check_resource(self, resource):
99 82
        restrictions = self.get_resources_restrictions()
......
107 90
            return True
108 91
        return False
109 92

  
110
    def filter_data(self, data):
111
        filtered = []
112
        for item in data:
113
            if not self.check_resource(item['text']):
114
                continue
115
            if not self.transports_restrictions:
116
                filtered.append(item)
117
            for t in item['transports']:
118
                if self.check_transport(t['id']):
119
                    filtered.append(item)
120
        return filtered
121

  
122
    def get_newsletters(self, **kwargs):
123
        endpoint = self.url + 'newsletters/'
124
        url = get_signed_url(endpoint, self.url, **kwargs)
125
        response = requests.get(url)
126
        if response.ok:
127
            json_response = response.json()
128
            return self.filter_data(json_response['data'])
129
        return []
130

  
131 93
    def get_subscriptions(self, **kwargs):
132 94
        endpoint = self.url + 'subscriptions/'
133 95
        url = get_signed_url(endpoint, self.url, **kwargs)
......
137 99
            return self.filter_data(json_response['data'])
138 100
        return []
139 101

  
102
    def simplify(self, name):
103
        return slugify(name.strip())
104

  
140 105
    def set_subscriptions(self, subscriptions, **kwargs):
141 106
        logger = logging.getLogger(__name__)
142 107
        headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
......
161 126
        if user.is_authenticated():
162 127
            form = NewslettersManageForm(instance=self, user=user)
163 128
            context['form'] = form
164
        return super(NewslettersCell, self).render(context)
129
        return super(NewslettersMixin, self).render(context)
165 130

  
166
    def is_relevant(self, context):
167
        return bool(context.get('user').is_authenticated())
131

  
132
@register_cell_class
133
class NewslettersCell(NewslettersMixin, CellBase):
134
    title = models.CharField(verbose_name=_('Title'), max_length=128)
135
    url = models.URLField(verbose_name=_('Newsletters service url'),
136
                                     max_length=128)
137
    resources_restrictions = models.CharField(_('resources restrictions'),
138
                                              blank=True, max_length=1024,
139
                                              help_text=_('list of resources(themes) separated by commas'))
140
    transports_restrictions = models.CharField(_('transports restrictions'),
141
                                               blank=True, max_length=1024,
142
                                               help_text=_('list of transports separated by commas'))
143

  
144
    template_name = 'newsletters/newsletters.html'
145

  
146
    class Meta:
147
        verbose_name = _('Newsletters')
148

  
149
    def get_default_form_class(self):
150
        model_fields = ('title', 'url', 'resources_restrictions',
151
                        'transports_restrictions')
152
        return model_forms.modelform_factory(self.__class__, fields=model_fields)
153

  
154
    def get_resources_restrictions(self):
155
        return filter(None, map(self.simplify, self.resources_restrictions.strip().split(',')))
156

  
157
    def get_transports_restrictions(self):
158
        return filter(None, map(self.simplify, self.transports_restrictions.strip().split(',')))
159

  
160
    def filter_data(self, data):
161
        filtered = []
162
        for item in data:
163
            if not self.check_resource(item['text']):
164
                continue
165
            if not self.transports_restrictions:
166
                filtered.append(item)
167
            for t in item['transports']:
168
                if self.check_transport(t['id']):
169
                    filtered.append(item)
170
        return filtered
171

  
172

  
173
@register_cell_class
174
class NewsletterSubscriptionCell(NewslettersMixin, CellBase):
175
    title = models.CharField(verbose_name=_('Title'), max_length=128)
176
    url = models.URLField(verbose_name=_('Newsletters service url'),
177
                                     max_length=128)
178
    newsletter = models.CharField(_('Newsletter'), max_length=128)
179

  
180
    template_name = 'newsletters/newsletter_subscription.html'
181

  
182
    class Meta:
183
        verbose_name = _('Newsletter subscription')
184

  
185
    def filter_data(self, data):
186
        return [i for i in data if i['text'] == self.newsletter]
187

  
188
    def get_resources_restrictions(self):
189
        return [self.simplify(self.newsletter)]
190

  
191
    def get_transports_restrictions(self):
192
        return ['mailto']
193

  
194
    def set_subscription(self, subscription, **kwargs):
195
        pass
196

  
197
    def get_default_form_class(self):
198
        model_fields = ('title', 'url', 'newsletter')
199
        return model_forms.modelform_factory(self.__class__, fields=model_fields)
200

  
201
    def render(self, context):
202
        user = context.get('user')
203
        if user.is_authenticated():
204
            form = NewslettersManageForm(instance=self, user=user, include_labels=True)
205
            context['form'] = form
206
        return super(NewslettersMixin, self).render(context)
combo/apps/newsletters/templates/newsletters/newsletter_subscription.html
1
{% load i18n %}
2

  
3
<h2>{{ cell.title }}</h2>
4
{% if form %}
5
{% if form.non_field_errors %}
6
{{ form.non_field_errors }}
7
{% else %}
8
<form method="post" action={% url 'newsletter-subscription-update' pk=cell.pk %}>
9
  {% csrf_token %}
10
  {% for field in form %}
11
  {% for w in field %}
12
  {{ w }}
13
  {% endfor %}
14
  {% endfor %}
15
  <input type="submit" value="{% trans "Send" %}"/>
16
</form>
17
{% endif %}
18
{% endif %}
combo/apps/newsletters/urls.py
1 1
from django.contrib.auth.decorators import login_required
2 2
from django.conf.urls import patterns, url
3 3

  
4
from .views import NewslettersView
4
from .views import NewslettersView, NewsletterSubscriptionView
5 5

  
6 6
urlpatterns = patterns('',
7 7
    url('^newsletters/(?P<pk>\w+)/update$', login_required(NewslettersView.as_view()),
8 8
        name='newsletters-update'),
9
    url('^subscription/(?P<pk>\w+)/update$', login_required(NewsletterSubscriptionView.as_view()),
10
        name='newsletter-subscription-update'),
9 11
)
combo/apps/newsletters/views.py
20 20
from django.http import HttpResponseRedirect
21 21

  
22 22
from .forms import NewslettersManageForm
23
from .models import NewslettersCell, SubscriptionsSaveError
23
from .models import NewslettersCell, NewsletterSubscriptionCell, SubscriptionsSaveError
24 24

  
25
class NewslettersView(FormView):
25

  
26
class NewslettersMixin(object):
26 27
    http_method_names = ['post']
27 28
    form_class = NewslettersManageForm
28 29

  
30
    def get_success_url(self):
31
        return self.instance.page.get_online_url()
32

  
33
    def form_invalid(self, form):
34
        messages.error(self.request, _('An error occured while saving your subscriptions. Please try later.'))
35
        return HttpResponseRedirect(self.get_success_url())
36

  
37

  
38
class NewslettersView(NewslettersMixin, FormView):
39

  
29 40
    def form_valid(self, form):
30 41
        try:
31 42
            form.save()
......
40 51
        kwargs.update({'user': self.request.user, 'instance': self.instance})
41 52
        return kwargs
42 53

  
43
    def form_invalid(self, form):
44
        messages.error(self.request, _('An error occured while saving your subscriptions. Please try later.'))
45
        return HttpResponseRedirect(self.get_success_url())
46 54

  
47
    def get_success_url(self):
48
        return self.instance.page.get_online_url()
55
class NewsletterSubscriptionView(NewslettersMixin, FormView):
56

  
57
    def form_valid(self, form):
58
        try:
59
            form.save()
60
            messages.info(self.request, _('Your subscription is successfully saved'))
61
        except SubscriptionsSaveError:
62
            messages.error(self.request, _('An error occured while saving your subscription. Please try later.'))
63
        return super(NewsletterSubscriptionView, self).form_valid(form)
64

  
65
    def get_form_kwargs(self):
66
        kwargs = super(NewsletterSubscriptionView, self).get_form_kwargs()
67
        self.instance = NewsletterSubscriptionCell.objects.get(pk=self.kwargs['pk'])
68
        kwargs.update({'user': self.request.user, 'instance': self.instance})
69
        return kwargs
49
-