Added contribution
authorveltr
Tue, 03 Sep 2013 15:50:59 +0200
changeset 101 19de76fe00a9
parent 100 25636bb50756
child 102 5d83d0105559
Added contribution
src/jocondelab/locale/en/LC_MESSAGES/django.mo
src/jocondelab/locale/en/LC_MESSAGES/django.po
src/jocondelab/locale/en/LC_MESSAGES/djangojs.mo
src/jocondelab/locale/en/LC_MESSAGES/djangojs.po
src/jocondelab/locale/fr/LC_MESSAGES/django.mo
src/jocondelab/locale/fr/LC_MESSAGES/django.po
src/jocondelab/locale/fr/LC_MESSAGES/djangojs.mo
src/jocondelab/locale/fr/LC_MESSAGES/djangojs.po
src/jocondelab/migrations/0007_auto__add_contribution_tables.py
src/jocondelab/models/__init__.py
src/jocondelab/models/contribution.py
src/jocondelab/static/jocondelab/css/front-common.css
src/jocondelab/static/jocondelab/css/front-notice.css
src/jocondelab/static/jocondelab/js/front-common.js
src/jocondelab/static/jocondelab/js/front-notice.js
src/jocondelab/templates/jocondelab/front_notice.html
src/jocondelab/templates/jocondelab/front_search.html
src/jocondelab/urls.py
src/jocondelab/views/ajax.py
src/jocondelab/views/front_office.py
Binary file src/jocondelab/locale/en/LC_MESSAGES/django.mo has changed
--- a/src/jocondelab/locale/en/LC_MESSAGES/django.po	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/locale/en/LC_MESSAGES/django.po	Tue Sep 03 15:50:59 2013 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-08-22 09:54-0500\n"
+"POT-Creation-Date: 2013-09-03 08:47-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -97,10 +97,41 @@
 msgid "English"
 msgstr "English"
 
-#: templates/jocondelab/ajax_contents.html:2
-#: templates/jocondelab/front_search.html:35
-msgid "results for:"
-msgstr "results for:"
+#: settings.py:44
+msgid "Italian"
+msgstr "Italian"
+
+#: settings.py:45
+msgid "Spanish"
+msgstr "Spanish"
+
+#: settings.py:46
+msgid "German"
+msgstr "German"
+
+#: settings.py:47
+msgid "Portuguese"
+msgstr "Portuguese"
+
+#: settings.py:48
+msgid "Chinese"
+msgstr "Chinese"
+
+#: settings.py:49
+msgid "Japanese"
+msgstr "Japanese"
+
+#: settings.py:50
+msgid "Catalan"
+msgstr "Catalan"
+
+#: settings.py:51
+msgid "Basque"
+msgstr "Basque"
+
+#: settings.py:52
+msgid "Breton"
+msgstr "Breton"
 
 #: templates/jocondelab/front_base.html:55
 msgid "Menu"
@@ -113,14 +144,14 @@
 msgstr "Multilingual search"
 
 #: templates/jocondelab/front_base.html:61
-#: templates/jocondelab/front_timeline.html:28
-#: templates/jocondelab/front_timeline.html:30
+#: templates/jocondelab/front_timeline.html:27
+#: templates/jocondelab/front_timeline.html:29
 msgid "Timeline"
 msgstr "Timeline"
 
 #: templates/jocondelab/front_base.html:64
-#: templates/jocondelab/front_geo.html:34
-#: templates/jocondelab/front_geo.html:36
+#: templates/jocondelab/front_geo.html:33
+#: templates/jocondelab/front_geo.html:35
 msgid "World map"
 msgstr "World map"
 
@@ -133,48 +164,54 @@
 msgid "Source: Wikipedia"
 msgstr "Source: Wikipedia"
 
-#: templates/jocondelab/front_geo.html:43
+#: templates/jocondelab/front_geo.html:42
 msgid "Search for a place"
 msgstr "Search for a place"
 
-#: templates/jocondelab/front_notice.html:44
-#: templates/jocondelab/partial/notice_list.html:9
+#: templates/jocondelab/front_notice.html:50
+#: templates/jocondelab/partial/notice_list.html:13
 msgid "Title:"
 msgstr "Title:"
 
-#: templates/jocondelab/front_notice.html:50
-#: templates/jocondelab/partial/notice_list.html:10
+#: templates/jocondelab/front_notice.html:56
+#: templates/jocondelab/partial/notice_list.html:14
 msgid "Denomination:"
 msgstr "Denomination:"
 
-#: templates/jocondelab/front_notice.html:56
-#: templates/jocondelab/partial/notice_list.html:24
+#: templates/jocondelab/front_notice.html:62
+#: templates/jocondelab/front_notice.html:110
+#: templates/jocondelab/front_notice.html:121
+#: templates/jocondelab/partial/notice_list.html:28
 msgid ":"
 msgstr ":"
 
-#: templates/jocondelab/front_notice.html:70
+#: templates/jocondelab/front_notice.html:76
 msgid "Description:"
 msgstr "Description:"
 
-#: templates/jocondelab/front_notice.html:76
+#: templates/jocondelab/front_notice.html:82
 msgid "History:"
 msgstr "History:"
 
-#: templates/jocondelab/front_notice.html:82
+#: templates/jocondelab/front_notice.html:88
 msgid "Conservation location:"
 msgstr "Conservation location:"
 
-#: templates/jocondelab/front_notice.html:88
+#: templates/jocondelab/front_notice.html:94
 msgid "Datasheet rights:"
 msgstr "Datasheet rights:"
 
-#: templates/jocondelab/front_notice.html:94
+#: templates/jocondelab/front_notice.html:100
 msgid "Images rights:"
 msgstr "Images rights:"
 
-#: templates/jocondelab/front_search.html:35
-msgid "results"
-msgstr "results"
+#: templates/jocondelab/front_notice.html:112
+msgid "What do you see in this work?"
+msgstr "What do you see in this work?"
+
+#: templates/jocondelab/front_notice.html:123
+msgid "Which other work is a source for this work?"
+msgstr "Which other work is a source for this work?"
 
 #: templates/jocondelab/term_edit.html:73
 msgid "prev"
@@ -250,7 +287,15 @@
 msgid "Search"
 msgstr "Search"
 
-#: templates/jocondelab/partial/notice_list.html:14
+#: templates/jocondelab/partial/notice_list.html:3
+msgid "results for:"
+msgstr "results for:"
+
+#: templates/jocondelab/partial/notice_list.html:3
+msgid "results"
+msgstr "results"
+
+#: templates/jocondelab/partial/notice_list.html:18
 msgid "Author(s):"
 msgstr "Author(s):"
 
