diff --git a/accounts/views.py b/accounts/views.py index 69a11220..9581f322 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -2,7 +2,7 @@ import dateutil.relativedelta as rdelta import json import datetime -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, reverse_lazy import calendar as python_calendar from django.shortcuts import get_object_or_404 from django.http import HttpResponseRedirect, HttpResponse, Http404, HttpResponseBadRequest @@ -11,7 +11,7 @@ from django.utils.translation import ugettext as _, get_language from django_messages.forms import SendForm from django.views.generic import TemplateView, FormView from django.conf import settings -from functions.custom_views import ListView +from functions.custom_views import ListView, CreateUpdateView from functions.views_help import dates_range, get_user from sorl.thumbnail import get_thumbnail from exposition.models import Exposition @@ -29,80 +29,60 @@ from emencia.django.newsletter.forms import SubscribeSettingsForm from emencia.django.newsletter.models import Contact, ContactSettings -class SettingsView(TemplateView): +class SettingsView(CreateUpdateView): """ display template with user settings like: password, email notifications, social settings, subscription """ + form_class = SubscribeSettingsForm template_name = 'client/accounts/settings.html' + success_url = reverse_lazy('accounts_settings') - def get_announce_form(self): + def get_object(self): user = self.request.user try: - contact = user.contact_set.get(email=user.username) + self.contact = Contact.objects.get(user=user) except Contact.DoesNotExist: try: - contact = Contact.objects.get(email=user.username) - contact.user = user - contact.save() + self.contact = Contact.objects.get(email=user.username, user__isnull=True) + self.contact.user = user + self.contact.save() 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 + self.contact = None + return None + obj = self.contact.contactsettings or ContactSettings.objects.create( + contact=self.contact, + exponent_practicum=False, organiser_practicum=False) + return obj + + def form_valid(self, form): + if not self.contact: + email = form.cleaned_data['email'] + self.contact = Contact.objects.create_contact(email, self.request.user) + form.activation_send = True + self.object = form.save(commit=False) + self.object.contact = self.contact + self.object.save() + form.save_m2m() + form.save_additional_fields(self.object) + form.make_pretty_city_val() + return self.render_to_response(self.get_context_data(form=form)) + + def get_form_kwargs(self): + kwargs = super(SettingsView, self).get_form_kwargs() + kwargs.update({ + 'initial': {'email': getattr(self.contact, 'email', self.request.user.email)}, + 'contact': self.contact, + }) + return kwargs 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() - 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')) - - class CalendarView(TemplateView): """ display template with user calendar(one month) diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index 3cfc8069..e54bc326 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -295,8 +295,11 @@ class SubscribeSettingsForm(AbstractSubscribeForm): europe_expo = forms.BooleanField(required=False, label=_(u'Выставки Европы')) def __init__(self, *args, **kwargs): - super(SubscribeSettingsForm, self).__init__(*args, **kwargs) + self.contact = kwargs.pop('contact') + self.activation_send = False lang = translation.get_language() + self.cities_choices = dict(City.objects.language(lang).all().values_list('pk', 'name')) + super(SubscribeSettingsForm, self).__init__(*args, **kwargs) self.fields['theme'] = forms.MultipleChoiceField( choices=[(item.pk, get_by_lang(item, 'name', lang)) for item in SearchQuerySet().models(Theme).all()], required=False, @@ -305,6 +308,13 @@ class SubscribeSettingsForm(AbstractSubscribeForm): 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'})) + if self.instance.pk: + self.initial['get_announce'] = self.instance.exponent_practicum or self.instance.organiser_practicum or self.instance.theme.exists() + self.initial['city'] = ','.join(['%s:%s'%(pk, self.cities_choices.get(pk)) for pk in set(self.instance.city.all().values_list('pk', flat=True))]) + + def make_pretty_city_val(self): + self.data = self.data.copy() + self.data['city'] = ','.join(['%s:%s'%(pk, self.cities_choices.get(pk)) for pk in set(self.instance.city.all().values_list('pk', flat=True))]) def save_additional_fields(self, settings): get_announce = self.cleaned_data.get('get_announce') @@ -342,6 +352,7 @@ class SubscribeSettingsForm(AbstractSubscribeForm): contactsettings.country.clear() for country in self.cleaned_data['country']: contactsettings.country.add(country) + contactsettings.city.clear() for city in self.cleaned_data['city']: contactsettings.city.add(city) @@ -354,6 +365,14 @@ class SubscribeSettingsForm(AbstractSubscribeForm): return contactsettings def clean_email(self): + if not self.contact: + return super(SubscribeSettingsForm, self).clean_email() + email = self.cleaned_data['email'] + if self.contact.email != email: + self.contact.activated = False + self.contact.send_activation() + self.save() + self.activation_send = True return self.cleaned_data['email'] diff --git a/functions/custom_views.py b/functions/custom_views.py index 28231fb1..ef1e59f7 100644 --- a/functions/custom_views.py +++ b/functions/custom_views.py @@ -1,27 +1,49 @@ # -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse, Http404 -from django.core.context_processors import csrf -from django.core.urlresolvers import reverse_lazy +import random + +from accounts.models import User +from city.models import City +from company.models import Company +from conference.models import Conference +from country.models import Country from django.conf import settings -from django.contrib.auth.decorators import login_required from django.contrib.admin.views.decorators import staff_member_required -from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, InvalidPage +from django.contrib.auth.decorators import login_required +from django.core.context_processors import csrf +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.core.paginator import ( + EmptyPage, + InvalidPage, + PageNotAnInteger, + Paginator +) +from django.core.urlresolvers import reverse_lazy from django.db.models.deletion import ProtectedError +from django.db.models.loading import get_model +from django.http import Http404, HttpResponse, HttpResponseRedirect +from django.shortcuts import render_to_response +from django.utils.translation import get_language as lang from django.utils.translation import ugettext as _ - -#forms and models +from django.views.generic import ListView as OldListView +from django.views.generic import DetailView, RedirectView +from django.views.generic.detail import ( + SingleObjectMixin, + SingleObjectTemplateResponseMixin +) +from django.views.generic.edit import ModelFormMixin, ProcessFormView +from exposition.models import Exposition from file.forms import FileModelForm from file.models import TmpFile -from theme.models import Tag -from accounts.models import User from functions.forms import AdminSearchForm -from django.utils.translation import get_language as lang +from functions.views_help import split_params +from haystack.query import EmptySearchQuerySet from hvad.utils import get_translation_aware_manager -#python -import random - -from django.views.generic import ListView as OldListView +from meta.models import MetaSetting +from meta.views import Meta +from photoreport.models import Photoreport +from seminar.models import Seminar +from theme.models import Tag, Theme +from webinar.models import Webinar class ListView(OldListView): @@ -91,8 +113,6 @@ def filtered_list(request, objects, template, item_per_page=settings.ADMIN_PAGIN return render_to_response(template, {'objects': objects, 'search_form': AdminSearchForm()}) -from django.db.models.loading import get_model -from theme.models import Theme @staff_member_required def objects_list(request, Model, template, item_per_page=settings.ADMIN_PAGINATION): @@ -235,18 +255,8 @@ def delete_object(request, Model, Form, url, prev_page,): return render_to_response('delete.html', args) -#-----class------------------ -from django.views.generic import DetailView -from functions.views_help import split_params -from city.models import City -from exposition.models import Exposition -from conference.models import Conference -from seminar.models import Seminar -from webinar.models import Webinar -from company.models import Company -from photoreport.models import Photoreport class ExpoMixin(object): @@ -271,8 +281,6 @@ single_page_filter = {Exposition:'event', Conference:'event', Seminar:'event', W -from meta.models import MetaSetting -from meta.views import Meta class ExpoListView(ExpoMixin, ListView): """ """ @@ -359,7 +367,6 @@ class ExpoListView(ExpoMixin, ListView): context['meta'] = m return context -from country.models import Country class EventDetail(ExpoMixin, DetailView): def get_object(self, queryset=None): @@ -367,7 +374,6 @@ class EventDetail(ExpoMixin, DetailView): return obj -from haystack.query import EmptySearchQuerySet class ExpoSearchView(ListView): paginate_by = settings.CLIENT_PAGINATION @@ -408,12 +414,6 @@ class ExpoSearchView(ListView): return context -from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist -from django.http import Http404 -from django.views.generic import RedirectView -from django.views.generic.detail import SingleObjectMixin - - class SimpleObjectChangeView(RedirectView, SingleObjectMixin): model = None url = None @@ -500,3 +500,19 @@ class AjaxableResponseMixin(object): return JsonResponse(data) else: return response + + +class CreateUpdateView(SingleObjectTemplateResponseMixin, ModelFormMixin, ProcessFormView): + def get_object(self, queryset=None): + try: + return super(CreateUpdateView,self).get_object(queryset) + except AttributeError: + return None + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + return super(CreateUpdateView, self).get(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + return super(CreateUpdateView, self).post(request, *args, **kwargs) diff --git a/templates/admin/newsletters/mailing_list.html b/templates/admin/newsletters/mailing_list.html index d67fea8d..b7210530 100644 --- a/templates/admin/newsletters/mailing_list.html +++ b/templates/admin/newsletters/mailing_list.html @@ -1,10 +1,11 @@ {% extends 'admin/base.html' %} +{% load i18n %} {% block body %}
-

