model simplification, correct import on language. We do not try to impose a language when none is found. add forgotten abstract field on import.
authorymh <ymh.work@gmail.com>
Fri, 30 Aug 2013 17:58:35 +0200
changeset 13 6296aa12fd71
parent 12 57efd01f1715
child 14 52fa6990e0bb
model simplification, correct import on language. We do not try to impose a language when none is found. add forgotten abstract field on import.
src/p4l/management/commands/import_record.py
src/p4l/migrations/0001_initial.py
src/p4l/models/data.py
--- a/src/p4l/management/commands/import_record.py	Fri Aug 30 17:09:14 2013 +0200
+++ b/src/p4l/management/commands/import_record.py	Fri Aug 30 17:58:35 2013 +0200
@@ -4,7 +4,7 @@
 from django.db import reset_queries, transaction
 from optparse import make_option
 from p4l.models import Record, Language
-from p4l.utils import show_progress, get_code_from_language_uri
+from p4l.utils import show_progress
 from rdflib import Graph, Namespace, BNode, URIRef
 from rdflib.plugins.sparql import prepareQuery
 import logging
@@ -100,20 +100,6 @@
                 return False        
         return bool(val)
 
-    def convert_lang(self, val, default_lang):
-        return unicode(val) if (val is not None and len(unicode(val))>0) else default_lang
-
-
-    def get_record_default_language(self, g, record_uri):
-        lang_uri = self.extract_single_value_form_graph(g, DEFAULT_LANGUAGE_QUERY, bindings={'s': URIRef(record_uri)})
-        if not lang_uri:
-            lang_uri = DEFAULT_LANGUAGE_URI
-        lang_code = get_code_from_language_uri(lang_uri)
-        if lang_code is None:
-            logger.warn("get_record_default_language: no code found for %s in record %s" % (lang_uri, record_uri))
-            return get_code_from_language_uri(DEFAULT_LANGUAGE_URI)
-        return lang_code
-
 
     def add_to_related_collection(self, coll, graph, fields, q, bindings={},  convert=lambda v: unicode(v) if v is not None else None, through_fields=None):
         
@@ -146,7 +132,6 @@
     def build_record(self, graph):
 
         record_uri = self.extract_single_value_form_graph(graph,"SELECT DISTINCT ?s WHERE { ?s rdf:type iiep:Record .}")
-        default_language_code = self.get_record_default_language(graph, record_uri)
 
         record = Record()
         record.uri = record_uri
@@ -176,7 +161,6 @@
             ['label','lang'],
             "SELECT DISTINCT ?o  ( lang(?o) as ?l) WHERE { ?s iiep:periodical ?o .}",
             bindings={'s':URIRef(record.uri)},
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)},
             through_fields = ['lang']
         )
 
@@ -185,7 +169,7 @@
             graph, 
             ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear', 'lang'],
             "SELECT ?l ?mn ?mp ?md ?my (lang(COALESCE(?l,?nm, ?mp,?md,?my)) as ?lang) WHERE { [iiep:meeting ?bnode]. OPTIONAL { ?bnode rdfs:label ?l }. OPTIONAL { ?bnode iiep:meetingNumber ?mn }. OPTIONAL { ?bnode iiep:meetingPlace ?mp }.  OPTIONAL { ?bnode iiep:meetingDate ?md }. OPTIONAL { ?bnode iiep:meetingYear ?my }}",
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code), 'meetingYear' : lambda y: int(y) if y is not None else None},
+            convert={'meetingYear' : lambda y: int(y) if y is not None else None},
             through_fields = ['lang']
         )
 
@@ -194,7 +178,6 @@
             graph, 
             ['title', 'volume', 'lang'],
             "SELECT ?t ?vol (lang(COALESCE(?t,?vol)) as ?lang) WHERE { [iiep:serie ?bnode]. OPTIONAL { ?bnode dct:title ?t }. OPTIONAL { ?bnode iiep:volume ?vol } }",
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)},
             through_fields = ['lang']
         )
 
