remotes/origin/1203
Nazar Kotjuk 10 years ago
parent adf41b6e2b
commit 81a006ed6c
  1. 34
      emencia/django/newsletter/forms.py
  2. 4
      emencia/django/newsletter/models.py
  3. 26
      emencia/django/newsletter/views/admin_views.py
  4. 213
      static/custom_js/main.js
  5. 14
      templates/admin/newsletters/popup_count.html

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Forms for emencia.django.newsletter""" """Forms for emencia.django.newsletter"""
from datetime import datetime, date, timedelta
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 django.http import Http404 from django.http import Http404
@ -8,8 +9,7 @@ from django.core.exceptions import ValidationError
from django.utils import translation from django.utils import translation
from haystack.query import SearchQuerySet from haystack.query import SearchQuerySet
from functions.search_forms import get_by_lang from functions.search_forms import get_by_lang
from emencia.django.newsletter.models import Contact, ContactSettings from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, PopupCount
from emencia.django.newsletter.models import MailingList
from functions.form_check import translit_with_separator as tr from functions.form_check import translit_with_separator as tr
from theme.models import Theme from theme.models import Theme
from country.models import Country, Area from country.models import Country, Area
@ -19,7 +19,7 @@ from city.models import City
class MailingListSubscriptionForm(forms.ModelForm): class MailingListSubscriptionForm(forms.ModelForm):
"""Form for subscribing to a mailing list""" """Form for subscribing to a mailing list"""
# Notes : This form will not check the uniquess of # Notes : This form will not check the uniquess of
# the 'email' field, by defining it explictly and setting # the 'email' field, by defining it explictly and setting6
# it the Meta.exclude list, for allowing registration # it the Meta.exclude list, for allowing registration
# to a mailing list even if the contact already exists. # to a mailing list even if the contact already exists.
# Then the contact is always added to the subscribers field # Then the contact is always added to the subscribers field
@ -94,7 +94,7 @@ class ContactSettingsForm(forms.ModelForm):
return Theme.objects.none() return Theme.objects.none()
from datetime import datetime
class ContactFilterForm(forms.Form): class ContactFilterForm(forms.Form):
email = forms.EmailField( email = forms.EmailField(
@ -334,4 +334,28 @@ class SubscribeSettingsForm(AbstractSubscribeForm):
return contactsettings return contactsettings
def clean_email(self): def clean_email(self):
return self.cleaned_data['email'] return self.cleaned_data['email']
from django.db.models import Sum
class PopupCountFilter(forms.Form):
fr = forms.DateField(required=False)
to = forms.DateField(required=False)
def filter(self):
fr = self.cleaned_data.get('fr')
to = self.cleaned_data.get('to')
if not fr and not to:
fr = date.today()
qs = PopupCount.objects.filter(date__gte=fr)
contacts = Contact.objects.filter(creation_date__gte=fr)
if to:
contacts = contacts.filter(creation_date__lte=to+timedelta(days=1))
qs = qs.filter(date__lte=to)
subscribed = contacts.count()
activated = contacts.filter(activated=True).count()
popups = qs.aggregate(count=Sum('cnt'))['count']
return {'subscribed': subscribed, 'activated': activated, 'popups': popups}

@ -564,9 +564,9 @@ class PopupCount(models.Model):
ordering = ['-date'] ordering = ['-date']
def get_subscr(self): def get_subscr(self):
qs = Contact.objects.filter(creation_date=self.date) qs = Contact.objects.filter(creation_date__startswith=self.date)
return qs.count() return qs.count()
def get_active(self): def get_active(self):
qs = Contact.objects.filter(creation_date=self.date, activated=True) qs = Contact.objects.filter(creation_date__startswith=self.date, activated=True)
return qs.count() return qs.count()

@ -11,6 +11,7 @@ from HTMLParser import HTMLParseError
from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment, ContactMailingStatus from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment, ContactMailingStatus
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 emencia.django.newsletter.forms import PopupCountFilter
from ..forms import ContactFilterForm, ContactImportForm 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
@ -347,12 +348,32 @@ def count_popups(request):
obj.save() obj.save()
return HttpResponse(obj.cnt, content_type='application/json') return HttpResponse(obj.cnt, content_type='application/json')
from django.db.models import Sum
class PopupStatisticsView(FormView):
form_class = PopupCountFilter
template_name = 'admin/newsletters/popup_count.html'
def get(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = form_class(request.GET)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
data = form.filter()
data['form'] = form
return self.render_to_response(data)
"""
class PopupStatisticsView(TemplateView): class PopupStatisticsView(TemplateView):
model = PopupCount model = PopupCount
template_name='admin/newsletters/popup_count.html' template_name = 'admin/newsletters/popup_count.html'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
qs = PopupCount.objects.all() qs = PopupCount.objects.all()
@ -369,3 +390,4 @@ class PopupStatisticsView(TemplateView):
res = {'cnt':0, 'subscr':0, 'active':0} res = {'cnt':0, 'subscr':0, 'active':0}
return self.render_to_response({'object':res}) return self.render_to_response({'object':res})
"""

@ -236,138 +236,141 @@ $(document).ready(function(){
return false; return false;
}); });
// end on-of events // end on-of events
if( $("#id_city" ).length ) {
$('#id_city').select2({
$('#id_city').select2({
placeholder: "Город", placeholder: "Город",
width: 'element', width: 'element',
ajax: { ajax: {
url: "/admin/city/search/", url: "/admin/city/search/",
dataType: "json", dataType: "json",
quietMillis: 200, quietMillis: 200,
data: function(term, page, country){ data: function(term, page, country){
var country = $('#id_country').val() var country = $('#id_country').val()
return {term: term, return {term: term,
page: page, page: page,
country: country}; country: country};
},
results: function (data) {
var results = [];
$.each(data, function(index, item){
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
}, },
initSelection : function(element, callback) {
var id= $(element).val();
var text = $(element).attr('data-init-text');
callback({id: id, text:text});
results: function (data) {
var results = [];
$.each(data, function(index, item){
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
} }
},
initSelection : function(element, callback) {
var id= $(element).val();
var text = $(element).attr('data-init-text');
callback({id: id, text:text});
}
}); });
}
$('#id_main_page_news').select2({ if( $("#id_main_page_news" ).length ) {
$('#id_main_page_news').select2({
placeholder: "Новости", placeholder: "Новости",
multiple: true, multiple: true,
width: '100%', width: '100%',
ajax: { ajax: {
url: "/admin/ajax/get-news/", url: "/admin/ajax/get-news/",
dataType: "json", dataType: "json",
quietMillis: 200, quietMillis: 200,
data: function(term, page){ data: function(term, page){
return {term: term, return {term: term,
page: page}; page: page};
}, },
results: function (data) { results: function (data) {
var results = []; var results = [];
$.each(data, function(index, item){ $.each(data, function(index, item){
results.push({ results.push({
id: item.id, id: item.id,
text: item.label text: item.label
});
}); });
return {results: results};
}
},
initSelection : function(element, callback) {
var text = $(element).attr('data-init-text');
var data = $.parseJSON(text);
console.log(data);
/*
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
}); });
return {results: results}; console.log(data)
*/
callback(data);
} }
},
initSelection : function(element, callback) {
var text = $(element).attr('data-init-text');
var data = $.parseJSON(text);
console.log(data);
/*
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
console.log(data)
*/
callback(data);
} });
}); }
// selects if( $("#id_main_page_news" ).length ) {
$('#id_tag').select2({ $('#id_tag').select2({
placeholder: "Теги", placeholder: "Теги",
width: '550px', width: '550px',
multiple: true, multiple: true,
ajax: { ajax: {
url: "/admin/theme/tag/search/", url: "/admin/theme/tag/search/",
dataType: "json", dataType: "json",
quietMillis: 200, quietMillis: 200,
multiple: true, multiple: true,
data: function(term, page, theme){ data: function(term, page, theme){
var theme = $('#id_theme').serialize(); var theme = $('#id_theme').serialize();
return {term: term, return {term: term,
page: page, page: page,
theme: theme}; theme: theme};
}, },
results: function (data) { results: function (data) {
var results = []; var results = [];
$.each(data, function(index, item){ $.each(data, function(index, item){
results.push({ results.push({
id: item.id, id: item.id,
text: item.label text: item.label
});
}); });
return {results: results};
}
},
initSelection : function(element, callback) {
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
}); });
return {results: results}; callback(data);
} }
},
initSelection : function(element, callback) {
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
callback(data);
} });
}
});
// end selects // end selects
/* /*
*/ */
@ -486,12 +489,14 @@ $(document).ready(function(){
} }
}); });
}); });
if($('select').length){
$('select').select2({ $('select').select2({
width: 'element', width: 'element',
allowClear: true allowClear: true
});//end select });
}
}); });

@ -17,8 +17,8 @@
<div class="box-content"> <div class="box-content">
<form id="id_form" class="form-inline"> <form id="id_form" class="form-inline">
<div class="control-group"> <div class="control-group">
<label for="from">С: </label><input type="text" name="from" class="filter-date margin-sides-15px"> <label for="from">С: </label><!--<input type="text" name="fr" class="filter-date margin-sides-15px"> -->{{ form.fr }}
<label for="to">По: </label><input type="text" name="to" class="filter-date margin-sides-15px"> <label for="to">По: </label>{{ form.to }}
<button id="submit" class="btn btn-primary margin-sides-15px">Фильтровать</button> <button id="submit" class="btn btn-primary margin-sides-15px">Фильтровать</button>
</div> </div>
</form> </form>
@ -32,15 +32,15 @@
<tbody> <tbody>
<tr> <tr>
<td>Показов</td> <td>Показов</td>
<td>{{ object.cnt }}</td> <td>{{ popups }}</td>
</tr> </tr>
<tr> <tr>
<td>Подписалось</td> <td>Подписалось</td>
<td>{{ object.subscr }}</td> <td>{{ subscribed }}</td>
</tr> </tr>
<tr> <tr>
<td>Подтверждено</td> <td>Подтверждено</td>
<td>{{ object.active }}</td> <td>{{ activated }}</td>
</tr> </tr>
</tbody> </tbody>
@ -52,9 +52,9 @@
</div> </div>
<script> <script>
$(document).ready(function(){ $(document).ready(function(){
$(".filter-date").datetimepicker({ $("#id_fr, #id_to").datetimepicker({
todayHighlight: true, todayHighlight: true,
format: 'dd.mm.yyyy', format: 'yyyy-mm-dd',
minView: 2 minView: 2
}); });
}); });

Loading…
Cancel
Save