0001-newsletters-newsletter-subscription-cell-12911.patch
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 |
- |