@@ -226,7 +209,6 @@
             ['issn', 'lang'],
             "SELECT ?issn (lang(COALESCE(?issn)) as ?lang) WHERE { ?s iiep:issn ?issn . }",
             bindings={'s':URIRef(record.uri)},
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)}
         )
 
         self.add_to_related_collection(
@@ -235,7 +217,6 @@
             ['isbn', 'lang'],
             "SELECT ?isbn (lang(COALESCE(?isbn)) as ?lang) WHERE { ?s iiep:isbn ?isbn . }",
             bindings={'s':URIRef(record.uri)},
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)}
         )
 
         self.add_to_related_collection(
@@ -244,7 +225,6 @@
             ['documentCode', 'lang'],
             "SELECT ?c (lang(COALESCE(?c)) as ?lang) WHERE { ?s iiep:documentCode ?c . }",
             bindings={'s':URIRef(record.uri)},
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)}
         )
 
         self.add_to_related_collection(
@@ -253,7 +233,14 @@
             ['title', 'lang'],
             "SELECT ?t (lang(COALESCE(?t)) as ?lang) WHERE { ?s dct:title ?t . }",
             bindings={'s':URIRef(record.uri)},
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)}
+        )
+
+        self.add_to_related_collection(
+            record.abstracts,
+            graph,
+            ['abstract', 'lang'],
+            "SELECT ?t (lang(COALESCE(?t)) as ?lang) WHERE { ?s dct:abstract ?t . }",
+            bindings={'s':URIRef(record.uri)},
         )
 
         self.add_to_related_collection(
@@ -262,7 +249,6 @@
             ['title', 'lang'],
             "SELECT ?t (lang(COALESCE(?t)) as ?lang) WHERE { ?s iiep:addedTitle ?t . }",
             bindings={'s':URIRef(record.uri)},
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)}
         )
 
         self.add_to_related_collection(
@@ -271,7 +257,6 @@
             ['title', 'lang'],
             "SELECT ?t (lang(COALESCE(?t)) as ?lang) WHERE { ?s iiep:titleMainDocument ?t . }",
             bindings={'s':URIRef(record.uri)},
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)}
         )
 
         self.add_to_related_collection(
@@ -279,7 +264,6 @@
             graph,
             ['imprintCity', 'publisher', 'imprintDate', 'lang'],
             "SELECT ?c ?p ?d (lang(COALESCE(?c, ?p, ?d)) as ?lang) WHERE { [ iiep:imprint ?bnode ]. OPTIONAL { ?bnode iiep:imprintCity ?c }. OPTIONAL { ?bnode dct:publisher ?p }. OPTIONAL { ?bnode iiep:imprintDate ?d }}",
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)}
         )
 
         self.add_to_related_collection(
@@ -288,7 +272,6 @@
             ['collation', 'lang'],
             "SELECT ?c (lang(COALESCE(?c)) as ?lang) WHERE { ?s iiep:collation ?c . }",
             bindings={'s':URIRef(record.uri)},
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)}
         )
 
         self.add_to_related_collection(
@@ -296,7 +279,6 @@
             graph,
             ['volume', 'number', 'lang'],
             "SELECT ?v ?n (lang(COALESCE(?v, ?n)) as ?lang) WHERE { [ iiep:volumeIssue ?bnode ]. OPTIONAL { ?bnode iiep:volume ?v }. OPTIONAL { ?bnode iiep:number ?n }}",
-            convert={'lang':lambda l: self.convert_lang(l, default_language_code)}
         )
 
         self.add_to_related_collection(
@@ -358,7 +340,7 @@
 
     # def process_url(self, records_url, options):
     #     #open graph with rdflib
-    #     #TODO: manage memory        
+    #             
     #     g = Graph()
     #     print("Loading %s" % records_url)
     #     g.parse(records_url)
--- a/src/p4l/migrations/0001_initial.py	Fri Aug 30 17:09:14 2013 +0200
+++ b/src/p4l/migrations/0001_initial.py	Fri Aug 30 17:58:35 2013 +0200
@@ -22,26 +22,13 @@
         # Adding model 'Serie'
         db.create_table(u'p4l_serie', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('lang', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=15, null=True, blank=True)),
+            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='series', to=orm['p4l.Record'])),
             ('title', self.gf('django.db.models.fields.CharField')(max_length=2048, db_index=True)),
             ('volume', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=2048, null=True, blank=True)),
         ))
         db.send_create_signal('p4l', ['Serie'])
 
