merged with remote

remotes/origin/1203
Ivan Kovalkovskyi 10 years ago
commit 3556211279
  1. 12
      emencia/django/newsletter/admin_forms.py
  2. 6
      emencia/django/newsletter/admin_urls.py
  3. 7
      emencia/django/newsletter/models.py
  4. 79
      emencia/django/newsletter/views/admin_views.py
  5. 1
      static/custom_js/formset_add.js
  6. 40
      templates/admin/newsletters/newsletter_list.html
  7. 22
      templates/admin/newsletters/newsletter_object.html

@ -2,7 +2,7 @@
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment
from city.models import City from city.models import City
from country.models import Country, Area from country.models import Country, Area
@ -55,4 +55,12 @@ class NewsletterForm(forms.ModelForm):
class Meta: class Meta:
model = Newsletter model = Newsletter
fields = ('title', 'content', 'mailing_list', 'test_contacts', 'header_sender', fields = ('title', 'content', 'mailing_list', 'test_contacts', 'header_sender',
'header_reply', 'status', 'sending_date', 'slug') 'header_reply', 'status', 'sending_date', 'slug')
def clean_test_contacts(self):
return []
class AttachmentForm(forms.ModelForm):
class Meta:
model = Attachment
fields = ('title', 'file_attachment')

@ -3,12 +3,12 @@ from django.conf.urls import include
from django.conf.urls import patterns from django.conf.urls import patterns
from django.http import HttpResponse from django.http import HttpResponse
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, NewsletterCreate, ExportContacts, DeleteContact CreateMailingList, NewsletterListView, NewsletterCreate, ExportContacts, DeleteContact, NewsletterUpdate
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^newsletters/all/$', MailingListView.as_view(), name='newsletters_mailinglist'), url(r'^newsletters/all/$', NewsletterListView.as_view(), name='newsletters_newsletters_list'),
url(r'^newsletters/(?P<pk>\d+)/edit/', UpdateMailingList.as_view(), name='newsletters_mailinglist_update'), url(r'^newsletters/(?P<pk>\d+)/edit/', NewsletterUpdate.as_view(), name='newsletters_newsletters_update'),
url(r'^newsletters/', NewsletterCreate.as_view(), name='newsletters_newsletters_create'), url(r'^newsletters/', NewsletterCreate.as_view(), name='newsletters_newsletters_create'),
url(r'^mailinglist/all/$', MailingListView.as_view(), name='newsletters_mailinglist'), url(r'^mailinglist/all/$', MailingListView.as_view(), name='newsletters_mailinglist'),

@ -307,6 +307,13 @@ class Newsletter(models.Model):
def get_statistics_url(self): def get_statistics_url(self):
return ('newsletter_newsletter_statistics', (self.slug,)) return ('newsletter_newsletter_statistics', (self.slug,))
def get_status_text(self):
for item in self.STATUS_CHOICES:
if self.status == item[0]:
return unicode(item[1])
return 'bug'
def __unicode__(self): def __unicode__(self):
return self.title return self.title

