From 618688a069800ee5e905fcc46a023c456267ef59 Mon Sep 17 00:00:00 2001 From: Nazar Kotjuk Date: Thu, 8 Oct 2015 12:20:04 +0300 Subject: [PATCH] startinf newsletter admin --- emencia/django/newsletter/admin_forms.py | 52 +++++++++++++++++ emencia/django/newsletter/admin_urls.py | 16 ++++-- emencia/django/newsletter/models.py | 22 +++---- emencia/django/newsletter/settings.py | 2 +- .../django/newsletter/views/admin_views.py | 43 ++++++++++++-- proj/settings.py | 10 ++++ templates/admin/newsletters/contact.html | 46 +++++++++++++++ templates/admin/newsletters/contact_list.html | 57 +++++++++++++++---- templates/admin/newsletters/mailing_list.html | 39 +++++++++++++ .../newsletters/mailing_list_object.html | 31 ++++++++++ .../admin/newsletters/newsletter_object.html | 53 +++++++++++++++++ 11 files changed, 340 insertions(+), 31 deletions(-) create mode 100644 emencia/django/newsletter/admin_forms.py create mode 100644 templates/admin/newsletters/contact.html create mode 100644 templates/admin/newsletters/mailing_list.html create mode 100644 templates/admin/newsletters/mailing_list_object.html create mode 100644 templates/admin/newsletters/newsletter_object.html diff --git a/emencia/django/newsletter/admin_forms.py b/emencia/django/newsletter/admin_forms.py new file mode 100644 index 00000000..2fc719af --- /dev/null +++ b/emencia/django/newsletter/admin_forms.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +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 city.models import City + + +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) + + 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) + 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): + return City.objects.none() + +class MailingListForm(forms.ModelForm): + class Meta: + model = MailingList + fields = ('name', 'description') + +class NewsletterForm(forms.ModelForm): + test_contacts = forms.CharField(label=u'Тестовые контакты', widget=forms.HiddenInput(), required=False) + content = forms.CharField(label=_('content'), widget=CKEditorWidget(config_name='newsletters')) + 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 diff --git a/emencia/django/newsletter/admin_urls.py b/emencia/django/newsletter/admin_urls.py index 4e83197e..2aa5b071 100644 --- a/emencia/django/newsletter/admin_urls.py +++ b/emencia/django/newsletter/admin_urls.py @@ -2,13 +2,19 @@ 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 +from emencia.django.newsletter.views.admin_views import ContactList, UpdateContact, MailingListView, UpdateMailingList,\ + CreateMailingList, NewsletterCreate -def test(request): - return HttpResponse('test') urlpatterns = patterns('', - url(r'^test/', test), + 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/', NewsletterCreate.as_view(), name='newsletters_newsletters_create'), + + 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/', CreateMailingList.as_view(), name='newsletters_mailinglist_create'), + + url(r'^contact/(?P\d+)/edit/', UpdateContact.as_view(), name='newsletters_contact_update'), url(r'^contact/all/$', ContactList.as_view(), name='newsletters_contact_list'), - url(r'^contact/(?P\d+)/edit/', test), ) \ No newline at end of file diff --git a/emencia/django/newsletter/models.py b/emencia/django/newsletter/models.py index c351fe05..1180e54d 100644 --- a/emencia/django/newsletter/models.py +++ b/emencia/django/newsletter/models.py @@ -190,7 +190,7 @@ class Contact(models.Model): msg.send() class Meta: - ordering = ('creation_date',) + ordering = ('-modification_date',) verbose_name = _('contact') verbose_name_plural = _('contacts') @@ -200,19 +200,19 @@ class ContactSettings(models.Model): WEEK_2 = 2 # every 2 weeks MONTH = 3 # every 4 month - PERIODIC_CHOICES = ((WEEK, _('draft')), - (WEEK_2, _('waiting sending')), - (MONTH, _('sending')), - ) + PERIODIC_CHOICES = [(WEEK, 'Раз в неделю'), + (WEEK_2, 'Раз в 2 недели'), + (MONTH, 'Разв месяц') + ] contact = models.OneToOneField(Contact) - periodic = models.PositiveIntegerField(choices=PERIODIC_CHOICES, default=WEEK) + periodic = models.PositiveIntegerField(verbose_name=_(u'Периодичность отправки'), choices=PERIODIC_CHOICES, default=WEEK) exponent_practicum = models.BooleanField(default=True, verbose_name=_(u'Практикум экспонента')) organiser_practicum = models.BooleanField(default=True, verbose_name=_(u'Практикум организатора событий')) - theme = models.ManyToManyField('theme.Theme', blank=True, null=True) - area = models.ManyToManyField('country.Area', blank=True, null=True) - country = models.ManyToManyField('country.Country', blank=True, null=True) - city = models.ManyToManyField('city.City', blank=True, null=True) + theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=_(u'Тематики')) + area = models.ManyToManyField('country.Area', blank=True, null=True, verbose_name=_(u'Географические зоны')) + country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=_(u'Страны')) + city = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=_(u'Города')) class MailingList(models.Model): @@ -278,7 +278,7 @@ class Newsletter(models.Model): blank=True, null=True) server = models.ForeignKey(SMTPServer, verbose_name=_('smtp server'), - default=1) + default=lambda: SMTPServer.objects.get(id=1)) header_sender = models.CharField(_('sender'), max_length=255, default=DEFAULT_HEADER_SENDER) header_reply = models.CharField(_('reply to'), max_length=255, diff --git a/emencia/django/newsletter/settings.py b/emencia/django/newsletter/settings.py index 829db0ec..29a05275 100644 --- a/emencia/django/newsletter/settings.py +++ b/emencia/django/newsletter/settings.py @@ -23,7 +23,7 @@ UNIQUE_KEY_LENGTH = getattr(settings, 'NEWSLETTER_UNIQUE_KEY_LENGTH', 8) UNIQUE_KEY_CHAR_SET = getattr(settings, 'NEWSLETTER_UNIQUE_KEY_CHAR_SET', string.ascii_uppercase + string.digits) DEFAULT_HEADER_SENDER = getattr(settings, 'NEWSLETTER_DEFAULT_HEADER_SENDER', - 'GENERAL SERVERS') + 'Expomap') DEFAULT_HEADER_REPLY = getattr(settings, 'NEWSLETTER_DEFAULT_HEADER_REPLY', DEFAULT_HEADER_SENDER) diff --git a/emencia/django/newsletter/views/admin_views.py b/emencia/django/newsletter/views/admin_views.py index fff3c499..88ad3a7e 100644 --- a/emencia/django/newsletter/views/admin_views.py +++ b/emencia/django/newsletter/views/admin_views.py @@ -3,7 +3,9 @@ from django.views.generic import TemplateView, CreateView, ListView, UpdateView, from django.conf import settings from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 -from emencia.django.newsletter.models import Contact, ContactSettings +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 class ContactList(ListView): @@ -11,10 +13,43 @@ class ContactList(ListView): model = Contact template_name = 'admin/newsletters/contact_list.html' + class UpdateContact(UpdateView): - model = Contact + model = ContactSettings + form_class = ContactSettingsForm template_name = 'admin/newsletters/contact.html' + success_url = '/admin/newsletters/contact/all/' + + def get_initial(self): + obj = self.object.contact + data = self.initial.copy() + data.update({'first_name': obj.first_name, 'subscriber': obj.subscriber, + 'valid': obj.valid, 'tester': obj.tester}) + return data + + +class MailingListView(ListView): + paginate_by = settings.ADMIN_PAGINATION + model = MailingList + template_name = 'admin/newsletters/mailing_list.html' + + +class UpdateMailingList(UpdateView): + model = MailingList + form_class = MailingListForm + template_name = 'admin/newsletters/mailing_list_object.html' + success_url = '/admin/newsletters/mailinglist/all/' + + +class CreateMailingList(CreateView): + model = MailingList + form_class = MailingListForm + template_name = 'admin/newsletters/mailing_list_object.html' + success_url = '/admin/newsletters/mailinglist/all/' - def get_success_url(self): - return ('subscription_activation_complete', (), {}) +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 diff --git a/proj/settings.py b/proj/settings.py index 052b5b42..5dded7d3 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -96,6 +96,16 @@ CKEDITOR_CONFIGS = { 'fillEmptyBlocks' : False, 'autoParagraph' : False, }, + 'newsletters': { + 'toolbar': 'standart', + 'height': 600, + 'width': 750, + 'resize_enabled' : True, + 'autoGrow_onStartup' : False, + 'autoGrow_bottomSpace' : 300, + 'fillEmptyBlocks' : False, + 'autoParagraph' : False, + }, } diff --git a/templates/admin/newsletters/contact.html b/templates/admin/newsletters/contact.html new file mode 100644 index 00000000..bcd8be29 --- /dev/null +++ b/templates/admin/newsletters/contact.html @@ -0,0 +1,46 @@ +{% extends 'admin/base.html' %} +{% load static %} + +{% block scripts %} + + + + +{% endblock %} + + +{% block body %} + +
{% csrf_token %} +
+ +
+
+