-        # Adding unique constraint on 'Serie', fields ['title', 'volume']
-        db.create_unique(u'p4l_serie', ['title', 'volume'])
-
-        # Adding model 'RecordSerie'
-        db.create_table(u'p4l_recordserie', (
-            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('lang', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=15, null=True, blank=True)),
-            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='series+', to=orm['p4l.Record'])),
-            ('serie', self.gf('django.db.models.fields.related.ForeignKey')(related_name='records', to=orm['p4l.Serie'])),
-        ))
-        db.send_create_signal('p4l', ['RecordSerie'])
-
-        # Adding unique constraint on 'RecordSerie', fields ['record', 'serie']
-        db.create_unique(u'p4l_recordserie', ['record_id', 'serie_id'])
-
         # Adding model 'ProjectName'
         db.create_table(u'p4l_projectname', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
@@ -56,14 +43,12 @@
         # Adding model 'CorporateAuthor'
         db.create_table(u'p4l_corporateauthor', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='corporateAuthors', to=orm['p4l.Record'])),
             ('label', self.gf('django.db.models.fields.CharField')(max_length=2048, db_index=True)),
             ('acronym', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=2048, null=True, blank=True)),
         ))
         db.send_create_signal('p4l', ['CorporateAuthor'])
 
-        # Adding unique constraint on 'CorporateAuthor', fields ['label', 'acronym']
-        db.create_unique(u'p4l_corporateauthor', ['label', 'acronym'])
-
         # Adding model 'Url'
         db.create_table(u'p4l_url', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
@@ -191,36 +176,28 @@
         # Adding model 'Author'
         db.create_table(u'p4l_author', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=2048, db_index=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=2048, db_index=True)),
+            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='authors', to=orm['p4l.Record'])),
         ))
         db.send_create_signal('p4l', ['Author'])
 
         # Adding model 'SubjectPerson'
         db.create_table(u'p4l_subjectperson', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=2048, db_index=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=2048, db_index=True)),
+            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='subjectPersons', to=orm['p4l.Record'])),
         ))
         db.send_create_signal('p4l', ['SubjectPerson'])
 
         # Adding model 'Periodical'
         db.create_table(u'p4l_periodical', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('label', self.gf('django.db.models.fields.CharField')(unique=True, max_length=2048, db_index=True)),
+            ('lang', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=15, null=True, blank=True)),
+            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='periodicals', to=orm['p4l.Record'])),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=2048, db_index=True)),
         ))
         db.send_create_signal('p4l', ['Periodical'])
 
-        # Adding model 'RecordPeriodical'
-        db.create_table(u'p4l_recordperiodical', (
-            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('lang', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=15, null=True, blank=True)),
-            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='periodicals+', to=orm['p4l.Record'])),
-            ('periodical', self.gf('django.db.models.fields.related.ForeignKey')(related_name='records', to=orm['p4l.Periodical'])),
-        ))
-        db.send_create_signal('p4l', ['RecordPeriodical'])
-
-        # Adding unique constraint on 'RecordPeriodical', fields ['record', 'periodical']
-        db.create_unique(u'p4l_recordperiodical', ['record_id', 'periodical_id'])
-
         # Adding model 'Meeting'
         db.create_table(u'p4l_meeting', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
@@ -229,24 +206,11 @@
             ('meetingPlace', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=2048, null=True, blank=True)),
             ('meetingDate', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=2048, null=True, blank=True)),
             ('meetingYear', self.gf('django.db.models.fields.PositiveSmallIntegerField')(db_index=True, null=True, blank=True)),
+            ('lang', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=15, null=True, blank=True)),
+            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='meetings', to=orm['p4l.Record'])),
         ))
         db.send_create_signal('p4l', ['Meeting'])
 
-        # Adding unique constraint on 'Meeting', fields ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear']
-        db.create_unique(u'p4l_meeting', ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear'])
-
-        # Adding model 'RecordMeeting'
-        db.create_table(u'p4l_recordmeeting', (
-            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('lang', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=15, null=True, blank=True)),
-            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='meetings+', to=orm['p4l.Record'])),
-            ('meeting', self.gf('django.db.models.fields.related.ForeignKey')(related_name='records', to=orm['p4l.Meeting'])),
-        ))
-        db.send_create_signal('p4l', ['RecordMeeting'])
-
-        # Adding unique constraint on 'RecordMeeting', fields ['record', 'meeting']
-        db.create_unique(u'p4l_recordmeeting', ['record_id', 'meeting_id'])
-
         # Adding model 'SubjectMeeting'
         db.create_table(u'p4l_subjectmeeting', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
@@ -255,12 +219,10 @@
             ('meetingPlace', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=2048, null=True, blank=True)),
             ('meetingDate', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=2048, null=True, blank=True)),
             ('meetingYear', self.gf('django.db.models.fields.PositiveSmallIntegerField')(db_index=True, null=True, blank=True)),
