From d5e8a055302686dbb33c76ca05dc4a32ff2fe5cf Mon Sep 17 00:00:00 2001 From: Thomas Fillon Date: Fri, 21 Jul 2017 17:13:05 +0200 Subject: [PATCH] Update code --- conda-environment.yml | 5 + mcm/admin.py | 36 ++- mcm/management/commands/import_auteurs.py | 55 ++++ mcm/management/commands/import_documents.py | 292 ++++++++++++++++++++ mcm/management/commands/import_xml.py | 8 +- mcm/migrations/0001_initial.py | 98 +++++-- mcm/migrations/0002_auto_20170201_1526.py | 55 ---- mcm/migrations/0002_auto_20170327_0936.py | 65 +++++ mcm/migrations/0003_auto_20170720_1403.py | 56 ++++ mcm/migrations/0004_auto_20170721_0135.py | 56 ++++ mcm/migrations/0005_auto_20170721_1209.py | 29 ++ mcm/migrations/0006_auto_20170721_1442.py | 20 ++ mcm/migrations/0007_auto_20170721_1454.py | 45 +++ mcm/migrations/0008_auto_20170721_1624.py | 21 ++ mcm/migrations/0009_auto_20170721_1643.py | 20 ++ mcm/migrations/0010_auto_20170721_1647.py | 20 ++ mcm/models.py | 241 ++++++++++------ telemeta_mcm/settings.py | 10 +- telemeta_mcm/urls.py | 3 +- 19 files changed, 959 insertions(+), 176 deletions(-) create mode 100644 mcm/management/commands/import_auteurs.py create mode 100644 mcm/management/commands/import_documents.py delete mode 100644 mcm/migrations/0002_auto_20170201_1526.py create mode 100644 mcm/migrations/0002_auto_20170327_0936.py create mode 100644 mcm/migrations/0003_auto_20170720_1403.py create mode 100644 mcm/migrations/0004_auto_20170721_0135.py create mode 100644 mcm/migrations/0005_auto_20170721_1209.py create mode 100644 mcm/migrations/0006_auto_20170721_1442.py create mode 100644 mcm/migrations/0007_auto_20170721_1454.py create mode 100644 mcm/migrations/0008_auto_20170721_1624.py create mode 100644 mcm/migrations/0009_auto_20170721_1643.py create mode 100644 mcm/migrations/0010_auto_20170721_1647.py diff --git a/conda-environment.yml b/conda-environment.yml index 4edaeb7..35431a4 100644 --- a/conda-environment.yml +++ b/conda-environment.yml @@ -4,8 +4,13 @@ dependencies: - python=2.7 - sqlite - wheel +- pandas +- jupyter +- ftfy<5 - pip: - django==1.9.* + - django-filer + - django-extensions - "--src=/srv/src/lib" - "--editable=git+https://github.com/thomasfillon/django-skosxl.git@master#egg=django-skosxl" - "--editable=git+https://github.com/thomasfillon/django-rdf-io.git@master#egg=django-rdf-io" diff --git a/mcm/admin.py b/mcm/admin.py index 91a9a4b..751c6c0 100644 --- a/mcm/admin.py +++ b/mcm/admin.py @@ -1,61 +1,71 @@ from django.contrib import admin # Register your models here. -from .models import Author, Keyword, Reference +from .models import Author, Role, AuthorRole +from .models import Reference from .models import Event, EventEdition, EventType, EventVenue from .models import GeographicalClassification from .models import Document from .models import Notice, Disc, Video, VideoFile, BookThesis, Journal -from .models import Article, Photo, PosterBooklet, Object +from .models import Article, Photo, PosterBooklet, Object + + +class AuthorRoleInline(admin.TabularInline): + model = AuthorRole + extra = 1 + class AuthorAdmin(admin.ModelAdmin): list_filter = ('name',) search_fields = ['name'] ordering = ['name'] + inlines = (AuthorRoleInline,) -class KeywordAdmin(admin.ModelAdmin): - list_filter = ('name',) - search_fields = ['name'] - ordering = ['name'] class ReferenceAdmin(admin.ModelAdmin): list_filter = ('name',) search_fields = ['name'] ordering = ['name'] - + + class EventAdmin(admin.ModelAdmin): list_filter = ('name',) search_fields = ['name'] ordering = ['name'] + class EventTypeAdmin(admin.ModelAdmin): list_filter = ('name',) search_fields = ['name'] ordering = ['name'] + class EventVenueAdmin(admin.ModelAdmin): list_filter = ('name',) search_fields = ['name'] ordering = ['name'] + class GeoAdmin(admin.ModelAdmin): list_filter = ('name',) search_fields = ['name'] ordering = ['name'] - + + class DocumentAdmin(admin.ModelAdmin): list_display = ('code', 'title') list_filter = ('code', 'title') search_fields = ['title', 'code'] - filter_horizontal = ('authors', 'keywords',) + filter_horizontal = ('keywords', 'related') + inlines = (AuthorRoleInline,) + class EventEditionAdmin(admin.ModelAdmin): list_display = ('event', 'edition') ordering = ['event', 'edition'] - + admin.site.register(Author, AuthorAdmin) -admin.site.register(Keyword, KeywordAdmin) admin.site.register(Reference, ReferenceAdmin) admin.site.register(Event, EventAdmin) @@ -64,7 +74,7 @@ admin.site.register(EventType, EventTypeAdmin) admin.site.register(EventVenue, EventVenueAdmin) admin.site.register(GeographicalClassification, GeoAdmin) -#admin.site.register(Document) +# admin.site.register(Document) admin.site.register(Notice, DocumentAdmin) admin.site.register(Disc, DocumentAdmin) admin.site.register(Video, DocumentAdmin) @@ -74,4 +84,4 @@ admin.site.register(Journal, DocumentAdmin) admin.site.register(Article, DocumentAdmin) admin.site.register(Photo, DocumentAdmin) admin.site.register(PosterBooklet, DocumentAdmin) - +admin.site.register(Object, DocumentAdmin) diff --git a/mcm/management/commands/import_auteurs.py b/mcm/management/commands/import_auteurs.py new file mode 100644 index 0000000..f0e89a1 --- /dev/null +++ b/mcm/management/commands/import_auteurs.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -* + +from django.core.management.base import BaseCommand, CommandError +from django.db.utils import IntegrityError + +# import lxml.etree.ElementTree as ET +import xml.etree.ElementTree as ET +import os +import logging +import tempfile + +from mcm.models import Author + +import HTMLParser + +INITIAL_IMPORT = False + + +class Command(BaseCommand): + help = 'Import items from XML' + + # def add_arguments(self, parser): + # parser.add_argument('xml_file', type=str, default='data/exports/Auteurs_clean.xml') + + def handle(self, *args, **options): + xml_file = 'data/exports/Auteurs_clean.xml' + + parser = ET.XMLParser(encoding="utf-8") + tree = ET.parse(xml_file, parser=parser) + root = tree.getroot() + + h = HTMLParser.HTMLParser() + + # for author in Author.objects.all(): + # author.delete() + + for author in root.iter('Auteur'): + + # Auteur + # fields: + # - name = models.CharField(max_length=100, blank=False, unique=True) + # - alias = models.CharField(max_length=100, blank=True, default='') + # - comment = models.TextField(default='') + # - old_id = models.IntegerField(unique=True, blank=False) # Record No + + name = author.findtext('Nom') + record_no = author.findtext('record_no') + try: + auteur, c = Author.objects.get_or_create(name=name, + old_id=record_no) + except IntegrityError as e: + print 'Auteur : %s / id: %s' % (name, record_no) + doublon = Author.objects.get(name=name) + print ' en conflit avec %s / id: %s' % (doublon.name, doublon.old_id) + raise e diff --git a/mcm/management/commands/import_documents.py b/mcm/management/commands/import_documents.py new file mode 100644 index 0000000..f4215d4 --- /dev/null +++ b/mcm/management/commands/import_documents.py @@ -0,0 +1,292 @@ +# -*- coding: utf-8 -* + +from django.core.management.base import BaseCommand, CommandError + +from ...models import Document +from ...models import Notice, Disc, Video, VideoFile, BookThesis, Journal +from ...models import Article, Photo, PosterBooklet, Object +from ...models import Author, Role, AuthorRole +from ...models import Reference +from ...models import Event, EventEdition, EventType, EventVenue +from ...models import GeographicalClassification +from skosxl.models import Concept + +from ftfy import fix_text + +# import lxml.etree.ElementTree as ET +import xml.etree.ElementTree as ET +import os +import logging +import tempfile + +import HTMLParser + + +DEBUG = False + +replacements_tag = { + 'auteur_affiche_(dessin)>': 'auteur_affiche_dessin>', + 'auteur_affiche_(dessin).Documents>': 'auteur_affiche_dessin_Documents>', + '[record_no]>': 'record_no>', + '->_Intervention>': 'Auteurs_intervention>', + #'\00': '', +} + +replacements_char = { + '<': '???<', + '’': ''', + 'œ': 'œ', + '&<': '?<', + '\373': 'û', + 'sa lta nata': 'saltanata', + 'Gugak FM': 'Gugak FM', + '\xf5': 'ı', + '\x1e': '', + '\x02': '', + '\xf9': '?', + '\xb7': '?', + '\371': '', + '\xc3': 'ù', # ù +} + + +def cleanup_xml(xml_file): + root, ext = os.path.splitext(xml_file) + clean_xml_file = ''.join([root, '_clean', ext]) + log_file = ''.join([root, '_clean_log.txt']) + if os.path.exists(log_file): + os.unlink(log_file) + logging.basicConfig(filename=log_file, format='%(levelname)s:%(message)s', + level=logging.DEBUG) + logging.info('Nettoyage du fichier XML %s', xml_file) + # if os.path.exists(clean_xml_file): + # return clean_xml_file + h = HTMLParser.HTMLParser() + temp_xml = tempfile.NamedTemporaryFile(delete=False) + # 1ere passe : nettoyage des tags XML + with open(xml_file, 'U') as infile: + with open(temp_xml.name, 'w') as outfile: + for line in infile: + for src, target in replacements_tag.iteritems(): + if src in line: + line = line.replace(src, target) + outfile.write(line) + + # 2nde passe : nettoyage des caractères + with open(temp_xml.name, 'U') as infile: + with open(clean_xml_file, 'w') as outfile: + lineno = 0 + for line in infile: + lineno += 1 + change_line = False + if False: + for src, target in replacements_char.iteritems(): + if src in line: + change_line = True + logging.info('Ligne : %d', lineno) + logging.info('%s -> %s', src, target) + logging.info('Ligne de texte originale: %s', line) + line = line.replace(src, target) + logging.info('Ligne de texte de remplacement : %s', line) + try: + line = h.unescape(line) + except UnicodeDecodeError as e: + print line + print "Ligne N°%d" % lineno + raise e + if change_line: + logging.info('Ligne de texte de remplacement HTML : %s', line) + # outfile.write(line.encode('utf-8')) + print fix_text(line) + outfile.write(fix_text(line)) + + os.unlink(temp_xml.name) + + return clean_xml_file + + +class Command(BaseCommand): + help = 'Import items from XML' + + def add_arguments(self, parser): + parser.add_argument('xml_file', type=str) + + def handle(self, *args, **options): + xml_file = options['xml_file'] + # clean_xml_file = cleanup_xml(xml_file) + # return + parser = ET.XMLParser(encoding="utf-8") + tree = ET.parse(xml_file, parser=parser) + root = tree.getroot() + + # Remove all object in Database + # Document.objects.all().delete() + + document_traite = 0 + document_non_traite = 0 + + # a-Notice spectacle + # b-Disque + # c-Vidéo DVD&VHS + # d-Vidéo en ligne + # f-Ouvrage & Thèse + # g-Revue + # h-Article + # i-Photo + # j-Affiche - Brochure + # k-Pédagogique + # l-Objet + + DOCUMENT_CLASS = {'a-Notice spectacle': Notice, + 'b-Disque': Disc, + u'c-Vidéo DVD&VHS': Video, + u'd-Vidéo en ligne': VideoFile, + u'f-Ouvrage & Thèse': BookThesis, + 'g-Revue': Journal, + 'h-Article': Article, + 'i-Photo': Photo, + 'j-Affiche - Brochure': PosterBooklet, + 'l-Objet': Object + } + + skip_document_types = ['e-Site Internet', u'k-Pédagogique', + 'l-Objet'] # On traitera les objets à part + + h = HTMLParser.HTMLParser() + + for document in root.iter('Document'): + doc_type = h.unescape(document.findtext('Type')) + if doc_type in skip_document_types: + continue + + document_traite += 1 + record_no = document.findtext('record_no') + if doc_type == 'l-Objet': + code = document.findtext('No_d_inventaire') + else: + code = document.findtext('Cote') + + doc_class = DOCUMENT_CLASS[doc_type] + doc, created = doc_class.objects.get_or_create(old_id=record_no) + doc.code = code + # Title + doc.title = document.findtext('Titre') + doc.save() + # if not created: + # continue + # Keywords + for keyword in document.findall('Mots-cles'): + try: + keyword_obj = Concept.objects.get(pref_label=keyword.text) + if keyword_obj not in doc.keywords.all(): + doc.keywords.add(keyword_obj) + except Concept.DoesNotExist: + print 'Concept \" %s \" DoesNotExist' % keyword.text + + # Text + doc.text = document.findtext('Texte') + if doc.text is None: + doc.text = '' + # Notice spectacle + if doc_type == 'a-Notice spectacle': + + event_type = document.findtext('Type_Manifestation') + if event_type is not None: + event_type_obj, c = EventType.objects.get_or_create( + name=event_type) + else: + event_type_obj = None + + event_venue = document.findtext('Lieu_Manifestation') + if event_venue is not None: + event_venue_obj, c = EventVenue.objects.get_or_create( + name=event_venue) + else: + event_venue_obj = None + + event = document.findtext('Festival_et_Manifestation') + if event is not None: + event_obj, c = Event.objects.get_or_create(name=event) + + edition = document.findtext('No_edition') + try: + event_edition_obj, c = EventEdition.objects.get_or_create( + event=event_obj, edition=edition) + except ValueError: + print 'Pb Edition : Cote %s / Event %s / Edition %s' % (code, event, edition) + event_edition_obj, c = EventEdition.objects.get_or_create( + event=event_obj, edition=None) + + doc.event_edition = event_edition_obj + doc.event_type = event_type_obj + doc.event_venue = event_venue_obj + + release_date_text = document.findtext('Date_de_parution') + doc.release_date_text = release_date_text + + import datetime + try: + release_date = datetime.datetime.strptime(release_date_text, + '%d/%m/%y').date() + doc.release_date = release_date + except ValueError: + pass + + # Authors + doc_authors = document.findtext('aScript_auteurs2') + if doc_authors is not None: + authors_roles = [auth.split('==') + for auth in doc_authors.split(';')] + for auth_role in authors_roles: + if auth_role[1]: + role, c = Role.objects.get_or_create(label=auth_role[1]) + else: + role = None + try: + author = Author.objects.filter(name=auth_role[0].strip()) + if len(author) > 1: + print '--- Doublon Auteurs ---' + print "Document : cote %s / id %d" % (doc.code, doc.old_id) + for auth in author: + print 'name: %s / id %d' % (auth.name, auth.old_id) + author = author[0] + except Author.DoesNotExist as e: + print "Does Not Exist ->%s<-" % auth_role[0] + raise e + + try: + author_role, c = AuthorRole.objects.get_or_create( + author=author, + document=doc, + role=role) + author_role.save() + + except UnicodeError as e: + print authors_roles + print 'role: %s' % auth_role[1] + raise e + + # Referencess + for ref in document.findall('Reference'): + ref_obj, ref_c = Reference.objects.get_or_create( + name=ref.text) + doc.references.add(ref_obj) + + # Source du document + source_doc = document.findtext('aScript_Source_du_document') + if source_doc is not None: + doc.source_doc = source_doc + + #  GeographicalClassification + geo = document.findtext('Classement_Geographique') + if geo is not None: + geo_obj, c = GeographicalClassification.objects.get_or_create( + name=geo) + doc.geographic_classification = geo_obj + doc.save() + + if DEBUG & (document_traite > 100): + break + print '-*-*--*-*-*-*-*-*-*-*' + print 'document_traité : %d' % document_traite + print 'document_non_traité : %d' % document_non_traite diff --git a/mcm/management/commands/import_xml.py b/mcm/management/commands/import_xml.py index a0f05e2..bfaf117 100644 --- a/mcm/management/commands/import_xml.py +++ b/mcm/management/commands/import_xml.py @@ -168,8 +168,7 @@ class Command(BaseCommand): doc.save() # Keywords for keyword in document.findall('Mots-cles'): - keyword_obj, keyword_c = Keyword.objects.get_or_create( - name=keyword.text) + keyword_obj, keyword_c = Keyword.objects.get(pref_label=keyword.text) doc.keywords.add(keyword_obj) if doc_type == 'a-Notice spectacle': @@ -211,6 +210,7 @@ class Command(BaseCommand): try: release_date = datetime.datetime.strptime( document.find('Date_de_parution').text, '%d/%m/%y').date() + doc.release_date = release_date except ValueError: # if document.find('Date_de_parution').text == '2015/09/08': # release_date = datetime.datetime.strptime('08/09/2015','%d/%m/%y').date() @@ -219,6 +219,7 @@ class Command(BaseCommand): try: indexation_date = datetime.datetime.strptime( document.find('Date_d_indexation').text, '%d/%m/%y').date() + doc.indexation_date = indexation_date except ValueError: indexation_date = None erreur_date_indexation += 1 @@ -231,7 +232,8 @@ class Command(BaseCommand): # print indexation_date # Authors - for author in document.findall('auteurs'): + for author, role in zip(document.findall('auteurs'), + document.findall('')): author_obj, auth_c = Author.objects.get_or_create( name=author.text) doc.authors.add(author_obj) diff --git a/mcm/migrations/0001_initial.py b/mcm/migrations/0001_initial.py index ce2db4c..9e51999 100644 --- a/mcm/migrations/0001_initial.py +++ b/mcm/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.2 on 2016-07-22 21:58 +# Generated by Django 1.9.12 on 2017-03-02 21:14 from __future__ import unicode_literals from django.db import migrations, models @@ -11,6 +11,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('skosxl', '0001_initial'), ] operations = [ @@ -23,7 +24,17 @@ class Migration(migrations.Migration): ('comment', models.TextField(default='')), ], options={ - 'abstract': False, + 'verbose_name': 'author', + }, + ), + migrations.CreateModel( + name='AuthorRole', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('authors', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mcm.Author', verbose_name='author')), + ], + options={ + 'verbose_name': 'Author role', }, ), migrations.CreateModel( @@ -32,7 +43,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=200, verbose_name='title')), ('old_id', models.IntegerField(unique=True)), - ('text', models.TextField(default='')), + ('text', models.TextField(default='', verbose_name='text')), ], ), migrations.CreateModel( @@ -42,7 +53,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=100, unique=True)), ], options={ - 'abstract': False, + 'verbose_name': 'event', }, ), migrations.CreateModel( @@ -60,7 +71,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=100, unique=True)), ], options={ - 'abstract': False, + 'verbose_name': 'event type', }, ), migrations.CreateModel( @@ -70,7 +81,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=100, unique=True)), ], options={ - 'abstract': False, + 'verbose_name': 'event venue', }, ), migrations.CreateModel( @@ -80,28 +91,26 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=100, unique=True)), ], options={ - 'abstract': False, + 'verbose_name': 'geographical classification', }, ), migrations.CreateModel( - name='Keyword', + name='Reference', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, unique=True)), ], options={ - 'abstract': False, + 'verbose_name': 'reference', }, ), migrations.CreateModel( - name='Reference', + name='Role', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, unique=True)), + ('label', models.CharField(blank=True, max_length=200, verbose_name='title')), + ('text', models.TextField(default='', verbose_name='text')), ], - options={ - 'abstract': False, - }, ), migrations.CreateModel( name='Article', @@ -109,6 +118,10 @@ class Migration(migrations.Migration): ('document_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mcm.Document')), ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ], + options={ + 'verbose_name': 'Document / H - Article', + 'verbose_name_plural': 'Documents - H - Articles', + }, bases=('mcm.document',), ), migrations.CreateModel( @@ -117,6 +130,10 @@ class Migration(migrations.Migration): ('document_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mcm.Document')), ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ], + options={ + 'verbose_name': 'Document / F - Ouvrage & Th\xe8se', + 'verbose_name_plural': 'Documents - F - Ouvrages & Th\xe8ses', + }, bases=('mcm.document',), ), migrations.CreateModel( @@ -125,6 +142,10 @@ class Migration(migrations.Migration): ('document_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mcm.Document')), ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ], + options={ + 'verbose_name': 'Document / B - Disque', + 'verbose_name_plural': 'Documents - B - Disques', + }, bases=('mcm.document',), ), migrations.CreateModel( @@ -133,6 +154,10 @@ class Migration(migrations.Migration): ('document_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mcm.Document')), ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ], + options={ + 'verbose_name': 'Document / G - Revue', + 'verbose_name_plural': 'Documents - G - Revues', + }, bases=('mcm.document',), ), migrations.CreateModel( @@ -146,8 +171,12 @@ class Migration(migrations.Migration): ('event_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mcm.EventType')), ('event_venue', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mcm.EventVenue')), ('geographic_classification', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mcm.GeographicalClassification')), - ('references', models.ManyToManyField(to='mcm.Reference')), + ('references', models.ManyToManyField(to='mcm.Reference', verbose_name='reference')), ], + options={ + 'verbose_name': 'Document / A - Notice spectacle', + 'verbose_name_plural': 'Documents - A - Notices spectacle', + }, bases=('mcm.document',), ), migrations.CreateModel( @@ -155,6 +184,10 @@ class Migration(migrations.Migration): fields=[ ('document_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mcm.Document')), ], + options={ + 'verbose_name': 'Document / L - Objet', + 'verbose_name_plural': 'Documents - L-Objets', + }, bases=('mcm.document',), ), migrations.CreateModel( @@ -163,6 +196,10 @@ class Migration(migrations.Migration): ('document_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mcm.Document')), ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ], + options={ + 'verbose_name': 'Document / I - Photo', + 'verbose_name_plural': 'Documents - I - Photos', + }, bases=('mcm.document',), ), migrations.CreateModel( @@ -171,6 +208,10 @@ class Migration(migrations.Migration): ('document_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mcm.Document')), ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ], + options={ + 'verbose_name': 'Document / J - Affiche-Brochure', + 'verbose_name_plural': 'Documents - J - Affiches-Brochures', + }, bases=('mcm.document',), ), migrations.CreateModel( @@ -179,6 +220,10 @@ class Migration(migrations.Migration): ('document_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mcm.Document')), ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ], + options={ + 'verbose_name': 'Document / C - Vid\xe9o DVD&VHS', + 'verbose_name_plural': 'Documents - C - Vid\xe9os DVD&VHS', + }, bases=('mcm.document',), ), migrations.CreateModel( @@ -187,16 +232,35 @@ class Migration(migrations.Migration): ('document_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mcm.Document')), ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ], + options={ + 'verbose_name': 'Document / D - Vid\xe9o en ligne', + 'verbose_name_plural': 'Documents - D - Vid\xe9os en ligne', + }, bases=('mcm.document',), ), migrations.AddField( model_name='document', name='authors', - field=models.ManyToManyField(to='mcm.Author'), + field=models.ManyToManyField(through='mcm.AuthorRole', to='mcm.Author', verbose_name='author'), ), migrations.AddField( model_name='document', name='keywords', - field=models.ManyToManyField(to='mcm.Keyword'), + field=models.ManyToManyField(to='skosxl.Concept', verbose_name='keyword'), + ), + migrations.AddField( + model_name='document', + name='related', + field=models.ManyToManyField(related_name='_document_related_+', to='mcm.Document', verbose_name='see also'), + ), + migrations.AddField( + model_name='authorrole', + name='document', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mcm.Document'), + ), + migrations.AddField( + model_name='authorrole', + name='role', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='mcm.Role'), ), ] diff --git a/mcm/migrations/0002_auto_20170201_1526.py b/mcm/migrations/0002_auto_20170201_1526.py deleted file mode 100644 index 4f4febd..0000000 --- a/mcm/migrations/0002_auto_20170201_1526.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.2 on 2017-02-01 14:26 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('mcm', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='article', - options={'verbose_name': 'Document / H - Article', 'verbose_name_plural': 'Documents - H - Articles'}, - ), - migrations.AlterModelOptions( - name='bookthesis', - options={'verbose_name': 'Document / F - Ouvrage & Th\xe8se', 'verbose_name_plural': 'Documents - F - Ouvrages & Th\xe8ses'}, - ), - migrations.AlterModelOptions( - name='disc', - options={'verbose_name': 'Document / B - Disque', 'verbose_name_plural': 'Documents - B - Disques'}, - ), - migrations.AlterModelOptions( - name='journal', - options={'verbose_name': 'Document / G - Revue', 'verbose_name_plural': 'Documents - G - Revues'}, - ), - migrations.AlterModelOptions( - name='notice', - options={'verbose_name': 'Document / A - Notice spectacle', 'verbose_name_plural': 'Documents - A - Notices spectacle'}, - ), - migrations.AlterModelOptions( - name='object', - options={'verbose_name': 'Document / L - Objet', 'verbose_name_plural': 'Documents - L-Objets'}, - ), - migrations.AlterModelOptions( - name='photo', - options={'verbose_name': 'Document / I - Photo', 'verbose_name_plural': 'Documents - I - Photos'}, - ), - migrations.AlterModelOptions( - name='posterbooklet', - options={'verbose_name': 'Document / J - Affiche-Brochure', 'verbose_name_plural': 'Documents - J - Affiches-Brochures'}, - ), - migrations.AlterModelOptions( - name='video', - options={'verbose_name': 'Document / C - Vid\xe9o DVD&VHS', 'verbose_name_plural': 'Documents - C - Vid\xe9os DVD&VHS'}, - ), - migrations.AlterModelOptions( - name='videofile', - options={'verbose_name': 'Document / D - Vid\xe9o en ligne', 'verbose_name_plural': 'Documents - D - Vid\xe9os en ligne'}, - ), - ] diff --git a/mcm/migrations/0002_auto_20170327_0936.py b/mcm/migrations/0002_auto_20170327_0936.py new file mode 100644 index 0000000..c76d8f9 --- /dev/null +++ b/mcm/migrations/0002_auto_20170327_0936.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.12 on 2017-03-27 07:36 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcm', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='article', + options={'verbose_name': 'H - Article', 'verbose_name_plural': 'H - Articles'}, + ), + migrations.AlterModelOptions( + name='authorrole', + options={'verbose_name': 'author role'}, + ), + migrations.AlterModelOptions( + name='bookthesis', + options={'verbose_name': 'F - Ouvrage & Th\xe8se', 'verbose_name_plural': 'F - Ouvrages & Th\xe8ses'}, + ), + migrations.AlterModelOptions( + name='disc', + options={'verbose_name': 'B - Disque', 'verbose_name_plural': 'B - Disques'}, + ), + migrations.AlterModelOptions( + name='journal', + options={'verbose_name': 'G - Revue', 'verbose_name_plural': 'G - Revues'}, + ), + migrations.AlterModelOptions( + name='notice', + options={'verbose_name': 'A - Notice spectacle', 'verbose_name_plural': 'A - Notices spectacle'}, + ), + migrations.AlterModelOptions( + name='object', + options={'verbose_name': 'L - Objet', 'verbose_name_plural': 'L-Objets'}, + ), + migrations.AlterModelOptions( + name='photo', + options={'verbose_name': 'I - Photo', 'verbose_name_plural': 'I - Photos'}, + ), + migrations.AlterModelOptions( + name='posterbooklet', + options={'verbose_name': 'J - Affiche-Brochure', 'verbose_name_plural': 'J - Affiches-Brochures'}, + ), + migrations.AlterModelOptions( + name='video', + options={'verbose_name': 'C - Vid\xe9o DVD&VHS', 'verbose_name_plural': 'C - Vid\xe9os DVD&VHS'}, + ), + migrations.AlterModelOptions( + name='videofile', + options={'verbose_name': 'D - Vid\xe9o en ligne', 'verbose_name_plural': 'D - Vid\xe9os en ligne'}, + ), + migrations.AddField( + model_name='author', + name='old_id', + field=models.IntegerField(default=0, unique=True), + preserve_default=False, + ), + ] diff --git a/mcm/migrations/0003_auto_20170720_1403.py b/mcm/migrations/0003_auto_20170720_1403.py new file mode 100644 index 0000000..4af07cf --- /dev/null +++ b/mcm/migrations/0003_auto_20170720_1403.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-07-20 12:03 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcm', '0002_auto_20170327_0936'), + ] + + operations = [ + migrations.AlterField( + model_name='author', + name='comment', + field=models.TextField(default='', verbose_name='comment'), + ), + migrations.AlterField( + model_name='author', + name='name', + field=models.CharField(max_length=100, unique=True, verbose_name='name'), + ), + migrations.AlterField( + model_name='event', + name='name', + field=models.CharField(max_length=100, unique=True, verbose_name='name'), + ), + migrations.AlterField( + model_name='eventedition', + name='event', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mcm.Event', verbose_name='event'), + ), + migrations.AlterField( + model_name='eventtype', + name='name', + field=models.CharField(max_length=100, unique=True, verbose_name='name'), + ), + migrations.AlterField( + model_name='eventvenue', + name='name', + field=models.CharField(max_length=100, unique=True, verbose_name='name'), + ), + migrations.AlterField( + model_name='geographicalclassification', + name='name', + field=models.CharField(max_length=100, unique=True, verbose_name='name'), + ), + migrations.AlterField( + model_name='reference', + name='name', + field=models.CharField(max_length=100, unique=True, verbose_name='name'), + ), + ] diff --git a/mcm/migrations/0004_auto_20170721_0135.py b/mcm/migrations/0004_auto_20170721_0135.py new file mode 100644 index 0000000..ba4d118 --- /dev/null +++ b/mcm/migrations/0004_auto_20170721_0135.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-07-20 23:35 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcm', '0003_auto_20170720_1403'), + ] + + operations = [ + migrations.RemoveField( + model_name='article', + name='code', + ), + migrations.RemoveField( + model_name='bookthesis', + name='code', + ), + migrations.RemoveField( + model_name='disc', + name='code', + ), + migrations.RemoveField( + model_name='journal', + name='code', + ), + migrations.RemoveField( + model_name='notice', + name='code', + ), + migrations.RemoveField( + model_name='photo', + name='code', + ), + migrations.RemoveField( + model_name='posterbooklet', + name='code', + ), + migrations.RemoveField( + model_name='video', + name='code', + ), + migrations.RemoveField( + model_name='videofile', + name='code', + ), + migrations.AddField( + model_name='document', + name='code', + field=models.CharField(blank=True, max_length=200, verbose_name='code'), + ), + ] diff --git a/mcm/migrations/0005_auto_20170721_1209.py b/mcm/migrations/0005_auto_20170721_1209.py new file mode 100644 index 0000000..1aaac48 --- /dev/null +++ b/mcm/migrations/0005_auto_20170721_1209.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-07-21 10:09 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcm', '0004_auto_20170721_0135'), + ] + + operations = [ + migrations.RemoveField( + model_name='notice', + name='indexation_date', + ), + migrations.AddField( + model_name='notice', + name='doc_source', + field=models.CharField(blank=True, max_length=200, verbose_name='document source'), + ), + migrations.AddField( + model_name='notice', + name='release_date_text', + field=models.CharField(blank=True, max_length=200, verbose_name='release date'), + ), + ] diff --git a/mcm/migrations/0006_auto_20170721_1442.py b/mcm/migrations/0006_auto_20170721_1442.py new file mode 100644 index 0000000..4df3235 --- /dev/null +++ b/mcm/migrations/0006_auto_20170721_1442.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-07-21 12:42 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcm', '0005_auto_20170721_1209'), + ] + + operations = [ + migrations.RenameField( + model_name='authorrole', + old_name='authors', + new_name='author', + ), + ] diff --git a/mcm/migrations/0007_auto_20170721_1454.py b/mcm/migrations/0007_auto_20170721_1454.py new file mode 100644 index 0000000..f77a7be --- /dev/null +++ b/mcm/migrations/0007_auto_20170721_1454.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-07-21 12:54 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcm', '0006_auto_20170721_1442'), + ] + + operations = [ + migrations.AlterField( + model_name='author', + name='name', + field=models.CharField(max_length=100, verbose_name='name'), + ), + migrations.AlterField( + model_name='event', + name='name', + field=models.CharField(max_length=100, verbose_name='name'), + ), + migrations.AlterField( + model_name='eventtype', + name='name', + field=models.CharField(max_length=100, verbose_name='name'), + ), + migrations.AlterField( + model_name='eventvenue', + name='name', + field=models.CharField(max_length=100, verbose_name='name'), + ), + migrations.AlterField( + model_name='geographicalclassification', + name='name', + field=models.CharField(max_length=100, verbose_name='name'), + ), + migrations.AlterField( + model_name='reference', + name='name', + field=models.CharField(max_length=100, verbose_name='name'), + ), + ] diff --git a/mcm/migrations/0008_auto_20170721_1624.py b/mcm/migrations/0008_auto_20170721_1624.py new file mode 100644 index 0000000..5073532 --- /dev/null +++ b/mcm/migrations/0008_auto_20170721_1624.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-07-21 14:24 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcm', '0007_auto_20170721_1454'), + ] + + operations = [ + migrations.AlterField( + model_name='authorrole', + name='role', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mcm.Role'), + ), + ] diff --git a/mcm/migrations/0009_auto_20170721_1643.py b/mcm/migrations/0009_auto_20170721_1643.py new file mode 100644 index 0000000..ec14989 --- /dev/null +++ b/mcm/migrations/0009_auto_20170721_1643.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-07-21 14:43 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcm', '0008_auto_20170721_1624'), + ] + + operations = [ + migrations.AlterField( + model_name='document', + name='text', + field=models.TextField(blank=True, default='', verbose_name='text'), + ), + ] diff --git a/mcm/migrations/0010_auto_20170721_1647.py b/mcm/migrations/0010_auto_20170721_1647.py new file mode 100644 index 0000000..f58a4ef --- /dev/null +++ b/mcm/migrations/0010_auto_20170721_1647.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-07-21 14:47 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcm', '0009_auto_20170721_1643'), + ] + + operations = [ + migrations.AlterField( + model_name='document', + name='text', + field=models.TextField(default='', verbose_name='text'), + ), + ] diff --git a/mcm/models.py b/mcm/models.py index 741add1..5324139 100644 --- a/mcm/models.py +++ b/mcm/models.py @@ -4,43 +4,72 @@ from __future__ import unicode_literals from django.db import models from django.utils.translation import ugettext_lazy as _ - +from skosxl.models import Concept # Create your models here. + class BaseMany(models.Model): - name = models.CharField(max_length=100, blank=False, unique=True) + name = models.CharField(max_length=100, blank=False, + verbose_name=_('name')) def __unicode__(self): return self.name - + class Meta: abstract = True + class Author(BaseMany): - alias = models.CharField(max_length=100, blank=True, default='') - comment = models.TextField(default='') + alias = models.CharField(max_length=100, blank=True, default='') + comment = models.TextField(default='', verbose_name=_('comment')) + old_id = models.IntegerField(unique=True, blank=False) # Record No + + class Meta: + verbose_name = _('author') + + +class Role(models.Model): + label = models.CharField(_('title'), blank=True, max_length=200) + text = models.TextField(default='', verbose_name=_('text')) + + def __unicode__(self): + return self.label -class Keyword(BaseMany): - pass class Reference(BaseMany): - pass + + class Meta: + verbose_name = _('reference') + class EventType(BaseMany): - pass + + class Meta: + verbose_name = _('event type') + class EventVenue(BaseMany): - pass + + class Meta: + verbose_name = _('event venue') + class Event(BaseMany): - pass + # + + class Meta: + verbose_name = _('event') + class GeographicalClassification(BaseMany): - pass + + class Meta: + verbose_name = _('geographical classification') + class EventEdition(models.Model): - event = models.ForeignKey(Event, blank=True, null=True)#Japon 93 + event = models.ForeignKey(Event, blank=True, null=True, verbose_name=_('event')) # Japon 93 edition = models.IntegerField(default=None, blank=True, null=True) # 16 def __unicode__(self): @@ -52,119 +81,163 @@ class EventEdition(models.Model): DOCUMENT_TYPES = ( ('a', 'Notice spectacle'), - ('b', 'Disque'), - ('c', 'Vidéo DVD&VHS'), - ('d', 'Vidéo en ligne'), - ('e', 'Site Internet'), - ('f', 'Ouvrage & Thèse'), - ('g', 'Revue'), - ('h', 'Article'), - ('i', 'Photo'), - ('j', 'Affiche - Brochure'), - ('k', 'Pédagogique'), - ('l', 'Objet') - ) - + ('b', 'Disque'), + ('c', 'Vidéo DVD&VHS'), + ('d', 'Vidéo en ligne'), + ('e', 'Site Internet'), + ('f', 'Ouvrage & Thèse'), + ('g', 'Revue'), + ('h', 'Article'), + ('i', 'Photo'), + ('j', 'Affiche - Brochure'), + ('k', 'Pédagogique'), + ('l', 'Objet') +) + + class Document(models.Model): - authors = models.ManyToManyField(Author) # Auteur - title = models.CharField(_('title'), max_length=200) # Titre + code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # Cote old_id = models.IntegerField(unique=True, blank=False) # Record No - keywords = models.ManyToManyField(Keyword) #Toraja - text = models.TextField(default='') - # see also / Voir aussi + authors = models.ManyToManyField(Author, through='AuthorRole', verbose_name=_('author')) # Auteur + title = models.CharField(_('title'), max_length=200) # Titre + + keywords = models.ManyToManyField(Concept, verbose_name=_('keyword')) # Toraja + text = models.TextField(default='', verbose_name=_('text')) + related = models.ManyToManyField("self", verbose_name=_('see also')) # see also / Voir aussi def __unicode__(self): return self.title -# Type : a-Notice spectacle + +class AuthorRole(models.Model): + + author = models.ForeignKey(Author, blank=False, verbose_name=_('author'), on_delete=models.CASCADE) # Auteur + document = models.ForeignKey(Document, blank=False) + role = models.ForeignKey(Role, blank=True, null=True) + + class Meta: + verbose_name = _('author role') + + class Notice(Document): + # Type : a-Notice spectacle + class Meta: - verbose_name = "Document / A - Notice spectacle" - verbose_name_plural = "Documents - A - Notices spectacle" - - code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # Cote - references = models.ManyToManyField(Reference) #Le Chant du Monde - release_date = models.DateField(_('release date'), null=True, blank=True)#1995 - geographic_classification = models.ForeignKey(GeographicalClassification, null=True, blank=True)# Pérou + verbose_name = "A - Notice spectacle" + verbose_name_plural = "A - Notices spectacle" + + references = models.ManyToManyField(Reference, verbose_name=_('reference')) # Le Chant du Monde + release_date = models.DateField(_('release date'), null=True, blank=True) # 1995 + release_date_text = models.CharField(_('release date'), blank=True, max_length=200) + geographic_classification = models.ForeignKey(GeographicalClassification, null=True, blank=True) # Pérou #Compact Disc Digital Audio #69'14 #Le chant du monde #CNR 2741004 - indexation_date = models.DateField(_('indexation date'), null=True, blank=True) #21/02/16 + # indexation_date = models.DateField(_('indexation date'), null=True, blank=True) # 21/02/16 + #5604 - #b-Disque - #<[record_no]>2300703 #Le Chant du Monde ; Editions du CNRS, 1995 - - #--- Event - Manifestion - event_type = models.ForeignKey(EventType, blank=True, null=True)#Danse - event_venue = models.ForeignKey(EventVenue, blank=True, null=True)#Le Rond Point, Théâtre Renaud-Barrault, Paris + doc_source = models.CharField(_('document source'), blank=True, max_length=200) + + #--- Event - Manifestion + event_type = models.ForeignKey(EventType, blank=True, null=True) # Danse + event_venue = models.ForeignKey(EventVenue, blank=True, null=True) # Le Rond Point, Théâtre Renaud-Barrault, Paris event_edition = models.ForeignKey(EventEdition, blank=True, null=True) -# Type: b-Disque + class Disc(Document): + # Type: b-Disque + class Meta: - verbose_name = "Document / B - Disque" - verbose_name_plural = "Documents - B - Disques" + verbose_name = "B - Disque" + verbose_name_plural = "B - Disques" + - code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # -# Type : c-Vidéo DVD&VHS class Video(Document): - code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + # Type : c-Vidéo DVD&VHS + class Meta: - verbose_name = "Document / C - Vidéo DVD&VHS" - verbose_name_plural = "Documents - C - Vidéos DVD&VHS" + verbose_name = "C - Vidéo DVD&VHS" + verbose_name_plural = "C - Vidéos DVD&VHS" + -# Type : d-Vidéo en ligne class VideoFile(Document): - code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + # Type : d-Vidéo en ligne + class Meta: - verbose_name = "Document / D - Vidéo en ligne" - verbose_name_plural = "Documents - D - Vidéos en ligne" - -# Type : f-Ouvrage & Thèse + verbose_name = "D - Vidéo en ligne" + verbose_name_plural = "D - Vidéos en ligne" + + class BookThesis(Document): - code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + # Type : f-Ouvrage & Thèse + class Meta: - verbose_name = "Document / F - Ouvrage & Thèse" - verbose_name_plural = "Documents - F - Ouvrages & Thèses" + verbose_name = "F - Ouvrage & Thèse" + verbose_name_plural = "F - Ouvrages & Thèses" + -# Type : g-Revue class Journal(Document): - code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + # Type : g-Revue + class Meta: - verbose_name = "Document / G - Revue" - verbose_name_plural = "Documents - G - Revues" + verbose_name = "G - Revue" + verbose_name_plural = "G - Revues" + -# Type : h-Article class Article(Document): - code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + # Type : h-Article + class Meta: - verbose_name = "Document / H - Article" - verbose_name_plural = "Documents - H - Articles" + verbose_name = "H - Article" + verbose_name_plural = "H - Articles" + -# Type : i-Photo class Photo(Document): - code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + # Type : i-Photo + class Meta: - verbose_name = "Document / I - Photo" - verbose_name_plural = "Documents - I - Photos" + verbose_name = "I - Photo" + verbose_name_plural = "I - Photos" + -# Type : j-Affiche - Brochure class PosterBooklet(Document): - code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + # Type : j-Affiche - Brochure + class Meta: - verbose_name = "Document / J - Affiche-Brochure" - verbose_name_plural = "Documents - J - Affiches-Brochures" + verbose_name = "J - Affiche-Brochure" + verbose_name_plural = "J - Affiches-Brochures" # Type :k-Pédagogique -#class Educational(Document): +# class Educational(Document): # pass -# Type : l-Objet + class Object(Document): - pass + # Type : l-Objet + + class Meta: + verbose_name = "I - Photo" + verbose_name_plural = "I - Photos" + + +class PosterBooklet(Document): + # Type : j-Affiche - Brochure + + class Meta: + verbose_name = "J - Affiche-Brochure" + verbose_name_plural = "J - Affiches-Brochures" + +# Type :k-Pédagogique +# class Educational(Document): +# pass + + +class Object(Document): + # Type : l-Objet + class Meta: - verbose_name = "Document / L - Objet" - verbose_name_plural = "Documents - L-Objets" + verbose_name = "L - Objet" + verbose_name_plural = "L-Objets" diff --git a/telemeta_mcm/settings.py b/telemeta_mcm/settings.py index 8a4776d..59aa2ff 100644 --- a/telemeta_mcm/settings.py +++ b/telemeta_mcm/settings.py @@ -46,6 +46,7 @@ INSTALLED_APPS = [ MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -59,7 +60,7 @@ ROOT_URLCONF = 'telemeta_mcm.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], + 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -67,6 +68,7 @@ TEMPLATES = [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + 'django.core.context_processors.i18n', ], }, }, @@ -108,8 +110,10 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/1.9/topics/i18n/ -LANGUAGE_CODE = 'fr-FR' - +LANGUAGE_CODE = 'fr' +LANGUAGES = [ ('fr', 'French'), + #('en', 'English') +] TIME_ZONE = 'Europe/Paris' USE_I18N = True diff --git a/telemeta_mcm/urls.py b/telemeta_mcm/urls.py index 34682d8..7bd46fb 100644 --- a/telemeta_mcm/urls.py +++ b/telemeta_mcm/urls.py @@ -19,5 +19,6 @@ from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), - url(r'^telemeta/skosxl/', include('skosxl.urls')) + url(r'^telemeta/skosxl/', include('skosxl.urls')), + url(r'^i18n/', include('django.conf.urls.i18n')), ] -- 2.39.5