Skip to content

Instantly share code, notes, and snippets.

@CBoJI
Created October 18, 2012 04:27
Show Gist options
  • Save CBoJI/3909851 to your computer and use it in GitHub Desktop.
Save CBoJI/3909851 to your computer and use it in GitHub Desktop.
# 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)
# 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
# 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']
# 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'}
<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>
$(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('Произошла ошибка. Пожалуйста, попробуйте позже. ')
}
});
}
});
});
.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