+            ('record', self.gf('django.db.models.fields.related.ForeignKey')(related_name='subjectMeetings', to=orm['p4l.Record'])),
         ))
         db.send_create_signal('p4l', ['SubjectMeeting'])
 
-        # Adding unique constraint on 'SubjectMeeting', fields ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear']
-        db.create_unique(u'p4l_subjectmeeting', ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear'])
-
         # Adding model 'CorporateBody'
         db.create_table(u'p4l_corporatebody', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
@@ -325,22 +287,6 @@
         ))
         db.create_unique(u'p4l_record_projectNames', ['record_id', 'projectname_id'])
 
-        # Adding M2M table for field authors on 'Record'
-        db.create_table(u'p4l_record_authors', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('record', models.ForeignKey(orm['p4l.record'], null=False)),
-            ('author', models.ForeignKey(orm['p4l.author'], null=False))
-        ))
-        db.create_unique(u'p4l_record_authors', ['record_id', 'author_id'])
-
-        # Adding M2M table for field subjectPersons on 'Record'
-        db.create_table(u'p4l_record_subjectPersons', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('record', models.ForeignKey(orm['p4l.record'], null=False)),
-            ('subjectperson', models.ForeignKey(orm['p4l.subjectperson'], null=False))
-        ))
-        db.create_unique(u'p4l_record_subjectPersons', ['record_id', 'subjectperson_id'])
-
         # Adding M2M table for field subjectCorporateBodies on 'Record'
         db.create_table(u'p4l_record_subjectCorporateBodies', (
             ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
@@ -349,22 +295,6 @@
         ))
         db.create_unique(u'p4l_record_subjectCorporateBodies', ['record_id', 'corporatebody_id'])
 
