diff --git a/emencia/django/newsletter/admin_urls.py b/emencia/django/newsletter/admin_urls.py index aafff25d..eeaa6f2b 100644 --- a/emencia/django/newsletter/admin_urls.py +++ b/emencia/django/newsletter/admin_urls.py @@ -1,9 +1,8 @@ from django.conf.urls import url -from django.conf.urls import include from django.conf.urls import patterns -from django.http import HttpResponse from emencia.django.newsletter.views.admin_views import ContactList, UpdateContact, MailingListView, UpdateMailingList,\ - CreateMailingList, NewsletterListView, NewsletterCreate, ExportContacts, DeleteContact, NewsletterUpdate + CreateMailingList, NewsletterListView, NewsletterCreate, ExportContacts, DeleteContact, NewsletterUpdate, \ + DeleteMailingList, ImportContacts urlpatterns = patterns('', @@ -17,10 +16,12 @@ urlpatterns = patterns('', url(r'^mailinglist/all/$', MailingListView.as_view(), name='newsletters_mailinglist'), url(r'^mailinglist/(?P\d+)/edit/', UpdateMailingList.as_view(), name='newsletters_mailinglist_update'), + url(r'^mailinglist/(?P\d+)/', DeleteMailingList.as_view(), name='newsletters_mailinglist_delete'), url(r'^mailinglist/', CreateMailingList.as_view(), name='newsletters_mailinglist_create'), url(r'^contact/(?P\d+)/edit/', UpdateContact.as_view(), name='newsletters_contact_update'), url(r'^contact/(?P\d+)/delete/', DeleteContact.as_view(), name='newsletters_contact_delete'), url(r'^contact/all/$', ContactList.as_view(), name='newsletters_contact_list'), url(r'^contact/export/$', ExportContacts.as_view(), name='export_contacts'), + url(r'^contact/import/$', ImportContacts.as_view(), name='import_newsletters_contacts'), ) \ No newline at end of file diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index b6107dd2..3df5c24a 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -87,28 +87,56 @@ class ContactSettingsForm(forms.ModelForm): class ContactFilterForm(forms.Form): - email = forms.EmailField(label="Email", max_length=255, required=False, - widget=forms.TextInput(attrs={'class':'input-xlarge search-query','placeholder':'Email'})) - theme = forms.MultipleChoiceField(label="Тематика", choices = [(t.id, t.name) for t in Theme.objects.language()]) - country = forms.MultipleChoiceField(label="Страна", - choices = [(c.id, c.name) for c in list(set(Country.objects.language('ru').all()))], - required=False) - area = forms.MultipleChoiceField(label="Area", choices = [(c.id, c.name) for c in list(set(Area.objects.language()))], - required=False) + email = forms.EmailField( + label="Email", + max_length=255, + required=False, + widget=forms.TextInput(attrs={'class':'input-xlarge search-query','placeholder': 'Email'}) + ) + theme = forms.MultipleChoiceField( + label="Тематика", + choices=[(t.id, t.name) for t in Theme.objects.language()], + required=False + ) + country = forms.MultipleChoiceField( + label="Страна", + choices=[(c.id, c.name) for c in list(set(Country.objects.language('ru').all()))], + required=False + ) + city = forms.MultipleChoiceField( + label="Город", + choices=[(c.id, c.name) for c in list(set(City.objects.language('ru').filter(contactsettings__isnull=False)))], + required=False + ) + area = forms.MultipleChoiceField( + label="Area", choices=[(c.id, c.name) for c in list(set(Area.objects.language()))], + required=False + ) + mailinglist = forms.ChoiceField( + choices=[(ml.id, ml.name) for ml in MailingList.objects.all()], + label="Список рассылки", + required=False + ) active = forms.BooleanField(label="Подтверждена подписка", required=False) valid = forms.BooleanField(label="Валидный Email", required=False) def filter(self): title = 'contact list ' qs = Contact.objects.all() + if self.cleaned_data.get('mailinglist'): + qs = qs.filter(mailinglist_subscriber__id=self.cleaned_data['mailinglist']) + title += " mailinglist: %s" % MailingList.objects.get(id=self.cleaned_data['mailinglist']).name + if self.cleaned_data.get('country'): + qs = qs.filter(contactsettings__country__id__in=self.cleaned_data['country']) + title += " countries: %s" % ','.join([obj.url for obj in Country.objects.language().filter(id__in=self.cleaned_data['country'])]) if self.cleaned_data.get('email'): qs = qs.filter(email__icontains=self.cleaned_data['email']) if self.cleaned_data.get('theme'): qs = qs.filter(contactsettings__theme__id__in=self.cleaned_data['theme']) title += " themes: %s" % ','.join([obj.url for obj in Theme.objects.language().filter(id__in=self.cleaned_data['theme'])]) - if self.cleaned_data.get('country'): - qs = qs.filter(contactsettings__country__id__in=self.cleaned_data['country']) - title += " countries: %s" % ','.join([obj.url for obj in Country.objects.language().filter(id__in=self.cleaned_data['country'])]) + if self.cleaned_data.get('city'): + qs = qs.filter(contactsettings__city__id__in=self.cleaned_data['city']) + title += " cities: %s" % ','.join([obj.url for obj in Country.objects.language().filter(id__in=self.cleaned_data['country'])]) if self.cleaned_data.get('area'): qs = qs.filter(contactsettings__area__id__in=self.cleaned_data['area']) title += " geo area: %s" % ','.join([tr(obj.name) for obj in Area.objects.language('en').filter(id__in=self.cleaned_data['area'])]) @@ -122,6 +150,36 @@ class ContactFilterForm(forms.Form): return qs, title +import xlrd +COUNTRY_CHOICES = [(c.id, c.name) for c in list(set(Country.objects.language('ru').all()))] +COUNTRY_CHOICES.insert(0, ('', 'Страна')) + + +class ContactImportForm(forms.Form): + excel_file = forms.FileField(label='Выберите файл') + activated = forms.BooleanField(label="Активные", required=False) + is_tester = forms.BooleanField(label="Тестовые", required=False) + country = forms.ChoiceField(label="Страна", choices=COUNTRY_CHOICES, required=False) + + def save(self): + data = self.cleaned_data + country_id = self.cleaned_data.get('country') + country = None + if country_id: + country = Country.objects.get(id=country_id) + activated = data['activated'] + is_tester = data['is_tester'] + f = data['excel_file'] + book = xlrd.open_workbook(file_contents=f.read()) + sheet = book.sheet_by_index(0) + row_list = [sheet.row_values(row_number) for row_number in range(1,sheet.nrows)] + contact_list = [] + for row in row_list: + contact_list.append(Contact(first_name=row[0], email=row[1], activated=activated, tester=is_tester)) + Contact.objects.bulk_create(contact_list) + Contact.objects.filter(first_name__in=[c[0] for c in contact_list]).update(contactsettings__country=country) + + class AbstractSubscribeForm(forms.ModelForm): email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Email'})) diff --git a/emencia/django/newsletter/views/admin_views.py b/emencia/django/newsletter/views/admin_views.py index a125f80d..1caf153c 100644 --- a/emencia/django/newsletter/views/admin_views.py +++ b/emencia/django/newsletter/views/admin_views.py @@ -11,7 +11,7 @@ from HTMLParser import HTMLParseError from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm, AttachmentForm from emencia.django.newsletter.mailer import Mailer -from ..forms import ContactFilterForm +from ..forms import ContactFilterForm, ContactImportForm from ..utils.excel import ExcelResponse from functions.admin_views import paginate_results @@ -93,6 +93,12 @@ class MailingListView(ListView): template_name = 'admin/newsletters/mailing_list.html' +class DeleteMailingList(DeleteView): + model = MailingList + template_name = 'admin/newsletters/confirm_delete.html' + success_url = reverse_lazy('newsletters_mailinglist') + + class UpdateMailingList(UpdateView): model = MailingList form_class = MailingListForm @@ -106,6 +112,15 @@ class CreateMailingList(CreateView): template_name = 'admin/newsletters/mailing_list_object.html' success_url = '/admin/newsletters/mailinglist/all/' + def form_valid(self, form): + obj = form.save() + form = ContactFilterForm(self.request.GET) + if form.is_valid(): + contacts, _ = form.filter() + obj.subscribers = contacts + obj.save() + return HttpResponseRedirect(self.success_url) + from django.forms.models import modelformset_factory @@ -214,3 +229,13 @@ class ExportContacts(FormView): columns = ('first_name', 'email') return ExcelResponse(qs, title, columns,'contacts') return HttpResponseRedirect(self.request.META['HTTP_REFERER']) + + +class ImportContacts(FormView): + form_class = ContactImportForm + success_url = reverse_lazy("newsletters_contact_list") + template_name = 'admin/import templates/import_contacts.html' + + def form_valid(self, form): + form.save() + return HttpResponseRedirect(self.get_success_url()) diff --git a/import_xls/admin.py b/import_xls/admin.py index 0ceee351..e1cff126 100644 --- a/import_xls/admin.py +++ b/import_xls/admin.py @@ -41,7 +41,6 @@ class ImportView(FormView): return render_to_response(self.template_name, context) - class ExportView(FormView): """ abstract class diff --git a/import_xls/import_forms.py b/import_xls/import_forms.py index 8554605c..e6172900 100644 --- a/import_xls/import_forms.py +++ b/import_xls/import_forms.py @@ -21,6 +21,7 @@ class ImportForm(forms.Form): model = None excel_file = forms.FileField(label='Выберите файл') language = forms.ChoiceField(label='Выберите язык', choices=languages) + def save_file(self): data = self.cleaned_data lang = data['language'] @@ -31,13 +32,12 @@ class ImportForm(forms.Form): # all field names in excel file (must be in second row) field_names = [name for name in row_list[1]] - for row_number, row in enumerate(row_list): - # go through all rows in file + # go through all rows in file if row_number > 1: - # first two fields are verbose name and name + # first two fields are verbose name and name if row[0] != '': - # in first column ids + # in first column ids try: object = self.model.objects.language(lang).get(id=int(row[0])) diff --git a/templates/admin/import templates/import_contacts.html b/templates/admin/import templates/import_contacts.html new file mode 100644 index 00000000..c652785a --- /dev/null +++ b/templates/admin/import templates/import_contacts.html @@ -0,0 +1,60 @@ +{% extends 'admin/base.html' %} +{% load static %} + + +{% block body %} +
{% csrf_token %} + + {# excel_file #} +
+ +
+ {{ form.excel_file }} + {{ form.excel_file.errors }} +
+
+ {# country #} +
+ +
+ {{ form.country }} + {{ form.country.errors }} +
+
+ {# activated #} +
+ +
+ {{ form.activated }} + {{ form.activated.errors }} +
+
+ {# is_tester #} +
+ +
+ {{ form.is_tester }} + {{ form.is_tester.errors }} +
+
+ +
+ + +
+ +
+ + + +{% endblock %} +{% block scripts %} + + + + +{% endblock %} diff --git a/templates/admin/newsletters/confirm_delete.html b/templates/admin/newsletters/confirm_delete.html index b2884763..434d1b61 100644 --- a/templates/admin/newsletters/confirm_delete.html +++ b/templates/admin/newsletters/confirm_delete.html @@ -3,7 +3,7 @@ {% block body %}
{% csrf_token %}
-

Вы точно хотите удалить "{{ object.contact.name }}" ?

+

Вы точно хотите удалить "{{ object.contact.name }}{{ object.name }}" ?

Нет
diff --git a/templates/admin/newsletters/contact_list.html b/templates/admin/newsletters/contact_list.html index 003dd7c9..155360b4 100644 --- a/templates/admin/newsletters/contact_list.html +++ b/templates/admin/newsletters/contact_list.html @@ -4,7 +4,7 @@
-

Список контактов

+

Список контактов Импорт

@@ -37,6 +37,14 @@
+ +
+ +
+ {{ form.city }} +
+
+
@@ -45,6 +53,14 @@
+ +
+ +
+ {{ form.mailinglist }} +
+
+
@@ -66,8 +82,9 @@
@@ -125,7 +142,9 @@ $(document).ready(function () { $("#id_theme").select2({width: 283, placeholder: 'Тематики'}); $("#id_country").select2({width: 283, placeholder: 'Страны'}); + $("#id_city").select2({width: 283, placeholder: 'Города'}); $("#id_area").select2({width: 283, placeholder: 'Географическая зона'}); + $("#id_mailinglist").select2({width: 283, placeholder: 'Список рассылки'}); var get_param = window.location.search; if (!get_param) { $('.toggled').collapse('hide'); @@ -136,6 +155,10 @@ $('#export').on('click', function(event){ event.preventDefault(); window.location = "{% url 'export_contacts' %}" + get_param; + }); + $('#mailinglist').on('click', function(event){ + event.preventDefault(); + window.location = "{% url 'newsletters_mailinglist_create' %}" + get_param; }) }) diff --git a/templates/admin/newsletters/mailing_list.html b/templates/admin/newsletters/mailing_list.html index 3a040807..d67fea8d 100644 --- a/templates/admin/newsletters/mailing_list.html +++ b/templates/admin/newsletters/mailing_list.html @@ -9,6 +9,14 @@
+ + + + + + + + @@ -16,6 +24,8 @@ + + @@ -26,6 +36,8 @@ + + {% endfor %}
Подписчиков Отписалось    
{{ item.unsubscribers_count }} Изменить Удалить Подписчики