Files
liederquelle/liederquelle/quellen/models.py
2026-04-18 17:04:07 +02:00

256 lines
7.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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']