-        # Adding M2M table for field subjectMeetings on 'Record'
-        db.create_table(u'p4l_record_subjectMeetings', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('record', models.ForeignKey(orm['p4l.record'], null=False)),
-            ('subjectmeeting', models.ForeignKey(orm['p4l.subjectmeeting'], null=False))
-        ))
-        db.create_unique(u'p4l_record_subjectMeetings', ['record_id', 'subjectmeeting_id'])
-
-        # Adding M2M table for field corporateAuthors on 'Record'
-        db.create_table(u'p4l_record_corporateAuthors', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('record', models.ForeignKey(orm['p4l.record'], null=False)),
-            ('corporateauthor', models.ForeignKey(orm['p4l.corporateauthor'], null=False))
-        ))
-        db.create_unique(u'p4l_record_corporateAuthors', ['record_id', 'corporateauthor_id'])
-
         # Adding model 'User'
         db.create_table(u'p4l_user', (
             (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
@@ -403,39 +333,15 @@
         # Removing unique constraint on 'CorporateBody', fields ['label', 'acronym']
         db.delete_unique(u'p4l_corporatebody', ['label', 'acronym'])
 
-        # Removing unique constraint on 'SubjectMeeting', fields ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear']
-        db.delete_unique(u'p4l_subjectmeeting', ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear'])
-
-        # Removing unique constraint on 'RecordMeeting', fields ['record', 'meeting']
-        db.delete_unique(u'p4l_recordmeeting', ['record_id', 'meeting_id'])
-
-        # Removing unique constraint on 'Meeting', fields ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear']
-        db.delete_unique(u'p4l_meeting', ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear'])
-
-        # Removing unique constraint on 'RecordPeriodical', fields ['record', 'periodical']
-        db.delete_unique(u'p4l_recordperiodical', ['record_id', 'periodical_id'])
-
-        # Removing unique constraint on 'CorporateAuthor', fields ['label', 'acronym']
-        db.delete_unique(u'p4l_corporateauthor', ['label', 'acronym'])
-
         # Removing unique constraint on 'ProjectName', fields ['label', 'acronym']
         db.delete_unique(u'p4l_projectname', ['label', 'acronym'])
 
-        # Removing unique constraint on 'RecordSerie', fields ['record', 'serie']
-        db.delete_unique(u'p4l_recordserie', ['record_id', 'serie_id'])
-
-        # Removing unique constraint on 'Serie', fields ['title', 'volume']
-        db.delete_unique(u'p4l_serie', ['title', 'volume'])
-
         # Deleting model 'Imprint'
         db.delete_table(u'p4l_imprint')
 
         # Deleting model 'Serie'
         db.delete_table(u'p4l_serie')
 
-        # Deleting model 'RecordSerie'
-        db.delete_table(u'p4l_recordserie')
-
         # Deleting model 'ProjectName'
         db.delete_table(u'p4l_projectname')
 
@@ -493,15 +399,9 @@
         # Deleting model 'Periodical'
         db.delete_table(u'p4l_periodical')
 
-        # Deleting model 'RecordPeriodical'
-        db.delete_table(u'p4l_recordperiodical')
-
         # Deleting model 'Meeting'
         db.delete_table(u'p4l_meeting')
 
-        # Deleting model 'RecordMeeting'
-        db.delete_table(u'p4l_recordmeeting')
-
         # Deleting model 'SubjectMeeting'
         db.delete_table(u'p4l_subjectmeeting')
 
@@ -526,21 +426,9 @@
         # Removing M2M table for field projectNames on 'Record'
         db.delete_table('p4l_record_projectNames')
 
-        # Removing M2M table for field authors on 'Record'
-        db.delete_table('p4l_record_authors')
-
-        # Removing M2M table for field subjectPersons on 'Record'
-        db.delete_table('p4l_record_subjectPersons')
-
         # Removing M2M table for field subjectCorporateBodies on 'Record'
         db.delete_table('p4l_record_subjectCorporateBodies')
 
-        # Removing M2M table for field subjectMeetings on 'Record'
-        db.delete_table('p4l_record_subjectMeetings')
-
-        # Removing M2M table for field corporateAuthors on 'Record'
-        db.delete_table('p4l_record_corporateAuthors')
-
         # Deleting model 'User'
         db.delete_table(u'p4l_user')
 
@@ -589,7 +477,8 @@
         'p4l.author': {
             'Meta': {'object_name': 'Author'},
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'})
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'db_index': 'True'}),
+            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'authors'", 'to': "orm['p4l.Record']"})
         },
         'p4l.collation': {
             'Meta': {'object_name': 'Collation'},
@@ -599,10 +488,11 @@
             'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'collations'", 'to': "orm['p4l.Record']"})
         },
         'p4l.corporateauthor': {
-            'Meta': {'unique_together': "(['label', 'acronym'],)", 'object_name': 'CorporateAuthor'},
+            'Meta': {'object_name': 'CorporateAuthor'},
             'acronym': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'label': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'db_index': 'True'})
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'db_index': 'True'}),
+            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'corporateAuthors'", 'to': "orm['p4l.Record']"})
         },
         'p4l.corporatebody': {
             'Meta': {'unique_together': "(['label', 'acronym'],)", 'object_name': 'CorporateBody'},
@@ -613,7 +503,8 @@
         'p4l.country': {
             'Meta': {'object_name': 'Country'},
             'country': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'}),
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'})
         },
         'p4l.documentcode': {
             'Meta': {'object_name': 'DocumentCode'},
@@ -648,21 +539,26 @@
         'p4l.language': {
             'Meta': {'object_name': 'Language'},
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
             'language': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'})
         },
         'p4l.meeting': {
-            'Meta': {'unique_together': "(['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear'],)", 'object_name': 'Meeting'},
+            'Meta': {'object_name': 'Meeting'},
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
             'label': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'db_index': 'True'}),
+            'lang': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
             'meetingDate': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
             'meetingNumber': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
             'meetingPlace': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
-            'meetingYear': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'})
+            'meetingYear': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'meetings'", 'to': "orm['p4l.Record']"})
         },
         'p4l.periodical': {
             'Meta': {'object_name': 'Periodical'},
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'})
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'db_index': 'True'}),
+            'lang': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
+            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'periodicals'", 'to': "orm['p4l.Record']"})
         },
         'p4l.projectname': {
             'Meta': {'unique_together': "(['label', 'acronym'],)", 'object_name': 'ProjectName'},
@@ -672,77 +568,55 @@
         },
         'p4l.record': {
             'Meta': {'object_name': 'Record'},
-            'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.Author']", 'symmetrical': 'False'}),
-            'corporateAuthors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.CorporateAuthor']", 'symmetrical': 'False'}),
             'countries': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.Country']", 'symmetrical': 'False'}),
             'editionStatement': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
             'identifier': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128', 'db_index': 'True'}),
             'isDocumentPart': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
             'language': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['p4l.Language']", 'null': 'True', 'blank': 'True'}),