Binary file src/jocondelab/locale/en/LC_MESSAGES/djangojs.mo has changed
--- a/src/jocondelab/locale/en/LC_MESSAGES/djangojs.po	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/locale/en/LC_MESSAGES/djangojs.po	Tue Sep 03 15:50:59 2013 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-29 22:20+0200\n"
+"POT-Creation-Date: 2013-09-03 08:47-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,6 +16,23 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: static/jocondelab/js/front-geo.js:11
+msgid "Map data © OpenStreetMap contributors"
+msgstr "Map data © OpenStreetMap contributors"
+
+#: static/jocondelab/js/front-notice.js:229
+msgid "Validating Resource…"
+msgstr "Validating Resource…"
+
+#: static/jocondelab/js/front-notice.js:233
+msgid "Saving contribution…"
+msgstr "Saving contribution…"
+
+#: static/jocondelab/js/front-notice.js:257
+#: static/jocondelab/js/front-notice.js:261
+msgid "No DbPedia resource found for term"
+msgstr "No DbPedia resource found for term"
+
 #: static/jocondelab/js/jocondelab.js:14
 msgid "Redirected from: "
 msgstr "Redirected from: "
@@ -38,14 +55,14 @@
 msgid "Confirmez-vous l'invalidation de cette fiche ?"
 msgstr "Do you confirm this notice validation ?"
 
-#: static/jocondelab/js/jocondelab.js:272
+#: static/jocondelab/js/jocondelab.js:271
 msgid "error when treating request"
 msgstr "error when treating request"
 
-#: static/jocondelab/js/jocondelab.js:341
+#: static/jocondelab/js/jocondelab.js:348
 msgid "Ok"
 msgstr "Ok"
 
-#: static/jocondelab/js/jocondelab.js:354
+#: static/jocondelab/js/jocondelab.js:361
 msgid "Cancel"
 msgstr "Cancel"
Binary file src/jocondelab/locale/fr/LC_MESSAGES/django.mo has changed
--- a/src/jocondelab/locale/fr/LC_MESSAGES/django.po	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/locale/fr/LC_MESSAGES/django.po	Tue Sep 03 15:50:59 2013 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-08-22 10:10-0500\n"
+"POT-Creation-Date: 2013-09-03 08:42-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -98,10 +98,41 @@
 msgid "English"
 msgstr "Anglais"
 
-#: templates/jocondelab/ajax_contents.html:2
-#: templates/jocondelab/front_search.html:35
-msgid "results for:"
-msgstr "résultats pour :"
+#: settings.py:44
+msgid "Italian"
+msgstr "Italien"
+
+#: settings.py:45
+msgid "Spanish"
+msgstr "Espagnol"
+
+#: settings.py:46
+msgid "German"
+msgstr "Allemand"
+
+#: settings.py:47
+msgid "Portuguese"
+msgstr "Portugais"
+
+#: settings.py:48
+msgid "Chinese"
+msgstr "Chinois"
+
+#: settings.py:49
+msgid "Japanese"
+msgstr "Japonais"
+
+#: settings.py:50
+msgid "Catalan"
+msgstr "Catalan"
+
+#: settings.py:51
+msgid "Basque"
+msgstr "Basque"
+
+#: settings.py:52
+msgid "Breton"
+msgstr "Breton"
 
 #: templates/jocondelab/front_base.html:55
 msgid "Menu"
@@ -114,14 +145,14 @@
 msgstr "Recherche multilingue"
 
 #: templates/jocondelab/front_base.html:61
-#: templates/jocondelab/front_timeline.html:28
-#: templates/jocondelab/front_timeline.html:30
+#: templates/jocondelab/front_timeline.html:27
+#: templates/jocondelab/front_timeline.html:29
 msgid "Timeline"
 msgstr "Frise chronologique"
 
 #: templates/jocondelab/front_base.html:64
-#: templates/jocondelab/front_geo.html:34
-#: templates/jocondelab/front_geo.html:36
+#: templates/jocondelab/front_geo.html:33
+#: templates/jocondelab/front_geo.html:35
 msgid "World map"
 msgstr "Mappemonde"
 
@@ -134,49 +165,55 @@
 msgid "Source: Wikipedia"
 msgstr "Source : Wikipédia"
 
-#: templates/jocondelab/front_geo.html:43
+#: templates/jocondelab/front_geo.html:42
 msgid "Search for a place"
 msgstr "Rechercher un lieu"
 
-#: templates/jocondelab/front_notice.html:44
-#: templates/jocondelab/partial/notice_list.html:9
+#: templates/jocondelab/front_notice.html:50
+#: templates/jocondelab/partial/notice_list.html:13
 msgid "Title:"
 msgstr "Titre :"
 
-#: templates/jocondelab/front_notice.html:50
-#: templates/jocondelab/partial/notice_list.html:10
+#: templates/jocondelab/front_notice.html:56
+#: templates/jocondelab/partial/notice_list.html:14
 msgid "Denomination:"
 msgstr "Dénomination :"
 
-#: templates/jocondelab/front_notice.html:56
-#: templates/jocondelab/partial/notice_list.html:24
+#: templates/jocondelab/front_notice.html:62
+#: templates/jocondelab/front_notice.html:110
+#: templates/jocondelab/front_notice.html:121
+#: templates/jocondelab/partial/notice_list.html:28
 msgid ":"
 msgstr " :"
 
-#: templates/jocondelab/front_notice.html:70
+#: templates/jocondelab/front_notice.html:76
 #, fuzzy
 msgid "Description:"
 msgstr "Description :"
 
-#: templates/jocondelab/front_notice.html:76
+#: templates/jocondelab/front_notice.html:82
 msgid "History:"
 msgstr "Histoire :"
 
-#: templates/jocondelab/front_notice.html:82
+#: templates/jocondelab/front_notice.html:88
 msgid "Conservation location:"
 msgstr "Lieu de conservation :"
 
-#: templates/jocondelab/front_notice.html:88
+#: templates/jocondelab/front_notice.html:94
 msgid "Datasheet rights:"
 msgstr "Copyright notice :"
 
-#: templates/jocondelab/front_notice.html:94
+#: templates/jocondelab/front_notice.html:100
 msgid "Images rights:"
 msgstr "Droits photographiques :"
 