Изменения подписчика {{ object.contact.email }}

+
+
+ {% for field in form %} +
+ +
{{ field }} + {{ field.errors }} +
+
+ {% endfor %} +
+
+
+ +
+ + +
+
+{% endblock %} diff --git a/templates/admin/newsletters/contact_list.html b/templates/admin/newsletters/contact_list.html index 8187682c..d65cb1f7 100644 --- a/templates/admin/newsletters/contact_list.html +++ b/templates/admin/newsletters/contact_list.html @@ -1,10 +1,47 @@ - - - - - - - -контакты список - - \ No newline at end of file +{% extends 'admin/base.html' %} + +{% block body %} + +
+
+

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

+
+
+ + + + + + + + + + + + + + + + + {% for item in object_list %} + + + + + + + + + + + + {% endfor %} + +
EmailИмяТестерПодписчикПотверждена подпискаДата созданияДата редактирования 
{{ item.email }}{{ item.first_name }}{% if item.tester %}да{% else %}нет{% endif %}{% if item.subscriber %}да{% else %}нет{% endif %}{% if item.activated %}да{% else %}нет{% endif %}{{ item.creation_date|date:"Y-m-d H:i" }}{{ item.modification_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/mailing_list.html b/templates/admin/newsletters/mailing_list.html new file mode 100644 index 00000000..3a040807 --- /dev/null +++ b/templates/admin/newsletters/mailing_list.html @@ -0,0 +1,39 @@ +{% extends 'admin/base.html' %} + +{% block body %} + +
+
+

Списки рассылок

+
+
+ + + + + + + + + + + + + {% for item in object_list %} + + + + + + + + {% endfor %} + +
НазваниеПодписчиковОтписалось 
{{ item.name }}{{ item.subscribers_count }}{{ item.unsubscribers_count }}Изменить
+ Добавить новый список +
+ {# 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/mailing_list_object.html b/templates/admin/newsletters/mailing_list_object.html new file mode 100644 index 00000000..abb1ef47 --- /dev/null +++ b/templates/admin/newsletters/mailing_list_object.html @@ -0,0 +1,31 @@ +{% extends 'admin/base.html' %} +{% load static %} + +{% block body %} + +
{% csrf_token %} +
+ +
+
+

{% if object %}Изменения{% else %}Создание{% endif %} списка рассылок

+
+
+ {% for field in form %} +
+ +
{{ field }} + {{ field.errors }} +
+
+ {% endfor %} +
+
+
+ +
+ + +
+
+{% endblock %} diff --git a/templates/admin/newsletters/newsletter_object.html b/templates/admin/newsletters/newsletter_object.html new file mode 100644 index 00000000..3338383c --- /dev/null +++ b/templates/admin/newsletters/newsletter_object.html @@ -0,0 +1,53 @@ +{% extends 'admin/base.html' %} +{% load static %} + +{% block scripts %} + + + + +{% endblock %} + +{% block body %} + +
{% csrf_token %} +
+ +
+
+

{% if object %}Изменения{% else %}Создание{% endif %} рассылки

+
+
+ {% for field in form %} +
+ +
{{ field }} + {{ field.errors }} +
+
+ {% endfor %} +
+
+
+ +
+
+

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

+
+
+
+
+ +
+ + +
+
+{% endblock %}