You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

180 lines
8.4 KiB

# -*- coding: utf-8 -*-
import xlrd
from city.models import City
from ckeditor.widgets import CKEditorWidget
from country.models import Area, Country
from django import forms
from django.utils import translation
from django.utils.translation import ugettext_lazy as _
from emencia.django.newsletter.models import (
Attachment,
Contact,
ContactSettings,
MailingList,
Newsletter
)
from theme.models import Theme
class ContactSettingsForm(forms.ModelForm):
city = forms.CharField(label=_(u'Город'), widget=forms.HiddenInput() ,required=False)
periodic = forms.ChoiceField(choices=ContactSettings.PERIODIC_CHOICES,
label=_(u'Периодичность отправки'))
first_name = forms.CharField(label=_('first name'))
subscriber = forms.BooleanField(label=_('subscriber'), required=False)
valid = forms.BooleanField(label=_('valid email'), required=False)
tester = forms.BooleanField(label=_('contact tester'), required=False)
country = forms.MultipleChoiceField(choices=[(c.id,c.name) for c in list(set(Country.objects.language().all()))], required=False)
area = forms.MultipleChoiceField(choices=[(a.id, a.name) for a in list(set(Area.objects.language().all()))], required=False)
def __init__(self, *args, **kwargs):
super(ContactSettingsForm, self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if instance:
lang = translation.get_language()
self.fields['city'].widget.attrs['data-init-text'] = [(item.id, item.name) for item in list(instance.city.filter(translations__language_code=lang))]
class Meta:
model = ContactSettings
fields = ('periodic', 'exponent_practicum', 'organiser_practicum', 'theme', 'area', 'country', 'city', )
def save(self, commit=True):
contactsettings = super(ContactSettingsForm, self).save(commit=False)
old_save_m2m = self.save_m2m
if commit:
contactsettings.save()
contact = contactsettings.contact
contact.first_name = self.cleaned_data['first_name']
contact.subscriber = self.cleaned_data['subscriber']
contact.valid = self.cleaned_data['valid']
contact.tester = self.cleaned_data['tester']
contact.save()
return contactsettings
def clean_periodic(self):
return int(self.cleaned_data['periodic'])
def clean_city(self):
cities = self.cleaned_data.get('city')
if cities:
res = []
for id in cities.split(','):
try:
res.append(int(id))
except ValueError:
continue
return City.objects.filter(id__in=res)
else:
return City.objects.none()
class MailingListForm(forms.ModelForm):
theme_choices = [(item.id, item.name) for item in Theme.objects.language().all()]
excel_file = forms.FileField(label=_(u'Импортировать подписчиков'), required=False)
add_from_themes = forms.MultipleChoiceField(label=_(u'Добавить подписчиков по тематикам'), required=False,
choices=theme_choices)
theme_for_filter = forms.MultipleChoiceField(label=_(u'Тематики'), required=False,
choices=theme_choices)
class Meta:
model = MailingList
fields = ('name', 'description', 'theme_for_filter')
def save(self, commit=True):
ml = super(MailingListForm, self).save(commit=True)
# data = self.cleaned_data
# f = data['excel_file']
# if f:
# # contact_list = list(Contact.objects.all())
# book = xlrd.open_workbook(file_contents=f.read())
# sheet = book.sheet_by_index(0)
# excel_emails = {sheet.row_values(row_number)[0]: sheet.row_values(row_number)[1] for row_number in range(1, sheet.nrows)}
# valid_contacts = []
# # for contact in contact_list:
# # if contact.email in excel_emails:
# # valid_contacts.append(contact)
# for email, first_name in excel_emails.iteritems():
# valid_contacts.append(Contact.objects.create(
# email=email, first_name=first_name,
# valid=True, activated=True))
# ml.subscribers = valid_contacts
# ml.save()
return ml
def get_contact_list(self, qs):
excel_file = self.cleaned_data['excel_file']
contact_items = dict(qs.values_list('email', 'pk'))
if excel_file:
book = xlrd.open_workbook(file_contents=excel_file.read())
sheet = book.sheet_by_index(0)
for i in range(1, sheet.nrows):
email = sheet.row_values(i)[0]
first_name = sheet.row_values(i)[1]
exponent_practicum = sheet.row_values(i)[2]
organiser_practicum = sheet.row_values(i)[3]
if email not in contact_items:
try:
c = Contact.objects.get(email=email)
c.contactsettings.exponent_practicum = exponent_practicum
c.contactsettings.organiser_practicum = organiser_practicum
c.contactsettings.save()
except Contact.DoesNotExist:
c = Contact.objects.create(email=email, first_name=first_name, activated=True)
cs = ContactSettings(
contact=c,
exponent_practicum=exponent_practicum,
organiser_practicum=organiser_practicum,
)
cs.save()
contact_items[email] = c.pk
ids = set(contact_items.values())
if self.cleaned_data['add_from_themes']:
ct_from_themes = Contact.objects\
.filter(
contactsettings__theme__in=self.cleaned_data['add_from_themes']
).distinct().values_list('pk', flat=True)
ids.update(ct_from_themes)
return ids
class NewsletterForm(forms.ModelForm):
test_contacts = forms.ModelMultipleChoiceField(label=_(u'Тестовые контакты'), required=False,
queryset=Contact.objects.filter(tester=True))
content = forms.CharField(label=_('content'), widget=CKEditorWidget(config_name='newsletters'))
content2 = forms.CharField(label=_('Content B'), widget=CKEditorWidget(config_name='newsletters'), required=False)
class Meta:
model = Newsletter
fields = ('preheader', 'title', 'content', 'ab_testing', 'ab_first_stage', 'title2', 'content2', 'mailing_list', 'theme_for_filter', 'test_contacts', 'header_sender',
'header_reply', 'status', 'sending_date', 'slug')
widgets = {
'ab_first_stage': forms.widgets.TextInput(attrs={'type':'number', 'min': 5, 'max': 100}),
}
def __init__(self, *args, **kwargs):
super(NewsletterForm, self).__init__(*args, **kwargs)
# добавляем поле для возможности указания варианта финальной рассылки (А-В тестирование)
if self.instance.pk and self.instance.ab_testing and self.instance.ab_final_stage:
self._meta.fields = (
'preheader', 'title', 'content', 'ab_testing',
'ab_first_stage', 'title2', 'content2', 'mailing_list',
'theme_for_filter', 'test_contacts', 'header_sender',
'header_reply', 'ab_final_choice', 'status', 'sending_date',
'slug')
field = forms.ChoiceField(
label=_(u'Вариант в финальную рассылку'),
choices=Newsletter.AB_FINAL_CHOICE,
initial=self.instance.ab_final_choice or Newsletter.A)
self.fields.insert(self.fields.keyOrder.index('status'), 'ab_final_choice', field)
if self.instance and self.instance.mailing_list_id:
self.fields['theme_for_filter'].queryset = self.instance.mailing_list.theme_for_filter.all()
self.initial['ab_first_stage'] = self.initial.get('ab_first_stage') or 10
class AttachmentForm(forms.ModelForm):
class Meta:
model = Attachment
fields = ('title', 'file_attachment')