- 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"
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)
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)
admin.site.register(Article, DocumentAdmin)
admin.site.register(Photo, DocumentAdmin)
admin.site.register(PosterBooklet, DocumentAdmin)
-
+admin.site.register(Object, DocumentAdmin)
--- /dev/null
+# -*- 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
--- /dev/null
+# -*- 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 nat\ 1a': 'saltanata',
+ 'Gugak FM\10': '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
+
+ # <Type>a-Notice spectacle</Type>
+ # <Type>b-Disque</Type>
+ # <Type>c-Vidéo DVD&VHS</Type>
+ # <Type>d-Vidéo en ligne</Type>
+ # <Type>f-Ouvrage & Thèse</Type>
+ # <Type>g-Revue</Type>
+ # <Type>h-Article</Type>
+ # <Type>i-Photo</Type>
+ # <Type>j-Affiche - Brochure</Type>
+ # <Type>k-Pédagogique</Type>
+ # <Type>l-Objet</Type>
+
+ 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
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':
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()
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
# 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)
# -*- 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
initial = True
dependencies = [
+ ('skosxl', '0001_initial'),
]
operations = [
('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(
('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(
('name', models.CharField(max_length=100, unique=True)),
],
options={
- 'abstract': False,
+ 'verbose_name': 'event',
},
),
migrations.CreateModel(
('name', models.CharField(max_length=100, unique=True)),
],
options={
- 'abstract': False,
+ 'verbose_name': 'event type',
},
),
migrations.CreateModel(
('name', models.CharField(max_length=100, unique=True)),
],
options={
- 'abstract': False,
+ 'verbose_name': 'event venue',
},
),
migrations.CreateModel(
('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',
('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(
('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(
('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(
('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(
('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(
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(
('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(
('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(
('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(
('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'),
),
]
+++ /dev/null
-# -*- 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'},
- ),
- ]
--- /dev/null
+# -*- 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,
+ ),
+ ]
--- /dev/null
+# -*- 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'),
+ ),
+ ]
--- /dev/null
+# -*- 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'),
+ ),
+ ]
--- /dev/null
+# -*- 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'),
+ ),
+ ]
--- /dev/null
+# -*- 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',
+ ),
+ ]
--- /dev/null
+# -*- 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'),
+ ),
+ ]
--- /dev/null
+# -*- 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'),
+ ),
+ ]
--- /dev/null
+# -*- 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'),
+ ),
+ ]
--- /dev/null
+# -*- 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'),
+ ),
+ ]
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
+ # <Festival_et_Manifestation>
+
+ 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)#<Festival_et_Manifestation>Japon 93</Festival_et_Manifestation>
+ event = models.ForeignKey(Event, blank=True, null=True, verbose_name=_('event')) # <Festival_et_Manifestation>Japon 93</Festival_et_Manifestation>
edition = models.IntegerField(default=None, blank=True, null=True) # <No_edition>16</No_edition>
def __unicode__(self):
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) #<Mots-cles>Toraja</Mots-cles>
- 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')) # <Mots-cles>Toraja</Mots-cles>
+ 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) #<Reference>Le Chant du Monde</Reference>
- release_date = models.DateField(_('release date'), null=True, blank=True)#<Date_de_parution>1995</Date_de_parution>
- geographic_classification = models.ForeignKey(GeographicalClassification, null=True, blank=True)# <Classement_Geographique>Pérou</Classement_Geographique>
+ verbose_name = "A - Notice spectacle"
+ verbose_name_plural = "A - Notices spectacle"
+
+ references = models.ManyToManyField(Reference, verbose_name=_('reference')) # <Reference>Le Chant du Monde</Reference>
+ release_date = models.DateField(_('release date'), null=True, blank=True) # <Date_de_parution>1995</Date_de_parution>
+ release_date_text = models.CharField(_('release date'), blank=True, max_length=200)
+ geographic_classification = models.ForeignKey(GeographicalClassification, null=True, blank=True) # <Classement_Geographique>Pérou</Classement_Geographique>
#<Support>Compact Disc Digital Audio</Support>
#<Duree>69'14</Duree>
#<Collection>Le chant du monde</Collection>
#<No_de_collection>CNR 2741004</No_de_collection>
- indexation_date = models.DateField(_('indexation date'), null=True, blank=True) #<Date_d_indexation>21/02/16</Date_d_indexation>
+ # indexation_date = models.DateField(_('indexation date'), null=True, blank=True) # <Date_d_indexation>21/02/16</Date_d_indexation>
+
#<Doc_no>5604</Doc_no>
- #<Type>b-Disque</Type>
- #<[record_no]>2300703</[record_no]>
#<aScript_Source_du_document>Le Chant du Monde ; Editions du CNRS, 1995</aScript_Source_du_document>
-
- #--- Event - Manifestion
- event_type = models.ForeignKey(EventType, blank=True, null=True)#<Type_Manifestation>Danse</Type_Manifestation>
- event_venue = models.ForeignKey(EventVenue, blank=True, null=True)#<Lieu_Manifestation>Le Rond Point, Théâtre Renaud-Barrault, Paris</Lieu_Manifestation>
+ doc_source = models.CharField(_('document source'), blank=True, max_length=200)
+
+ #--- Event - Manifestion
+ event_type = models.ForeignKey(EventType, blank=True, null=True) # <Type_Manifestation>Danse</Type_Manifestation>
+ event_venue = models.ForeignKey(EventVenue, blank=True, null=True) # <Lieu_Manifestation>Le Rond Point, Théâtre Renaud-Barrault, Paris</Lieu_Manifestation>
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"
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',
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [],
+ 'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
+ 'django.core.context_processors.i18n',
],
},
},
# 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
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')),
]