diff --git a/accounts/urls.py b/accounts/urls.py index 2345511f..f3250df3 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -14,7 +14,7 @@ def test(request): urlpatterns = patterns('', url(r'^profile/$', login_required(ProfileView.as_view())), url(r'^profile/company/$', login_required(ProfileCompanyView.as_view())), - url(r'^profile/settings/$', login_required(SettingsView.as_view())), + url(r'^profile/settings/$', login_required(SettingsView.as_view()), name='accounts_settings'), url(r'^profile/calendar/remove/$', 'accounts.views.remove_from_calendar'), url(r'^profile/calendar/export/$', 'core.views.download_workbook'), url(r'^profile/calendar/$', login_required(CalendarView.as_view())), @@ -35,6 +35,7 @@ urlpatterns = patterns('', #url(r'^profile/messages/$', login_required(MessagesView.as_view())), # ajax + url(r'^profile/update/announce-settings/$', 'accounts.views.save_announce_settings', name='account_save_announce_settings'), url(r'^profile/update/name/$', login_required(NameView.as_view())), url(r'^profile/update/home/$', login_required(HomeView.as_view())), url(r'^profile/update/avatar/$', login_required(AvatarView.as_view())), diff --git a/accounts/views.py b/accounts/views.py index 87212446..95bf56bc 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -3,21 +3,22 @@ import dateutil.relativedelta as rdelta import json, datetime import calendar as python_calendar from django.shortcuts import get_object_or_404 -from django.http import HttpResponseRedirect, HttpResponse, Http404 +from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect, HttpResponse, Http404, HttpResponseForbidden from django.contrib.auth.decorators import login_required from django.utils.translation import ugettext as _, get_language from django_messages.forms import SendForm from django.views.generic import TemplateView, FormView from functions.custom_views import ListView from sorl.thumbnail import get_thumbnail -from .forms import ChangePasswordForm, EmailAnnouncementForm, FeedFilterForm +from .forms import ChangePasswordForm, FeedFilterForm from company.forms import CreateCompanyForm from .models import User from .edit_forms import AvatarForm, NameForm, HomeForm, WorkForm, AboutCompanyForm, PhoneForm, EmailForm,\ WebPageForm, SocialForm, AboutForm from emencia.django.newsletter.forms import SubscribeSettingsForm from emencia.django.newsletter.models import Contact - +from meta.views import MetadataMixin class SettingsView(TemplateView): @@ -27,21 +28,75 @@ class SettingsView(TemplateView): """ template_name = 'client/accounts/settings.html' - def get_context_data(self, **kwargs): - context = super(SettingsView, self).get_context_data(**kwargs) - context['change_password_form'] = ChangePasswordForm() + + def get_announce_form(self): user = self.request.user try: contact = user.contact_set.get(email=user.username) except Contact.DoesNotExist: contact = None + if not contact: + return SubscribeSettingsForm() + setting = contact.contactsettings + initial = {'email': contact.email} + + initial['city'] = ','.join(['%s:%s'%(item.id, item.name) for item in set(setting.city.all())]) + if setting.exponent_practicum or setting.organiser_practicum or setting.theme.exists(): + initial['get_announce'] = True + # north america check + if setting.area.filter(id=SubscribeSettingsForm.NA_ID).exists(): + initial['na_expo'] = True + # asia check + if setting.area.filter(id=SubscribeSettingsForm.ASIA_ID).exists(): + initial['asia_expo'] = True + # europe check + if setting.area.filter(id=SubscribeSettingsForm.EUROPE_ID).exists(): + initial['europe_expo'] = True + + form = SubscribeSettingsForm(instance=setting, initial=initial) + return form + + + + def get_context_data(self, **kwargs): + context = super(SettingsView, self).get_context_data(**kwargs) + context['change_password_form'] = ChangePasswordForm() + context['subscribe'] = self.get_announce_form() - if contact: - context['subscribe'] = SubscribeSettingsForm(instance=contact.contactsettings) - else: - context['subscribe'] = SubscribeSettingsForm() return context + + +def save_announce_settings(request): + + if request.POST: + user = request.user + email = request.POST.get('email') or user.username + + # check if setting subscription already exist + try: + contact, created = user.contact_set.get(email=email), False + except Contact.DoesNotExist: + contact, created = Contact.objects.create_contact(email, user, create_setting=True), True + setting = contact.contactsettings + form = SubscribeSettingsForm(request.POST, instance=setting) + if form.is_valid(): + setting = form.save(commit=False) + setting.contact = contact + setting.save() + form.save_m2m() + form.save_additional_fields(setting) + else: + errors = form.errors + # todo: subscribe settings error handle + #not_valid + + return HttpResponseRedirect(reverse('accounts_settings')) + + + + + def dates_range(date1, date2): delta = date2 - date1 dates = [] @@ -54,7 +109,7 @@ class CalendarView(TemplateView): display template with user calendar(one month) """ - template_name = 'accounts/calendar.html' + template_name = 'client/accounts/calendar.html' def get_context_data(self, **kwargs): """ @@ -155,7 +210,7 @@ class ProfileView(TemplateView): in template forms handles dynamically by ajax """ - template_name = 'accounts/new_profile.html' + template_name = 'client/accounts/new_profile.html' def get_context_data(self, **kwargs): context = super(ProfileView, self).get_context_data(**kwargs) @@ -217,8 +272,6 @@ class ProfileCompanyView(TemplateView): - -from meta.views import MetadataMixin class UserView(MetadataMixin, TemplateView): """ display user information for another users diff --git a/emencia/django/newsletter/admin_forms.py b/emencia/django/newsletter/admin_forms.py index 9306c31b..7f4a50be 100644 --- a/emencia/django/newsletter/admin_forms.py +++ b/emencia/django/newsletter/admin_forms.py @@ -32,6 +32,7 @@ class ContactSettingsForm(forms.ModelForm): def save(self, commit=True): contactsettings = super(ContactSettingsForm, self).save(commit=False) + old_save_m2m = self.save_m2m if commit: contactsettings.save() contact = contactsettings.contact diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index 4fd0a961..7f2d7acf 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -250,12 +250,15 @@ class SubscribeAssideForm(AbstractSubscribeForm): class SubscribeSettingsForm(AbstractSubscribeForm): + NA_ID = 12 + ASIA_ID = 9 + EUROPE_ID = 4 city = forms.CharField( widget=forms.HiddenInput(attrs={'id': 'id_sub_set_city', 'placeholder': _(u'Город')}), required=False) get_announce = forms.BooleanField(required=False, label=_(u'Получать анонсы')) - moscow_expo = forms.BooleanField(required=False, label=_(u'Выставки Москвы')) - saint_expo = forms.BooleanField(required=False, label=_(u'Выставки Санкт-Петербурга')) + na_expo = forms.BooleanField(required=False, label=_(u'Выставки Северной Америки')) + asia_expo = forms.BooleanField(required=False, label=_(u'Выставки Азии')) europe_expo = forms.BooleanField(required=False, label=_(u'Выставки Европы')) def __init__(self, *args, **kwargs): @@ -263,17 +266,59 @@ class SubscribeSettingsForm(AbstractSubscribeForm): lang = translation.get_language() self.fields['theme'] = forms.MultipleChoiceField( choices=[(item.pk, get_by_lang(item, 'name', lang)) for item in SearchQuerySet().models(Theme).all()], + required=False, widget=forms.SelectMultiple(attrs={'placeholder': _(u'Тематики'), 'id': 'id_sub_set_theme'})) self.fields['country'] = forms.MultipleChoiceField( choices=[(item.pk, get_by_lang(item, 'name', lang)) for item in SearchQuerySet().models(Country).all()], required=False, widget=forms.SelectMultiple(attrs={'placeholder': _(u'Страны'), 'id': 'id_sub_set_country'})) - - -# do not watch -# cursor = db.cursor() -# sql = u""" -# INSERT IGNORE -# INTO newsletter_contact(first_name, email, activated, tester, creation_date, last_name) -# VALUES %s;""" % u','.join([u"('%s', '%s', '%s', '%s', NOW(), '')" % (row[1], row[0], str(activated).upper(), str(is_tester).upper()) for row in row_list]) -# cursor.execute(sql) \ No newline at end of file + + def save_additional_fields(self, settings): + get_announce = self.cleaned_data.get('get_announce') + na_expo = self.cleaned_data.get('na_expo') + asia_expo = self.cleaned_data.get('asia_expo') + europe_expo = self.cleaned_data.get('europe_expo') + if not get_announce: + settings.organiser_practicum = False + settings.exponent_practicum = False + settings.save() + settings.theme.clear() + if na_expo: + settings.area.add(Area.objects.get(id=self.NA_ID)) + else: + settings.area.remove(Area.objects.get(id=self.NA_ID)) + if asia_expo: + settings.area.add(Area.objects.get(id=self.ASIA_ID)) + else: + settings.area.remove(Area.objects.get(id=self.ASIA_ID)) + if europe_expo: + settings.area.add(Area.objects.get(id=self.EUROPE_ID)) + else: + settings.area.remove(Area.objects.get(id=self.EUROPE_ID)) + return settings + + def save(self, commit=True): + contactsettings = super(SubscribeSettingsForm, self).save(commit=False) + # Prepare a 'save_m2m' method for the form, + old_save_m2m = self.save_m2m + def save_m2m(): + old_save_m2m() + contactsettings.theme.clear() + for theme in self.cleaned_data['theme']: + contactsettings.theme.add(theme) + contactsettings.country.clear() + for country in self.cleaned_data['country']: + contactsettings.country.add(country) + for city in self.cleaned_data['city']: + contactsettings.city.add(city) + + self.save_m2m = save_m2m + + if commit: + contactsettings.save() + self.save_m2m() + + return contactsettings + + def clean_email(self): + return self.cleaned_data['email'] \ No newline at end of file diff --git a/emencia/django/newsletter/mailer.py b/emencia/django/newsletter/mailer.py index 53be1f93..b17669a5 100644 --- a/emencia/django/newsletter/mailer.py +++ b/emencia/django/newsletter/mailer.py @@ -143,7 +143,7 @@ class NewsLetterSender(object): message[header] = value uidb36, token = tokenize(contact) - unsubscribe_link = 'http://' + Site.objects.get_current().domain + reverse('newsletter_mailinglist_unsubscribe', args=[self.newsletter.slug, uidb36, token]) + unsubscribe_link = 'http://' + Site.objects.get_current().domain + reverse('newsletter_mailinglist_unsubscribe_hard', args=[self.newsletter.slug, uidb36, token]) message['List-Unsubscribe'] = '<' + unsubscribe_link + '>' message['List-Id'] = str(self.newsletter.id) @@ -376,6 +376,8 @@ class Mailer(NewsLetterSender): send = False else: announce_context = None + + try: if send: message = self.build_message(contact, announce_context) diff --git a/emencia/django/newsletter/managers.py b/emencia/django/newsletter/managers.py index 30bcaef7..54caa7aa 100644 --- a/emencia/django/newsletter/managers.py +++ b/emencia/django/newsletter/managers.py @@ -39,11 +39,16 @@ class ContactManager(models.Manager): contact.save() return contact - def create_contact(self, email, user=None): + def create_contact(self, email, user=None, create_setting=False): contact = self.model(user=user, email=email) if user: contact.first_name = user.first_name contact.last_name = user.last_name contact.save() contact.send_activation() + if create_setting: + from .models import ContactSettings + sett = ContactSettings(contact=contact, exponent_practicum=False, organiser_practicum=False) + sett.save() + return contact \ No newline at end of file diff --git a/emencia/django/newsletter/templates/newsletter/newsletter_link_unsubscribe.html b/emencia/django/newsletter/templates/newsletter/newsletter_link_unsubscribe.html index b1a281a0..8cfc1522 100644 --- a/emencia/django/newsletter/templates/newsletter/newsletter_link_unsubscribe.html +++ b/emencia/django/newsletter/templates/newsletter/newsletter_link_unsubscribe.html @@ -4,7 +4,7 @@ Чтобы отписаться от этой рассылки, перейдите по ссылке. - © 2018 — 2013 Expomap.ru + © 2008 — 2015 Expomap.ru diff --git a/emencia/django/newsletter/urls/mailing_list.py b/emencia/django/newsletter/urls/mailing_list.py index 8508df92..a42238b6 100644 --- a/emencia/django/newsletter/urls/mailing_list.py +++ b/emencia/django/newsletter/urls/mailing_list.py @@ -1,14 +1,29 @@ """Urls for the emencia.django.newsletter Mailing List""" -from django.conf.urls.defaults import url -from django.conf.urls.defaults import patterns +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.forms import MailingListSubscriptionForm from emencia.django.newsletter.forms import AllMailingListSubscriptionForm urlpatterns = patterns('emencia.django.newsletter.views.mailing_list', - url(r'^unsubscribe/(?P[-\w]+)/(?P[0-9A-Za-z]+)-(?P.+)/$', + + 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}, diff --git a/emencia/django/newsletter/urls/tracking.py b/emencia/django/newsletter/urls/tracking.py index aca0a49d..5aae9e5e 100644 --- a/emencia/django/newsletter/urls/tracking.py +++ b/emencia/django/newsletter/urls/tracking.py @@ -1,6 +1,6 @@ """Urls for the emencia.django.newsletter Tracking""" -from django.conf.urls.defaults import url -from django.conf.urls.defaults import patterns +from django.conf.urls import url +from django.conf.urls import patterns urlpatterns = patterns('emencia.django.newsletter.views.tracking', url(r'^newsletter/(?P[-\w]+)/(?P[0-9A-Za-z]+)-(?P.+)\.(?Ppng|gif|jpg)$', diff --git a/emencia/django/newsletter/views/mailing_list.py b/emencia/django/newsletter/views/mailing_list.py index e8d2d323..2a1bd1c6 100644 --- a/emencia/django/newsletter/views/mailing_list.py +++ b/emencia/django/newsletter/views/mailing_list.py @@ -1,16 +1,20 @@ +# -*- coding: utf-8 -*- """Views for emencia.django.newsletter Mailing List""" from django.template import RequestContext 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.core.urlresolvers import reverse_lazy from emencia.django.newsletter.utils.tokens import untokenize -from emencia.django.newsletter.models import Newsletter -from emencia.django.newsletter.models import MailingList -from emencia.django.newsletter.models import ContactMailingStatus +from emencia.django.newsletter.models import Newsletter, MailingList, ContactMailingStatus, Contact, ContactSettings +from emencia.django.newsletter.forms import SubscribeSettingsForm def view_mailinglist_unsubscribe(request, slug, uidb36, token): - """Unsubscribe a contact to a mailing list""" + """hard Unsubscribe a contact to a mailing list""" newsletter = get_object_or_404(Newsletter, slug=slug) contact = untokenize(uidb36, token) @@ -21,20 +25,8 @@ def view_mailinglist_unsubscribe(request, slug, uidb36, token): already_unsubscribed = True ContactMailingStatus.objects.create(newsletter=newsletter, contact=contact, status=ContactMailingStatus.UNSUBSCRIPTION) - """ - if request.POST.get('email') and not already_unsubscribed: - newsletter.mailing_list.unsubscribers.add(contact) - newsletter.mailing_list.save() - already_unsubscribed = True - ContactMailingStatus.objects.create(newsletter=newsletter, contact=contact, - status=ContactMailingStatus.UNSUBSCRIPTION) - """ - - return render_to_response('newsletter/mailing_list_unsubscribe.html', - {'email': contact.email, - 'already_unsubscribed': already_unsubscribed}, - context_instance=RequestContext(request)) + return HttpResponseRedirect(reverse_lazy('newsletter_mailinglist_unsubscribe_success')) def view_mailinglist_subscribe(request, form_class, mailing_list_id=None): """ @@ -59,3 +51,66 @@ def view_mailinglist_subscribe(request, form_class, mailing_list_id=None): 'mailing_list': mailing_list, 'form': form}, context_instance=RequestContext(request)) + + +class UnsubscribeView(DetailView): + model = Newsletter + template_name = 'client/newsletters/unsubscribe_form.html' + + def get_object(self, queryset=None): + return get_object_or_404(Newsletter, slug=self.kwargs.get('slug')) + + + def get_announce_form(self): + contact = untokenize(self.kwargs.get('uidb36'), self.kwargs.get('token')) + self.contact= contact + setting = contact.contactsettings + initial = {'email': contact.email} + + initial['city'] = ','.join(['%s:%s'%(item.id, item.name) for item in set(setting.city.all())]) + if setting.exponent_practicum or setting.organiser_practicum or setting.theme.exists(): + initial['get_announce'] = True + # north america check + if setting.area.filter(id=SubscribeSettingsForm.NA_ID).exists(): + initial['na_expo'] = True + # asia check + if setting.area.filter(id=SubscribeSettingsForm.ASIA_ID).exists(): + initial['asia_expo'] = True + # europe check + if setting.area.filter(id=SubscribeSettingsForm.EUROPE_ID).exists(): + initial['europe_expo'] = True + + form = SubscribeSettingsForm(instance=setting, initial=initial) + return form + + + def get_context_data(self, **kwargs): + context = super(UnsubscribeView, self).get_context_data(**kwargs) + context['subscribe'] = self.get_announce_form() + # + ContactMailingStatus.objects.create(newsletter=self.object, contact=self.contact, + status=ContactMailingStatus.UNSUBSCRIPTION) + + return context + + +def unsubscription_handle(request): + + if request.POST: + email = request.POST.get('email') + contact = get_object_or_404(Contact, email=email) + setting = contact.contactsettings + form = SubscribeSettingsForm(request.POST, instance=setting) + if form.is_valid(): + setting = form.save(commit=False) + setting.contact = contact + setting.save() + form.save_m2m() + form.save_additional_fields(setting) + if form.cleaned_data.get('get_announce'): + messages.add_message(request, messages.INFO, u'Настройки вашой подписки успешно сохранены') + + return HttpResponseRedirect(reverse_lazy('newsletter_mailinglist_unsubscribe_success')) + +class UnsubscriptionSuccess(TemplateView): + template_name = 'client/newsletters/unsubscribe_success.html' diff --git a/templates/admin/newsletters/newsletter_list.html b/templates/admin/newsletters/newsletter_list.html index 4f8cc05f..6f7d712a 100644 --- a/templates/admin/newsletters/newsletter_list.html +++ b/templates/admin/newsletters/newsletter_list.html @@ -18,6 +18,8 @@ Дата отправки     +   +   @@ -29,6 +31,8 @@ {{ item.sending_date|date:"Y-m-d H:i" }} тест Изменить + История + {% if item.status == item.SENT or item.status == item.CANCELED %}Статистика{% endif %} {% endfor %} diff --git a/templates/client/accounts/settings.html b/templates/client/accounts/settings.html index c183b6d2..492e3ede 100644 --- a/templates/client/accounts/settings.html +++ b/templates/client/accounts/settings.html @@ -1,4 +1,4 @@ -{% extends 'base_catalog.html' %} +{% extends 'client/base_catalog.html' %} {% load static %} {% load i18n %} @@ -115,7 +115,7 @@