admin dailymail recommendation choice fix

remotes/origin/stage6
Alexander Burdeinyi 9 years ago
parent 47862cca12
commit 16310ccf07
  1. 59
      emencia/django/newsletter/admin_forms.py
  2. 8
      emencia/django/newsletter/models.py
  3. 132
      emencia/django/newsletter/templates/newsletter/recommend/create.html
  4. 1
      emencia/django/newsletter/views/admin_views.py
  5. 26
      events/admin.py
  6. 9
      events/admin_urls.py
  7. 1
      proj/admin_urls.py

@ -4,6 +4,7 @@ from collections import namedtuple
import re import re
from django import forms from django import forms
from django.core.urlresolvers import reverse
from django.utils import translation from django.utils import translation
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -24,7 +25,7 @@ from theme.models import Theme
from city.models import City from city.models import City
from country.models import Area, Country from country.models import Area, Country
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference
class ContactSettingsForm(forms.ModelForm): class ContactSettingsForm(forms.ModelForm):
city = forms.CharField(label=_(u'Город'), widget=forms.HiddenInput() ,required=False) city = forms.CharField(label=_(u'Город'), widget=forms.HiddenInput() ,required=False)
@ -248,17 +249,57 @@ class AttachmentForm(forms.ModelForm):
class NewsletterRecommendForm(forms.ModelForm): class NewsletterRecommendForm(forms.ModelForm):
rx = re.compile(r'^(?P<type>c|e)(?P<pk>\d+)$')
verbose = _(u'Создание/Редактирование рекомендации') verbose = _(u'Создание/Редактирование рекомендации')
exposition = forms.IntegerField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False) # exposition = forms.IntegerField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False)
event_models = {'c': Conference, 'e': Exposition}
event = forms.CharField(label=_(u'Событие'), widget=forms.Select())
class Meta: class Meta:
model = NewsletterRecommend model = NewsletterRecommend
fields = ('theme', 'exposition', 'fr', 'to') fields = ('theme', 'fr', 'to')
def clean_exposition(self): def __init__(self, *args, **kwargs):
expo_id = self.cleaned_data['exposition'] super(NewsletterRecommendForm, self).__init__(*args, **kwargs)
# import pdb; pdb.set_trace()
if self.instance and self.instance.pk:
event = self.instance.event()
id = event.__class__.__name__.lower()[:1] + str(event.pk)
option = u'<option value="{id}" selected="selected">{label}</option>'.format(id=id, label=event.name)
self.fields['event'].widget.render_options = lambda choices, value: option
self.initial['event'] = id
self.fields['event'].widget.attrs.update({
'data-ajax-url': reverse('admin_events_search'),
'select2': 'true',
})
def clean_event(self):
event = self.cleaned_data.get('event')
print(event)
match = self.rx.match(event)
if not match:
raise forms.ValidationError(_(u'Введены неверные данные'))
model = self.event_models.get(match.group('type'))
self.event_model = model
event_id = match.group('pk')
print(model, event_id, event)
try: try:
expo = Exposition.objects.get(id=expo_id) event = model.objects.get(pk=event_id)
except Exposition.DoesNotExist: except model.DoesNotExist:
raise forms.ValidationError(_(u'Такой выставки не существует')) raise forms.ValidationError(_(u'Такого события не существует'))
return expo return event
def save(self, commit=True):
obj = super(NewsletterRecommendForm, self).save(commit=False)
if self.cleaned_data['event']:
if self.event_model == Exposition:
obj.exposition = self.cleaned_data['event']
else:
obj.conference = self.cleaned_data['event']
if commit:
obj.save()
if not obj.pk:
obj.save()
obj.theme = self.cleaned_data['theme']
return obj

