190 lines
5.3 KiB
Python
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']
|