настройка и подписка рассылки

remotes/origin/HEAD
Slava Kyrachevsky 9 years ago
parent 2a3079dbd8
commit 50f25bf381
  1. 14
      apps/emencia/django/newsletter/forms.py
  2. 6
      apps/emencia/django/newsletter/models.py
  3. 13
      apps/emencia/django/newsletter/views/expo_views.py
  4. 6
      static/mailing_settings/css/main.css
  5. 63
      static/mailing_settings/js/main.js
  6. 4
      templates/c_admin/newsletters/contact_list.html
  7. 10
      templates/client/newsletters/mailing_settings.html

@ -81,6 +81,11 @@ class MailingListSubscriptionForm(forms.ModelForm):
class MailingSettingsForm(forms.ModelForm):
email = forms.EmailField(
error_messages={
'required': _(u'Поле e-mail обязательно для заполнения')
}
)
r_cities = ML_ModelMultipleChoiceField(
label=_(u'Города России'), required=False,
queryset=City.objects.all())
@ -186,6 +191,15 @@ class MailingSettingsForm(forms.ModelForm):
obj.save()
return obj
def clean(self):
cleaned_data = super(MailingSettingsForm, self).clean()
if not cleaned_data.get('tg') and not cleaned_data.get('th'):
raise forms.ValidationError(_(u'Необходимо выбрать тему или тег'))
if not cleaned_data.get('moscow') or not cleaned_data.get('russia'):
raise forms.ValidationError(_(u'Необходимо выбрать минимум '
u'1 вариант в гео-фильтрах'))
return cleaned_data
class AllMailingListSubscriptionForm(MailingListSubscriptionForm):
"""Form for subscribing to all mailing list"""