@ -256,7 +256,7 @@ class Contact(models.Model):
recommended = SearchQuerySet().models(Exposition, Conference)\ recommended = SearchQuerySet().models(Exposition, Conference)\
.filter(expohit=True, data_begin__gte=date) .filter(expohit=True, data_begin__gte=date)
if th_tg_filter: if th_tg_filter:
paid_recommend = list(paid_recommend.filter(theme__in=th_tg_structure.keys())) paid_recommend = list(paid_recommend.filter(Q(theme__in=th_tg_structure.keys()) | Q(theme__isnull=True)))
recommended = recommended.filter(th_tg_filter) recommended = recommended.filter(th_tg_filter)
try: try:
ctx['recommended'] = choice(paid_recommend).event() ctx['recommended'] = choice(paid_recommend).event()
@ -745,11 +745,11 @@ class Newsletter(models.Model):
class NewsletterRecommend(models.Model): class NewsletterRecommend(models.Model):
theme = models.ManyToManyField('theme.Theme', null=True) theme = models.ManyToManyField('theme.Theme', verbose_name=_(u'Тема'), null=True, blank=True)
exposition = models.ForeignKey('exposition.Exposition', verbose_name=_(u'Выставка'), null=True) exposition = models.ForeignKey('exposition.Exposition', verbose_name=_(u'Выставка'), null=True)
conference = models.ForeignKey('conference.Conference', verbose_name=_(u'Конференция'), null=True) conference = models.ForeignKey('conference.Conference', verbose_name=_(u'Конференция'), null=True)
fr = models.DateField(default=lambda: date.today()) fr = models.DateField(_(u'Первый день показов'), default=lambda: date.today())
to = models.DateField(blank=True, null=True) to = models.DateField(_(u'Последний день показов'), blank=True, null=True)
creation_date = models.DateTimeField(_('creation date'), auto_now_add=True) creation_date = models.DateTimeField(_('creation date'), auto_now_add=True)

