import contacts

remotes/origin/1203
Ivan Kovalkovskyi 10 years ago
parent f668a6eaea
commit 06c480ce80
  1. 4
      emencia/django/newsletter/admin_urls.py
  2. 30
      emencia/django/newsletter/forms.py
  3. 12
      emencia/django/newsletter/views/admin_views.py
  4. 1
      import_xls/admin.py
  5. 8
      import_xls/import_forms.py
  6. 60
      templates/admin/import templates/import_contacts.html
  7. 2
      templates/admin/newsletters/contact_list.html

@ -1,7 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
from django.conf.urls import patterns from django.conf.urls import patterns
from emencia.django.newsletter.views.admin_views import ContactList, UpdateContact, MailingListView, UpdateMailingList,\ from emencia.django.newsletter.views.admin_views import ContactList, UpdateContact, MailingListView, UpdateMailingList,\
CreateMailingList, NewsletterListView, NewsletterCreate, ExportContacts, DeleteContact, NewsletterUpdate, DeleteMailingList CreateMailingList, NewsletterListView, NewsletterCreate, ExportContacts, DeleteContact, NewsletterUpdate, \
DeleteMailingList, ImportContacts
urlpatterns = patterns('', urlpatterns = patterns('',
@ -22,4 +23,5 @@ urlpatterns = patterns('',
url(r'^contact/(?P<pk>\d+)/delete/', DeleteContact.as_view(), name='newsletters_contact_delete'), url(r'^contact/(?P<pk>\d+)/delete/', DeleteContact.as_view(), name='newsletters_contact_delete'),
url(r'^contact/all/$', ContactList.as_view(), name='newsletters_contact_list'), url(r'^contact/all/$', ContactList.as_view(), name='newsletters_contact_list'),
url(r'^contact/export/$', ExportContacts.as_view(), name='export_contacts'), url(r'^contact/export/$', ExportContacts.as_view(), name='export_contacts'),
url(r'^contact/import/$', ImportContacts.as_view(), name='import_newsletters_contacts'),
) )

@ -145,3 +145,33 @@ class ContactFilterForm(forms.Form):
qs = qs.filter(valid=True) qs = qs.filter(valid=True)
return qs, title 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)

@ -10,7 +10,7 @@ from HTMLParser import HTMLParseError
from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment 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.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm, AttachmentForm
from emencia.django.newsletter.mailer import Mailer from emencia.django.newsletter.mailer import Mailer
from ..forms import ContactFilterForm from ..forms import ContactFilterForm, ContactImportForm
from ..utils.excel import ExcelResponse from ..utils.excel import ExcelResponse
from functions.admin_views import paginate_results from functions.admin_views import paginate_results
@ -223,3 +223,13 @@ class ExportContacts(FormView):
columns = ('first_name', 'email') columns = ('first_name', 'email')
return ExcelResponse(qs, title, columns,'contacts') return ExcelResponse(qs, title, columns,'contacts')
return HttpResponseRedirect(self.request.META['HTTP_REFERER']) 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())

@ -41,7 +41,6 @@ class ImportView(FormView):
return render_to_response(self.template_name, context) return render_to_response(self.template_name, context)
class ExportView(FormView): class ExportView(FormView):
""" """
abstract class abstract class

@ -21,6 +21,7 @@ class ImportForm(forms.Form):
model = None model = None
excel_file = forms.FileField(label='Выберите файл') excel_file = forms.FileField(label='Выберите файл')
language = forms.ChoiceField(label='Выберите язык', choices=languages) language = forms.ChoiceField(label='Выберите язык', choices=languages)
def save_file(self): def save_file(self):
data = self.cleaned_data data = self.cleaned_data
lang = data['language'] lang = data['language']
@ -31,13 +32,12 @@ class ImportForm(forms.Form):
# all field names in excel file (must be in second row) # all field names in excel file (must be in second row)
field_names = [name for name in row_list[1]] field_names = [name for name in row_list[1]]
for row_number, row in enumerate(row_list): for row_number, row in enumerate(row_list):
# go through all rows in file # go through all rows in file
if row_number > 1: if row_number > 1:
# first two fields are verbose name and name # first two fields are verbose name and name
if row[0] != '': if row[0] != '':
# in first column ids # in first column ids
try: try:
object = self.model.objects.language(lang).get(id=int(row[0])) object = self.model.objects.language(lang).get(id=int(row[0]))

@ -0,0 +1,60 @@
{% extends 'admin/base.html' %}
{% load static %}
{% block body %}
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %}
{# excel_file #}
<div class="control-group {% if form.excel_file.errors %}error{% endif %}">
<label class="control-label">{{ form.excel_file.label }}:</label>
<div class="controls">
{{ form.excel_file }}
<span class="help-inline">{{ form.excel_file.errors }}</span>
</div>
</div>
{# country #}
<div class="control-group {% if form.country.errors %}error{% endif %}">
<label class="control-label">{{ form.country.label }}:</label>
<div class="controls">
{{ form.country }}
<span class="help-inline">{{ form.country.errors }}</span>
</div>
</div>
{# activated #}
<div class="control-group {% if form.activated.errors %}error{% endif %}">
<label class="control-label">{{ form.activated.label }}:</label>
<div class="controls">
{{ form.activated }}
<span class="help-inline">{{ form.activated.errors }}</span>
</div>
</div>
{# is_tester #}
<div class="control-group {% if form.is_tester.errors %}error{% endif %}">
<label class="control-label">{{ form.is_tester.label }}:</label>
<div class="controls">
{{ form.is_tester }}
<span class="help-inline">{{ form.is_tester.errors }}</span>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Импорт">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</form>
{% endblock %}
{% block scripts %}
<link rel="stylesheet" href="{% static 'js/select/select2.css' %}">
<script src="{% static 'js/select2.min.js' %}"></script>
<script>
$(document).ready(function(){
$("#id_country").select2({width:"element", placeholder:"Страна"});
});
</script>
{% endblock %}

@ -4,7 +4,7 @@
<div class="box span10"> <div class="box span10">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список контактов</h2> <h2><i class="icon-arrow-down"></i>Список контактов <a class="btn" href="{% url 'import_newsletters_contacts' %}">Импорт</a></h2>
</div> </div>
<div class="box-content"> <div class="box-content">
<form class="form-horizontal" method="get"> <form class="form-horizontal" method="get">

Loading…
Cancel
Save