@ -1,8 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.views.generic import TemplateView, CreateView, ListView, UpdateView, DeleteView, FormView from django.views.generic import TemplateView, CreateView, ListView, UpdateView, DeleteView, FormView
from django.conf import settings from django.conf import settings
from django.http import HttpResponseRedirect
from django.forms.formsets import BaseFormSet, formset_factory
from django.http import HttpResponseRedirect, HttpResponse from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.core.urlresolvers import reverse
from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment
from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm, AttachmentForm
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy
from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter
from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm
@ -97,6 +102,8 @@ class CreateMailingList(CreateView):
template_name = 'admin/newsletters/mailing_list_object.html' template_name = 'admin/newsletters/mailing_list_object.html'
success_url = '/admin/newsletters/mailinglist/all/' success_url = '/admin/newsletters/mailinglist/all/'
from django.forms.models import modelformset_factory
class NewsletterCreate(CreateView): class NewsletterCreate(CreateView):
model = Newsletter model = Newsletter
@ -104,6 +111,76 @@ class NewsletterCreate(CreateView):
template_name = 'admin/newsletters/newsletter_object.html' template_name = 'admin/newsletters/newsletter_object.html'
success_url = '/admin/newsletters/newsletters/all/' success_url = '/admin/newsletters/newsletters/all/'
def get_formset(self):
#if self.request.POST:
# AttachmentFormSet = formset_factory(Attachment)
#else:
AttachmentFormSet = formset_factory(AttachmentForm)
if self.request.POST:
return AttachmentFormSet(self.request.POST, self.request.FILES)
else:
return AttachmentFormSet()
def get_context_data(self, **kwargs):
context = super(NewsletterCreate, self).get_context_data(**kwargs)
context['attachment_formset'] = self.get_formset()
return context
def form_valid(self, form):
self.object = form.save()
formset = self.get_formset()
if formset.is_valid():
for item in formset.forms:
if item.is_valid() and item.has_changed():
instance = item.save(commit=False)
instance.newsletter = self.object
instance.save()
return HttpResponseRedirect(self.success_url)
class NewsletterUpdate(UpdateView):
model = Newsletter
form_class = NewsletterForm
template_name = 'admin/newsletters/newsletter_object.html'
success_url = '/admin/newsletters/newsletters/all/'
def get_formset(self):
if self.request.POST:
AttachmentFormSet = modelformset_factory(Attachment, form=AttachmentForm, exclude=('newsletter',))
else:
AttachmentFormSet = modelformset_factory(Attachment, form=AttachmentForm, exclude=('newsletter',))
if self.request.POST:
return AttachmentFormSet(self.request.POST, self.request.FILES, queryset=self.object.attachment_set.all())
else:
return AttachmentFormSet(queryset=self.object.attachment_set.all())
def get_context_data(self, **kwargs):
context = super(NewsletterUpdate, self).get_context_data(**kwargs)
context['attachment_formset'] = self.get_formset()
return context
def form_valid(self, form):
self.object = form.save()
formset = self.get_formset()
if formset.is_valid():
for item in formset.forms:
if item.is_valid() and item.has_changed():
instance = item.save(commit=False)
instance.newsletter = self.object
instance.save()
return HttpResponseRedirect(self.success_url)
class NewsletterListView(ListView):
paginate_by = settings.ADMIN_PAGINATION
model = Newsletter
template_name = 'admin/newsletters/newsletter_list.html' success_url = '/admin/newsletters/newsletters/all/'
from ..utils.excel import ExcelResponse from ..utils.excel import ExcelResponse
@ -118,4 +195,4 @@ class ExportContacts(FormView):
if qs.count(): if qs.count():
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'])

@ -1,5 +1,6 @@
function addForm(btn, prefix) { function addForm(btn, prefix) {
var formCount = parseInt($('#id_' + prefix + '-TOTAL_FORMS').val()); var formCount = parseInt($('#id_' + prefix + '-TOTAL_FORMS').val());
console.log(formCount)
// You can only submit a maximum of 10 todo items // You can only submit a maximum of 10 todo items
if (formCount < 30) { if (formCount < 30) {
// Clone a form (without event handlers) from the first form // Clone a form (without event handlers) from the first form

@ -0,0 +1,40 @@
{% extends 'admin/base.html' %}
{% block body %}
<div class="box span10">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Рассылки</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>Название</th>
<th>Список рассылки</th>
<th>Статус</th>
<th>Дата отправки</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.title }}</td>
<td>{{ item.mailing_list }}</td>
<td>{{ item.get_status_text }}</td>
<td>{{ item.sending_date|date:"Y-m-d H:i" }}</td>
<td><a href="{% url 'newsletters_newsletters_update' item.id %}">Изменить</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="{% url 'newsletters_newsletters_create' %}"><i class="icon-plus-sign icon-white"></i> Добавить новый список</a>
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
{% endblock %}

@ -2,6 +2,7 @@
{% load static %} {% load static %}
{% block scripts %} {% block scripts %}
<script src="{% static 'custom_js/formset_add.js' %}"></script>
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> <script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> <link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script> <script src="{% static 'js/select/select2.js' %}"></script>
@ -11,6 +12,7 @@
$('select').select2({width: "element"}); $('select').select2({width: "element"});
//$('#id_country').select2({width: "element"}); //$('#id_country').select2({width: "element"});
}) })
</script> </script>
{% endblock %} {% endblock %}
@ -42,6 +44,26 @@
<h2><i class="icon-pencil"></i>Прикрепить файлы</h2> <h2><i class="icon-pencil"></i>Прикрепить файлы</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{{ attachment_formset.management_form }}
<table class="table table-hover" style=" width: 100%;">
<thead>
<th>тайтл</th>
<th>файл</th>
<th>&nbsp;</th>
</thead>
<tbody>
{% for attachment_form in attachment_formset.forms %}
<tr class="item">
<td>{{ attachment_form.id }}{{ attachment_form.title }}</td>
<td>{{ attachment_form.file_attachment }}</td>
<td><a class="delete btn btn-danger" href="#"><i class="icon-trash icon-white"></i> Удалить</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<p style=" padding-left: 20px"><a id="add" class="btn btn-success" href="#"><i class="icon-plus-sign icon-white"></i> Добавить файл</a></p>
</div> </div>
</div> </div>

Loading…
Cancel
Save