<commit_before># -*- coding: UTF-8 -*-
from django.contrib.gis.db import models
from django.template.defaultfilters import slugify
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import get_object_or_404
 
from apps.core.managers import RecorridoManager
from apps.catastro.models import Ciudad
from apps.usuarios.models import RecorridoFavorito
from apps.editor.fields import UUIDField

from django.core.urlresolvers import reverse

class Linea(models.Model):
    nombre = models.CharField(max_length=100)
    slug = models.SlugField(max_length=120, blank=True, null=False)
    descripcion = models.TextField(blank=True, null=True)
    foto = models.CharField(max_length=20, blank=True, null=True)
    img_panorama = models.ImageField(max_length=200, upload_to='linea', blank=True, null=True)
    img_cuadrada = models.ImageField(max_length=200, upload_to='linea', blank=True, null=True)
    color_polilinea = models.CharField(max_length=20, blank=True, null=True)
    info_empresa = models.TextField(blank=True, null=True)
    info_terminal = models.TextField(blank=True, null=True)
    localidad = models.CharField(max_length=50, blank=True, null=True)
    cp = models.CharField(max_length=20, blank=True, null=True)
    telefono = models.CharField(max_length=200, blank=True, null=True)
    envolvente = models.PolygonField(blank=True, null=True)
    
    @property
    def ciudades(self):
        return Ciudad.objects.filter(lineas=self)
    
    def __unicode__(self):
        return self.nombre

    def save(self, *args, **kwargs):
        self.slug = slugify(self.nombre)
        super(Linea, self).save(*args, **kwargs)

    def get_absolute_url(self, ciudad_slug = None):
        # chequear si la linea está en esta ciudad, sino tirar excepcion
        if ciudad_slug is None:
            ciudad_slug = Ciudad.objects.filter(lineas=self)[0].slug
        else:
            get_object_or_404(Ciudad, slug=ciudad_slug, lineas=self)
        return reverse('ver_linea',
            kwargs={
                'nombre_ciudad'   : ciudad_slug,
                'nombre_linea'    : self.slug
            })

