# -*- coding: utf-8 -*- from django.db import models from django.core.exceptions import ValidationError from django.template.defaultfilters import filesizeformat from compte.models import Employe from utils.models import CommonField from world.models import Ville from utils import helpme from parametres.models import Operation,Categorie from parametres.conf import IMAGE_SIZE,ANNONCES_LIFETIMES import datetime,time,os,os.path # Create your models here. LIFE_STEP = [ ("1","Libre"), ("2","En visite"), ("3","Reserver"), ("4",u"Occuper") ] class Annonce(models.Model): reference = models.CharField(max_length=6,unique=True,editable=False) annonceur = models.ForeignKey(Employe,limit_choices_to={'is_active':True}) operation = models.ForeignKey(Operation,limit_choices_to={'is_active':True}) localisation = models.ForeignKey(Ville,limit_choices_to={'is_active':True}) quartier = models.CharField(max_length=100,blank=True,help_text=u"Séparer les différentes appelation du quartier par des virgules") type_bien = models.ForeignKey(Categorie,limit_choices_to={"is_active":True},verbose_name='Type de bien') price = models.PositiveIntegerField(u"Coût du bien") periode = models.CharField(max_length=1,choices=[('3','Annuel'),('4','Hebdo'),('2','Journalier'),('1','Mensuel')],help_text='Ce champ est obligatoire si et seulement si le type d\'operation est une location',blank=True) def upload_path(self,filename): extension=os.path.splitext(filename)[1] new_name=str(time.time())+extension return "annonceimage/"+new_name p_image = models.ImageField("Image principale",upload_to=upload_path,null=True,blank=True,help_text="La taille maximale est de %s"%filesizeformat(IMAGE_SIZE)) nb_chambre = models.PositiveIntegerField('Nombre de chambre',null=True,blank=True) nb_salon = models.PositiveIntegerField('Nombre de salon',null=True,blank=True) nb_wc = models.PositiveIntegerField('Nombre de WC',null=True,blank=True) nb_douche = models.PositiveIntegerField('Nombre de douche',null=True,blank=True) nb_cuisine = models.PositiveIntegerField('Nombre de cuisine',null=True,blank=True) nb_car = models.PositiveIntegerField(u'Capacité garage',null=True,blank=True) nb_piscine = models.PositiveIntegerField('Nombre de piscine',null=True,blank=True) year_build = models.PositiveIntegerField(u'Année de construction',null=True,blank=True) sup_all = models.PositiveIntegerField('Superficie totale',null=True,blank=True) sup_hab = models.PositiveIntegerField('Superfice habitable',null=True,blank=True) open_date = models.DateField('Date d\'ouverture',default=datetime.date.today) close_date = models.DateField('Date de fermeture') life = models.CharField('Suivie',max_length=1,choices=LIFE_STEP,default='1') created = models.DateField(auto_now_add=True) updated = models.DateField(auto_now=True) is_active= models.BooleanField("Actif",default=True) def __unicode__(self): return "Annonce %s"%self.reference def save(self,*args,**kwargs): if not self.reference: self.reference = helpme.generate_random_code("annonces","Annonce","reference",length=6) return super(Annonce,self).save(*args,**kwargs) def clean(self): if self.operation.slug_libelle == 'location': if not self.periode: raise ValidationError("Pour une location, le champ 'periode' est obligatoire") if self.p_image and self.p_image.size() > IMAGE_SIZE: raise ValidationError("La taille maximale est de %s"%filesizeformat(IMAGE_SIZE)) if self.open_date > self.close_date: raise ValidationError("Mauvaise configuration des dates") if ANNONCES_LIFETIMES: date_ecart = self.close_date - self.open_date if date_ecart.days > ANNONCES_LIFETIMES: raise ValidationError(u"La durée d'une annonce ne peut pas dépasser %s jour(s)"%ANNONCES_LIFETIMES) class Meta: verbose_name = "annonce" verbose_name_plural = "Liste des annonces" class ImageSecondaire(CommonField): def upload_path(self,filename): extension=os.path.splitext(filename)[1] new_name=str(time.time())+extension return "annonceimage/"+new_name annonce = models.ForeignKey(Annonce) s_image = models.ImageField("Image",upload_to=upload_path,help_text="La taille maximale est de %s"%filesizeformat(IMAGE_SIZE)) def __unicode__(self): return "image de l'annonce %s"%self.annonce.reference def clean(self): if not self.annonce.p_image: raise ValidationError("Ajouter une image principale avant") if self.p_image and self.p_image.size() > IMAGE_SIZE: raise ValidationError("La taille maximale est de %s"%filesizeformat(IMAGE_SIZE)) class Meta: verbose_name = 'image' verbose_name_plural = "Liste des images secondaire"