Files
liederquelle/liederquelle/quellen/models.py
2026-01-25 00:48:56 +01:00

190 lines
5.3 KiB
Python

from django.db import models
from taggit.managers import TaggableManager
from django.contrib.contenttypes.fields import GenericForeignKey
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.',
)
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='',
)
class Meta:
verbose_name = 'Person'
verbose_name_plural = 'Personen'
ordering = ['name','birth_year']
list_display = ['name']
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.',
)
tags = TaggableManager()
class Meta:
verbose_name = 'Identität'
verbose_name_plural = 'Identitäten'
ordering = ['author_id']
list_display = ['author_id', 'alias']
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 Contact(models.Model):
reference = models.ForeignKey(ContentType,
on_delete = models.CASCADE,
help_text = 'Person oder Verlag'
)
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 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 = ['reference', 'last_try']
list_display = ['reference', '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'
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 = 'Medium'
verbose_name_plural = 'Medien'
ordering = ['contact','key']
list_display = ['contact', 'key', 'value']