class Recorrido(models.Model):
    uuid = UUIDField()
    nombre = models.CharField(max_length=100)
    img_panorama = models.ImageField(max_length=200, upload_to='recorrido', blank=True, null=True)
    img_cuadrada = models.ImageField(max_length=200, upload_to='recorrido', blank=True, null=True)
    linea = models.ForeignKey(Linea)
    ruta = models.LineStringField()
    sentido = models.CharField(max_length=100, blank=True, null=False)
    slug = models.SlugField(max_length=200, blank=True, null=False)
    inicio = models.CharField(max_length=100, blank=True, null=False)
    fin = models.CharField(max_length=100, blank=True, null=False)
    semirrapido = models.BooleanField(default=False)
    color_polilinea = models.CharField(max_length=20, blank=True, null=True)
    horarios = models.TextField(blank=True, null=True)
    pois = models.TextField(blank=True, null=True)
    descripcion = models.TextField(blank=True, null=True)

    # Si tiene las paradas completas es porque tiene todas las paradas de
    # este recorrido en la tabla paradas+horarios (horarios puede ser null),
    # y se puede utilizar en la busqueda usando solo las paradas.
    paradas_completas = models.BooleanField(default=False)

    objects = RecorridoManager()

    @property
    def ciudades(self):
        return Ciudad.objects.filter(lineas=self.linea)
    
    def __unicode__(self):
        #return str(self.ciudad_set.all()[0]) + " - " + str(self.linea) + " - " + self.nombre
        return str(self.linea) + " - " + self.nombre

    def es_favorito(self, usuario):
        """ Verificar si este recorrido esta marcado como favorito para <usuario> """
        try:
            favorito = RecorridoFavorito.objects.get(recorrido=self, usuario=usuario)
            return favorito.activo
        except ObjectDoesNotExist:
            return False

    def save(self, *args, **kwargs):
        # Generar el SLUG a partir del origen y destino del recorrido
        self.slug = slugify(self.nombre + " desde " + self.inicio + " hasta " + self.fin)

        # Asegurarse de que no haya 'inicio' y/o 'fin' invalidos
        assert (
            self.inicio != self.fin
            and self.inicio != ''
            and self.fin != ''
        ), "Los campos 'inicio' y 'fin' no pueden ser vacios y/o iguales"

        # Ejecutar el SAVE original
        super(Recorrido, self).save(*args, **kwargs)

        # Ver que ciudades intersecta
        ciudades = Ciudad.objects.all()
        for ciudad in ciudades:
            if ciudad.poligono.intersects(self.ruta):
                ciudad.recorridos.add(self)
                ciudad.lineas.add(self.linea)

    class Meta:
        ordering = ['linea__nombre', 'nombre']

    def get_absolute_url(self, ciudad_slug = None, linea_slug = None, slug = None):
        # chequear si la linea/recorrido está en esta ciudad, sino tirar excepcion
        if ciudad_slug is None:
            try:
                ciudad_slug = self.ciudad_slug
            except:
                try:
                    ciudad_slug = Ciudad.objects.filter(lineas=self.linea)[0].slug
                except:
                    print self
                    #raise
        else:
            # Esto lo comento porque hace muuuy lento a todo el sistema.
            # Mas vale tomo como que el slug esta siempre bien. De ultima como mucho, me genera un link que da un 404.
            # get_object_or_404(Ciudad, slug=ciudad_slug, lineas=self.linea)
            pass
        if linea_slug is None:
            try:
                linea_slug = self.linea_slug
            except:
                linea_slug = self.linea.slug # Esto genera una consulta mas
        if slug is None:
            slug = self.slug # Esto puede generar otra a veces
        return reverse('ver_recorrido',
            kwargs={<commit_msg>Dont raise exception if linea-ciudad not found<commit_after># -*- coding: UTF-8 -*-
from django.contrib.gis.db import models
from django.template.defaultfilters import slugify
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import get_object_or_404
 
from apps.core.managers import RecorridoManager
from apps.catastro.models import Ciudad
from apps.usuarios.models import RecorridoFavorito
from apps.editor.fields import UUIDField

from django.core.urlresolvers import reverse

class Linea(models.Model):
    nombre = models.CharField(max_length=100)
    slug = models.SlugField(max_length=120, blank=True, null=False)
    descripcion = models.TextField(blank=True, null=True)
    foto = models.CharField(max_length=20, blank=True, null=True)
    img_panorama = models.ImageField(max_length=200, upload_to='linea', blank=True, null=True)
    img_cuadrada = models.ImageField(max_length=200, upload_to='linea', blank=True, null=True)
    color_polilinea = models.CharField(max_length=20, blank=True, null=True)
    info_empresa = models.TextField(blank=True, null=True)
    info_terminal = models.TextField(blank=True, null=True)
    localidad = models.CharField(max_length=50, blank=True, null=True)
    cp = models.CharField(max_length=20, blank=True, null=True)
    telefono = models.CharField(max_length=200, blank=True, null=True)
    envolvente = models.PolygonField(blank=True, null=True)
    
    @property
    def ciudades(self):
        return Ciudad.objects.filter(lineas=self)
    
    def __unicode__(self):
        return self.nombre

    def save(self, *args, **kwargs):
        self.slug = slugify(self.nombre)
        super(Linea, self).save(*args, **kwargs)

    def get_absolute_url(self, ciudad_slug = None):
        # chequear si la linea está en esta ciudad, sino tirar excepcion
        if ciudad_slug is None:
            try:
                ciudad_slug = Ciudad.objects.filter(lineas=self)[0].slug
            except:
                print self
                return ""
        else:
            get_object_or_404(Ciudad, slug=ciudad_slug, lineas=self)
        return reverse('ver_linea',
            kwargs={
                'nombre_ciudad'   : ciudad_slug,
                'nombre_linea'    : self.slug
            })

class Recorrido(models.Model):
    uuid = UUIDField()
    nombre = models.CharField(max_length=100)
    img_panorama = models.ImageField(max_length=200, upload_to='recorrido', blank=True, null=True)
    img_cuadrada = models.ImageField(max_length=200, upload_to='recorrido', blank=True, null=True)
    linea = models.ForeignKey(Linea)
    ruta = models.LineStringField()
    sentido = models.CharField(max_length=100, blank=True, null=False)
    slug = models.SlugField(max_length=200, blank=True, null=False)
    inicio = models.CharField(max_length=100, blank=True, null=False)
    fin = models.CharField(max_length=100, blank=True, null=False)
    semirrapido = models.BooleanField(default=False)
    color_polilinea = models.CharField(max_length=20, blank=True, null=True)
    horarios = models.TextField(blank=True, null=True)
    pois = models.TextField(blank=True, null=True)
    descripcion = models.TextField(blank=True, null=True)

    # Si tiene las paradas completas es porque tiene todas las paradas de
    # este recorrido en la tabla paradas+horarios (horarios puede ser null),
    # y se puede utilizar en la busqueda usando solo las paradas.
    paradas_completas = models.BooleanField(default=False)

    objects = RecorridoManager()

    @property
    def ciudades(self):
        return Ciudad.objects.filter(lineas=self.linea)
    
    def __unicode__(self):
        #return str(self.ciudad_set.all()[0]) + " - " + str(self.linea) + " - " + self.nombre
        return str(self.linea) + " - " + self.nombre

    def es_favorito(self, usuario):
        """ Verificar si este recorrido esta marcado como favorito para <usuario> """
        try:
            favorito = RecorridoFavorito.objects.get(recorrido=self, usuario=usuario)
            return favorito.activo
        except ObjectDoesNotExist:
            return False

    def save(self, *args, **kwargs):
        # Generar el SLUG a partir del origen y destino del recorrido
        self.slug = slugify(self.nombre + " desde " + self.inicio + " hasta " + self.fin)

        # Asegurarse de que no haya 'inicio' y/o 'fin' invalidos
        assert (
            self.inicio != self.fin
            and self.inicio != ''
            and self.fin != ''
        ), "Los campos 'inicio' y 'fin' no pueden ser vacios y/o iguales"

        # Ejecutar el SAVE original
        super(Recorrido, self).save(*args, **kwargs)

        # Ver que ciudades intersecta
        ciudades = Ciudad.objects.all()
        for ciudad in ciudades:
            if ciudad.poligono.intersects(self.ruta):
                ciudad.recorridos.add(self)
                ciudad.lineas.add(self.linea)

    class Meta:
        ordering = ['linea__nombre', 'nombre']

    def get_absolute_url(self, ciudad_slug = None, linea_slug = None, slug = None):
        # chequear si la linea/recorrido está en esta ciudad, sino tirar excepcion
        if ciudad_slug is None:
            try:
                ciudad_slug = self.ciudad_slug
            except:
                try:
                    ciudad_slug = Ciudad.objects.filter(lineas=self.linea)[0].slug
                except:
                    print self
                    return ""
                    #raise
        else:
            # Esto lo comento porque hace muuuy lento a todo el sistema.
            # Mas vale tomo como que el slug esta siempre bien. De ultima como mucho, me genera un link que da un 404.
            # get_object_or_404(Ciudad, slug=ciudad_slug, lineas=self.linea)
            pass
        if linea_slug is None:
            try:
                linea_slug = self.linea_slug
            except:
                linea_slug = self.linea.slug # Esto genera una consulta mas
        if slug is None:
            slug = self.slug # Esto puede generar otra a veces
        return reverse('ver_recorrido',
            kwargs={
{'fraction_non_alphanumeric': 0.097244061905156, 'fraction_numerical': 0.010262352064884548, 'mean_word_length': 2.734239802224969, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6468240', 'n_tokens_mistral': 3914, 'n_tokens_neox': 3837, 'n_words': 891}