Merge branch 'stage6' of bitbucket.org:Bonus_05/expomap into stage6

remotes/origin/stage6
ya_dim4ik 9 years ago
commit bde9deecbb
  1. 34
      accounts/views.py
  2. 10
      emencia/django/newsletter/forms.py
  3. 47
      emencia/django/newsletter/models.py
  4. 59
      emencia/django/newsletter/urls/mailing_list.py
  5. 11
      emencia/django/newsletter/views/mailing_list.py
  6. 4
      templates/client/popups/mailing_settings_countries.html

@ -7,7 +7,7 @@ from sorl.thumbnail import get_thumbnail
from django.core.urlresolvers import reverse, reverse_lazy from django.core.urlresolvers import reverse, reverse_lazy
from django.shortcuts import get_object_or_404 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.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _, get_language from django.utils.translation import ugettext as _, get_language
from django_messages.forms import SendForm from django_messages.forms import SendForm
@ -112,6 +112,12 @@ class MailingSettings(ContextMixin, AjaxableResponseMixin, CreateUpdateView):
instance = Contact.objects.get(email=self.request.user.email) instance = Contact.objects.get(email=self.request.user.email)
except Contact.DoesNotExist: except Contact.DoesNotExist:
pass 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: if instance is not None:
self.extra_ctx.update({ self.extra_ctx.update({
'checked_f_countries': list(instance.f_countries.values_list('pk', flat=True)), '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_tg': list(instance.tags.values_list('pk', flat=True)),
'checked_th': list(instance.themes.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 return instance
def form_valid(self, form): # def form_valid(self, form):
print(form.cleaned_data) # print(form.cleaned_data)
print(form.errors) # print(form.errors)
print(self.request.POST) # print(self.request.POST)
# import pdb; pdb.set_trace() # # import pdb; pdb.set_trace()
return super(MailingSettings, self).form_valid(form) # return super(MailingSettings, self).form_valid(form)
def form_invalid(self, form): # def form_invalid(self, form):
print(form.cleaned_data) # print(form.cleaned_data)
print(form.errors) # print(form.errors)
print(self.request.POST) # print(self.request.POST)
return super(MailingSettings, self).form_invalid(form) # return super(MailingSettings, self).form_invalid(form)
class CalendarView(TemplateView): class CalendarView(TemplateView):

@ -11,6 +11,7 @@ from django.forms.models import ModelChoiceIterator
from django.http import Http404 from django.http import Http404
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 _
from django.utils.translation import get_language
from django.utils.encoding import smart_text, force_text from django.utils.encoding import smart_text, force_text
from haystack.query import SearchQuerySet from haystack.query import SearchQuerySet
@ -158,6 +159,13 @@ class MailingSettingsForm(forms.ModelForm):
if self.instance and self.instance.pk: if self.instance and self.instance.pk:
# area # area
self.initial['area'] = set(self.instance.f_countries.values_list('area_id', flat=True)) 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 # foreign countries
self.fields['f_countries'].c_queryset = self.instance.f_countries.distinct() self.fields['f_countries'].c_queryset = self.instance.f_countries.distinct()
@ -203,7 +211,7 @@ class MailingSettingsForm(forms.ModelForm):
if countries_add: if countries_add:
obj.f_countries.add(*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.tags = self.cleaned_data.get('tg') or []
obj.themes = self.cleaned_data.get('th') or [] obj.themes = self.cleaned_data.get('th') or []
obj.save() obj.save()

@ -6,6 +6,8 @@ from datetime import date
from datetime import timedelta from datetime import timedelta
from dateutil import relativedelta from dateutil import relativedelta
from email.MIMEImage import MIMEImage from email.MIMEImage import MIMEImage
from random import choice
from itertools import chain
import copy import copy
import operator import operator
@ -25,7 +27,7 @@ from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.template.loader import render_to_string, get_template from django.template.loader import render_to_string, get_template
from django.template import Context from django.template import Context
from django.http import QueryDict
from emencia.django.newsletter.managers import ContactManager from emencia.django.newsletter.managers import ContactManager
from emencia.django.newsletter.settings import BASE_PATH 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,)) return reverse('admin:newsletter_contact_change', args=(self.pk,))
def get_announce_context_v2(self, date=None): def get_announce_context_v2(self, date=None):
# import error
from emencia.django.newsletter.utils.tokens import tokenize
date = date or datetime.today().date() date = date or datetime.today().date()
activate('ru') activate('ru')
ctx = { ctx = {
'recomended': [], 'recommended': [],
'moscow': [], 'moscow': [],
'russia': [], 'russia': [],
'foreign': [], 'foreign': [],
'news': [], 'news': [],
'blog': [], 'blog': [],
'mailing_settings_url': reverse('newsletter-authmailingsettings', args=tokenize(self)),
} }
th_tg_filter_params = [] th_tg_filter_params = []
th_tg_structure = {} th_tg_structure = {}
@ -223,14 +229,22 @@ class Contact(models.Model):
th_tg_filter_params.append(SQ(**p)) th_tg_filter_params.append(SQ(**p))
th_tg_filter = reduce(operator.or_, th_tg_filter_params) th_tg_filter = reduce(operator.or_, th_tg_filter_params)
# recomended # recommended
recomended = RelatedSearchQuerySet().models(Exposition, Conference) paid_recommend = NewsletterRecommend.objects.filter(
fr__gte=date,
to__lte=date)
recommended = RelatedSearchQuerySet().models(Exposition, Conference)\
.filter(expohit=True)
if th_tg_filter: 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: try:
ctx['recomended'] = recomended[0] ctx['recommended'] = choice(paid_recommend)
except: except:
pass try:
ctx['recommended'] = recommended[0]
except:
pass
# moscow # moscow
if self.moscow: if self.moscow:
@ -239,6 +253,12 @@ class Contact(models.Model):
if th_tg_filter is not None: if th_tg_filter is not None:
moscow_sqs = moscow_sqs.filter(th_tg_filter) moscow_sqs = moscow_sqs.filter(th_tg_filter)
ctx['moscow'] = moscow_sqs.order_by('data_begin')[:4] 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 # russia
if self.russia: if self.russia:
@ -252,7 +272,12 @@ class Contact(models.Model):
if th_tg_filter is not None: if th_tg_filter is not None:
russia_sqs = russia_sqs.filter(th_tg_filter) russia_sqs = russia_sqs.filter(th_tg_filter)
ctx['russia'] = russia_sqs.order_by('data_begin')[:3] 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 # foreign
if self.foreign: if self.foreign:
@ -262,6 +287,12 @@ class Contact(models.Model):
if th_tg_filter is not None: if th_tg_filter is not None:
foreign_sqs = foreign_sqs.filter(th_tg_filter) foreign_sqs = foreign_sqs.filter(th_tg_filter)
ctx['foreign'] = foreign_sqs.order_by('data_begin')[:4] 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 # news
if self.content_news: if self.content_news:

@ -1,35 +1,42 @@
"""Urls for the emencia.django.newsletter Mailing List""" """Urls for the emencia.django.newsletter Mailing List"""
from django.conf.urls import url from django.conf.urls import url
from django.conf.urls import patterns 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 MailingListSubscriptionForm
from emencia.django.newsletter.forms import AllMailingListSubscriptionForm from emencia.django.newsletter.forms import AllMailingListSubscriptionForm
urlpatterns = patterns('emencia.django.newsletter.views.mailing_list', urlpatterns = patterns('emencia.django.newsletter.views.mailing_list',
url(r'^unsubscribe/hard/(?P<slug>[-\w]+)/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', url(r'^unsubscribe/hard/(?P<slug>[-\w]+)/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
'view_mailinglist_unsubscribe', 'view_mailinglist_unsubscribe',
name='newsletter_mailinglist_unsubscribe_hard'), name='newsletter_mailinglist_unsubscribe_hard'),
url(r'^unsubscribe/(?P<slug>[-\w]+)/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', url(r'^unsubscribe/(?P<slug>[-\w]+)/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
UnsubscribeView.as_view(), UnsubscribeView.as_view(),
name='newsletter_mailinglist_unsubscribe'), name='newsletter_mailinglist_unsubscribe'),
url(r'^unsubscribe/handle/$', url(r'^unsubscribe/handle/$',
'unsubscription_handle', 'unsubscription_handle',
name='newsletter_mailinglist_unsubscribe_handle'), name='newsletter_mailinglist_unsubscribe_handle'),
url(r'^unsubscribe/success/$', url(r'^unsubscribe/success/$',
UnsubscriptionSuccess.as_view(), UnsubscriptionSuccess.as_view(),
name='newsletter_mailinglist_unsubscribe_success'), name='newsletter_mailinglist_unsubscribe_success'),
url(r'^subscribe/(?P<mailing_list_id>\d+)/', url(r'^subscribe/(?P<mailing_list_id>\d+)/',
'view_mailinglist_subscribe', 'view_mailinglist_subscribe',
{'form_class': MailingListSubscriptionForm}, {'form_class': MailingListSubscriptionForm},
name='newsletter_mailinglist_subscribe'), name='newsletter_mailinglist_subscribe'),
url(r'^subscribe/', url(r'^subscribe/',
'view_mailinglist_subscribe', 'view_mailinglist_subscribe',
{'form_class': AllMailingListSubscriptionForm}, {'form_class': AllMailingListSubscriptionForm},
name='newsletter_mailinglist_subscribe_all'), name='newsletter_mailinglist_subscribe_all'),
)
url(r'^settings/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
AuthMailingSettings.as_view(),
name='newsletter-authmailingsettings'),
)

@ -5,7 +5,7 @@ from django.shortcuts import get_object_or_404
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.contrib import messages from django.contrib import messages
from django.http import HttpResponseRedirect 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.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
@ -141,3 +141,12 @@ def unsubscription_handle(request):
class UnsubscriptionSuccess(TemplateView): class UnsubscriptionSuccess(TemplateView):
template_name = 'client/newsletters/unsubscribe_success.html' 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)

@ -14,10 +14,10 @@
<div class="scroll-content"> <div class="scroll-content">
<div class="places-list"> <div class="places-list">
<ul class="modal_checkboxes"> <ul class="modal_checkboxes">
{% for value, text in search_form.area.field.choices %} {% for value, text in form.area.field.choices %}
<li class="level1 level"> <li class="level1 level">
<label> <label>
<input type="checkbox" name="area" id="id_{{ prefix }}{{ value }}" class="csb-menu-input" value="{{ value }}" {% for option in search_form.area.value %}{% if option == value|slugify %}checked="checked"{% endif %}{% endfor %}/> <input type="checkbox" name="area" id="id_{{ prefix }}{{ value }}" class="csb-menu-input" value="{{ value }}">
<span class="custom_checkbox"></span> <span class="custom_checkbox"></span>
<span class="label hidden">{{ text }}</span> <span class="label hidden">{{ text }}</span>
</label> </label>

Loading…
Cancel
Save