sangue/django/contatti_app/models.py

210 lines
6.4 KiB
Python

from django.db import models
from polymorphic.models import PolymorphicModel
from dati_geo_app.models import AbstractIndirizzo
class SoggettoContattabile(PolymorphicModel):
"""
Questa è una classe padre astratta. È utilizzata come base per tutti i soggetti contattabili.
"""
class Meta:
verbose_name = 'soggetto contattabile'
verbose_name_plural = 'soggetti contattabili'
def __str__(self):
return str(getattr(self,self.polymorphic_ctype.model))
class Recapito(PolymorphicModel):
"""
Questo modello rappresenta i recapiti di contatto di un SoggettoContattabile,
come telefoni, email, fax, ecc.
"""
class Meta:
verbose_name = 'recapito'
verbose_name_plural = 'recapiti'
soggetto = models.ForeignKey(SoggettoContattabile, on_delete=models.CASCADE, null=False,
blank=False, related_name="contatti")
class PersonaFisica(SoggettoContattabile):
"""
È child polimorfico, come PersonaGiuridica, di SoggettoContattabile e
rappresenta una persone giuridica. Ha, come PersonaGiuridica, campi specifici
per i dettagli dello specifico tipo di persona.
"""
class Meta:
verbose_name = 'persona fisica'
verbose_name_plural = 'persone fisiche'
def __str__(self):
if self.nome:
out = str(self.nome).strip()
else:
out = ''
if self.cognome:
out = f'{out} {self.cognome}'.strip()
else:
out = ''
if not out:
out = f'Persona fisica senza nome #{self.id}'
if self.titolo:
out=f'{self.titolo} {out}'
return out
titolo = models.CharField(null=False,blank=True,default='', max_length=10)
nome = models.CharField(null=False,blank=False, max_length=60)
cognome = models.CharField(null=False,blank=False, max_length=60)
is_privato = models.BooleanField(null=False, blank=False, default=True)
class PersonaGiuridica(SoggettoContattabile):
"""
È child polimorfico, come PersonaFisica, di SoggettoContattabile e
rappresenta una persona fisica. Ha, come PersonaFisica, campi specifici
per i dettagli dello specifico tipo di persona.
"""
class Meta:
verbose_name = 'persona giuridica'
verbose_name_plural = 'persone giuridiche'
def __str__(self):
if self.denominazione:
out = self.denominazione
else:
out = ''
if not out.strip:
out = 'Persona giuridica senza nome #{self.id}'
return out
denominazione = models.CharField(null=False,blank=False, max_length=80)
class Telefono(Recapito):
class Meta:
verbose_name = 'telefono'
verbose_name_plural = 'telefono'
def __str__(self):
if self.interno:
tel = f'{self.numero} (int.{self.interno})'
else:
tel = str(self.numero)
if self.note:
tel += ' (*)'
return tel
numero = models.CharField(null=False,blank=False,max_length=20)
interno = models.CharField(null=False,blank=True,default='', max_length=20)
note = models.CharField(null=False,blank=True,default='', max_length=64)
class Email(Recapito):
class Meta:
verbose_name = 'email'
verbose_name_plural = 'email'
def __str__(self):
eml = self.indirizzo_email
if self.note:
eml += ' (*)'
return eml
indirizzo_email = models.EmailField(null=False,blank=False,max_length=254)
note = models.CharField(null=False,blank=True,default='', max_length=64)
class Pec(Email):
class Meta:
verbose_name = 'pec'
verbose_name_plural = 'pec'
def __str__(self):
eml = self.indirizzo_email
if self.note:
eml += ' (*)'
return eml
class Fax(Recapito):
class Meta:
verbose_name = 'fax'
verbose_name_plural = 'fax'
def __str__(self):
out = self.numero
if self.note:
out += ' (*)'
return out.strip()
numero = models.CharField(null=False,blank=False, max_length=20)
note = models.CharField(null=False,blank=True,default='', max_length=64)
class Indirizzo(Recapito, AbstractIndirizzo):
"""
Questo modello rappresenta un indirizzo fisico associato a un soggetto contattabile.
Implementa AbstractIndirizzo, lo schema di indirizzi di django_geo_app.
"""
class Meta(AbstractIndirizzo.Meta):
pass
class Sede(Indirizzo):
"""
Questo modello rappresenta una sede fisica di un'azienda.
"""
class Meta:
verbose_name = 'sede'
verbose_name_plural = 'sedi'
def __str__(self):
out='Sede '
if self.is_legale:
out+='legale '
else:
out+='operativa '
out+=f'di {self.dug} {self.duf} {self.civico}, {self.cap} {self.comune.nome} {self.comune.provincia_id}'
return out
societa = models.ForeignKey('Societa', on_delete=models.CASCADE,
null=False, blank=False, related_name="sedi")
is_legale = models.BooleanField(null=False, blank=False, default=False)
class Societa(models.Model):
class Meta:
verbose_name = 'società'
verbose_name_plural = 'società'
def __str__(self):
if self.ragione_sociale:
out = self.ragione_sociale
else:
out = str(self.soggetto)
return out
soggetto = models.OneToOneField(SoggettoContattabile, on_delete=models.CASCADE, null=False,
blank=False, related_name="societa")
ragione_sociale = models.CharField(max_length=1024)
nazione = models.ForeignKey('dati_geo_app.Nazione', on_delete=models.CASCADE, null=True,
blank=True, related_name="societa")
class ContattoAziendale(models.Model):
class Meta:
verbose_name = 'Contatto aziendale'
verbose_name_plural = 'Contatti aziendali'
def __str__(self):
return f'{self.persona} per {self.azienda}'
persona = models.ForeignKey(PersonaFisica, on_delete=models.CASCADE, null=False,
blank=False, related_name='aziende_correlate')
azienda = models.ForeignKey(Societa, on_delete=models.CASCADE, null=False,
blank=False, related_name='contatti_azienda')
is_personale = models.BooleanField(null=False, blank=False, default=True)
# --------------- FINE PREFISSO TEMPLATE ---------------