Списки рассылок

+

{% trans "Списки рассылок" %}

@@ -20,9 +21,9 @@ - Название - Подписчиков - Отписалось + {% trans "Название" %} + {% trans "Подписчиков" %} + {% trans "Отписалось" %}       @@ -35,17 +36,17 @@ {{ item.subscribers_count }} {{ item.unsubscribers_count }} - Изменить - Удалить - Подписчики + {% trans "Изменить" %} + {% trans "Удалить" %} + {% trans "Подписчики" %} {% endfor %} - Добавить новый список + {% trans "Добавить новый список" %}
{# pagination #} {% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/client/accounts/settings.html b/templates/client/accounts/settings.html index 18cd5a67..524e0953 100644 --- a/templates/client/accounts/settings.html +++ b/templates/client/accounts/settings.html @@ -115,7 +115,8 @@
{% trans 'настройка подписки' %}
-
{% csrf_token %} + + {% csrf_token %}
  • {% trans 'по e-mail' %}
  • @@ -127,7 +128,7 @@
    @@ -135,36 +136,36 @@
    -
    {{ subscribe.email }}
    -
    +
    {{ form.email }}
    +
    {{ form.email.errors }}
    - {{ subscribe.country }} + {{ form.country }}
    -
    +
    {{ form.country.errors }}
    - {{ subscribe.city }} + {{ form.city }}
    -
    +
    {{ form.city.errors }}
    - {{ subscribe.theme }} + {{ form.theme }}
    -
    +
    {{ form.theme.errors }}
    - {{ subscribe.periodic }} + {{ form.periodic }}
    -
    +
    {{ form.periodic.errors }}
@@ -172,11 +173,11 @@
- +
- +