diff --git a/database.db b/database.db index 1c033a0..ab3cab7 100644 Binary files a/database.db and b/database.db differ diff --git a/settings.py b/settings.py index b47243f..07511c0 100644 --- a/settings.py +++ b/settings.py @@ -1,5 +1,6 @@ # Django settings for eventex project. +ON_HERIKE = False DEBUG = True TEMPLATE_DEBUG = DEBUG @@ -7,7 +8,11 @@ PROJECT_DIR = os.path.dirname(__file__) -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +if ON_HERIKE: + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +else: + EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + EMAIL_HOST = 'localhost' EMAIL_HOST_PASSWORD = '' EMAIL_HOST_USER = '' @@ -105,6 +110,7 @@ 'subscription', # Uncomment the next line to enable the admin: 'django.contrib.admin', + 'south', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', ) diff --git a/subscription/admin.py b/subscription/admin.py index 93f93a0..28ab5a4 100644 --- a/subscription/admin.py +++ b/subscription/admin.py @@ -1,18 +1,52 @@ +# encoding: utf-8 import datetime from django.contrib import admin from subscription.models import Subscription +from django.utils.translation import ugettext as _ +from django.utils.translation import ungettext +from django.http import HttpResponse +from django.conf.urls.defaults import patterns, url class SubscriptionAdmin(admin.ModelAdmin): - list_display = ('name', 'email', 'phone', 'created_at', 'subscribed_today') + list_display = ('name', 'email', 'phone', 'created_at', 'subscribed_today', 'paid') date_hierarchy = 'created_at' search_fields = ('name', 'email', 'phone', 'cpf', 'created_at') - list_filter = ['created_at'] + list_filter = ['created_at', 'paid'] + + actions = ['mark_as_paid'] def subscribed_today(self, obj): return obj.created_at.date() == datetime.date.today() subscribed_today.short_description = 'Inscrito hoje?' subscribed_today.boolean = True + + def mark_as_paid(self, request, queryset): + count = queryset.update(paid=True) + msg = ungettext ( + u'%(count)d inscrição foi marcada como paga.', + u'%(count)d inscrições foram marcadas como pagas.', + count) % {'count': count} + self.message_user(request, msg) + + mark_as_paid.short_description = _(u'Marcar como pagas') + + def export_subscriptions(self, request): + subscriptions = self.model.objects.all() + rows = [','.join([s.name, s.email]) for s in subscriptions] #list comprehension + response = HttpResponse('\r\n'.join(rows)) + response.mimetype = 'text/csv' + response['Content-Disposition'] = 'attachment; filename=inscritos.csv' + + return response + + def get_urls(self): + default_urls = super(SubscriptionAdmin, self).get_urls() + new_urls = patterns('', + url(r'^exportar-inscricoes/$', self.admin_site.admin_view(self.export_subscriptions), + name='export_subscriptions')) + + return new_urls + default_urls admin.site.register(Subscription, SubscriptionAdmin) diff --git a/subscription/forms.py b/subscription/forms.py index 60b5aed..7c97310 100644 --- a/subscription/forms.py +++ b/subscription/forms.py @@ -1,7 +1,56 @@ +# encoding: utf-8 + from django import forms from subscription.models import Subscription +from django.utils.translation import ugettext as _ +from subscription import validators +from django.core.validators import EMPTY_VALUES + +class PhoneWidget(forms.MultiWidget): + def __init__(self, attrs=None): + widgets = ( + forms.TextInput(attrs=attrs), + forms.TextInput(attrs=attrs)) + super(PhoneWidget, self).__init__(widgets, attrs) + + def decompress(self, value): + if value: + return value.split('‐') + return [None, None] + +class PhoneField(forms.MultiValueField): + + widget = PhoneWidget + + def __init__(self, *args, **kwargs): + fields = (forms.IntegerField(), forms.IntegerField()) + super(PhoneField, self).__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if data_list: + if data_list[0] in EMPTY_VALUES: + raise forms.ValidationError(_(u'DDD inválido.')) + if data_list[1] in EMPTY_VALUES: + raise forms.ValidationError(_(u'Número inválido.')) + return '%s‐%s' % tuple(data_list) + return "" class SubscriptionForm(forms.ModelForm): + + phone = PhoneField(required=False) + class Meta: model = Subscription - exclude= ("created_at",) + exclude= ('created_at', 'paid') + + def clean(self): + super(SubscriptionForm, self).clean() + if not self.cleaned_data.get('email') and not self.cleaned_data.get('phone'): + raise forms.ValidationError(_(u'Você deve informar pelo menos o e-mail ou o telefone.')) + return self.cleaned_data + + + + + + diff --git a/subscription/models.py b/subscription/models.py index ec8116f..0defa40 100644 --- a/subscription/models.py +++ b/subscription/models.py @@ -1,15 +1,17 @@ -#coding: utf-8 +# encoding: utf-8 from django.db import models +from subscription import validators # Create your models here. class Subscription(models.Model): name = models.CharField('Nome', max_length=100) - cpf = models.CharField('CPF', max_length=11, unique=True) - email = models.EmailField('E-mail', unique=True) + cpf = models.CharField('CPF', max_length=11, unique=True, validators=[validators.CpfValidator]) + email = models.EmailField('E-mail', unique=True, blank=True) phone = models.CharField('Telefone', max_length=20, blank=True) created_at = models.DateTimeField('Data inscrição', auto_now_add=True) + paid = models.BooleanField('Pagou?', default=False) def __unicode__(self): return self.name @@ -18,3 +20,5 @@ class Meta: ordering = ["created_at"] verbose_name = u"Inscrição" verbose_name_plural = u"Inscrições" + + diff --git a/subscription/validators.py b/subscription/validators.py new file mode 100644 index 0000000..eaae30c --- /dev/null +++ b/subscription/validators.py @@ -0,0 +1,13 @@ +# encoding: utf-8 +from django.utils.translation import ugettext as _ +from django.core.exceptions import ValidationError + +def CpfValidator(value): + if not value.isdigit(): + raise ValidationEror(_(u'O CPF deve conter apenas números')) + if len(value) != 11: + raise ValidationError(_(u'O CPF deve conter 11 dígitos')) + + + + diff --git a/subscription/views.py b/subscription/views.py index 3e8b553..3ee00f6 100644 --- a/subscription/views.py +++ b/subscription/views.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# encoding: utf-8 # Create your views here. from django.http import HttpResponseRedirect diff --git a/templates/admin/subscription/change_list.html b/templates/admin/subscription/change_list.html new file mode 100644 index 0000000..a01144e --- /dev/null +++ b/templates/admin/subscription/change_list.html @@ -0,0 +1,13 @@ +{% extends 'admin/change_list.html' %} +{% block object-tools %} + + +{{ block.super }} +{% endblock object-tools %} + diff --git a/templates/master.html b/templates/master.html index 2e9b4ed..04771ca 100644 --- a/templates/master.html +++ b/templates/master.html @@ -28,10 +28,9 @@

EventeX