add announce to profile settings

remotes/origin/1203
Nazar Kotjuk 10 years ago
parent de9867b7a6
commit 4b9c6daaca
  1. 3
      accounts/urls.py
  2. 73
      accounts/views.py
  3. 1
      emencia/django/newsletter/admin_forms.py
  4. 67
      emencia/django/newsletter/forms.py
  5. 7
      emencia/django/newsletter/managers.py
  6. 65
      templates/client/accounts/settings.html

@ -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())),

@ -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)

@ -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

@ -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)
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']

@ -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

@ -1,4 +1,4 @@
{% extends 'base_catalog.html' %}
{% extends 'client/base_catalog.html' %}
{% load static %}
{% load i18n %}
@ -115,7 +115,7 @@
<div class="set-sect subscribe">
<header>{% trans 'настройка подписки' %}</header>
<div class="set-sect-body">
<form action="#">
<form action="{% url 'account_save_announce_settings' %}" method="post">{% csrf_token %}
<ul class="tabs clearfix">
<li class="active"><a class="icon-big-email" href="#">{% trans 'по e-mail' %}</a></li>
@ -127,7 +127,7 @@
<div class="mf-announces clearfix">
<div class="mf-subj-checks-title">
<label class="check">
<input type="checkbox" class="annoncesFlag" name="annoncesFlag" />
{{ subscribe.get_announce }}
Получать анонсы</label>
</div>
@ -171,9 +171,10 @@
<hr />
<div class="mf-line">
<label class="check">{{ subscribe.moscow_expo }}{{ subscribe.moscow_expo.label }}</label>
<label class="check">{{ subscribe.saint_expo }}{{ subscribe.saint_expo.label }}</label>
<label class="check">{{ subscribe.europe_expo }}{{ subscribe.europe_expo.label }}</label>
<label class="check">{{ subscribe.asia_expo }}{{ subscribe.asia_expo.label }}</label>
<label class="check">{{ subscribe.na_expo }}{{ subscribe.na_expo.label }}</label>
</div>
<hr />
@ -196,4 +197,56 @@
</div>
</div>
{% endblock %}
{% block scripts %}
<script>
$(function(){
$('#id_sub_set_country, #id_sub_set_theme')
.select2({
placeholder: $(this).attr('placeholder'),
width: '100%'
});
$('#id_sub_set_city').select2({
placeholder: $(this).attr('placeholder'),
multiple: true,
width: '100%',
ajax: {
url: "/city/get-city/",
dataType: "json",
quietMillis: 200,
data: function(term, page){
return {term: term,
page: page};
},
results: function (data) {
var results = [];
$.each(data, function(index, item){
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection : function(element, callback) {
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
callback(data);
}
});
});
</script>
{% endblock %}
{% endblock %}

Loading…
Cancel
Save