From 4b9c6daaca376b418d1a96a4c39b74b4b774a92c Mon Sep 17 00:00:00 2001 From: Nazar Kotjuk Date: Mon, 19 Oct 2015 17:09:52 +0300 Subject: [PATCH] add announce to profile settings --- accounts/urls.py | 3 +- accounts/views.py | 73 ++++++++++++++++++++---- emencia/django/newsletter/admin_forms.py | 1 + emencia/django/newsletter/forms.py | 67 ++++++++++++++++++---- emencia/django/newsletter/managers.py | 7 ++- templates/client/accounts/settings.html | 65 +++++++++++++++++++-- 6 files changed, 187 insertions(+), 29 deletions(-) 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..b7191dbc 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -3,7 +3,7 @@ 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.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 @@ -27,21 +27,74 @@ 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 + +from django.core.urlresolvers import reverse +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 + not_valid + + return HttpResponseRedirect(reverse('accounts_settings')) + + + + + def dates_range(date1, date2): delta = date2 - date1 dates = [] @@ -54,7 +107,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 +208,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) 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 148336a0..8013c26a 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -249,12 +249,15 @@ class SubsribeAssideForm(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): @@ -262,17 +265,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/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/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 @@
{% trans 'настройка подписки' %}
-
+ {% csrf_token %}
  • {% trans 'по e-mail' %}
  • @@ -127,7 +127,7 @@
    @@ -171,9 +171,10 @@
    - - + + +

    @@ -196,4 +197,56 @@
-{% endblock %} \ No newline at end of file + {% block scripts %} + + {% endblock %} +{% endblock %} +