startinf newsletter admin

remotes/origin/1203
Nazar Kotjuk 10 years ago
parent c964782f4d
commit 618688a069
  1. 52
      emencia/django/newsletter/admin_forms.py
  2. 16
      emencia/django/newsletter/admin_urls.py
  3. 22
      emencia/django/newsletter/models.py
  4. 2
      emencia/django/newsletter/settings.py
  5. 43
      emencia/django/newsletter/views/admin_views.py
  6. 10
      proj/settings.py
  7. 46
      templates/admin/newsletters/contact.html
  8. 57
      templates/admin/newsletters/contact_list.html
  9. 39
      templates/admin/newsletters/mailing_list.html
  10. 31
      templates/admin/newsletters/mailing_list_object.html
  11. 53
      templates/admin/newsletters/newsletter_object.html

@ -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')

@ -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<pk>\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<pk>\d+)/edit/', UpdateMailingList.as_view(), name='newsletters_mailinglist_update'),
url(r'^mailinglist/', CreateMailingList.as_view(), name='newsletters_mailinglist_create'),
url(r'^contact/(?P<pk>\d+)/edit/', UpdateContact.as_view(), name='newsletters_contact_update'),
url(r'^contact/all/$', ContactList.as_view(), name='newsletters_contact_list'),
url(r'^contact/(?P<pk>\d+)/edit/', test),
)

@ -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,

@ -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<notifier@general-servers.com>')
'Expomap<mail@expomap.ru>')
DEFAULT_HEADER_REPLY = getattr(settings, 'NEWSLETTER_DEFAULT_HEADER_REPLY',
DEFAULT_HEADER_SENDER)

@ -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/'

@ -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,
},
}

@ -0,0 +1,46 @@
{% extends 'admin/base.html' %}
{% load static %}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
<script>
$(function(){
$('#id_theme').select2({width: "element"});
$('#id_country').select2({width: "element"});
})
</script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" name="form2" id="form2" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<div class="box span10">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Изменения подписчика {{ object.contact.email }}</h2>
</div>
<div class="box-content">
{% for field in form %}
<div class="control-group {% if field.errors %}error{% endif %}">
<label class="control-label">{% if field.field.required %}<b>{{ field.label }}:</b>{% else %}{{ field.label }}{% endif %}</label>
<div class="controls">{{ field }}
<span class="help-inline">{{ field.errors }}</span>
</div>
</div>
{% endfor %}
</div>
</div>
</fieldset>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Готово">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</form>
{% endblock %}

@ -1,10 +1,47 @@
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
контакты список
</body>
</html>
{% 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>Email</th>
<th>Имя</th>
<th>Тестер</th>
<th>Подписчик</th>
<th>Потверждена подписка</th>
<th>Дата создания</th>
<th>Дата редактирования</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.email }}</td>
<td>{{ item.first_name }}</td>
<td>{% if item.tester %}<span class="label label-success">да</span>{% else %}<span class="label label-important">нет</span>{% endif %}</td>
<td>{% if item.subscriber %}<span class="label label-success">да</span>{% else %}<span class="label label-important">нет</span>{% endif %}</td>
<td>{% if item.activated %}<span class="label label-success">да</span>{% else %}<span class="label label-important">нет</span>{% endif %}</td>
<td>{{ item.creation_date|date:"Y-m-d H:i" }}</td>
<td>{{ item.modification_date|date:"Y-m-d H:i" }}</td>
<td><a href="{% url 'newsletters_contact_update' item.contactsettings.id %}">Изменить</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
{% endblock %}

@ -0,0 +1,39 @@
{% 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>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.subscribers_count }}</td>
<td>{{ item.unsubscribers_count }}</td>
<td><a href="{% url 'newsletters_mailinglist_update' item.id %}">Изменить</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="{% url 'newsletters_mailinglist_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 %}

@ -0,0 +1,31 @@
{% extends 'admin/base.html' %}
{% load static %}
{% block body %}
<form method="post" class="form-horizontal" name="form2" id="form2" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<div class="box span10">
<div class="box-header well">
<h2><i class="icon-pencil"></i>{% if object %}Изменения{% else %}Создание{% endif %} списка рассылок</h2>
</div>
<div class="box-content">
{% for field in form %}
<div class="control-group {% if field.errors %}error{% endif %}">
<label class="control-label">{% if field.field.required %}<b>{{ field.label }}:</b>{% else %}{{ field.label }}{% endif %}</label>
<div class="controls">{{ field }}
<span class="help-inline">{{ field.errors }}</span>
</div>
</div>
{% endfor %}
</div>
</div>
</fieldset>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Готово">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</form>
{% endblock %}

@ -0,0 +1,53 @@
{% extends 'admin/base.html' %}
{% load static %}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
<script>
$(function(){
$('select').select2({width: "element"});
//$('#id_country').select2({width: "element"});
})
</script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" name="form2" id="form2" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<div class="box span10">
<div class="box-header well">
<h2><i class="icon-pencil"></i>{% if object %}Изменения{% else %}Создание{% endif %} рассылки</h2>
</div>
<div class="box-content">
{% for field in form %}
<div class="control-group {% if field.errors %}error{% endif %}">
<label class="control-label">{% if field.field.required %}<b>{{ field.label }}:</b>{% else %}{{ field.label }}{% endif %}</label>
<div class="controls">{{ field }}
<span class="help-inline">{{ field.errors }}</span>
</div>
</div>
{% endfor %}
</div>
</div>
</fieldset>
<div class="box span10">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Прикрепить файлы</h2>
</div>
<div class="box-content">
</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 %}
Loading…
Cancel
Save