-            'meetings': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.Meeting']", 'through': "orm['p4l.RecordMeeting']", 'symmetrical': 'False'}),
             'notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
             'otherLanguages': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'otherLanguage_record'", 'symmetrical': 'False', 'to': "orm['p4l.Language']"}),
-            'periodicals': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.Periodical']", 'through': "orm['p4l.RecordPeriodical']", 'symmetrical': 'False'}),
             'projectNames': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.ProjectName']", 'symmetrical': 'False'}),
             'recordType': ('django.db.models.fields.URLField', [], {'max_length': '2048'}),
-            'series': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.Serie']", 'through': "orm['p4l.RecordSerie']", 'symmetrical': 'False'}),
             'subjectCorporateBodies': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.CorporateBody']", 'symmetrical': 'False'}),
-            'subjectMeetings': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.SubjectMeeting']", 'symmetrical': 'False'}),
-            'subjectPersons': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.SubjectPerson']", 'symmetrical': 'False'}),
             'subjects': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.Subject']", 'symmetrical': 'False'}),
             'themes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['p4l.Theme']", 'symmetrical': 'False'}),
             'uri': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'})
         },
-        'p4l.recordmeeting': {
-            'Meta': {'unique_together': "(['record', 'meeting'],)", 'object_name': 'RecordMeeting'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'lang': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
-            'meeting': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'records'", 'to': "orm['p4l.Meeting']"}),
-            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'meetings+'", 'to': "orm['p4l.Record']"})
-        },
-        'p4l.recordperiodical': {
-            'Meta': {'unique_together': "(['record', 'periodical'],)", 'object_name': 'RecordPeriodical'},
+        'p4l.serie': {
+            'Meta': {'object_name': 'Serie'},
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
             'lang': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
-            'periodical': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'records'", 'to': "orm['p4l.Periodical']"}),
-            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'periodicals+'", 'to': "orm['p4l.Record']"})
-        },
-        'p4l.recordserie': {
-            'Meta': {'unique_together': "(['record', 'serie'],)", 'object_name': 'RecordSerie'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'lang': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
-            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'series+'", 'to': "orm['p4l.Record']"}),
-            'serie': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'records'", 'to': "orm['p4l.Serie']"})
-        },
-        'p4l.serie': {
-            'Meta': {'unique_together': "(['title', 'volume'],)", 'object_name': 'Serie'},
-            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'series'", 'to': "orm['p4l.Record']"}),
             'title': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'db_index': 'True'}),
             'volume': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'})
         },
         'p4l.subject': {
             'Meta': {'object_name': 'Subject'},
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
             'subject': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'})
         },
         'p4l.subjectmeeting': {
-            'Meta': {'unique_together': "(['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear'],)", 'object_name': 'SubjectMeeting'},
+            'Meta': {'object_name': 'SubjectMeeting'},
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
             'label': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'db_index': 'True'}),
             'meetingDate': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
             'meetingNumber': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
             'meetingPlace': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