-#: templates/jocondelab/front_search.html:35
-msgid "results"
-msgstr "résultats"
+#: templates/jocondelab/front_notice.html:112
+msgid "What do you see in this work?"
+msgstr "Que voyez-vous dans cette œuvre ?"
+
+#: templates/jocondelab/front_notice.html:123
+msgid "Which other work is a source for this work?"
+msgstr "Quelle autre œuvre est une source de la représentation ?"
 
 #: templates/jocondelab/term_edit.html:73
 msgid "prev"
@@ -252,7 +289,15 @@
 msgid "Search"
 msgstr "Rech."
 
-#: templates/jocondelab/partial/notice_list.html:14
+#: templates/jocondelab/partial/notice_list.html:3
+msgid "results for:"
+msgstr "résultats pour :"
+
+#: templates/jocondelab/partial/notice_list.html:3
+msgid "results"
+msgstr "résultats"
+
+#: templates/jocondelab/partial/notice_list.html:18
 msgid "Author(s):"
 msgstr "Auteur(s) :"
 
Binary file src/jocondelab/locale/fr/LC_MESSAGES/djangojs.mo has changed
--- a/src/jocondelab/locale/fr/LC_MESSAGES/djangojs.po	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/locale/fr/LC_MESSAGES/djangojs.po	Tue Sep 03 15:50:59 2013 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-29 22:20+0200\n"
+"POT-Creation-Date: 2013-09-03 08:45-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,6 +17,23 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
+#: static/jocondelab/js/front-geo.js:11
+msgid "Map data © OpenStreetMap contributors"
+msgstr "Données cartographiques © Contributeurs OpenStreetMap"
+
+#: static/jocondelab/js/front-notice.js:229
+msgid "Validating Resource…"
+msgstr "Validation de la ressource…"
+
+#: static/jocondelab/js/front-notice.js:233
+msgid "Saving contribution…"
+msgstr "Enregistrement de la contribution…"
+
+#: static/jocondelab/js/front-notice.js:257
+#: static/jocondelab/js/front-notice.js:261
+msgid "No DbPedia resource found for term"
+msgstr "Pas de ressource DbPédia trouvée pour le terme"
+
 #: static/jocondelab/js/jocondelab.js:14
 msgid "Redirected from: "
 msgstr "Redirigé de : "
@@ -38,14 +55,14 @@
 msgid "Confirmez-vous l'invalidation de cette fiche ?"
 msgstr "Confirmez-vous la validation de cette fiche ?"
 
-#: static/jocondelab/js/jocondelab.js:272
+#: static/jocondelab/js/jocondelab.js:271
 msgid "error when treating request"
 msgstr "Erreur lors du traitement de la requête"
 
-#: static/jocondelab/js/jocondelab.js:341
+#: static/jocondelab/js/jocondelab.js:348
 msgid "Ok"
 msgstr "Ok"
 
-#: static/jocondelab/js/jocondelab.js:354
+#: static/jocondelab/js/jocondelab.js:361
 msgid "Cancel"
 msgstr "Annuler"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/migrations/0007_auto__add_contribution_tables.py	Tue Sep 03 15:50:59 2013 +0200