@ -1,92 +1,65 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static %} {% load static %}
{% block select2 %}
<link href="{% static 'js/select2-4.0.3/css/select2.min.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select2-4.0.3/js/select2.full.min.js' %}"></script>
{% endblock select2 %}
{% block scripts %} {% block scripts %}
{# selects #} {# selects #}
<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>#}
<script src="{% static 'js/select/select2_locale_ru.js' %}"></script> {#<script src="{% static 'js/select/select2_locale_ru.js' %}"></script>#}
<script> <script>
$(function(){ function make_event_select(select){
$('#id_fr').datetimepicker({ select.select2({
todayHighlight: true, multiple: select.attr('multiple') || false,
format : 'yyyy-mm-dd', language: "ru",
minView:2 width: '550px',
}); ajax: {
$('#id_to').datetimepicker({ url: select.data('ajax-url'),
todayHighlight: true, dataType: "json",
format : 'yyyy-mm-dd', quietMillis: 200,
minView:2
});
$('#id_theme').select2({width: "element"});
$('#id_exposition').select2({
placeholder: 'Найти',
width: 'element',
ajax: {
url: '/admin/exposition/search/',
dataType: "json",
quietMillis: 200,
multiple: true,
data: function(term, page, theme){
return {term: term,
page: page};
},
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});
} data: function(params){
}); return {term: params.term,
$('#id_conference').select2({ page: params.page};
placeholder: 'Найти', },
width: 'element',
ajax: {
url: '/admin/conference/search/',
dataType: "json",
quietMillis: 200,
multiple: true,
data: function(term, page){ processResults: function (data) {
return {term: term, return {results: $.map(data, function(obj) {
page: page}; obj.text = obj.label;
}, return obj
})};
},
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});
createTag: function(params) {
return undefined;
},
});
} }
});
});
</script>
{% endblock %}
$(document).ready(function(){
$('select[select2=true], input[select2=true]').each(function() {
make_event_select($(this));
// $(this).select2_sortable();
});
$('#id_fr').datetimepicker({
todayHighlight: true,
format : 'yyyy-mm-dd',
minView:2
});
$('#id_to').datetimepicker({
todayHighlight: true,
format : 'yyyy-mm-dd',
minView:2
});
});
</script>
{% endblock %}
{% block body %} {% block body %}
<form method="post" class="form-horizontal"> <form method="post" class="form-horizontal">
@ -99,7 +72,7 @@ $(function(){
<div class="box-content"> <div class="box-content">
{% for field in form %} {% for field in form %}
<div class="control-group {% if field.errors %}error{% endif %}"> <div class="control-group {% if field.errors %}error{% endif %}">
<label class="control-label"><b>{{ field.label }}:</b></label> <label class="control-label">{% if field.field.required %}<b>{{ field.label }}:</b>{% else %}{{ field.label }}:{% endif %}</label>
<div class="controls">{{ field }} <div class="controls">{{ field }}
<span class="help-inline">{{ field.errors }}</span> <span class="help-inline">{{ field.errors }}</span>
</div> </div>
@ -114,4 +87,5 @@ $(function(){
<input class="btn btn-large" type="reset" value="Отмена"> <input class="btn btn-large" type="reset" value="Отмена">
</div> </div>
</form> </form>
<div style="display: block;height: 200px;"></div>
{% endblock %} {% endblock %}

@ -544,6 +544,7 @@ class RecommendsList(ListView):
model = NewsletterRecommend model = NewsletterRecommend
template_name = 'newsletter/recommend/list.html' template_name = 'newsletter/recommend/list.html'
class RecommendsCreateorEdit(CreateUpdateView): class RecommendsCreateorEdit(CreateUpdateView):
model = NewsletterRecommend model = NewsletterRecommend
form_class = NewsletterRecommendForm form_class = NewsletterRecommendForm

@ -3,11 +3,16 @@ from functools import update_wrapper, partial
from django.contrib import admin from django.contrib import admin
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from django.utils import translation
from haystack.query import SearchQuerySet
from modeltranslation.admin import TabbedTranslationAdmin from modeltranslation.admin import TabbedTranslationAdmin
from functions.admin import DefaultAdmin from functions.admin import DefaultAdmin
from functions.http import JsonResponse from functions.http import JsonResponse
from exposition.admin import get_by_lang
from exposition.models import Exposition
from conference.models import Conference
from .models import TargetAudience from .models import TargetAudience
@ -44,4 +49,23 @@ class TargetAudienceAdmin(DefaultAdmin, TabbedTranslationAdmin):
result = [{'id': obj.id, 'label': obj.title} for obj in qs] result = [{'id': obj.id, 'label': obj.title} for obj in qs]
return JsonResponse(result, safe=False) return JsonResponse(result, safe=False)
admin.site.register(TargetAudience, TargetAudienceAdmin) admin.site.register(TargetAudience, TargetAudienceAdmin)
def ajax_search(request):
# perpage = 30
pk_prefixes = {'conference': 'c', 'exposition': 'e'}
term = request.GET.get('term')
# page = request.GET.get('page')
lang = translation.get_language()
if not term:
qs = SearchQuerySet().models(Conference, Exposition).order_by('text')
else:
qs = SearchQuerySet().models(Conference, Exposition).autocomplete(content_auto=term.capitalize()).order_by('text')
result = []
for item in qs[:30]:
label = get_by_lang(item, 'name', lang)
if label:
result.append({'id': pk_prefixes.get(item.model_name) + item.pk, 'label': label})
return JsonResponse(result, safe=False)

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
from .admin import ajax_search
urlpatterns = patterns('',
url(r'^search/$', ajax_search, name='admin_events_search'),
)

@ -41,6 +41,7 @@ urlpatterns = required(
url(r'^stats/', include('stats_collector.admin_urls')), url(r'^stats/', include('stats_collector.admin_urls')),
url(r'^rosetta/', include('rosetta.urls')), url(r'^rosetta/', include('rosetta.urls')),
url(r'^redirects/', include('redirects.admin_urls')), url(r'^redirects/', include('redirects.admin_urls')),
url(r'^events/', include('events.admin_urls')),
url(r'^language/add/', 'directories.admin.language_add'), url(r'^language/add/', 'directories.admin.language_add'),
url(r'^currency/add/', 'directories.admin.currency_add'), url(r'^currency/add/', 'directories.admin.currency_add'),

Loading…
Cancel
Save