diff --git a/accounts/views.py b/accounts/views.py index 7914738d..746b247d 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -7,7 +7,7 @@ from sorl.thumbnail import get_thumbnail from django.core.urlresolvers import reverse, reverse_lazy from django.shortcuts import get_object_or_404 -from django.http import HttpResponseRedirect, HttpResponse, Http404, HttpResponseBadRequest +from django.http import HttpResponseRedirect, HttpResponse, Http404, HttpResponseBadRequest, HttpResponseForbidden from django.contrib.auth.decorators import login_required from django.utils.translation import ugettext as _, get_language from django_messages.forms import SendForm @@ -112,6 +112,12 @@ class MailingSettings(ContextMixin, AjaxableResponseMixin, CreateUpdateView): instance = Contact.objects.get(email=self.request.user.email) except Contact.DoesNotExist: pass + elif 'ml_contact_pk' in self.request.session: + try: + instance = Contact.objects.get(pk=self.request.session['ml_contact_pk']) + except Contact.DoesNotExist: + pass + if instance is not None: self.extra_ctx.update({ 'checked_f_countries': list(instance.f_countries.values_list('pk', flat=True)), @@ -119,20 +125,22 @@ class MailingSettings(ContextMixin, AjaxableResponseMixin, CreateUpdateView): 'checked_tg': list(instance.tags.values_list('pk', flat=True)), 'checked_th': list(instance.themes.values_list('pk', flat=True)), }) + elif not self.request.user.is_authenticated(): + raise HttpResponseForbidden() return instance - def form_valid(self, form): - print(form.cleaned_data) - print(form.errors) - print(self.request.POST) - # import pdb; pdb.set_trace() - return super(MailingSettings, self).form_valid(form) - - def form_invalid(self, form): - print(form.cleaned_data) - print(form.errors) - print(self.request.POST) - return super(MailingSettings, self).form_invalid(form) + # def form_valid(self, form): + # print(form.cleaned_data) + # print(form.errors) + # print(self.request.POST) + # # import pdb; pdb.set_trace() + # return super(MailingSettings, self).form_valid(form) + + # def form_invalid(self, form): + # print(form.cleaned_data) + # print(form.errors) + # print(self.request.POST) + # return super(MailingSettings, self).form_invalid(form) class CalendarView(TemplateView): diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index 85dada87..eb0599e1 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -11,6 +11,7 @@ from django.forms.models import ModelChoiceIterator 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 haystack.query import SearchQuerySet @@ -158,6 +159,13 @@ class MailingSettingsForm(forms.ModelForm): if self.instance and self.instance.pk: # area self.initial['area'] = set(self.instance.f_countries.values_list('area_id', flat=True)) + area_q = Area.objects.language().all().order_by('name') + where = " `{db_table}_translation`.`language_code` = '{lang}' "\ + .format( + db_table=Area._meta.db_table, + lang=get_language()) + area_q = area_q.extra(where=[where]) + self.fields['area'].queryset = area_q # foreign countries self.fields['f_countries'].c_queryset = self.instance.f_countries.distinct() @@ -203,7 +211,7 @@ class MailingSettingsForm(forms.ModelForm): if countries_add: obj.f_countries.add(*countries_add) - obj.r_cities = self.cleaned_data['r_cities'] or [] + obj.r_cities = self.cleaned_data.get('r_cities') or [] obj.tags = self.cleaned_data.get('tg') or [] obj.themes = self.cleaned_data.get('th') or [] obj.save() diff --git a/emencia/django/newsletter/models.py b/emencia/django/newsletter/models.py index 3ed48a26..9913ac30 100644 --- a/emencia/django/newsletter/models.py +++ b/emencia/django/newsletter/models.py @@ -6,6 +6,8 @@ from datetime import date from datetime import timedelta from dateutil import relativedelta from email.MIMEImage import MIMEImage +from random import choice +from itertools import chain import copy import operator @@ -25,7 +27,7 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Group from django.template.loader import render_to_string, get_template from django.template import Context - +from django.http import QueryDict from emencia.django.newsletter.managers import ContactManager from emencia.django.newsletter.settings import BASE_PATH @@ -198,15 +200,19 @@ class Contact(models.Model): return reverse('admin:newsletter_contact_change', args=(self.pk,)) def get_announce_context_v2(self, date=None): + # import error + from emencia.django.newsletter.utils.tokens import tokenize + date = date or datetime.today().date() activate('ru') ctx = { - 'recomended': [], + 'recommended': [], 'moscow': [], 'russia': [], 'foreign': [], 'news': [], 'blog': [], + 'mailing_settings_url': reverse('newsletter-authmailingsettings', args=tokenize(self)), } th_tg_filter_params = [] th_tg_structure = {} @@ -223,14 +229,22 @@ class Contact(models.Model): th_tg_filter_params.append(SQ(**p)) th_tg_filter = reduce(operator.or_, th_tg_filter_params) - # recomended - recomended = RelatedSearchQuerySet().models(Exposition, Conference) + # recommended + paid_recommend = NewsletterRecommend.objects.filter( + fr__gte=date, + to__lte=date) + recommended = RelatedSearchQuerySet().models(Exposition, Conference)\ + .filter(expohit=True) if th_tg_filter: - recomended = recomended.filter(th_tg_filter) + paid_recommend = list(paid_recommend.filter(theme__in=th_tg_structure.keys())) + recommended = recommended.filter(th_tg_filter) try: - ctx['recomended'] = recomended[0] + ctx['recommended'] = choice(paid_recommend) except: - pass + try: + ctx['recommended'] = recommended[0] + except: + pass # moscow if self.moscow: @@ -239,6 +253,12 @@ class Contact(models.Model): if th_tg_filter is not None: moscow_sqs = moscow_sqs.filter(th_tg_filter) ctx['moscow'] = moscow_sqs.order_by('data_begin')[:4] + moscow_filter_url = QueryDict('', mutable=True) + moscow_filter_url.setlist('theme', th_tg_structure.keys()) + moscow_filter_url.setlist('tag', list(chain(th_tg_structure.values()))) + moscow_filter_url['city'] = settings.MOSCOW_PK + moscow_filter_url['date_from'] = date.strftime('%d.%m.%Y') + ctx['moscow_filter_url'] = moscow_filter_url.urlencode() # russia if self.russia: @@ -252,7 +272,12 @@ class Contact(models.Model): if th_tg_filter is not None: russia_sqs = russia_sqs.filter(th_tg_filter) ctx['russia'] = russia_sqs.order_by('data_begin')[:3] - + russia_filter_url = QueryDict('', mutable=True) + russia_filter_url.setlist('theme', th_tg_structure.keys()) + russia_filter_url.setlist('tag', list(chain(th_tg_structure.values()))) + russia_filter_url['country'] = settings.RUSSIA_PK + russia_filter_url['date_from'] = r_date.strftime('%d.%m.%Y') + ctx['russia_filter_url'] = russia_filter_url.urlencode() # foreign if self.foreign: @@ -262,6 +287,12 @@ class Contact(models.Model): if th_tg_filter is not None: foreign_sqs = foreign_sqs.filter(th_tg_filter) ctx['foreign'] = foreign_sqs.order_by('data_begin')[:4] + foreign_filter_url = QueryDict('', mutable=True) + foreign_filter_url.setlist('theme', th_tg_structure.keys()) + foreign_filter_url.setlist('tag', list(chain(th_tg_structure.values()))) + foreign_filter_url.setlist('country', f_countries) + foreign_filter_url['date_from'] = date.strftime('%d.%m.%Y') + ctx['foreign_filter_url'] = foreign_filter_url.urlencode() # news if self.content_news: diff --git a/emencia/django/newsletter/urls/mailing_list.py b/emencia/django/newsletter/urls/mailing_list.py index a42238b6..be50064a 100644 --- a/emencia/django/newsletter/urls/mailing_list.py +++ b/emencia/django/newsletter/urls/mailing_list.py @@ -1,35 +1,42 @@ """Urls for the emencia.django.newsletter Mailing List""" from django.conf.urls import url from django.conf.urls import patterns -from emencia.django.newsletter.views.mailing_list import UnsubscribeView, UnsubscriptionSuccess +from emencia.django.newsletter.views.mailing_list import UnsubscribeView +from emencia.django.newsletter.views.mailing_list import UnsubscriptionSuccess +from emencia.django.newsletter.views.mailing_list import AuthMailingSettings from emencia.django.newsletter.forms import MailingListSubscriptionForm from emencia.django.newsletter.forms import AllMailingListSubscriptionForm urlpatterns = patterns('emencia.django.newsletter.views.mailing_list', - url(r'^unsubscribe/hard/(?P[-\w]+)/(?P[0-9A-Za-z]+)-(?P.+)/$', - 'view_mailinglist_unsubscribe', - name='newsletter_mailinglist_unsubscribe_hard'), - - url(r'^unsubscribe/(?P[-\w]+)/(?P[0-9A-Za-z]+)-(?P.+)/$', - UnsubscribeView.as_view(), - name='newsletter_mailinglist_unsubscribe'), - - url(r'^unsubscribe/handle/$', - 'unsubscription_handle', - name='newsletter_mailinglist_unsubscribe_handle'), - - url(r'^unsubscribe/success/$', - UnsubscriptionSuccess.as_view(), - name='newsletter_mailinglist_unsubscribe_success'), - - url(r'^subscribe/(?P\d+)/', - 'view_mailinglist_subscribe', - {'form_class': MailingListSubscriptionForm}, - name='newsletter_mailinglist_subscribe'), - url(r'^subscribe/', - 'view_mailinglist_subscribe', - {'form_class': AllMailingListSubscriptionForm}, - name='newsletter_mailinglist_subscribe_all'), - ) + url(r'^unsubscribe/hard/(?P[-\w]+)/(?P[0-9A-Za-z]+)-(?P.+)/$', + 'view_mailinglist_unsubscribe', + name='newsletter_mailinglist_unsubscribe_hard'), + + url(r'^unsubscribe/(?P[-\w]+)/(?P[0-9A-Za-z]+)-(?P.+)/$', + UnsubscribeView.as_view(), + name='newsletter_mailinglist_unsubscribe'), + + url(r'^unsubscribe/handle/$', + 'unsubscription_handle', + name='newsletter_mailinglist_unsubscribe_handle'), + + url(r'^unsubscribe/success/$', + UnsubscriptionSuccess.as_view(), + name='newsletter_mailinglist_unsubscribe_success'), + + url(r'^subscribe/(?P\d+)/', + 'view_mailinglist_subscribe', + {'form_class': MailingListSubscriptionForm}, + name='newsletter_mailinglist_subscribe'), + url(r'^subscribe/', + 'view_mailinglist_subscribe', + {'form_class': AllMailingListSubscriptionForm}, + name='newsletter_mailinglist_subscribe_all'), + + url(r'^settings/(?P[0-9A-Za-z]+)-(?P.+)/$', + AuthMailingSettings.as_view(), + name='newsletter-authmailingsettings'), + +) diff --git a/emencia/django/newsletter/views/mailing_list.py b/emencia/django/newsletter/views/mailing_list.py index 3472522c..1e718993 100644 --- a/emencia/django/newsletter/views/mailing_list.py +++ b/emencia/django/newsletter/views/mailing_list.py @@ -5,7 +5,7 @@ from django.shortcuts import get_object_or_404 from django.shortcuts import render_to_response from django.contrib import messages from django.http import HttpResponseRedirect -from django.views.generic import DetailView, TemplateView +from django.views.generic import DetailView, TemplateView, RedirectView from django.core.urlresolvers import reverse_lazy from django.utils.translation import ugettext as _ @@ -141,3 +141,12 @@ def unsubscription_handle(request): class UnsubscriptionSuccess(TemplateView): template_name = 'client/newsletters/unsubscribe_success.html' + + +class AuthMailingSettings(RedirectView): + url = reverse_lazy('accounts-mailing_settings') + + def get(self, request, *args, **kwargs): + self.contact = untokenize(self.kwargs.get('uidb36'), self.kwargs.get('token')) + request.session['ml_contact_pk'] = self.contact.pk + return super(AuthMailingSettings, self).get(request, *args, **kwargs) diff --git a/templates/client/popups/mailing_settings_countries.html b/templates/client/popups/mailing_settings_countries.html index e3b9a470..00ad41d3 100644 --- a/templates/client/popups/mailing_settings_countries.html +++ b/templates/client/popups/mailing_settings_countries.html @@ -14,10 +14,10 @@