adding the site foreign key in Evento entity, adding Trilha 200807131914
authorLincoln de Sousa <lincoln@minaslivre.org>
Sun, 13 Jul 2008 22:11:00 +0000 (19:11 -0300)
committerLincoln de Sousa <lincoln@minaslivre.org>
Sun, 13 Jul 2008 22:11:00 +0000 (19:11 -0300)
 and making it and TipoTrabalho dependent on the event.

eventos/models.py
eventos/views.py

index 85e3243..fd7d809 100644 (file)
@@ -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):
index 42c40a7..bd771c1 100644 (file)
@@ -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)