@@ -0,0 +1,315 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'ContributedFields'
+        db.create_table(u'jocondelab_contributedfields', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('term', self.gf('django.db.models.fields.related.ForeignKey')(related_name='dbpedia_fields', to=orm['jocondelab.ContributedTerm'])),
+            ('dbpedia_uri', self.gf('django.db.models.fields.URLField')(max_length=2048, db_index=True)),
+            ('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
+            ('thumbnail', self.gf('django.db.models.fields.URLField')(max_length=2048, null=True, blank=True)),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=2048, null=True, blank=True)),
+            ('abstract', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+        ))
+        db.send_create_signal('jocondelab', ['ContributedFields'])
+
+        # Adding model 'Contribution'
+        db.create_table(u'jocondelab_contribution', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('term', self.gf('django.db.models.fields.related.ForeignKey')(related_name='contributions', to=orm['jocondelab.ContributedTerm'])),
+            ('thesaurus', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.Thesaurus'])),
+            ('notice', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.Notice'])),
+            ('contribution_count', self.gf('django.db.models.fields.IntegerField')(default=0, db_index=True)),
+        ))
+        db.send_create_signal('jocondelab', ['Contribution'])
+
+        # Adding model 'ContributedTerm'
+        db.create_table(u'jocondelab_contributedterm', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+            ('dbpedia_uri', self.gf('django.db.models.fields.URLField')(unique=True, max_length=2048, db_index=True)),
+            ('dbpedia_language', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
+        ))
+        db.send_create_signal('jocondelab', ['ContributedTerm'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'ContributedFields'
+        db.delete_table(u'jocondelab_contributedfields')
+
+        # Deleting model 'Contribution'
+        db.delete_table(u'jocondelab_contribution')
+
+        # Deleting model 'ContributedTerm'
+        db.delete_table(u'jocondelab_contributedterm')
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'core.autrnoticeterm': {
+            'Meta': {'object_name': 'AutrNoticeTerm', '_ormbases': ['core.NoticeTerm']},
+            u'noticeterm_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['core.NoticeTerm']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'core.domnnoticeterm': {
+            'Meta': {'object_name': 'DomnNoticeTerm', '_ormbases': ['core.NoticeTerm']},
+            u'noticeterm_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['core.NoticeTerm']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'core.ecolnoticeterm': {
+            'Meta': {'object_name': 'EcolNoticeTerm', '_ormbases': ['core.NoticeTerm']},
+            u'noticeterm_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['core.NoticeTerm']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'core.epoqnoticeterm': {
+            'Meta': {'object_name': 'EpoqNoticeTerm', '_ormbases': ['core.NoticeTerm']},
+            u'noticeterm_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['core.NoticeTerm']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'core.lieuxnoticeterm': {
+            'Meta': {'object_name': 'LieuxNoticeTerm', '_ormbases': ['core.NoticeTerm']},
+            u'noticeterm_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['core.NoticeTerm']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'core.notice': {
+            'Meta': {'object_name': 'Notice'},
+            'adpt': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'appl': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'aptn': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'attr': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'autr': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'autr_terms': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'autr+'", 'symmetrical': 'False', 'through': "orm['core.AutrNoticeTerm']", 'to': "orm['core.Term']"}),
+            'bibl': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'comm': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'contact': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'coor': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'copy': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'dacq': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'data': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'dation': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'ddpt': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'decv': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'deno': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'depo': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'desc': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'desy': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'dims': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'dmaj': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'dmis': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'domn': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'domn_terms': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'domn+'", 'symmetrical': 'False', 'through': "orm['core.DomnNoticeTerm']", 'to': "orm['core.Term']"}),
+            'drep': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'ecol': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'ecol_terms': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'ecol+'", 'symmetrical': 'False', 'through': "orm['core.EcolNoticeTerm']", 'to': "orm['core.Term']"}),
+            'epoq': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'epoq_terms': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'epoq+'", 'symmetrical': 'False', 'through': "orm['core.EpoqNoticeTerm']", 'to': "orm['core.Term']"}),
+            'etat': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'expo': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'gene': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'geohi': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'hist': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'image': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'insc': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'inv': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'labo': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'lieux': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'lieux_terms': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'lieux+'", 'symmetrical': 'False', 'through': "orm['core.LieuxNoticeTerm']", 'to': "orm['core.Term']"}),
+            'loca': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'loca2': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'mill': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'milu': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'mosa': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'msgcom': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'museo': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'nsda': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'onom': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'paut': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'pdat': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'pdec': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'peoc': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'peri': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'peri_terms': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'peri+'", 'symmetrical': 'False', 'through': "orm['core.PeriNoticeTerm']", 'to': "orm['core.Term']"}),
+            'peru': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'phot': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'pins': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'plieux': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'prep': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'puti': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'reda': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'ref': ('django.db.models.fields.CharField', [], {'max_length': '20', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'refim': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'repr': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'repr_terms': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'repr+'", 'symmetrical': 'False', 'through': "orm['core.ReprNoticeTerm']", 'to': "orm['core.Term']"}),
+            'srep': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'srep_terms': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'srep+'", 'symmetrical': 'False', 'through': "orm['core.SrepNoticeTerm']", 'to': "orm['core.Term']"}),
+            'stat': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'tech': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'tico': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'titr': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'util': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'video': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'www': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'})
+        },
+        'core.noticeterm': {
+            'Meta': {'object_name': 'NoticeTerm'},
+            'graph': ('django.db.models.fields.URLField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'notice': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Notice']"}),
+            'term': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Term']"})
+        },
+        'core.perinoticeterm': {
+            'Meta': {'object_name': 'PeriNoticeTerm', '_ormbases': ['core.NoticeTerm']},
+            u'noticeterm_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['core.NoticeTerm']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'core.reprnoticeterm': {
+            'Meta': {'object_name': 'ReprNoticeTerm', '_ormbases': ['core.NoticeTerm']},
+            u'noticeterm_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['core.NoticeTerm']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'core.srepnoticeterm': {
+            'Meta': {'object_name': 'SrepNoticeTerm', '_ormbases': ['core.NoticeTerm']},
+            u'noticeterm_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['core.NoticeTerm']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'core.term': {
+            'Meta': {'object_name': 'Term'},
+            'alternative_wikipedia_pageid': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+            'alternative_wikipedia_url': ('django.db.models.fields.URLField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'dbpedia_uri': ('django.db.models.fields.URLField', [], {'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': '1024', 'db_index': 'True'}),
+            'lang': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}),
+            u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+            u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+            'link_semantic_level': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
+            'nb_notice': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}),
+            'normalized_label': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'db_index': 'True'}),
+            'notices': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'terms+'", 'symmetrical': 'False', 'through': "orm['core.NoticeTerm']", 'to': "orm['core.Notice']"}),
+            'parent': ('mptt.fields.TreeForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['core.Term']"}),
+            u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+            'thesaurus': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Thesaurus']"}),
+            u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+            'uri': ('django.db.models.fields.URLField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'url_status': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
+            'validated': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
+            'validation_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'validator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.User']", 'null': 'True', 'blank': 'True'}),
+            'wikipedia_edition': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'wikipedia_pageid': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+            'wikipedia_revision_id': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'wikipedia_url': ('django.db.models.fields.URLField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'wp_alternative_label': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'wp_label': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '1024', 'null': 'True', 'blank': 'True'})
+        },
+        'core.thesaurus': {
+            'Meta': {'ordering': "['label']", 'object_name': 'Thesaurus'},
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128', 'db_index': 'True'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'uri': ('django.db.models.fields.URLField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'})
+        },
+        'core.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'language': ('django.db.models.fields.CharField', [], {'default': "'en'", 'max_length': '2'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'jocondelab.contributedfields': {
+            'Meta': {'object_name': 'ContributedFields'},
+            'abstract': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'dbpedia_uri': ('django.db.models.fields.URLField', [], {'max_length': '2048', 'db_index': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
+            'term': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dbpedia_fields'", 'to': "orm['jocondelab.ContributedTerm']"}),
+            'thumbnail': ('django.db.models.fields.URLField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'})
+        },
+        'jocondelab.contributedterm': {
+            'Meta': {'object_name': 'ContributedTerm'},
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'dbpedia_language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
+            'dbpedia_uri': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        },
+        'jocondelab.contribution': {
+            'Meta': {'object_name': 'Contribution'},
+            'contribution_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'notice': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Notice']"}),
+            'term': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contributions'", 'to': "orm['jocondelab.ContributedTerm']"}),
+            'thesaurus': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Thesaurus']"})
+        },
+        'jocondelab.country': {
+            'Meta': {'object_name': 'Country'},
+            'dbpedia_uri': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '2048', 'db_index': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iso_code_2': ('django.db.models.fields.CharField', [], {'max_length': '2', 'db_index': 'True'}),
+            'iso_code_3': ('django.db.models.fields.CharField', [], {'max_length': '3', 'db_index': 'True'})
+        },
+        'jocondelab.dbpediafields': {
+            'Meta': {'object_name': 'DbpediaFields'},
+            'abstract': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'dbpedia_uri': ('django.db.models.fields.URLField', [], {'max_length': '2048', 'db_index': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
+            'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
+            'term': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dbpedia_fields'", 'to': "orm['core.Term']"}),
+            'thumbnail': ('django.db.models.fields.URLField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'})
+        },
+        'jocondelab.dbpediageo': {
+            'Meta': {'object_name': 'DbpediaGeo'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'latitude': ('django.db.models.fields.FloatField', [], {'db_index': 'True'}),
+            'longitude': ('django.db.models.fields.FloatField', [], {'db_index': 'True'}),
+            'term': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'geo'", 'unique': 'True', 'to': "orm['core.Term']"})
+        },
+        'jocondelab.dbpediayears': {
+            'Meta': {'object_name': 'DbpediaYears'},
+            'end_year': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'start_year': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'term': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'years'", 'unique': 'True', 'to': "orm['core.Term']"})
+        },
+        'jocondelab.termlinks': {
+            'Meta': {'object_name': 'TermLinks'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'termlinks_objects'", 'to': "orm['core.Term']"}),
+            'subject': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'termlinks_subjects'", 'to': "orm['core.Term']"})
+        }
+    }
+
+    complete_apps = ['jocondelab']
\ No newline at end of file
--- a/src/jocondelab/models/__init__.py	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/models/__init__.py	Tue Sep 03 15:50:59 2013 +0200
@@ -1,3 +1,4 @@
-__all__ = ['Country', 'DbpediaFields', 'TermLinks', 'DbpediaYears', 'DbpediaGeo']
+__all__ = ['Country', 'DbpediaFields', 'TermLinks', 'DbpediaYears', 'DbpediaGeo', 'ContributedTerm', 'ContributedFields', 'Contribution' ]
 
-from jocondelab.models.data import Country, DbpediaFields, TermLinks, DbpediaYears, DbpediaGeo
\ No newline at end of file
+from jocondelab.models.data import Country, DbpediaFields, TermLinks, DbpediaYears, DbpediaGeo
+from jocondelab.models.contribution import ContributedTerm, ContributedFields, Contribution
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/models/contribution.py	Tue Sep 03 15:50:59 2013 +0200
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+'''
+Created on Jul 31, 2013
+
+@author: ymh
+'''
+from django.db import models
+from core.models import Thesaurus, Notice
+
+class ContributedTerm(models.Model):
+    
+    created_at = models.DateTimeField(auto_now_add=True)
+    dbpedia_uri = models.URLField(max_length=2048, unique=True, blank=False, null=False, db_index=True)
+    dbpedia_language = models.CharField(max_length=15, blank=False, null=False, db_index=True)
+
+    class Meta:
+        app_label = 'jocondelab'
+
+class ContributedFields(models.Model):
+    
+    term = models.ForeignKey(ContributedTerm, blank=False, null=False, db_index=True, related_name="dbpedia_fields")
+    dbpedia_uri = models.URLField(max_length=2048, blank=False, null=False, db_index=True, unique=False)
+    language_code = models.CharField(max_length=15, blank=False, null=False, db_index=True)
+    thumbnail = models.URLField(max_length=2048, blank=True, null=True, db_index=False)    
+    label = models.CharField(max_length=2048, unique=False, blank=True, null=True)
+    abstract = models.TextField(blank=True, null=True)
+    
+    class Meta:
+        app_label = 'jocondelab'
+
+class Contribution(models.Model):
+    
+    term = models.ForeignKey(ContributedTerm, blank=False, null=False, db_index=True, related_name="contributions")
+    thesaurus = models.ForeignKey(Thesaurus, blank=False, null=False, db_index=True)
+    notice = models.ForeignKey(Notice, blank=False, null=False, db_index=True)
+    contribution_count = models.IntegerField(blank=False, null=False, default=0, db_index=True, editable=False)
+    
+    class Meta:
+        app_label = 'jocondelab'
--- a/src/jocondelab/static/jocondelab/css/front-common.css	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/static/jocondelab/css/front-common.css	Tue Sep 03 15:50:59 2013 +0200
@@ -174,6 +174,14 @@
     background: url(../img/search-icon.png) right center no-repeat #ffffff;
 }
 
+.header-search-input::-moz-placeholder {
+    font-size: .8em; font-style: italic;
+}
+
+.header-search-input::-webkit-input-placeholder {
+    font-size: .8em; font-style: italic;
+}
+
 /* HEADER > MENUS */
 
 .top-menus {
@@ -294,6 +302,10 @@
     border-radius: 3px; margin: 0 5px 2px 0;
 }
 
+.notice-term:hover {
+    background: #ffffff;
+}
+
 .big-search-form {
     text-align: center; margin: 20px 0;
 }
--- a/src/jocondelab/static/jocondelab/css/front-notice.css	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/static/jocondelab/css/front-notice.css	Tue Sep 03 15:50:59 2013 +0200
@@ -32,22 +32,18 @@
 }
 
 .notice-term {
-    display: inline-block; padding: 3px; 
-    border-radius: 3px; margin: -2px 5px 4px 0;
+    margin: -2px 5px 4px 0;
 }
 
-.term-translated {
-    background: #d0e0f0;
-}
-
-.term-translated:hover {
-    background: #ffffff;
-}
-
-.term-untranslated {
-    color: #333333; font-style: italic;
+.notice-term.term-untranslated {
+    background: transparent; color: #333333; font-style: italic;
 }
 
 .datasheet-small {
     font-size: 11px;
 }
+
+.notice-contribution-field {
+    font-size: 12px; line-height: 20px; height: 20px; padding: 0 4px; border: 1px solid #999999; margin-bottom: 8px;
+    border-radius: 4px; width: 90%;
+}
--- a/src/jocondelab/static/jocondelab/js/front-common.js	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/static/jocondelab/js/front-common.js	Tue Sep 03 15:50:59 2013 +0200
@@ -60,7 +60,7 @@
             if (label) {
                 wkUrl += "wiki/" + encodeURI(label.replace(/ /g,'_'));
             } 
-            $h2.text(uriData.l || uriData.lr || "");
+            $h2.text((uriData.l && uriData.lr) ? (uriData.l + " → " + uriData.lr) : label);
             $abstract.text((uriData.a || uriData.ar || "").replace(/^(.{240,260})\s.+$/,'$1…').substr(0,261));
             $source.attr("href", wkUrl);
             moveDbpediaPopin();
@@ -101,6 +101,7 @@
             if (!hovering) {
                 $overlay.hide();
                 deferredRemovePopin();
+                $refdiv = null;
             }
         }, 0);
     }