@ -157,10 +157,10 @@ class Contact(models.Model):
from_users = models.BooleanField(default=False)
dailymailing = models.BooleanField(default=False)
moscow = models.BooleanField(_(u'Москва'), blank=True, default=True)
russia = models.BooleanField(_(u'Россия'), blank=True, default=True)
moscow = models.BooleanField(_(u'Москва'), blank=True, default=False)
russia = models.BooleanField(_(u'Россия'), blank=True, default=False)
r_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=_(u'Города России'))
foreign = models.BooleanField(_(u'Зарубеж'), blank=True, default=True)
foreign = models.BooleanField(_(u'Зарубеж'), blank=True, default=False)
f_countries = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=_(u'Зарубежные страны'))
area = models.ManyToManyField('country.Area', blank=True, null=True, verbose_name=_(u'Географическая зона'))
periodic = models.PositiveSmallIntegerField(_(u'Периодичность отправки'),

@ -36,12 +36,16 @@ class SubscribeView(GetUserMixin, FormView):
return super(SubscribeView, self).post(request, *args, **kwargs)
def form_valid(self, form):
contact = form.save()
if not self.request.user.is_authenticated():
contact.send_activation()
if self.request.GET.get('save'):
contact = form.save()
if not self.request.user.is_authenticated():
contact.send_activation()
if self.request.is_ajax():
data = {'success': True}
data = {
'success': True,
'redirect_url': str(self.get_success_url())
}
return JsonResponse(data)
return redirect(self.get_success_url())
@ -50,7 +54,6 @@ class SubscribeView(GetUserMixin, FormView):
if self.request.is_ajax():
data = {
'form_errors': form.errors,
'form_non_fields_errors': form.non_field_errors(),
}
return JsonResponse(data, status=400)
return self.render_to_response(self.get_context_data(form=form))

@ -868,7 +868,7 @@ a.themes_trigger{
color: #bd2626;
padding-bottom: 3px;
}
.pr-input.field_error input{
.pr-input input.field_error{
box-shadow: 0 0 0 2px #f00;
}
.pr-input:first-child{
@ -941,3 +941,7 @@ a.themes_trigger{
-o-transition: all 100ms linear;
transition: all 100ms linear;
}
.error_messages .errorlist{
list-style: decimal inside;
}

@ -1,25 +1,52 @@
'use strict';
function sendForm () {
var $form = $('#mailing_settings_form');
function sendForm (show_modal) {
var show_modal = show_modal || false,
$form = $('#mailing_settings_form');
$form.find('.field_error').removeClass('field_error');
$form.find('.text_error').remove();
var form_data = $form.serializeArray();
if (show_modal) {
form_data.push({
name: 'save',
value: true
})
}
$.ajax({
url: $form.attr('action'),
type: $form.attr('method'),
data: $form.serializeArray(),
// success: function(response){
// console.log(response);
// },
data: form_data,
success: function(response){
console.log(response);
if (response.hasOwnProperty('redirect_url')){
window.location.pathname = response.redirect_url;
}
},
error: function (error) {
var form_errors = error.responseJSON.form_errors;
$.each(form_errors, function (field, err) {
var $field = $form.find('#id_' + field);
$field.addClass('field_error');
$field.parent('.pr-input').prepend('<span class="text_error">' + err + '</span>');
})
if (show_modal){
var $error_list = $('<ol></ol>', {class: 'errorlist'});
$.each(form_errors, function (field, err) {
$error_list.append('<li>' + err + '</li>');
});
$('#error_messages').html($error_list);
$.fancybox.open({
href: '#error_modal'
})
} else {
$.each(form_errors, function (field, err) {
var $field = $form.find('#id_' + field);
$field.addClass('field_error');
$field.parent('.pr-input').prepend('<span class="text_error">' + err + '</span>');
});
}
}
});
}
@ -135,7 +162,6 @@ function sendForm () {
});
}
function isAllTagsChecked (theme_id) {
return themes_data[theme_id].tags.every(function (obj) {
return obj.checked;
@ -373,6 +399,13 @@ function sendForm () {
$themes_modal.on('click', '.modal-approve', function () {
var $selected = $selected_themes.find('li').removeClass('unsaved').clone();
if ($('#pr-promo').length){
if (!$('#id_moscow').is(':checked') && !$('#id_russia').is(':checked') && $selected_themes.children().length && !$('#selected_themes').children().length){
$('#id_moscow').prop('checked', true);
$('#id_russia').prop('checked', true);
}
}
$('#selected_themes').html($selected);
sendForm();
@ -383,6 +416,12 @@ function sendForm () {
$selected_themes.find('a').trigger('click');
});
$('#mailing_settings_form button').on('click', function (event) {
event.preventDefault();
var show_modal = true;
sendForm(show_modal);
});
})();

@ -152,8 +152,8 @@
<div class="controls">
<button id="submit" class="btn btn-primary">Фильтровать</button>
<a href="{% url 'export_contacts' %}" id="export" class="btn yellow">Экспорт<i class="icon-circle-arrow-down"></i></a>
<a href="{% url 'newsletters_mailinglist_create_filter' %}" id="mailinglist" class="btn btn-success" data-toggle="tooltip" data-placement="top" title="Создает новый список рассылки с отфильтрованими контактами"><i class="icon-plus"></i>Создать список рассылки из фильтра</i></a>
<a href="{% url 'newsletters_mailinglist_create' %}" class="btn btn-success" data-toggle="tooltip" data-placement="top" title="Создает новый список рассылки"><i class="icon-plus"></i>Создать список рассылки</i></a>
<a href="{% url 'newsletters_mailinglist_create_filter' %}" id="mailinglist" class="btn btn-success" data-toggle="tooltip" data-placement="top" title="Создает новый список рассылки с отфильтрованими контактами"><i class="icon-plus"></i>Создать список рассылки из фильтра</a>
<a href="{% url 'newsletters_mailinglist_create' %}" class="btn btn-success" data-toggle="tooltip" data-placement="top" title="Создает новый список рассылки"><i class="icon-plus"></i>Создать список рассылки</a>
</div>
</div>
</div>

@ -236,6 +236,16 @@
{% include 'client/popups/unsubscribed.html' %}
</div>
{% endif %}
<div id="error_modal">
<div class="popup-window">
<header>
<div class="title">{% trans 'Ошибка' %}</div>
</header>
<div class="body error_messages" id="error_messages"></div>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/2.1.4/jquery.fancybox.pack.min.js" defer></script>

Loading…
Cancel
Save