From be76dcaec479d0de8ec9d575bc2ffdc7ab8ca035 Mon Sep 17 00:00:00 2001 From: Lincoln de Sousa Date: Sun, 13 Jul 2008 19:11:00 -0300 Subject: [PATCH] adding the site foreign key in Evento entity, adding Trilha and making it and TipoTrabalho dependent on the event. --- eventos/models.py | 21 ++++++++++++++++-- eventos/views.py | 56 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/eventos/models.py b/eventos/models.py index 85e3243..fd7d809 100644 --- a/eventos/models.py +++ b/eventos/models.py @@ -18,6 +18,7 @@ from django.db import models from django.contrib.localflavor.br.br_states import STATE_CHOICES from django.contrib.auth.models import User +from django.contrib.sites.models import Site class Evento(models.Model): nome = models.CharField(max_length=100) @@ -32,10 +33,12 @@ class Evento(models.Model): estado = models.CharField(max_length=2, choices=STATE_CHOICES) info_adicional = models.TextField(blank=True) + site = models.ForeignKey(Site) + class Admin: fields = ( (u'Informações do evento', - {'fields': ('nome', 'data_inicio', 'data_final')}), + {'fields': ('nome', 'data_inicio', 'data_final', 'site')}), (u'Informações da sede', {'fields': ('local', 'nome_contato', 'endereco', 'cidade', @@ -89,9 +92,11 @@ class Palestrante(models.Model): class TipoTrabalho(models.Model): nome = models.CharField(max_length=100) + evento = models.ForeignKey(Evento) class Admin: search_fields = 'nome', + list_filter = 'evento', class Meta: verbose_name = u'Tipo de trabalho' @@ -100,10 +105,22 @@ class TipoTrabalho(models.Model): def __str__(self): return self.nome +class Trilha(models.Model): + nome = models.CharField(max_length=100) + evento = models.ForeignKey(Evento) + + class Admin: + search_fields = 'nome', + list_filter = 'evento', + + def __str__(self): + return self.nome + class Trabalho(models.Model): titulo = models.CharField(max_length=100) evento = models.ForeignKey(Evento) tipo = models.ForeignKey(TipoTrabalho) + trilha = models.ForeignKey(Trilha) palestrante = models.ForeignKey(Palestrante) descricao_curta = models.TextField(u'Descrição curta') descricao_longa = models.TextField(u'Descrição longa') @@ -115,7 +132,7 @@ class Trabalho(models.Model): null=True) class Admin: - list_filter = 'evento', 'tipo' + list_filter = 'evento', 'tipo', 'trilha', search_fields = list_display = 'titulo', 'evento', 'tipo' def __str__(self): diff --git a/eventos/views.py b/eventos/views.py index 42c40a7..bd771c1 100644 --- a/eventos/views.py +++ b/eventos/views.py @@ -15,6 +15,7 @@ # License along with this program; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. +from django.conf import settings from django.http import HttpResponseRedirect, HttpResponseForbidden from django.contrib import auth from django.contrib.auth.forms import AuthenticationForm @@ -22,7 +23,7 @@ from django.contrib.auth.models import User, Group from django.newforms import form_for_instance, form_for_model, HiddenInput from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext, Context, loader -from eventos.models import Palestrante, Trabalho +from eventos.models import Palestrante, Trabalho, TipoTrabalho, Trilha, Evento from eventos.forms import RegisterSpeaker forbidden = \ @@ -135,9 +136,35 @@ def speaker_talks(request, lid): def talk_details(request, tid): """Shows a form to edit a talk """ + # Selected in settings.py (SITE_ID) variable, because an event can + # be linked with only one site. + event = Evento.objects.get(site__id__exact=settings.SITE_ID) + + # building the form entity = get_object_or_404(Trabalho, pk=tid) FormKlass = form_for_instance(entity) form = FormKlass(request.POST or None) + + # These fields should not be shown to the user. + form.fields['palestrante'].widget = HiddenInput() + form.fields['evento'].widget = HiddenInput() + + # These fields are event specific + trilhas = Trilha.objects.filter(evento=event) + form.fields['trilha']._set_queryset(trilhas) + + tipos = TipoTrabalho.objects.filter(evento=event) + form.fields['tipo']._set_queryset(tipos) + + # hidding the owner in the other speakers list + other = Palestrante.objects.exclude(pk=entity.id) + form.fields['outros_palestrantes']._set_queryset(other) + if other.count() == 0: + # I need set the value to '', otherwise the wise django + # newforms will fill the field with the invalid string '[]' + form.fields['outros_palestrantes'].initial = '' + form.fields['outros_palestrantes'].widget = HiddenInput() + if request.POST and form.is_valid(): form.save() @@ -165,19 +192,42 @@ def talk_add(request): if not hasattr(request.user, 'palestrante_set'): return forbidden + # Selected in settings.py (SITE_ID) variable, because an event can + # be linked with only one site. + event = Evento.objects.get(site__id__exact=settings.SITE_ID) + + # building the form entity = request.user.palestrante_set.get() FormKlass = form_for_model(Trabalho) form = FormKlass(request.POST or None, - initial={'palestrante': entity.id}) + initial={'palestrante': entity.id, 'evento': event.id}) - # This field should not be shown to the user. + # These fields should not be shown to the user. form.fields['palestrante'].widget = HiddenInput() + form.fields['evento'].widget = HiddenInput() + + # These fields are event specific + trilhas = Trilha.objects.filter(evento=event) + form.fields['trilha']._set_queryset(trilhas) + + tipos = TipoTrabalho.objects.filter(evento=event) + form.fields['tipo']._set_queryset(tipos) # hidding the owner in the other speakers list other = Palestrante.objects.exclude(pk=entity.id) form.fields['outros_palestrantes']._set_queryset(other) + if other.count() == 0: + form.fields['outros_palestrantes'].widget = HiddenInput() if request.POST and form.is_valid(): + # validation + cleaned = form.cleaned_data + if cleaned['tipo'].evento.id != event.id: + return forbidden + + if cleaned['trilha'].evento.id != event.id: + return forbidden + instance = form.save() return HttpResponseRedirect('/speaker/%d/talks/' % entity.id) -- 2.20.1