# -*- 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')