-            'meetingYear': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'})
+            'meetingYear': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subjectMeetings'", 'to': "orm['p4l.Record']"})
         },
         'p4l.subjectperson': {
             'Meta': {'object_name': 'SubjectPerson'},
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'})
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'db_index': 'True'}),
+            'record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subjectPersons'", 'to': "orm['p4l.Record']"})
         },
         'p4l.theme': {
             'Meta': {'object_name': 'Theme'},
             u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
             'theme': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'})
         },
         'p4l.title': {
--- a/src/p4l/models/data.py	Fri Aug 30 17:09:14 2013 +0200
+++ b/src/p4l/models/data.py	Fri Aug 30 17:58:35 2013 +0200
@@ -11,18 +11,10 @@
     imprintDate = models.CharField(max_length=512, blank=True, null=True, db_index=True)    
 
 
-class Serie(P4lModel):
+class Serie(P4lModelLang):
+    record = models.ForeignKey('p4l.Record', related_name="series")
     title = models.CharField(max_length=2048, blank=False, null=False, db_index=True)
     volume = models.CharField(max_length=2048, blank=True, null=True, db_index=True)
-    class Meta(P4lModel.Meta):
-        unique_together = ['title', 'volume']
-
-class RecordSerie(P4lModelLang):
-    record = models.ForeignKey('p4l.Record', related_name="series+")
-    serie = models.ForeignKey('p4l.Serie', related_name="records")
-    class Meta(P4lModelLang.Meta):
-        unique_together = ['record','serie']
-
 
 
 class ProjectName(P4lModel):
@@ -33,14 +25,13 @@
 
 
 class CorporateAuthor(P4lModel):
+    record = models.ForeignKey('p4l.Record', related_name="corporateAuthors", db_index=True)
     label = models.CharField(max_length=2048, blank=False, null=False, db_index=True)
     acronym = models.CharField(max_length=2048, blank=True, null=True, db_index=True) #iiep:acronym
-    class Meta(P4lModel.Meta):
-        unique_together = ['label', 'acronym']
 
 
 class Url(P4lModel):
-    record = models.ForeignKey('p4l.Record', related_name="urls")
+    record = models.ForeignKey('p4l.Record', related_name="urls", db_index=True)
     address = models.CharField(max_length=2048, blank=False, null=False, db_index=True) #iiep:address
     display = models.CharField(max_length=2048, blank=True, null=True, db_index=True) #iiep:display
     accessLevel = models.CharField(max_length=512, blank=True, null=True, db_index=True) #iiep:accessLevel
@@ -61,16 +52,16 @@
 
 
 class Isbn(P4lModelLang):
-    record = models.ForeignKey('p4l.Record', related_name="isbns")
+    record = models.ForeignKey('p4l.Record', related_name="isbns", db_index=True)
     isbn = models.CharField(max_length=128) #iiep:isbn
 
 
 class Issn(P4lModelLang):
-    record = models.ForeignKey('p4l.Record', related_name="issns")
+    record = models.ForeignKey('p4l.Record', related_name="issns", db_index=True)
     issn = models.CharField(max_length=128) #iiep:issn
 
 class DocumentCode(P4lModelLang):
-    record = models.ForeignKey('p4l.Record', related_name="documentCodes")
+    record = models.ForeignKey('p4l.Record', related_name="documentCodes", db_index=True)
     documentCode = models.CharField(max_length=128) #iiep:issn
 
 class Language(P4lModel):
@@ -85,52 +76,46 @@
         abstract = True
 
 class Title(BaseTitle):
-    record = models.ForeignKey('p4l.Record', related_name="titles")
+    record = models.ForeignKey('p4l.Record', related_name="titles", db_index=True)
 
 class AddedTitle(BaseTitle):
-    record = models.ForeignKey('p4l.Record', related_name="addedTitles")
+    record = models.ForeignKey('p4l.Record', related_name="addedTitles", db_index=True)
 
 class TitleMainDocument(BaseTitle):
-    record = models.ForeignKey('p4l.Record', related_name="titlesMainDocument")
+    record = models.ForeignKey('p4l.Record', related_name="titlesMainDocument", db_index=True)
 
 
 class Abstract(P4lModelLang):
-    record = models.ForeignKey('p4l.Record', related_name="abstracts")
+    record = models.ForeignKey('p4l.Record', related_name="abstracts", db_index=True)
     abstract = models.TextField(blank=True, null=True)
 
 
 class Collation(P4lModelLang):
-    record = models.ForeignKey('p4l.Record', related_name="collations")
+    record = models.ForeignKey('p4l.Record', related_name="collations", db_index=True)
     collation = models.CharField(max_length=1024, blank=False, null=False, db_index=True)
 
 
 class VolumeIssue(P4lModelLang):
-    record = models.ForeignKey('p4l.Record', related_name="volumeIssues")
+    record = models.ForeignKey('p4l.Record', related_name="volumeIssues", db_index=True)
     volume = models.CharField(max_length=1024, blank=True, null=True, db_index=True) #iiep:volume
     number = models.CharField(max_length=1024, blank=True, null=True, db_index=True) #iiep:number
 
 
 class P4lPerson(P4lModel):
-    name = models.CharField(max_length=2048, blank=False, null=False, db_index=True, unique=True)
+    name = models.CharField(max_length=2048, blank=False, null=False, db_index=True)
     class Meta(P4lModel.Meta):
         abstract = True
 
 
 class Author(P4lPerson):
-    pass
+    record = models.ForeignKey('p4l.Record', related_name="authors", db_index=True)
     
 class SubjectPerson(P4lPerson):
-    pass
-
-
-class Periodical(P4lModel):
-    label = models.CharField(max_length=2048, blank=False, null=False, db_index=True, unique=True) #iiep:periodical
+    record = models.ForeignKey('p4l.Record', related_name="subjectPersons", db_index=True)
 
-class RecordPeriodical(P4lModelLang):
-    record = models.ForeignKey('p4l.Record', related_name="periodicals+")
-    periodical = models.ForeignKey('p4l.Periodical', related_name="records")
-    class Meta(P4lModelLang.Meta):
-        unique_together = ['record','periodical']
+class Periodical(P4lModelLang):
+    record = models.ForeignKey('p4l.Record', related_name="periodicals", db_index=True)
+    label = models.CharField(max_length=2048, blank=False, null=False, db_index=True) #iiep:periodical
 
 
 class BaseMeeting(P4lModel):
@@ -141,21 +126,15 @@
     meetingYear = models.PositiveSmallIntegerField(blank=True, null=True, db_index=True) #iiep:meetingYear
     class Meta(P4lModel.Meta):
         abstract = True
-        unique_together = ['label', 'meetingNumber', 'meetingPlace', 'meetingDate', 'meetingYear']
 
 
 class Meeting(BaseMeeting):
-    pass
-
-class RecordMeeting(P4lModelLang):
-    record = models.ForeignKey('p4l.Record', related_name="meetings+")
-    meeting = models.ForeignKey('p4l.Meeting', related_name="records")
-    class Meta(P4lModelLang.Meta):
-        unique_together = ['record','meeting']
+    lang = models.CharField(max_length=15, blank=True, null=True, db_index=True) #@xml:lang
+    record = models.ForeignKey('p4l.Record', related_name="meetings")
 
 
 class SubjectMeeting(BaseMeeting):
-    pass
+    record = models.ForeignKey('p4l.Record', related_name="subjectMeetings", db_index=True)
 
 
 class CorporateBody(P4lModel):
@@ -177,6 +156,7 @@
     language = models.ForeignKey('p4l.Language', blank=True, null=True) #dct:language                                    # Language
     otherLanguages = models.ManyToManyField('p4l.Language', related_name='otherLanguage_record') #iiep:otherLanguage     # Language
     #titles foreign Key from Title #dct:title
+    #abstracts foreign Key from Abstract #dct:abstract
     #addedTitles foreign Key from AddedTitle #iiep:addedTitle
     #titlesMainDocument foreign Key from TitleMainDocument #iiep:titleMainDocument
     editionStatement = models.CharField(max_length=1024, blank=True, null=True) #iiep:editionStatement
@@ -184,14 +164,14 @@
     #collations = foreign Key from Collation #iiep:collation
     #volumeIssues = foreign Key from VolumeIssue #iiep:volumeIssue
     projectNames = models.ManyToManyField('p4l.ProjectName') #iiep:projectName
-    periodicals = models.ManyToManyField('p4l.Periodical', through='p4l.RecordPeriodical') #iiep:periodical
-    meetings = models.ManyToManyField('p4l.Meeting', through='p4l.RecordMeeting') #iiep:meeting
-    series = models.ManyToManyField('p4l.Serie', through='p4l.RecordSerie')  #iiep:serie
-    authors = models.ManyToManyField('p4l.Author') #iiep:author
-    subjectPersons = models.ManyToManyField('p4l.SubjectPerson') #iiep:subjectPerson
+    #periodicals = foreign key from 'p4l.Periodical' #iiep:periodical
+    #meetings = foreign key from 'p4l.Meeting' #iiep:meeting
+    #series = foreign key from 'p4l.Serie'  #iiep:serie
+    #authors = foreign key from 'p4l.Author' #iiep:author
+    #subjectPersons = foreign key from 'p4l.SubjectPerson' #iiep:subjectPerson
     subjectCorporateBodies = models.ManyToManyField('p4l.CorporateBody') #iiep:subjectCorporateBody                       # Organisation ?
-    subjectMeetings = models.ManyToManyField('p4l.SubjectMeeting') #iiep:subjectMeeting
-    corporateAuthors = models.ManyToManyField('p4l.CorporateAuthor') #iiep:corporateAuthor                                # Organisation ?
+    #subjectMeetings = foreign key from 'p4l.SubjectMeeting' #iiep:subjectMeeting
+    #corporateAuthors = foreign key from 'p4l.CorporateAuthor' #iiep:corporateAuthor                                # Organisation ?
     #urls foreign Key from Url #iiep:url
     recordType = models.URLField(max_length=2048) #dct:type
     isDocumentPart = models.BooleanField() #iiep:isDocumentPart