From e55ec348003a955a24c59526301612754c4f9644 Mon Sep 17 00:00:00 2001 From: Nazar Kotjuk Date: Mon, 12 Oct 2015 15:24:36 +0300 Subject: [PATCH] NEwsletter creating and controling --- emencia/django/newsletter/admin_forms.py | 12 ++- emencia/django/newsletter/admin_urls.py | 6 +- emencia/django/newsletter/models.py | 7 ++ .../django/newsletter/views/admin_views.py | 79 ++++++++++++++++++- static/custom_js/formset_add.js | 1 + .../admin/newsletters/newsletter_list.html | 40 ++++++++++ .../admin/newsletters/newsletter_object.html | 22 ++++++ 7 files changed, 159 insertions(+), 8 deletions(-) create mode 100644 templates/admin/newsletters/newsletter_list.html diff --git a/emencia/django/newsletter/admin_forms.py b/emencia/django/newsletter/admin_forms.py index 2fc719af..8b647e4a 100644 --- a/emencia/django/newsletter/admin_forms.py +++ b/emencia/django/newsletter/admin_forms.py @@ -2,7 +2,7 @@ from django import forms from django.utils.translation import ugettext_lazy as _ 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 @@ -49,4 +49,12 @@ class NewsletterForm(forms.ModelForm): class Meta: model = Newsletter fields = ('title', 'content', 'mailing_list', 'test_contacts', 'header_sender', - 'header_reply', 'status', 'sending_date', 'slug') \ No newline at end of file + 'header_reply', 'status', 'sending_date', 'slug') + + def clean_test_contacts(self): + return [] + +class AttachmentForm(forms.ModelForm): + class Meta: + model = Attachment + fields = ('title', 'file_attachment') \ No newline at end of file diff --git a/emencia/django/newsletter/admin_urls.py b/emencia/django/newsletter/admin_urls.py index 2aa5b071..2fb7af57 100644 --- a/emencia/django/newsletter/admin_urls.py +++ b/emencia/django/newsletter/admin_urls.py @@ -3,12 +3,12 @@ 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, NewsletterCreate + CreateMailingList, NewsletterCreate, NewsletterListView, NewsletterUpdate urlpatterns = patterns('', - url(r'^newsletters/all/$', MailingListView.as_view(), name='newsletters_mailinglist'), - url(r'^newsletters/(?P\d+)/edit/', UpdateMailingList.as_view(), name='newsletters_mailinglist_update'), + url(r'^newsletters/all/$', NewsletterListView.as_view(), name='newsletters_newsletters_list'), + url(r'^newsletters/(?P\d+)/edit/', NewsletterUpdate.as_view(), name='newsletters_newsletters_update'), url(r'^newsletters/', NewsletterCreate.as_view(), name='newsletters_newsletters_create'), url(r'^mailinglist/all/$', MailingListView.as_view(), name='newsletters_mailinglist'), diff --git a/emencia/django/newsletter/models.py b/emencia/django/newsletter/models.py index 1180e54d..c0f16ff5 100644 --- a/emencia/django/newsletter/models.py +++ b/emencia/django/newsletter/models.py @@ -307,6 +307,13 @@ class Newsletter(models.Model): def get_statistics_url(self): 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): return self.title diff --git a/emencia/django/newsletter/views/admin_views.py b/emencia/django/newsletter/views/admin_views.py index 88ad3a7e..6c04b220 100644 --- a/emencia/django/newsletter/views/admin_views.py +++ b/emencia/django/newsletter/views/admin_views.py @@ -2,10 +2,11 @@ from django.views.generic import TemplateView, CreateView, ListView, UpdateView, DetailView from django.conf import settings from django.http import HttpResponseRedirect +from django.forms.formsets import BaseFormSet, formset_factory from django.shortcuts import get_object_or_404 from django.core.urlresolvers import reverse -from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter -from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm +from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment +from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm, AttachmentForm class ContactList(ListView): @@ -47,9 +48,81 @@ class CreateMailingList(CreateView): template_name = 'admin/newsletters/mailing_list_object.html' success_url = '/admin/newsletters/mailinglist/all/' +from django.forms.models import modelformset_factory + class NewsletterCreate(CreateView): model = Newsletter form_class = NewsletterForm template_name = 'admin/newsletters/newsletter_object.html' - success_url = '/admin/newsletters/newsletters/all/' \ No newline at end of file + 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' \ No newline at end of file diff --git a/static/custom_js/formset_add.js b/static/custom_js/formset_add.js index a40cdf60..38a9f30f 100644 --- a/static/custom_js/formset_add.js +++ b/static/custom_js/formset_add.js @@ -1,5 +1,6 @@ function addForm(btn, prefix) { var formCount = parseInt($('#id_' + prefix + '-TOTAL_FORMS').val()); + console.log(formCount) // You can only submit a maximum of 10 todo items if (formCount < 30) { // Clone a form (without event handlers) from the first form diff --git a/templates/admin/newsletters/newsletter_list.html b/templates/admin/newsletters/newsletter_list.html new file mode 100644 index 00000000..94d0164e --- /dev/null +++ b/templates/admin/newsletters/newsletter_list.html @@ -0,0 +1,40 @@ +{% extends 'admin/base.html' %} + +{% block body %} + +
+
+

Рассылки

+
+
+ + + + + + + + + + + + + + {% for item in object_list %} + + + + + + + + {% endfor %} + +
НазваниеСписок рассылкиСтатусДата отправки 
{{ item.title }}{{ item.mailing_list }}{{ item.get_status_text }}{{ item.sending_date|date:"Y-m-d H:i" }}Изменить
+ Добавить новый список +
+ {# pagination #} + {% include 'admin/includes/admin_pagination.html' with page_obj=object_list %} +
+ +{% endblock %} \ No newline at end of file diff --git a/templates/admin/newsletters/newsletter_object.html b/templates/admin/newsletters/newsletter_object.html index 3338383c..5f764932 100644 --- a/templates/admin/newsletters/newsletter_object.html +++ b/templates/admin/newsletters/newsletter_object.html @@ -2,6 +2,7 @@ {% load static %} {% block scripts %} + @@ -11,6 +12,7 @@ $('select').select2({width: "element"}); //$('#id_country').select2({width: "element"}); + }) {% endblock %} @@ -42,6 +44,26 @@

Прикрепить файлы

+ {{ attachment_formset.management_form }} + + + + + + + + {% for attachment_form in attachment_formset.forms %} + + + + + + {% endfor %} + +
тайтлфайл 
{{ attachment_form.id }}{{ attachment_form.title }}{{ attachment_form.file_attachment }} Удалить
+

Добавить файл

+ +