diff --git a/conference/admin.py b/conference/admin.py index 0f1d5d52..787e19e0 100644 --- a/conference/admin.py +++ b/conference/admin.py @@ -351,12 +351,12 @@ def upload_conference_photo(request, conf_id): def search_conf(request): - term = request.GET['term'].capitalize() + term = request.GET.get('term') lang = translation.get_language() if not term: qs = SearchQuerySet().models(Conference).order_by('text')[:30] else: - qs = SearchQuerySet().models(Conference).autocomplete(content_auto=term).order_by('text')[:30] + qs = SearchQuerySet().models(Conference).autocomplete(content_auto=term.capitalize()).order_by('text')[:30] result = [] for item in qs: diff --git a/conference/models.py b/conference/models.py index 93e01883..464bbe35 100644 --- a/conference/models.py +++ b/conference/models.py @@ -149,6 +149,8 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): _(u'Минимальная цена'), choices=PRICE_EUR, blank=True, null=True, db_index=True) price_eur = models.PositiveIntegerField(verbose_name=_(u'Цена в евро'), blank=True, null=True) + comments = generic.GenericRelation('comments.Comment') + def __unicode__(self): return self.lazy_translation_getter('name', unicode(self.pk)) diff --git a/conference/views.py b/conference/views.py index 5efc65da..2bfbad33 100644 --- a/conference/views.py +++ b/conference/views.py @@ -451,11 +451,11 @@ class ConferenceDetail(ObjectStatMixin, CommentMixin, JitterCacheMixin, Metadata if city: return HttpResponseRedirect('/conference/city/%s/'%city.url) except Exception: - try: - return super(ConferenceDetail, self).dispatch(request, *args, **kwargs) - except: - raise Http404('NotFound') - + # try: + return super(ConferenceDetail, self).dispatch(request, *args, **kwargs) + # except Ex: + # raise Http404('NotFound') + # def get_context_data(self, **kwargs): lang = translation.get_language() context = super(ConferenceDetail, self).get_context_data(**kwargs) diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index 0b71db55..4224d91a 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -6,12 +6,15 @@ import xlrd from django import forms from django.core.exceptions import ValidationError -from django.db.models import Sum +from django.db.models import Sum, Q from django.http import Http404 from django.utils import translation from django.utils.translation import ugettext_lazy as _ from django.utils.translation import get_language from django.utils.encoding import smart_text, force_text + +from conference.models import Conference +from exposition.models import Exposition from functions.forms import ML_ModelMultipleChoiceField from haystack.query import SearchQuerySet @@ -252,6 +255,10 @@ class ContactFilterForm(forms.Form): label="Area", choices=[(c.id, c.name) for c in list(set(Area.objects.language()))], required=False ) + exposition = ML_ModelMultipleChoiceField(label=_(u'Новости по выставкам'), queryset=Exposition.objects.all(), required=False) + conference = ML_ModelMultipleChoiceField(label=_(u'Новости по конференциям'), queryset=Conference.objects.all(), required=False) + event_news = forms.BooleanField(label=_(u'Подписка на новости хотя бы по 1 событию'), required=False) + mailinglist = forms.ModelChoiceField( queryset=MailingList.objects.all(), label="Список рассылки", @@ -304,6 +311,15 @@ class ContactFilterForm(forms.Form): qs = qs.filter(subscriber=False) else: qs = qs.filter(subscriber=True) + if self.cleaned_data.get('event_news'): + qs = qs.filter(Q(conferences__isnull=False) | Q(expositions__isnull=False)) + else: + q = Q() + if self.cleaned_data.get('conference'): + q = Q(conferences__in=self.cleaned_data.get('conference')) + if self.cleaned_data.get('expositions'): + q |= Q(conferences__in=self.cleaned_data.get('expositions')) + qs = qs.filter(q) types = self.cleaned_data.get('types_choice') if types == types_choice.USERS: diff --git a/emencia/django/newsletter/migrations/0016_auto__add_field_contact_from_events.py b/emencia/django/newsletter/migrations/0016_auto__add_field_contact_from_events.py index f2ae21f5..bec0080f 100644 --- a/emencia/django/newsletter/migrations/0016_auto__add_field_contact_from_events.py +++ b/emencia/django/newsletter/migrations/0016_auto__add_field_contact_from_events.py @@ -8,9 +8,9 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - # Adding field 'Contact.events_news' - db.add_column(u'newsletter_contact', 'events_news', - self.gf('django.db.models.fields.BooleanField')(default=False), + # Adding field 'Contact.dailymailing' + db.add_column(u'newsletter_contact', 'dailymailing', + self.gf('django.db.models.fields.BooleanField')(default=True), keep_default=False) # Adding M2M table for field conferences on 'Contact' @@ -33,8 +33,8 @@ class Migration(SchemaMigration): def backwards(self, orm): - # Deleting field 'Contact.events_news' - db.delete_column(u'newsletter_contact', 'events_news') + # Deleting field 'Contact.dailymailing' + db.delete_column(u'newsletter_contact', 'dailymailing') # Removing M2M table for field conferences on 'Contact' db.delete_table(db.shorten_name(u'newsletter_contact_conferences')) @@ -98,6 +98,18 @@ class Migration(SchemaMigration): 'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}) }, + u'comments.comment': { + 'Meta': {'object_name': 'Comment'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comments.Comment']", 'null': 'True', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounts.User']"}) + }, u'company.company': { 'Meta': {'ordering': "['-rating', 'id']", 'unique_together': '()', 'object_name': 'Company', 'index_together': '()'}, 'address': ('functions.custom_fields.LocationField', [], {'blank': 'True'}), @@ -256,7 +268,7 @@ class Migration(SchemaMigration): 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'customer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Customer']", 'null': 'True', 'blank': 'True'}), 'flash': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2016, 11, 22, 0, 0)'}), + 'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2016, 11, 23, 0, 0)'}), 'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'banners'", 'null': 'True', 'to': u"orm['expobanner.BannerGroup']"}), 'html': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), @@ -329,7 +341,7 @@ class Migration(SchemaMigration): 'country': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['country.Country']", 'null': 'True', 'blank': 'True'}), 'excluded_cities': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['city.City']", 'null': 'True', 'blank': 'True'}), 'excluded_tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Tag']", 'null': 'True', 'blank': 'True'}), - 'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2016, 11, 22, 0, 0)'}), + 'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2016, 11, 23, 0, 0)'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'link': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Banner']"}), 'months': ('functions.custom_fields.MonthMultiSelectField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}), @@ -438,7 +450,7 @@ class Migration(SchemaMigration): u'newsletter.contact': { 'Meta': {'ordering': "('-modification_date',)", 'object_name': 'Contact'}, 'activated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'activation_code': ('django.db.models.fields.CharField', [], {'default': "'f0ee2280ab463a4d1e0c68acfbe98b44115b34a2'", 'max_length': '40'}), + 'activation_code': ('django.db.models.fields.CharField', [], {'default': "'a1d2fb1379a544e39c9d2ff60f931eef3bf850de'", 'max_length': '40'}), 'area': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['country.Area']", 'null': 'True', 'blank': 'True'}), 'conferences': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['conference.Conference']", 'null': 'True', 'symmetrical': 'False'}), 'content_articles': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), @@ -446,8 +458,8 @@ class Migration(SchemaMigration): 'content_overview': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}), 'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'dailymailing': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '255'}), - 'events_news': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'expositions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['exposition.Exposition']", 'null': 'True', 'symmetrical': 'False'}), 'f_countries': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['country.Country']", 'null': 'True', 'blank': 'True'}), 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), @@ -543,7 +555,7 @@ class Migration(SchemaMigration): 'conference': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['conference.Conference']", 'null': 'True'}), 'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'exposition': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['exposition.Exposition']", 'null': 'True'}), - 'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2016, 11, 22, 0, 0)'}), + 'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2016, 11, 23, 0, 0)'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'theme': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['theme.Theme']", 'null': 'True', 'symmetrical': 'False'}), 'to': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}) diff --git a/emencia/django/newsletter/models.py b/emencia/django/newsletter/models.py index 50d8b1e9..9a24977d 100644 --- a/emencia/django/newsletter/models.py +++ b/emencia/django/newsletter/models.py @@ -151,7 +151,7 @@ class Contact(models.Model): ) activated = models.BooleanField(default=False) from_users = models.BooleanField(default=False) - events_news = models.BooleanField(default=False) + dailymailing = models.BooleanField(default=True) moscow = models.BooleanField(_(u'Москва'), blank=True, default=True) russia = models.BooleanField(_(u'Россия'), blank=True, default=True) diff --git a/events/views.py b/events/views.py index 25dd43e6..6331ade0 100644 --- a/events/views.py +++ b/events/views.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- from django.core.exceptions import ObjectDoesNotExist +from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import Q from django.http import Http404 from django.http import HttpResponseForbidden from django.http import HttpResponseNotFound +from django.http import HttpResponsePermanentRedirect from django.views.generic.edit import FormMixin, FormView from django.conf import settings from django.template.loader import render_to_string @@ -91,11 +93,12 @@ class FilterListView(ReverseOrderMixin, FilterListView_): class SubscribeView(FormView): form_class = ContactForm template_name = None + redirect_url = reverse_lazy('subscription_activation_send') models = {'expo': (Exposition, 'expositions'), 'conf': (Conference, 'conferences')} defaults = { - 'activated': True, - 'from_events': True, - 'subscriber': False, + # 'activated': True, + # 'from_events': True, + 'dailymailing': False, } def get_event(self): @@ -114,7 +117,6 @@ class SubscribeView(FormView): 'last_name': user.last_name, 'email': user.email, 'user': user, - 'subscriber': False, } defaults.update(self.defaults) try: @@ -124,6 +126,14 @@ class SubscribeView(FormView): contact.save() return contact + def get_form_kwargs(self): + """ + Returns the keyword arguments for instantiating the form. + """ + kwargs = super(SubscribeView, self).get_form_kwargs() + kwargs.update({'instance': self.object}) + return kwargs + def dispatch(self, request, *args, **kwargs): if not request.is_ajax(): return HttpResponseForbidden() @@ -135,25 +145,19 @@ class SubscribeView(FormView): return HttpResponseNotFound() return super(SubscribeView, self).dispatch(request, *args, **kwargs) - # def get_form(self, form_class): - # form = super(SubscribeView, self).get_form(form_class) - # form.fields['email'].error_messages.update({ - # 'unique': _(u'Тест') - # }) - # # import pdb; pdb.set_trace() - # return form - def form_invalid(self, form): return JsonResponse({'errors': form.errors}) def form_valid(self, form): contact = form.save(commit=False) + contact.dailymailing = False + contact.save() contact.send_activation() - return self.success_responce() + return self.success_responce(sent=True) - def success_responce(self): + def success_responce(self, sent=False): self.set_event() - return JsonResponse({'success': True}) + return JsonResponse({'success': True, 'sent': sent, 'redirect_url': str(self.redirect_url)}) def post(self, request, *args, **kwargs): if request.user.is_authenticated(): diff --git a/exposition/admin.py b/exposition/admin.py index 18b52db2..9e147fc3 100644 --- a/exposition/admin.py +++ b/exposition/admin.py @@ -360,12 +360,12 @@ def get_by_lang(item, field, lang='en'): return getattr(item, field+'_'+lang) def search_expo(request): - term = request.GET['term'].capitalize() + term = request.GET.get('term') lang = translation.get_language() if not term: qs = SearchQuerySet().models(Exposition).order_by('text')[:30] else: - qs = SearchQuerySet().models(Exposition).autocomplete(content_auto=term).order_by('text')[:30] + qs = SearchQuerySet().models(Exposition).autocomplete(content_auto=term.capitalize()).order_by('text')[:30] result = [] for item in qs: label = get_by_lang(item, 'name', lang) diff --git a/static/client/js/_modules/page.exposition.object.js b/static/client/js/_modules/page.exposition.object.js index 4d0cb5fd..1e81b9de 100644 --- a/static/client/js/_modules/page.exposition.object.js +++ b/static/client/js/_modules/page.exposition.object.js @@ -178,7 +178,16 @@ if (EXPO.exposition.object){ clearValue(); dataLayer.push({'event': 'event-news-subscribe-form'}); $('input:text',$form).val(''); - $.fancybox.close(); + $('p#success').show(); + if (data.sent == true) { + window.location = data.redirect_url; + } else { + window.setTimeout(function () { + $.fancybox.close(); + }, 1000); + } + + } $waiter.hide(); }; diff --git a/templates/c_admin/newsletters/contact_list.html b/templates/c_admin/newsletters/contact_list.html index 05bf5a21..8d64f897 100644 --- a/templates/c_admin/newsletters/contact_list.html +++ b/templates/c_admin/newsletters/contact_list.html @@ -63,6 +63,30 @@ + +