256 lines
7.5 KiB
Python
256 lines
7.5 KiB
Python
from django.db import models
|
||
from taggit.managers import TaggableManager
|
||
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
|
||
from django.contrib.contenttypes.models import ContentType
|
||
from django.contrib.auth.models import User
|
||
|
||
|
||
class Person(models.Model):
|
||
name = models.CharField(
|
||
verbose_name='Name',
|
||
max_length=127,
|
||
help_text='Klarname, wie er beim Lied angezeigt werden soll. Normalerweise "Vorname Nachname".',
|
||
)
|
||
full_name = models.CharField(
|
||
verbose_name='Vollständiger Name',
|
||
max_length=255, blank=True,
|
||
help_text='Name mit zusätzlichen Vornamen, Titeln usw.',
|
||
)
|
||
name_native = models.CharField(
|
||
verbose_name='Name in Originalschreibweise',
|
||
max_length=255, blank=True,
|
||
help_text='Name in nichtlateinischer Schrift',
|
||
)
|
||
birth_name = models.CharField(
|
||
verbose_name='Geburtsname',
|
||
max_length=127, blank=True,
|
||
help_text='Name vor einer Namensänderung, z.B. durch Ehe.',
|
||
)
|
||
details_secret = models.BooleanField(
|
||
verbose_name='Details geheim',
|
||
default=False,
|
||
help_text='Beim Lied soll nur der Alias angezeigt werden, kein Klarname und keine Lebensdaten.',
|
||
)
|
||
birth_year = models.CharField(
|
||
verbose_name='Geburtsjahr',
|
||
max_length=15, blank=True,
|
||
help_text='Auch ungefähre Angaben sind erlaubt.',
|
||
)
|
||
death_year = models.CharField(
|
||
verbose_name='Todesjahr',
|
||
max_length=15, blank=True,
|
||
help_text='Auch ungefähre Angaben sind erlaubt.',
|
||
)
|
||
remarks = models.TextField(
|
||
verbose_name='Anmerkungen',
|
||
blank=True,
|
||
#help_text='',
|
||
)
|
||
contacts = GenericRelation('Contact')
|
||
def alias(self):
|
||
return ','.join(n.alias for n in self.identity_set.all())
|
||
alias.verbose_name = 'Aliase'
|
||
alias.help_text = 'Fahrten-/Spitznamen einer Person'
|
||
|
||
class Meta:
|
||
verbose_name = 'Person'
|
||
verbose_name_plural = 'Personen'
|
||
ordering = ['name','birth_year']
|
||
|
||
list_display = ['name', 'alias', 'full_name', 'details_secret', 'birth_year']
|
||
|
||
def __str__(self):
|
||
return self.name
|
||
|
||
|
||
class Identity(models.Model):
|
||
person = models.ForeignKey(Person,
|
||
blank=False,
|
||
on_delete=models.CASCADE,
|
||
)
|
||
author_id = models.CharField(
|
||
verbose_name='Autoren-ID',
|
||
max_length=127,
|
||
help_text='Wie in der LilyPond-Datei und der `authors.yml` verwendet.',
|
||
)
|
||
alias = models.CharField(
|
||
verbose_name='Alias',
|
||
max_length=127,
|
||
blank=True,
|
||
help_text='Fahrtenname, Künstlername o.ä.; Spitznamen nur, wenn sie mehr sind als eine Vornamensvariante.',
|
||
)
|
||
organization = models.CharField(
|
||
verbose_name='Organisation',
|
||
max_length=127,
|
||
blank=True,
|
||
help_text='Bund (mit Stamm/Orden), Band o.ä. wie am Lied anzuzeigen – bitte zusätzlich taggen!',
|
||
)
|
||
tags = TaggableManager(
|
||
blank=True,
|
||
help_text='Kommaseparierte Stichwörter zu dieser Identität, z.B. "Bund:DPB,Band:Schlagsaite"',
|
||
verbose_name='Stichwörter'
|
||
)
|
||
|
||
class Meta:
|
||
verbose_name = 'Identität'
|
||
verbose_name_plural = 'Identitäten'
|
||
ordering = ['author_id']
|
||
|
||
list_display = ['person', 'author_id', 'alias', 'organization']
|
||
|
||
def __str__(self):
|
||
return "{} ({})".format(self.author_id, self.alias)
|
||
|
||
|
||
class AuthorID(models.Model):
|
||
person = models.ForeignKey(Person,
|
||
blank=False,
|
||
on_delete=models.CASCADE,
|
||
)
|
||
class IDs(models.TextChoices):
|
||
DISCOGS = "DISCOGS", 'Discogs'
|
||
GND = "GND", 'DNB GND'
|
||
ISNI = "ISNI", 'ISNI'
|
||
LIED = "LIED", 'LiederNet author'
|
||
BRAINZ = "BRAINZ", 'MusicBrainz'
|
||
ORCID = "ORCID", 'ORCID'
|
||
VIAF = "VIAF", 'VIAF'
|
||
WIKI = "WIKI", 'Wikidata'
|
||
key = models.CharField(
|
||
verbose_name='ID-Typ',
|
||
max_length=7,
|
||
choices=IDs,
|
||
default=IDs.VIAF,
|
||
)
|
||
value = models.CharField(
|
||
verbose_name='Wert',
|
||
max_length=127,
|
||
blank=False,
|
||
help_text='ID in der Schreibweise der jeweiligen Datenbank',
|
||
)
|
||
|
||
class Meta:
|
||
verbose_name = 'Autor-ID'
|
||
verbose_name_plural = 'Autor-IDs'
|
||
ordering = ['person', 'key', 'value']
|
||
|
||
list_display = ['person', 'key', 'value']
|
||
|
||
|
||
class AuthorURL(models.Model):
|
||
person = models.ForeignKey(Person,
|
||
blank=False,
|
||
on_delete=models.CASCADE,
|
||
)
|
||
name = models.CharField(
|
||
verbose_name='Art',
|
||
max_length=15,
|
||
blank=False,
|
||
default='Homepage',
|
||
help_text='z.B. Wikipedia-Eintrag'
|
||
)
|
||
url = models.URLField(
|
||
verbose_name='URL',
|
||
blank=False,
|
||
help_text='Web-Adresse',
|
||
)
|
||
|
||
class Meta:
|
||
verbose_name = 'Autor-Website'
|
||
verbose_name_plural = 'Autor-Webseiten'
|
||
ordering = ['person', 'name',]
|
||
|
||
list_display = ['person', 'name', 'url']
|
||
|
||
|
||
class Contact(models.Model):
|
||
content_type = models.ForeignKey(ContentType,
|
||
on_delete = models.CASCADE,
|
||
help_text = 'Person oder Verlag',
|
||
default = Person,
|
||
blank=False,null=False,
|
||
)
|
||
object_id = models.PositiveBigIntegerField(
|
||
default=1,
|
||
blank=False,null=False,
|
||
)
|
||
content_object = GenericForeignKey("content_type", "object_id")
|
||
name = models.CharField(
|
||
verbose_name = 'Kontaktperson',
|
||
blank=True,
|
||
max_length=127,
|
||
help_text = 'Name der Kontaktperson, falls nicht mit der Person identisch'
|
||
)
|
||
address = models.TextField(
|
||
verbose_name = 'Adresse',
|
||
blank=True,
|
||
help_text = 'Postadresse',
|
||
)
|
||
last_try = models.DateField(
|
||
verbose_name = 'letzter Kontaktversuch',
|
||
blank=True,null=True,
|
||
)
|
||
user = models.ForeignKey(User,
|
||
verbose_name = 'User',
|
||
blank=True,null=True,
|
||
on_delete = models.SET_NULL,
|
||
help_text = 'Kontakt durch bzw. persönlich bekannt mit Projektmitarbeiter*in'
|
||
)
|
||
success = models.BooleanField(
|
||
verbose_name = 'Kontakt erfolgreich?',
|
||
blank=True,null=True,default=None,
|
||
help_text = 'War der Kontaktversuch erfolgreich?'
|
||
)
|
||
remarks = models.TextField(
|
||
verbose_name='Anmerkungen',
|
||
blank=True,
|
||
#help_text='',
|
||
)
|
||
|
||
class Meta:
|
||
verbose_name = 'Kontakt'
|
||
verbose_name_plural = 'Kontakte'
|
||
#ordering = ['content_object', 'last_try']
|
||
indexes = [
|
||
models.Index(fields=["content_type", "object_id"]),
|
||
]
|
||
|
||
def __str__(self):
|
||
return str(self.content_object)
|
||
|
||
list_display = ['content_object', 'name', 'last_try', 'user', 'success']
|
||
|
||
|
||
class Medium(models.Model):
|
||
contact = models.ForeignKey(Contact,
|
||
blank=False,
|
||
on_delete=models.CASCADE,
|
||
)
|
||
class IDs(models.TextChoices):
|
||
Email = "Email", 'E-Mail'
|
||
Phone = "Phone", 'Telefon'
|
||
Web = "Web", 'Homepage'
|
||
Signal = "Signal", 'Signal-ID'
|
||
Fedi = "Fedi", 'Fediverse-Handle'
|
||
Matrix = "Matrix", 'Matrix-ID'
|
||
XMPP = "XMPP", 'XMPP-ID'
|
||
key = models.CharField(
|
||
verbose_name='Art',
|
||
max_length=15,
|
||
choices=IDs,
|
||
default=IDs.Email,
|
||
)
|
||
value = models.CharField(
|
||
verbose_name='Wert',
|
||
max_length=127,
|
||
blank=False,
|
||
help_text='Adresse bzw. Handle',
|
||
)
|
||
|
||
class Meta:
|
||
verbose_name = 'Kontaktmedium'
|
||
verbose_name_plural = 'Kontaktmedien'
|
||
ordering = ['contact','key']
|
||
|
||
list_display = ['contact', 'key', 'value']
|