diff --git a/.gitignore b/.gitignore index d88899c73..cece58f16 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ tmp dist doc/output/ doc/pelican-plugins/ +doc/pelican-themes/ doc/api/telemeta # Installer logs diff --git a/telemeta/admin.py b/telemeta/admin.py index 4e06c7037..0da8f4eeb 100644 --- a/telemeta/admin.py +++ b/telemeta/admin.py @@ -42,6 +42,9 @@ class MediaItemIdentifierInline(admin.StackedInline): model = MediaItemIdentifier factory_kwargs = {'max_num': 1} +class ResponsabilityInline(admin.StackedInline): + model = Responsability + class MediaItemAdmin(admin.ModelAdmin): search_fields = ['title', 'code'] ordering = ['code'] @@ -49,7 +52,9 @@ class MediaItemAdmin(admin.ModelAdmin): inlines = [MediaItemIdentifierInline, MediaItemRelatedInline, MediaItemTranscodedInline, - MediaItemMarkerInline] + MediaItemMarkerInline, + ResponsabilityInline + ] class MediaPartAdmin(admin.ModelAdmin): search_fields = ['title', 'item__code'] @@ -106,6 +111,8 @@ class PlaylistAdmin(admin.ModelAdmin): class EnumerationPropertyAdmin(admin.ModelAdmin): list_display = ['enumeration_name', 'is_admin', 'is_hidden'] +#class AuthorityAdmin(admin.ModelAdmin): +# model = Authority admin.site.register(MediaFonds, MediaFondsAdmin) admin.site.register(MediaCorpus, MediaCorpusAdmin) @@ -135,3 +142,6 @@ class EnumerationPropertyAdmin(admin.ModelAdmin): admin.site.register(Playlist, PlaylistAdmin) admin.site.register(EnumerationProperty, EnumerationPropertyAdmin) + +admin.site.register(Responsability) +admin.site.register(Authority) diff --git a/telemeta/migrations/0008_auto_20200531_0733.py b/telemeta/migrations/0008_auto_20200531_0733.py new file mode 100644 index 000000000..1737ae661 --- /dev/null +++ b/telemeta/migrations/0008_auto_20200531_0733.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import telemeta.models.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemeta', '0007_auto_20190505_1749'), + ] + + operations = [ + migrations.CreateModel( + name='Authority', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('first_name', models.CharField(max_length=50, verbose_name='firstname')), + ('last_name', models.CharField(max_length=50, verbose_name='lastname')), + ], + options={ + 'db_table': 'media_authority', + 'verbose_name': 'authority', + }, + ), + migrations.AddField( + model_name='mediaitem', + name='authority', + field=telemeta.models.fields.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='telemeta.Authority', null=True), + ), + ] diff --git a/telemeta/migrations/0009_auto_20200531_0805.py b/telemeta/migrations/0009_auto_20200531_0805.py new file mode 100644 index 000000000..b06c3c627 --- /dev/null +++ b/telemeta/migrations/0009_auto_20200531_0805.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemeta', '0008_auto_20200531_0733'), + ] + + operations = [ + migrations.RenameField( + model_name='mediaitem', + old_name='authority', + new_name='collector2', + ), + ] diff --git a/telemeta/migrations/0010_auto_20200531_0811.py b/telemeta/migrations/0010_auto_20200531_0811.py new file mode 100644 index 000000000..7c7ca1e5a --- /dev/null +++ b/telemeta/migrations/0010_auto_20200531_0811.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemeta', '0009_auto_20200531_0805'), + ] + + operations = [ + migrations.AddField( + model_name='authority', + name='biography', + field=models.TextField(null=True, verbose_name='biography', blank=True), + ), + migrations.AddField( + model_name='authority', + name='birth', + field=models.DateField(help_text='YYYY-MM-DD', null=True, verbose_name='birth', blank=True), + ), + migrations.AddField( + model_name='authority', + name='death', + field=models.DateField(help_text='YYYY-MM-DD', null=True, verbose_name='death', blank=True), + ), + ] diff --git a/telemeta/migrations/0011_authority_isni.py b/telemeta/migrations/0011_authority_isni.py new file mode 100644 index 000000000..c89112dc1 --- /dev/null +++ b/telemeta/migrations/0011_authority_isni.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemeta', '0010_auto_20200531_0811'), + ] + + operations = [ + migrations.AddField( + model_name='authority', + name='isni', + field=models.PositiveIntegerField(help_text='International Standard Name Identifier', null=True, verbose_name='isni', blank=True), + ), + ] diff --git a/telemeta/migrations/0012_auto_20200531_0822.py b/telemeta/migrations/0012_auto_20200531_0822.py new file mode 100644 index 000000000..110339611 --- /dev/null +++ b/telemeta/migrations/0012_auto_20200531_0822.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemeta', '0011_authority_isni'), + ] + + operations = [ + migrations.AddField( + model_name='authority', + name='first_name_lat', + field=models.CharField(help_text='First name in latin characters, usage form', max_length=50, null=True, verbose_name='firstname_lat', blank=True), + ), + migrations.AddField( + model_name='authority', + name='first_name_translit', + field=models.CharField(help_text='First name transliterated', max_length=50, null=True, verbose_name='firstname_translit', blank=True), + ), + migrations.AddField( + model_name='authority', + name='last_name_lat', + field=models.CharField(help_text='Last name in latin character, usage form', max_length=50, null=True, verbose_name='lastname_lat', blank=True), + ), + migrations.AddField( + model_name='authority', + name='last_name_translit', + field=models.CharField(help_text='Last name transliterated', max_length=50, null=True, verbose_name='lastname_translit', blank=True), + ), + migrations.AlterField( + model_name='authority', + name='first_name', + field=models.CharField(help_text='First name in original language', max_length=50, verbose_name='firstname'), + ), + migrations.AlterField( + model_name='authority', + name='last_name', + field=models.CharField(help_text='Last name in original language', max_length=50, verbose_name='lastname'), + ), + ] diff --git a/telemeta/migrations/0013_auto_20200531_0849.py b/telemeta/migrations/0013_auto_20200531_0849.py new file mode 100644 index 000000000..b46885262 --- /dev/null +++ b/telemeta/migrations/0013_auto_20200531_0849.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemeta', '0012_auto_20200531_0822'), + ] + + operations = [ + migrations.RemoveField( + model_name='mediaitem', + name='collector2', + ), + migrations.DeleteModel( + name='Authority', + ), + ] diff --git a/telemeta/migrations/0014_auto_20200531_0901.py b/telemeta/migrations/0014_auto_20200531_0901.py new file mode 100644 index 000000000..480303b38 --- /dev/null +++ b/telemeta/migrations/0014_auto_20200531_0901.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemeta', '0013_auto_20200531_0849'), + ] + + operations = [ + migrations.CreateModel( + name='Authority', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('first_name', models.CharField(help_text='First name in original language', max_length=50, verbose_name='firstname')), + ('last_name', models.CharField(help_text='Last name in original language', max_length=50, verbose_name='lastname')), + ('first_name_lat', models.CharField(help_text='First name in latin characters, usage form', max_length=50, null=True, verbose_name='firstname_lat', blank=True)), + ('last_name_lat', models.CharField(help_text='Last name in latin character, usage form', max_length=50, null=True, verbose_name='lastname_lat', blank=True)), + ('first_name_translit', models.CharField(help_text='First name transliterated', max_length=50, null=True, verbose_name='firstname_translit', blank=True)), + ('last_name_translit', models.CharField(help_text='Last name transliterated', max_length=50, null=True, verbose_name='lastname_translit', blank=True)), + ('birth', models.DateField(help_text='YYYY-MM-DD', null=True, verbose_name='birth', blank=True)), + ('death', models.DateField(help_text='YYYY-MM-DD', null=True, verbose_name='death', blank=True)), + ('biography', models.TextField(null=True, verbose_name='biography', blank=True)), + ('isni', models.PositiveIntegerField(help_text='International Standard Name Identifier', null=True, verbose_name='isni', blank=True)), + ], + options={ + 'db_table': 'media_authority', + 'verbose_name': 'authority', + 'verbose_name_plural': 'authorities', + }, + ), + migrations.CreateModel( + name='Responsability', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('authority', models.ForeignKey(to='telemeta.Authority')), + ('collection', models.ForeignKey(to='telemeta.MediaCollection')), + ('item', models.ForeignKey(to='telemeta.MediaItem')), + ], + options={ + 'db_table': 'media_responsability', + 'verbose_name': 'responsability', + 'verbose_name_plural': 'responsabilites', + }, + ), + migrations.CreateModel( + name='Role', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('intitule', models.CharField(help_text='List of roles', max_length=50, verbose_name='role')), + ], + options={ + 'db_table': 'media_role', + 'verbose_name': 'role', + 'verbose_name_plural': 'roles', + }, + ), + migrations.AddField( + model_name='responsability', + name='role', + field=models.ForeignKey(to='telemeta.Role'), + ), + ] diff --git a/telemeta/models/item.py b/telemeta/models/item.py index 0000f3853..b7132c42e 100644 --- a/telemeta/models/item.py +++ b/telemeta/models/item.py @@ -30,7 +30,7 @@ from telemeta.models.identifier import * from telemeta.models.resource import * from telemeta.models.enum import * - +from telemeta.models.responsability import * item_published_code_regex = getattr(settings, 'ITEM_PUBLISHED_CODE_REGEX', '[A-Za-z0-9._-]*') item_unpublished_code_regex = getattr(settings, 'ITEM_UNPUBLISHED_CODE_REGEX', '[A-Za-z0-9._-]*') diff --git a/telemeta/models/responsability.py b/telemeta/models/responsability.py new file mode 100644 index 000000000..1b51ea393 --- /dev/null +++ b/telemeta/models/responsability.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- + +# This file is part of Telemeta. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# Authors: Anas Ghrab + +from __future__ import division +from django.db import models +from django.utils.translation import ugettext_lazy as _ +from telemeta.models.item import * +from telemeta.models.collection import * + +class Authority(models.Model): + "Describe an autority" + + first_name = models.CharField(_('firstname'), max_length=50, help_text=_('First name in original language')) + last_name = models.CharField(_('lastname'), max_length=50, help_text=_('Last name in original language')) + first_name_lat = models.CharField(_('firstname_lat'), max_length=50, null=True, blank=True, help_text=_('First name in latin characters, usage form')) + last_name_lat = models.CharField(_('lastname_lat'), max_length=50, null=True, blank=True, help_text=_('Last name in latin character, usage form')) + first_name_translit = models.CharField(_('firstname_translit'), max_length=50, null=True, blank=True, help_text=_('First name transliterated')) + last_name_translit = models.CharField(_('lastname_translit'), max_length=50, null=True, blank=True, help_text=_('Last name transliterated')) + birth = models.DateField(_('birth'), null=True, blank=True, help_text=_('YYYY-MM-DD')) + death = models.DateField(_('death'), null=True, blank=True, help_text=_('YYYY-MM-DD')) + biography = models.TextField(_('biography'), null=True, blank=True) + isni = models.PositiveIntegerField(_('isni'), null=True, blank=True, help_text=_('International Standard Name Identifier')) + #photo = + + class Meta: + db_table = 'media_authority' + verbose_name = _('authority') + verbose_name_plural = _('authorities') + + def __str__(self): + return '%s %s' % (self.prenom, self.nom) + +class Role(models.Model): + "Describe a role related to items" + + intitule = models.CharField(_('role'), max_length=50, help_text=_('List of roles')) + + class Meta: + db_table = 'media_role' + verbose_name = _('role') + verbose_name_plural = _('roles') + + def __str__(self): + return '%s %s' % (self.intitule) + +class Responsability(models.Model): + "Describe a responsability in making an item" + + authority = models.ForeignKey('Authority', on_delete = models.CASCADE) + role = models.ForeignKey('Role', on_delete = models.CASCADE) + item = models.ForeignKey('MediaItem', on_delete = models.CASCADE) + collection = models.ForeignKey('MediaCollection', on_delete = models.CASCADE) + + class Meta: + db_table = 'media_responsability' + verbose_name = _('responsability') + verbose_name_plural = _('responsabilites') + + def __str__(self): + return '%s %s' % (self.authority, self.role)