From: Thomas Fillon Date: Fri, 22 Jul 2016 22:16:26 +0000 (+0200) Subject: Add models for all documents type X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=5b15927edb951d8c22f854d306ab21e313a8cf9e;p=telemeta_mcm.git Add models for all documents type --- diff --git a/mcm/admin.py b/mcm/admin.py index ff80824..91a9a4b 100644 --- a/mcm/admin.py +++ b/mcm/admin.py @@ -5,8 +5,8 @@ from .models import Author, Keyword, Reference from .models import Event, EventEdition, EventType, EventVenue from .models import GeographicalClassification from .models import Document -from .models import Notice - +from .models import Notice, Disc, Video, VideoFile, BookThesis, Journal +from .models import Article, Photo, PosterBooklet, Object class AuthorAdmin(admin.ModelAdmin): list_filter = ('name',) @@ -43,7 +43,7 @@ class GeoAdmin(admin.ModelAdmin): search_fields = ['name'] ordering = ['name'] -class NoticeAdmin(admin.ModelAdmin): +class DocumentAdmin(admin.ModelAdmin): list_display = ('code', 'title') list_filter = ('code', 'title') search_fields = ['title', 'code'] @@ -64,5 +64,14 @@ admin.site.register(EventType, EventTypeAdmin) admin.site.register(EventVenue, EventVenueAdmin) admin.site.register(GeographicalClassification, GeoAdmin) -admin.site.register(Document) -admin.site.register(Notice, NoticeAdmin) +#admin.site.register(Document) +admin.site.register(Notice, DocumentAdmin) +admin.site.register(Disc, DocumentAdmin) +admin.site.register(Video, DocumentAdmin) +admin.site.register(VideoFile, DocumentAdmin) +admin.site.register(BookThesis, DocumentAdmin) +admin.site.register(Journal, DocumentAdmin) +admin.site.register(Article, DocumentAdmin) +admin.site.register(Photo, DocumentAdmin) +admin.site.register(PosterBooklet, DocumentAdmin) + diff --git a/mcm/management/commands/import_xml.py b/mcm/management/commands/import_xml.py index b508361..de7dbc4 100644 --- a/mcm/management/commands/import_xml.py +++ b/mcm/management/commands/import_xml.py @@ -3,7 +3,8 @@ from django.core.management.base import BaseCommand, CommandError from ...models import Document -from ...models import Notice +from ...models import Notice, Disc, Video, VideoFile, BookThesis, Journal +from ...models import Article, Photo, PosterBooklet, Object from ...models import Author, Keyword, Reference from ...models import Event, EventEdition, EventType, EventVenue from ...models import GeographicalClassification @@ -69,25 +70,78 @@ class Command(BaseCommand): document_non_traite = 0 erreur_date_parution = 0 erreur_date_indexation = 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', 'l-Objet', u'k-Pédagogique'] + + doc_types = [] + + import HTMLParser + h = HTMLParser.HTMLParser() + for document in root.iter('Document'): #print '------------' - doc_type = document.find('Type').text + doc_type = h.unescape(document.findtext('Type')) #print doc_type + if doc_type in skip_document_types: + if doc_type == 'l-Objet': + document_non_traite += 1 + continue + + document_traite +=1 + record_no = document.findtext('record_no') + code = document.findtext('Cote') + doc_class = DOCUMENT_CLASS[doc_type] + doc, c = doc_class.objects.get_or_create(old_id=record_no, + code=code) + # Title + doc.title = document.findtext('Titre') + doc.save() + # Keywords + for keyword in document.findall('Mots-cles'): + keyword_obj, keyword_c = Keyword.objects.get_or_create( + name=keyword.text) + doc.keywords.add(keyword_obj) + if doc_type == 'a-Notice spectacle': - document_traite +=1 - record_no = document.findtext('record_no') - code = document.findtext('Cote') event_type = document.findtext('Type_Manifestation') if event_type is not None: - event_type_obj, c = EventType.objects.get_or_create(name=event_type) + 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) + event_venue_obj, c = EventVenue.objects.get_or_create( + name=event_venue) else: event_venue_obj = None @@ -97,32 +151,34 @@ class Command(BaseCommand): edition = document.findtext('No_edition') try: - event_edition_obj, c = EventEdition.objects.get_or_create(event=event_obj, edition=edition) + event_edition_obj, c = EventEdition.objects.get_or_create( + event=event_obj, edition=edition) except ValueError: print code, edition - event_edition_obj, c = EventEdition.objects.get_or_create(event=event_obj, edition=None) + event_edition_obj, c = EventEdition.objects.get_or_create( + event=event_obj, edition=None) else: event_edition_obj = None - notice, c = Notice.objects.get_or_create(old_id=record_no, - code=code, - event_edition=event_edition_obj, - event_type=event_type_obj, - event_venue=event_venue_obj) + doc.event_edition = event_edition_obj + doc.event_type = event_type_obj + doc.event_venue = event_venue_obj - notice.title = document.findtext('Titre') + import datetime try: - release_date = datetime.datetime.strptime(document.find('Date_de_parution').text,'%d/%m/%y').date() + release_date = datetime.datetime.strptime( + document.find('Date_de_parution').text,'%d/%m/%y').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() release_date = None erreur_date_parution += 1 try: - indexation_date = datetime.datetime.strptime(document.find('Date_d_indexation').text,'%d/%m/%y').date() + indexation_date = datetime.datetime.strptime( + document.find('Date_d_indexation').text,'%d/%m/%y').date() except ValueError: indexation_date = None erreur_date_indexation +=1 @@ -136,24 +192,23 @@ class Command(BaseCommand): # Authors for author in document.findall('auteurs'): - author_obj, auth_c = Author.objects.get_or_create(name=author.text) - notice.authors.add(author_obj) - # Keywords - for keyword in document.findall('Mots-cles'): - keyword_obj, keyword_c = Keyword.objects.get_or_create(name=keyword.text) - notice.keywords.add(keyword_obj) + author_obj, auth_c = Author.objects.get_or_create( + name=author.text) + doc.authors.add(author_obj) + # Referencess for ref in document.findall('Reference'): - ref_obj, ref_c = Reference.objects.get_or_create(name=ref.text) - notice.references.add(ref_obj) + ref_obj, ref_c = Reference.objects.get_or_create( + name=ref.text) + doc.references.add(ref_obj) # GeographicalClassification geo = document.findtext('Classement_Geographique') if geo is not None: - geo_obj,c = GeographicalClassification.objects.get_or_create(name=geo) - notice.geographic_classification = geo_obj - notice.save() - else: - document_non_traite += 1 + geo_obj,c = GeographicalClassification.objects.get_or_create( + name=geo) + doc.geographic_classification = geo_obj + doc.save() + if DEBUG & (document_traite > 100): break print '-*-*--*-*-*-*-*-*-*-*' diff --git a/mcm/migrations/0001_initial.py b/mcm/migrations/0001_initial.py index bc0ffab..ce2db4c 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-19 15:51 +# Generated by Django 1.9.2 on 2016-07-22 21:58 from __future__ import unicode_literals from django.db import migrations, models @@ -19,6 +19,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, unique=True)), + ('alias', models.CharField(blank=True, default='', max_length=100)), + ('comment', models.TextField(default='')), ], options={ 'abstract': False, @@ -28,12 +30,9 @@ class Migration(migrations.Migration): name='Document', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ('title', models.CharField(max_length=200, verbose_name='title')), ('old_id', models.IntegerField(unique=True)), - ('release_date', models.DateField(blank=True, null=True, verbose_name='release date')), ('text', models.TextField(default='')), - ('indexation_date', models.DateField(blank=True, null=True, verbose_name='indexation date')), ], ), migrations.CreateModel( @@ -104,13 +103,89 @@ class Migration(migrations.Migration): 'abstract': False, }, ), + migrations.CreateModel( + name='Article', + 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')), + ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), + ], + bases=('mcm.document',), + ), + migrations.CreateModel( + name='BookThesis', + 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')), + ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), + ], + bases=('mcm.document',), + ), + migrations.CreateModel( + name='Disc', + 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')), + ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), + ], + bases=('mcm.document',), + ), + migrations.CreateModel( + name='Journal', + 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')), + ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), + ], + bases=('mcm.document',), + ), migrations.CreateModel( name='Notice', 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')), + ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), + ('release_date', models.DateField(blank=True, null=True, verbose_name='release date')), + ('indexation_date', models.DateField(blank=True, null=True, verbose_name='indexation date')), ('event_edition', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mcm.EventEdition')), ('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')), + ], + bases=('mcm.document',), + ), + migrations.CreateModel( + name='Object', + 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')), + ], + bases=('mcm.document',), + ), + migrations.CreateModel( + name='Photo', + 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')), + ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), + ], + bases=('mcm.document',), + ), + migrations.CreateModel( + name='PosterBooklet', + 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')), + ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), + ], + bases=('mcm.document',), + ), + migrations.CreateModel( + name='Video', + 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')), + ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), + ], + bases=('mcm.document',), + ), + migrations.CreateModel( + name='VideoFile', + 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')), + ('code', models.CharField(blank=True, max_length=200, verbose_name='code')), ], bases=('mcm.document',), ), @@ -119,19 +194,9 @@ class Migration(migrations.Migration): name='authors', field=models.ManyToManyField(to='mcm.Author'), ), - migrations.AddField( - model_name='document', - name='geographic_classification', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mcm.GeographicalClassification'), - ), migrations.AddField( model_name='document', name='keywords', field=models.ManyToManyField(to='mcm.Keyword'), ), - migrations.AddField( - model_name='document', - name='references', - field=models.ManyToManyField(to='mcm.Reference'), - ), ] diff --git a/mcm/models.py b/mcm/models.py index 35f97bf..c03e4a5 100644 --- a/mcm/models.py +++ b/mcm/models.py @@ -18,7 +18,8 @@ class BaseMany(models.Model): abstract = True class Author(BaseMany): - pass + alias = models.CharField(max_length=100, blank=True, default='') + comment = models.TextField(default='') class Keyword(BaseMany): pass @@ -65,18 +66,22 @@ DOCUMENT_TYPES = ( ) class Document(models.Model): - code = models.CharField(_('code'), unique=False, blank=True, - max_length=200) # Cote + authors = models.ManyToManyField(Author) # Auteur title = models.CharField(_('title'), max_length=200) # Titre - #doc_type = models.CharField(max_length=1, - # choices=DOCUMENT_TYPES) # Type old_id = models.IntegerField(unique=True, blank=False) # Record No - references = models.ManyToManyField(Reference) #Le Chant du Monde - release_date = models.DateField(_('release date'), null=True, blank=True)#1995 - #Musique d'Indonésie keywords = models.ManyToManyField(Keyword) #Toraja text = models.TextField(default='') + # see also / Voir aussi + + def __unicode__(self): + return self.title + +# Type : a-Notice spectacle +class Notice(Document): + 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 #Compact Disc Digital Audio #69'14 @@ -87,11 +92,47 @@ class Document(models.Model): #b-Disque #<[record_no]>2300703 #Le Chant du Monde ; Editions du CNRS, 1995 - def __unicode__(self): - return self.title - -class Notice(Document): + + #--- 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): + 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 : d-Vidéo en ligne +class VideoFile(Document): + code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + +# Type : f-Ouvrage & Thèse +class BookThesis(Document): + code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + +# Type : g-Revue +class Journal(Document): + code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + +# Type : h-Article +class Article(Document): + code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + +# Type : i-Photo +class Photo(Document): + code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + +# Type : j-Affiche - Brochure +class PosterBooklet(Document): + code = models.CharField(_('code'), unique=False, blank=True, max_length=200) # + +# Type :k-Pédagogique +#class Educational(Document): +# pass + +# Type : l-Objet +class Object(Document): + pass