diff --git a/emencia/django/newsletter/admin_forms.py b/emencia/django/newsletter/admin_forms.py index 61aed16f..0f7a9aae 100644 --- a/emencia/django/newsletter/admin_forms.py +++ b/emencia/django/newsletter/admin_forms.py @@ -4,6 +4,7 @@ from collections import namedtuple import re from django import forms +from django.core.urlresolvers import reverse from django.utils import translation from django.utils.translation import ugettext_lazy as _ @@ -24,7 +25,7 @@ from theme.models import Theme from city.models import City from country.models import Area, Country from exposition.models import Exposition - +from conference.models import Conference class ContactSettingsForm(forms.ModelForm): city = forms.CharField(label=_(u'Город'), widget=forms.HiddenInput() ,required=False) @@ -248,17 +249,57 @@ class AttachmentForm(forms.ModelForm): class NewsletterRecommendForm(forms.ModelForm): + rx = re.compile(r'^(?Pc|e)(?P\d+)$') 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: model = NewsletterRecommend - fields = ('theme', 'exposition', 'fr', 'to') + fields = ('theme', 'fr', 'to') - def clean_exposition(self): - expo_id = self.cleaned_data['exposition'] + def __init__(self, *args, **kwargs): + 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''.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: - expo = Exposition.objects.get(id=expo_id) - except Exposition.DoesNotExist: - raise forms.ValidationError(_(u'Такой выставки не существует')) - return expo + event = model.objects.get(pk=event_id) + except model.DoesNotExist: + raise forms.ValidationError(_(u'Такого события не существует')) + 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 \ No newline at end of file diff --git a/emencia/django/newsletter/models.py b/emencia/django/newsletter/models.py index 4423c74a..9d32262c 100644 --- a/emencia/django/newsletter/models.py +++ b/emencia/django/newsletter/models.py @@ -256,7 +256,7 @@ class Contact(models.Model): recommended = SearchQuerySet().models(Exposition, Conference)\ .filter(expohit=True, data_begin__gte=date) 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) try: ctx['recommended'] = choice(paid_recommend).event() @@ -745,11 +745,11 @@ class Newsletter(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) conference = models.ForeignKey('conference.Conference', verbose_name=_(u'Конференция'), null=True) - fr = models.DateField(default=lambda: date.today()) - to = models.DateField(blank=True, null=True) + fr = models.DateField(_(u'Первый день показов'), default=lambda: date.today()) + to = models.DateField(_(u'Последний день показов'), blank=True, null=True) creation_date = models.DateTimeField(_('creation date'), auto_now_add=True) diff --git a/emencia/django/newsletter/templates/newsletter/recommend/create.html b/emencia/django/newsletter/templates/newsletter/recommend/create.html index 754a11ba..ee15c529 100644 --- a/emencia/django/newsletter/templates/newsletter/recommend/create.html +++ b/emencia/django/newsletter/templates/newsletter/recommend/create.html @@ -1,92 +1,65 @@ {% extends 'base.html' %} {% load static %} +{% block select2 %} + + +{% endblock select2 %} + {% block scripts %} {# selects #} - - - -#} +{##} + -{% 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 + }); + }); + +{% endblock %} {% block body %}
@@ -99,7 +72,7 @@ $(function(){
{% for field in form %}
- +
{{ field }} {{ field.errors }}
@@ -114,4 +87,5 @@ $(function(){
+
{% endblock %} diff --git a/emencia/django/newsletter/views/admin_views.py b/emencia/django/newsletter/views/admin_views.py index 0685ddd2..ace097f3 100644 --- a/emencia/django/newsletter/views/admin_views.py +++ b/emencia/django/newsletter/views/admin_views.py @@ -544,6 +544,7 @@ class RecommendsList(ListView): model = NewsletterRecommend template_name = 'newsletter/recommend/list.html' + class RecommendsCreateorEdit(CreateUpdateView): model = NewsletterRecommend form_class = NewsletterRecommendForm diff --git a/events/admin.py b/events/admin.py index 5bdb573b..5c2dc1ad 100644 --- a/events/admin.py +++ b/events/admin.py @@ -3,11 +3,16 @@ from functools import update_wrapper, partial from django.contrib import admin from django.conf.urls import patterns, url +from django.utils import translation +from haystack.query import SearchQuerySet from modeltranslation.admin import TabbedTranslationAdmin from functions.admin import DefaultAdmin 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 @@ -44,4 +49,23 @@ class TargetAudienceAdmin(DefaultAdmin, TabbedTranslationAdmin): result = [{'id': obj.id, 'label': obj.title} for obj in qs] return JsonResponse(result, safe=False) -admin.site.register(TargetAudience, TargetAudienceAdmin) \ No newline at end of file +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) diff --git a/events/admin_urls.py b/events/admin_urls.py new file mode 100644 index 00000000..74d14b39 --- /dev/null +++ b/events/admin_urls.py @@ -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'), + +) \ No newline at end of file diff --git a/proj/admin_urls.py b/proj/admin_urls.py index c25b39ea..781f0f13 100644 --- a/proj/admin_urls.py +++ b/proj/admin_urls.py @@ -41,6 +41,7 @@ urlpatterns = required( url(r'^stats/', include('stats_collector.admin_urls')), url(r'^rosetta/', include('rosetta.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'^currency/add/', 'directories.admin.currency_add'),