@@ -110,7 +111,7 @@
             mouseenter: function(e) {
                 $refdiv = $(this);
                 var dbpediaUri = $refdiv.attr("data-dbpedia-uri") || defaultUri;
-                if (!dbpediaUri) {
+                if (!dbpediaUri || dbpediaUri === "None") {
                     return;
                 }
                 hovering = dbpediaUri;
--- a/src/jocondelab/static/jocondelab/js/front-notice.js	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/static/jocondelab/js/front-notice.js	Tue Sep 03 15:50:59 2013 +0200
@@ -1,4 +1,270 @@
 $(function() {
+        
     $('.notice-images a').magnificPopup({type:'image'});
     bindDbpediaBox(".notice-term a");
+    
+    var lang = document.querySelector("html").lang.substr(0,2) || "en",
+        labelsCache = {},
+        dbpCache = {},
+        eventCache = {},
+        errorCache = {};
+        
+    var frSparqlTpl = _.template(
+        'select distinct * where { ?s rdfs:label "<%= label %>"@<%= lang %> . '
+        + 'OPTIONAL { ?s rdfs:label ?l. ?s dbpedia-owl:abstract ?a. FILTER(lang(?a)=lang(?l)) }. '
+        + 'OPTIONAL { ?s dbpedia-owl:thumbnail ?t }. OPTIONAL { ?s dbpedia-owl:wikiPageRedirects ?r }.' 
+        + 'OPTIONAL { ?r rdfs:label ?lr. ?r dbpedia-owl:abstract ?ar FILTER(lang(?ar)=lang(?lr)) }. '
+        + 'OPTIONAL { ?r dbpedia-owl:thumbnail ?tr }. '
+        + 'FILTER(!regex(?s, ":[^/]+$" ) && regex(?s, "^http://fr.dbpedia.org/resource/")) }'
+//        + 'OPTIONAL { ?s dbpedia-owl:wikiPageDisambiguates ?d }. OPTIONAL { ?d rdfs:label ?ld FILTER( langMatches( lang(?ld), "en" ) ) }. '
+    );
+    
+    var otherSparqlTpl = _.template(
+        'select distinct * where { '
+        + '?s foaf:isPrimaryTopicOf <<%= wikipedia_url %>>. '
+        + 'OPTIONAL { ?s dbpedia-owl:wikiPageRedirects ?r }. '
+        + 'OPTIONAL { ?s rdfs:label ?l . ?s dbpedia-owl:abstract ?a . FILTER(lang(?l)=lang(?a)) }. ' 
+        + 'OPTIONAL { ?s dbpedia-owl:thumbnail ?t }. '
+        + 'OPTIONAL { ?r rdfs:label ?lr . ?r dbpedia-owl:abstract ?ar . FILTER(lang(?lr)=lang(?ar)) }. '
+        + 'OPTIONAL { ?r dbpedia-owl:thumbnail ?tr }. '
+        + '}'
+    );
+        
+    function getDbpedia(label, callback, errorcb) {
+        
+        function onBindingsLoaded(sparqlData, initialData) {
+            var bindings = sparqlData.results.bindings,
+                res = initialData || {};
+            res.translations = _(sparqlData.results.bindings).map(function(b) {
+                var t = {}
+                t.dbpedia_uri = b.s.value;
+                if (b.r) { t.dbpedia_uri = b.r.value; }
+                if (b.a) { t.abstract = b.a.value; }
+                if (b.ar) { t.abstract = b.ar.value; }
+                if (b.t) { t.thumbnail = b.t.value; }
+                if (b.tr) { t.thumbnail = b.tr.value; }
+                if (b.l) {
+                    t.label = b.l.value;
+                    t.language = b.l["xml:lang"];
+                }
+                if (b.lr) {
+                    t.label = b.lr.value;
+                    t.language = b.lr["xml:lang"];
+                }
+                return t;
+            });
+            res.local = _(res.translations).find(function(t) {
+                return t.language === lang;
+            }) || {};
+            res.label = res.local.label || label;
+            res.dbpedia_uri = res.translations[0].dbpedia_uri;
+            res.wikipedia_url = "http://" + lang + ".wikipedia.org/wiki/" + encodeURIComponent(res.label.replace(/ /g,'_'));
+            dbpCache[label] = res;
+            _(eventCache[label]).each(function(cb) {
+                cb(label, res);
+            });
+            delete eventCache[label];
+            if (res.label !== label) {
+                dbpCache[res.label] = res;
+                _(eventCache[res.label]).each(function(cb) {
+                    cb(res.label, res);
+                });
+                delete eventCache[res.label];
+            }
+        }
+        
+        function onError() {
+            dbpCache[label] = false;
+            _(errorCache[label]).each(function(cb) {
+                cb(label);
+            });
+            delete errorCache[label];
+        }
+        
+        if (dbpCache[label]) {
+            //console.log("Data already in cache", dbpCache[label]);
+            if (typeof callback === "function") { callback(label, dbpCache[label]); }
+            return;
+        }
+        if (dbpCache[label] === false) {
+            if (typeof errorcb === "function") { errorcb(label); }
+            return;
+        }
+        if (typeof eventCache[label] === "undefined") {
+            eventCache[label] = [];
+            errorCache[label] = [];
+        }
+        if (typeof callback === "function") { eventCache[label].push(callback); }
+        if (typeof errorcb === "function") { errorCache[label].push(callback); }
+                
+        if (typeof dbpCache[label] === "undefined") {
+            dbpCache[label] = null;
+            $.ajax({
+                url: wikipedia_urls.fr.dbpedia_sparql_url,
+                data: {
+                    query: frSparqlTpl( { label: label, lang: lang } ),
+                    format: "application/sparql-results+json"
+                },
+                dataType: "json",
+                success: function(data) {
+                    if (data.results.bindings.length) {
+                        //console.log("Data found in french DbPedia", data.results.bindings[0]);
+                        onBindingsLoaded(data, { dbpedia_language: "fr" });
+                    } else {
+                        if (lang !== "fr" && wikipedia_urls[lang]) {
+                            var wk_url = wikipedia_urls[lang].page_url + '/' + encodeURIComponent(label.replace(/ /g,'_'));
+                            $.ajax({
+                                url: wikipedia_urls[lang].dbpedia_sparql_url,
+                                data: {
+                                    query: otherSparqlTpl({ wikipedia_url: wk_url }),
+                                    format: "application/sparql-results+json"
+                                },
+                                dataType: "json",
+                                success: function(data) {
+                                    if (data.results.bindings.length) {
+                                        //console.log("Data found in "+lang+" DbPedia", data.results.bindings[0]);
+                                        onBindingsLoaded(data, { dbpedia_language: lang });
+                                    } else {
+                                        //console.log("Data not found in "+lang+" DbPedia");
+                                        onError();
+                                    }
+                                },
+                                error: onError
+                            });
+                        } else {
+                            //console.log("Data not found in french DbPedia and there is no known endpoint for "+lang);
+                            onError();
+                        }
+                    }
+                },
+                error: onError
+            });
+        }
+    }
+    
+    var $curitem = null,
+        $overlay = $(".dbpedia-overlay"),
+        $overlayImg = $overlay.find("img"),
+        $h2 = $overlay.find("h2"),
+        $abstract = $overlay.find(".dbpedia-abstract"),
+        $source = $overlay.find(".dbpedia-source a"),
+        hovering = false;
+    
+    $overlay.hover(function() {
+        hovering = true;
+    }, function() {
+        hovering = false;
+        hideOverlay();
+    });
+    
+    function hideOverlay() {
+        if (!$curitem && !hovering) {
+            $overlayImg.attr("src","");
+            $overlay.hide();
+        }
+    }
+    
+    function showOverlay(label, termdata) {
+        if (!$curitem) {
+            return;
+        }
+        var o = $curitem.offset();
+        $overlay.css({
+            top: o.top + $curitem.outerHeight(),
+            left: o.left - $overlay.outerWidth(),
+        }).show().attr("data-dbpedia-uri", termdata.dbpedia_uri);
+        if (termdata.local.thumbnail) {
+            $overlayImg.attr("src",termdata.local.thumbnail).show();
+        } else {
+            $overlayImg.hide();
+        }
+        $h2.text(termdata.label);
+        if (label !== termdata.label) {
+            $h2.prepend($('<span style="font-style: italic;">').text(label  + " → "));
+        }
+        $abstract.text((termdata.local.abstract || "").replace(/^(.{240,260})\s.+$/,'$1…').substr(0,261));
+        $source.attr("href", termdata.wikipedia_url);
+    }
+    
+    var eltTemplate = '<li class="notice-term term-translated"><a class="term-link" href="#"></a></li>';
+    
+    $(".notice-contribution-field").autocomplete({
+        source: function( request, response ) {
+            if (labelsCache[request.term]) {
+                response(labelsCache[request.term]);
+            }
+            if (typeof labelsCache[request.term] === "undefined") {
+                labelsCache[request.term] = false;
+                $.ajax({
+                   url : "http://" + lang + ".wikipedia.org/w/api.php",
+                   dataType: "jsonp",
+                   data : {
+                       action: "opensearch",
+                       search: request.term,
+                       format: "json",
+                       limit: 10
+                   },
+                   success: function( data ) {
+                       labelsCache[request.term] = _.map( data[1], function(item) {
+                           return {
+                               label: item,
+                               value: item
+                           };
+                       });
+                       response(labelsCache[request.term]);
+                   }
+                });
+            }
+        },
+        focus: function(e, ui) {
+            $curitem = $(this);
+            hovering = false;
+            $overlay.hide();
+            getDbpedia(ui.item.label, showOverlay);
+        },
+        select: function(e, ui) {
+            var $this = $(this),
+                $newItem = $(eltTemplate);
+            $this.next(".notice-term-list").append($newItem);
+            $newItem.find(".term-link").text(gettext("Validating Resource…"));
+            $this.autocomplete("close");
+            $this.val("");
+            getDbpedia(ui.item.label, function(label, termdata) {
+                $newItem.find(".term-link").text(gettext("Saving contribution…"));
+                if (termdata.dbpedia_uri) {
+                    bindDbpediaBox($newItem.find("term-link"), termdata.dbpedia_uri);
+                    $.ajax({
+                        url: contribute_url,
+                        dataType: "json",
+                        type: "POST",
+                        data: {
+                            csrfmiddlewaretoken: csrf_token,
+                            notice_id: notice_id,
+                            dbpedia_language: termdata.dbpedia_language,
+                            dbpedia_uri: termdata.dbpedia_uri,
+                            translations: JSON.stringify(termdata.translations),
+                            thesaurus_label: $this.attr("data-thesaurus")
+                        },
+                        success: function() {
+                            $newItem.find(".term-link").text(termdata.label);
+                        },
+                        error: function() {
+                            $newItem.remove();
+                        }
+                    })
+                } else {
+                    $newItem.remove();
+                    alert(gettext("No DbPedia resource found for term") + " " + ui.item.label);
+                }
+            }, function() {
+                $newItem.remove();
+                alert(gettext("No DbPedia resource found for term") + " " + ui.item.label);
+            });
+        },
+        close: function(e, ui) {
+            $curitem = null;
+            hideOverlay();
+        },
+        minLength: 2
+    });
 });
--- a/src/jocondelab/templates/jocondelab/front_notice.html	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/templates/jocondelab/front_notice.html	Tue Sep 03 15:50:59 2013 +0200
@@ -9,6 +9,12 @@
 
 {% block js_declaration %}
     {{block.super}}
+    <script type="text/javascript">
+        var wikipedia_urls = {{wikipedia_urls|safe}},
+            contribute_url = "{% url 'ajax_contribute' %}",
+            notice_id = "{{object.id}}",
+            csrf_token = "{{csrf_token}}";
+    </script>
     <script type="text/javascript" src="{{STATIC_URL}}jocondelab/js/front-notice.js"></script>
 {% endblock %}
 
@@ -55,7 +61,7 @@
                 <tr>
                      <th>{% trans thesaurus context 'Thesaurus label' %}{% trans ':' %}</th>
                      <td>
-                         <ul class="datasheet-contents notice-term-list">
+                         <ul class="notice-term-list">
                          {% for termtype, terms in terms.items %}
                             {% for term in terms %}
                             <li class="notice-term term-{{termtype}}"><a href="{% url 'front_search' %}?q={{term.locale_label|urlencode}}" data-dbpedia-uri="{{term.dbpedia_uri}}">{{term.locale_label}}</a></li>
@@ -97,4 +103,29 @@
             {% endif %}
             </table>
             
+            <h2 style="float: left; padding: 20px 20px 0; font-size: 18px; font-weight : 800;">Contribuer</h2>
+            
+            <table class="notice-datasheet">
+                <tr>
+                    <th>{% trans 'REPR' context 'Thesaurus label' %}{% trans ':' %}</th>
+                    <td>
+                        <input class="notice-contribution-field" data-thesaurus="REPR" type="text" size="60" placeholder="{% trans 'What do you see in this work?' %}" />
+                        <ul class="notice-term-list">
+                        {% for term in contributions.REPR %}
+                            <li class="notice-term term-translated"><a href="{% url 'front_search' %}?q={{term.label|urlencode}}" data-dbpedia-uri="{{term.dbpedia_uri}}">{{term.label}}</a></li>
+                        {% endfor %}
+                        </ul>
+                    </td>
+                </tr>
+                <tr>
+                    <th>{% trans 'SREP' context 'Thesaurus label' %}{% trans ':' %}</th>
+                    <td>
+                        <input class="notice-contribution-field" data-thesaurus="SREP" type="text" size="60" placeholder="{% trans 'Which other work is a source for this work?' %}" />
+                        <ul class="notice-term-list">
+                        {% for term in contributions.SREP %}
+                            <li class="notice-term term-translated"><a href="{% url 'front_search' %}?q={{term.label|urlencode}}" data-dbpedia-uri="{{term.dbpedia_uri}}">{{term.label}}</a></li>
+                        {% endfor %}</ul>
+                    </td>
+                </tr>
+            </table>
 {% endblock %}
--- a/src/jocondelab/templates/jocondelab/front_search.html	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/templates/jocondelab/front_search.html	Tue Sep 03 15:50:59 2013 +0200
@@ -21,7 +21,7 @@
 {% block main %}
 
             <form class="big-search-form">
-                <input class="big-search-input" type="search" name="q" value="{{queryterms}}" />
+                <input class="big-search-input" type="search" name="q" value="{{searchterm}}" />
             </form>
             
             <ul class="term-cloud">
--- a/src/jocondelab/urls.py	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/urls.py	Tue Sep 03 15:50:59 2013 +0200
@@ -40,5 +40,6 @@
     url(r'^ajax/geocoords/$', 'jocondelab.views.ajax.geo_coords', name='ajax_geo_coords'),
     url(r'^ajax/geosearch/$', 'jocondelab.views.ajax.geo_search', name='ajax_geo_search'),
     url(r'^ajax/contents/$', 'jocondelab.views.ajax.contents', name='ajax_contents'),
+    url(r'^ajax/contribute/$', 'jocondelab.views.ajax.contribute', name='ajax_contribute'),
 )
 
--- a/src/jocondelab/views/ajax.py	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/views/ajax.py	Tue Sep 03 15:50:59 2013 +0200
@@ -5,8 +5,8 @@
 @author: rvelt
 '''
 
-from jocondelab.models import DbpediaYears, DbpediaGeo, DbpediaFields
-from core.models import Notice, Term
+from jocondelab.models import DbpediaYears, DbpediaGeo, DbpediaFields, ContributedTerm, ContributedFields, Contribution
+from core.models import Notice, Term, Thesaurus
 import django.utils.simplejson as json
 from django.http import HttpResponse
 from django.template.response import TemplateResponse
@@ -136,4 +136,29 @@
     results.sort(key=lambda y: y["label"])
     
     return HttpResponse(content=json.dumps(results), mimetype='application/json')
+
+def contribute(request):
+    
+    notice_id = request.POST.get('notice_id', None)
+    dbpedia_language = request.POST.get('dbpedia_language', None)
+    dbpedia_uri = request.POST.get('dbpedia_uri', None)
+    thesaurus_label = request.POST.get('thesaurus_label', None)
+    translations = json.loads(request.POST.get('translations', '[]'))
+    
+    thobj = Thesaurus.objects.get(label=thesaurus_label)
+    notobj = Notice.objects.get(id=notice_id)
+    termobj, created = ContributedTerm.objects.get_or_create(dbpedia_uri=dbpedia_uri, dbpedia_language=dbpedia_language)
+    controbj, created = Contribution.objects.get_or_create(term=termobj, thesaurus=thobj, notice=notobj, defaults={'contribution_count': 1})
+    if not created:
+        controbj.contribution_count += 1
+        controbj.save()
+    for t in translations:
+        fieldsobj, created = ContributedFields.objects.get_or_create(term=termobj, dbpedia_uri=dbpedia_uri, language_code=t['language'], defaults={'abstract': t['abstract'], 'label': t['label'], 'thumbnail': t['thumbnail']})
+        if not created:
+            fieldsobj.abstract = t['abstract']
+            fieldsobj.thumbnail = t['thumbnail']
+            fieldsobj.label = t['label']
+            fieldsobj.save()
+
+    return HttpResponse(content=json.dumps(translations), mimetype='application/json')
     
\ No newline at end of file
--- a/src/jocondelab/views/front_office.py	Fri Aug 23 15:18:43 2013 +0200
+++ b/src/jocondelab/views/front_office.py	Tue Sep 03 15:50:59 2013 +0200
@@ -7,6 +7,7 @@
 
 from core.models import (Notice, Thesaurus, Term)
 from jocondelab.models import DbpediaFields
+import django.utils.simplejson as json
 from django.conf import settings
 from django.views.generic import View, DetailView
 from django.views.generic.base import TemplateResponseMixin
@@ -122,27 +123,37 @@
         context["images"] = [settings.JOCONDE_IMG_BASE_URL + i.url for i in self.object.images.exclude(relative_url__endswith='v.jpg')]
         context["title"] = self.object.titr if self.object.titr else self.object.deno
         
-        terms = []
-        for nt in self.object.noticeterm_set.select_related('term__dbpedia_fields').all():
+        termsbythesaurus = {}
+        for nt in self.object.noticeterm_set.select_related('thesaurus,term__dbpedia_fields').all():
             translated_term = nt.term.dbpedia_fields.filter(language_code = lang)
-            termdict = {
+            term = {
                 "label": nt.term.label,
                 "thesaurus": nt.term.thesaurus.label,
                 "dbpedia_uri": nt.term.dbpedia_uri,
                 "translated": True if translated_term else False,
                 "locale_label": translated_term[0].label if translated_term else nt.term.label
             }
-            terms.append(termdict)
-        termsbythesaurus = {}
-        for term in terms:
             if not term["thesaurus"] in termsbythesaurus:
                 termsbythesaurus[term["thesaurus"]] = {
                    "translated": [],
                    "untranslated": []
                    }
             termsbythesaurus[term["thesaurus"]]["translated" if term["translated"] else "untranslated"].append(term)
-         
+        
+        contributions = {}
+        for ct in self.object.contribution_set.select_related('thesaurus,term__dbpedia_fields').filter(term__dbpedia_fields__language_code=lang):
+            thesauruslabel = ct.thesaurus.label
+            contribution = {
+                "label": ct.term.dbpedia_fields.get(language_code=lang).label,
+                "dbpedia_uri": ct.term.dbpedia_uri
+            }
+            if not thesauruslabel in contributions:
+                contributions[thesauruslabel] = []
+            contributions[thesauruslabel].append(contribution)
+            
         context["terms_by_thesaurus"] = termsbythesaurus
+        context["contributions"] = contributions
+        context['wikipedia_urls'] = json.dumps(settings.WIKIPEDIA_URLS)
         
         return context