Created
October 18, 2012 04:27
-
-
Save CBoJI/3909851 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
from django.contrib import admin | |
from django.db import models | |
from tinymce.widgets import TinyMCE | |
from models import Message, FormSettings | |
class FormSettingsAdmin(admin.ModelAdmin): | |
formfield_overrides = { | |
models.TextField: {'widget': TinyMCE()}, | |
} | |
class MessageAdmin(admin.ModelAdmin): | |
list_display = ('name', 'email', 'phone', 'created_on') | |
fieldsets = ( | |
(None, { | |
'fields': ('name', 'email', 'phone', 'comment') | |
}), | |
) | |
readonly_fields = ('name', 'email', 'phone', 'comment') | |
admin.site.register(FormSettings, FormSettingsAdmin) | |
admin.site.register(Message, MessageAdmin) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
from django import forms | |
from django.core.mail.message import EmailMessage | |
from django.template.base import Template | |
from django.template.context import Context | |
from common.models import CommonContent | |
from models import Message | |
class MessageForm(forms.ModelForm): | |
message = forms.CharField(required=False) | |
class Meta: | |
model = Message | |
def clean(self): | |
cleaned_data = super(MessageForm, self).clean() | |
if cleaned_data['message']: | |
raise forms.ValidationError('Spam attack') | |
return cleaned_data |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
from django.db import models | |
from django.contrib.contenttypes.models import ContentType | |
from datetime import datetime | |
class FormSettings(models.Model): | |
TYPE_CHOICES = ( | |
('tenderoffer', u'Форма коммерческого предложения'), | |
('bookingoffer', u'Форма заявки на бронирование'), | |
('feedback', u'Форма обратного звонка'), | |
('discount', u'Форма скидки') | |
) | |
type = models.CharField(choices=TYPE_CHOICES, verbose_name=u'тип', max_length=50, unique=True) | |
email = models.EmailField(verbose_name=u'Адрес получателя', blank=True) | |
before_content = models.TextField(verbose_name=u'Текст до формы', blank=True) | |
after_content = models.TextField(verbose_name=u'Текст после заполнения формы', blank=True) | |
manager_template = models.TextField(verbose_name=u'Шаблон письма для менеджера', blank=True) | |
client_template = models.TextField(verbose_name=u'Шаблон письма для клиента', blank=True) | |
def __unicode__(self): | |
return self.type | |
class Meta: | |
verbose_name = u"настройка формы" | |
verbose_name_plural = u'настройки форм' | |
class BaseForm(models.Model): | |
name = models.CharField(max_length=100, verbose_name=u'имя') | |
email = models.CharField(max_length=100, verbose_name=u'email') | |
phone = models.CharField(max_length=20, verbose_name=u'контактный телефон') | |
note = models.TextField(blank=True, null=True, verbose_name=u'примечание') | |
created_on = models.DateTimeField(default=datetime.now, editable=False) | |
type = models.CharField(editable=False, max_length=50) | |
def get_settings(self): | |
try: | |
settings = FormSettings.objects.get(type=self.type) | |
except FormSettings.DoesNotExist: | |
settings = None | |
return settings | |
def save(self, *args, **kwargs): | |
self.type = self.__class__.__name__.lower() | |
super(BaseForm, self).save(*args, **kwargs) | |
class Meta: | |
abstract = True | |
class Message(BaseForm): | |
#name, email, phone | |
comment = models.TextField(blank=True, null=True, verbose_name=u'сообщение') | |
class Meta: | |
verbose_name = u'сообщение' | |
verbose_name_plural = u'сообщения' | |
ordering = ['-created_on'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
from annoying.decorators import ajax_request | |
from django.template.base import Template | |
from django.template.context import Context | |
import logging | |
from common.models import CommonContent | |
from forms import MessageForm | |
from django.core.mail.message import EmailMessage | |
@ajax_request | |
def message(request): | |
if request.is_ajax(): | |
if request.method == 'POST': | |
form = MessageForm(request.POST) | |
if form.is_valid(): | |
instance = form.save() | |
settings = instance.get_settings() | |
if settings: | |
c = Context({'form': instance}) | |
try: | |
subject = CommonContent.objects.get(alias='mail_subject') | |
except CommonContent.DoesNotExist: | |
subject = u'Письмо с сайта' | |
else: | |
subject = subject.value | |
try: | |
mail_from = CommonContent.objects.get(alias='mail_from') | |
except CommonContent.DoesNotExist: | |
mail_from = 'noreply@xpage.ru' | |
else: | |
mail_from = mail_from.value | |
t = Template(settings.manager_template) | |
msg = EmailMessage(subject=subject, body=t.render(c), from_email=mail_from, to=[settings.email,]) | |
msg.content_subtype = 'html' | |
logger = logging.getLogger(__name__) | |
try: | |
msg.send() | |
except Exception, error: | |
logger.error('Email Sending Error', | |
exc_info = True, | |
extra = {'request': request, 'culprint': 'bid.views.py', 'exceprtion': error} | |
) | |
t = Template(settings.client_template) | |
msg = EmailMessage(subject=subject, body=t.render(c), from_email=mail_from, to=[instance.email,]) | |
msg.content_subtype = 'html' | |
try: | |
msg.send() | |
except Exception, error: | |
logger.error('Email Sending Error', | |
exc_info = True, | |
extra = {'request': request, 'culprint': 'bid.views.py', 'exceprtion': error} | |
) | |
return {'status': 'ok', 'message': u'Ваше сообщение принято'} | |
else: | |
return {'status': 'error', 'message': 'form_not_valid'} | |
else: | |
return {'status': 'error', 'message': 'bad_request'} | |
return {'status': 'error'} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<div id="fonone" style="display:none;"> | |
<div class="letter"> | |
<a class="close" href="#" onclick="openbox('fonone'); return false"><img alt="" src="{% static 'img/close.png' %}" /></a> | |
<form method="POST" id="CallForm" action="/message/"> | |
<table> | |
<tr> | |
<td> | |
<span>Написать НАМ</span> | |
<div> | |
Ваше имя * | |
<input type="text" name="name" required /> | |
</div> | |
<div> | |
Номер вашего телефона * | |
<input type="text" name="phone" required /> | |
</div> | |
<div> | |
Адрес вашей электронной почты * | |
<input type="email" name="email" required /> | |
</div> | |
<div> | |
Текст сообщения * | |
<textarea id="comment" name="comment" required ></textarea> | |
</div> | |
<div class="message"> | |
<label>Сообщение</label> | |
<input type="text" name="message" class="text medium" name='message'/> | |
{% csrf_token %} | |
</div> | |
<div id="client_message"></div> | |
</td> | |
<td style="text-align:center;vertical-align:bottom;"> | |
<img alt="" src="{% static 'img/mailbox.png' %}" /> | |
<button type="submit"><img alt="" src="{% static 'img/send.png' %}" /></button> | |
</td> | |
</tr> | |
</table> | |
</form> | |
</div> | |
</div> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$(document).ready(function(){ | |
$('#CallForm').validate({ | |
rules: { | |
name: { | |
required: true | |
}, | |
phone: { | |
required: true, | |
number: true | |
}, | |
email: { | |
required: true, | |
email: true | |
}, | |
comment: { | |
required: true | |
} | |
}, | |
errorPlacement: function(error, element) { | |
if ($(element).attr('name') != 'agree'){ | |
$(element).parent().append($(error)); | |
} | |
}, | |
messages: { | |
name: { | |
required: "Введите данные о контактном лице" | |
}, | |
phone: { | |
required: "Введите номер контактного телефона", | |
number: "Возможно вы ошиблись, проверьте контактный телефон" | |
}, | |
email: { | |
required: "Введите адрес электронной почты", | |
email: 'Проверьте правильность адреса электронной почты' | |
}, | |
comment:{ | |
required: "Введите текст сообщения" | |
} | |
}, | |
submitHandler: function(form) { | |
$.ajax({ | |
url: '/message/', | |
dataType: 'json', | |
type: 'POST', | |
data: { | |
'name': form.name.value, | |
'phone': form.phone.value, | |
'email': form.email.value, | |
'comment': form.comment.value, | |
'message': form.message.value, | |
'csrfmiddlewaretoken': form.csrfmiddlewaretoken.value | |
}, | |
success: function(data) { | |
if (data['status'] == 'ok' ){ | |
$('#client_message').html('Ваше сообщение принято.') | |
} | |
else if (data['status'] == 'invalid_data'){ | |
$('#client_message').html('Произошла ошибка. Пожалуйста, попробуйте позже. ') | |
} | |
else { | |
$('#client_message').html('Произошла ошибка. Пожалуйста, попробуйте позже. ') | |
} | |
}, | |
error: function(jqXHR, textStatus, errorThrown) { | |
$('#client_message').html('Произошла ошибка. Пожалуйста, попробуйте позже. ') | |
} | |
}); | |
} | |
}); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.message {visibility: hidden;} | |
.letter input.error { | |
border: 1px solid #AC2727; | |
} | |
.letter label.error { | |
color: #AC2727; | |
display: inline-block; | |
margin-bottom: 10px; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment