Added Term List View
authorveltr
Wed, 18 Sep 2013 18:31:29 +0200
changeset 110 597fa9d09973
parent 109 eb4e56cb675b
child 111 439485fd5961
Added Term List View
src/core/models/term.py
src/jocondelab/admin.py
src/jocondelab/migrations/0009_auto__contribution_allow_null_thesaurus.py
src/jocondelab/migrations/0010_auto__add_contributable_term.py
src/jocondelab/migrations/0011_auto__add_tagcloud_term.py
src/jocondelab/models/__init__.py
src/jocondelab/models/contribution.py
src/jocondelab/models/data.py
src/jocondelab/models/displaysettings.py
src/jocondelab/settings.py
src/jocondelab/static/jocondelab/css/front-common.css
src/jocondelab/static/jocondelab/css/front-home.css
src/jocondelab/static/jocondelab/css/front-notice.css
src/jocondelab/static/jocondelab/css/front-search.css
src/jocondelab/static/jocondelab/css/front-termlist.css
src/jocondelab/static/jocondelab/img/vote-sprite.png
src/jocondelab/static/jocondelab/js/front-common.js
src/jocondelab/static/jocondelab/js/front-notice.js
src/jocondelab/static/jocondelab/js/front-termlist.js
src/jocondelab/templates/jocondelab/front_base.html
src/jocondelab/templates/jocondelab/front_home.html
src/jocondelab/templates/jocondelab/front_notice.html
src/jocondelab/templates/jocondelab/front_search.html
src/jocondelab/templates/jocondelab/front_termlist.html
src/jocondelab/templates/jocondelab/partial/contributed_item.html
src/jocondelab/templates/jocondelab/partial/datasheet_row.html
src/jocondelab/templates/jocondelab/partial/notice_list.html
src/jocondelab/templates/jocondelab/partial/termlist_contents.html
src/jocondelab/templates/jocondelab/partial/wrapped_notice_list.html
src/jocondelab/urls.py
src/jocondelab/views/ajax.py
src/jocondelab/views/front_office.py
--- a/src/core/models/term.py	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/core/models/term.py	Wed Sep 18 18:31:29 2013 +0200
@@ -157,6 +157,9 @@
             self.validation_date = None
             self.save()
     
+    def __unicode__(self):
+        return self.label
+    
     class Meta:
         app_label = 'core'
         
--- a/src/jocondelab/admin.py	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/admin.py	Wed Sep 18 18:31:29 2013 +0200
@@ -1,2 +1,10 @@
+from jocondelab.models import DbpediaYears, DbpediaGeo, ContributedTerm, ContributedFields, Contribution, ContributableTerm, TagcloudTerm
+from django.contrib import admin
 
-
+admin.site.register(DbpediaYears)
+admin.site.register(DbpediaGeo)
+admin.site.register(ContributedTerm)
+admin.site.register(ContributedFields)
+admin.site.register(Contribution)
+admin.site.register(ContributableTerm)
+admin.site.register(TagcloudTerm)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/migrations/0009_auto__contribution_allow_null_thesaurus.py	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,282 @@
+# -*- 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):
+
+        # Changing field 'Contribution.thesaurus'
+        db.alter_column(u'jocondelab_contribution', 'thesaurus_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.Thesaurus'], null=True))
+
+    def backwards(self, orm):
+
+        # Changing field 'Contribution.thesaurus'
+        db.alter_column(u'jocondelab_contribution', 'thesaurus_id', self.gf('django.db.models.fields.related.ForeignKey')(default=1, to=orm['core.Thesaurus']))
+
+    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']", 'null': 'True', 'blank': 'True'})
+        },
+        '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'}),
+            'nb_notices': ('django.db.models.fields.IntegerField', [], {'default': '0', '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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/migrations/0010_auto__add_contributable_term.py	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,291 @@
+# -*- 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 'ContributableTerm'
+        db.create_table(u'jocondelab_contributableterm', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('term', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.Term'], unique=True)),
+        ))
+        db.send_create_signal('jocondelab', ['ContributableTerm'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'ContributableTerm'
+        db.delete_table(u'jocondelab_contributableterm')
+
+
+    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.contributableterm': {
+            'Meta': {'object_name': 'ContributableTerm'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'term': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Term']", 'unique': 'True'})
+        },
+        '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']", 'null': 'True', 'blank': 'True'})
+        },
+        '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'}),
+            'nb_notices': ('django.db.models.fields.IntegerField', [], {'default': '0', '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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/migrations/0011_auto__add_tagcloud_term.py	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,296 @@
+# -*- 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 'TagcloudTerm'
+        db.create_table(u'jocondelab_tagcloudterm', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('term', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.Term'], unique=True)),
+        ))
+        db.send_create_signal('jocondelab', ['TagcloudTerm'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'TagcloudTerm'
+        db.delete_table(u'jocondelab_tagcloudterm')
+
+
+    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.contributableterm': {
+            'Meta': {'object_name': 'ContributableTerm'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'term': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Term']", 'unique': 'True'})
+        },
+        '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']", 'null': 'True', 'blank': 'True'})
+        },
+        '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'}),
+            'nb_notices': ('django.db.models.fields.IntegerField', [], {'default': '0', '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.tagcloudterm': {
+            'Meta': {'object_name': 'TagcloudTerm'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'term': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Term']", 'unique': 'True'})
+        },
+        '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	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/models/__init__.py	Wed Sep 18 18:31:29 2013 +0200
@@ -1,4 +1,5 @@
-__all__ = ['Country', 'DbpediaFields', 'TermLinks', 'DbpediaYears', 'DbpediaGeo', 'ContributedTerm', 'ContributedFields', 'Contribution' ]
+__all__ = ['Country', 'DbpediaFields', 'TermLinks', 'DbpediaYears', 'DbpediaGeo', 'ContributedTerm', 'ContributedFields', 'Contribution', 'ContributableTerm', 'TagcloudTerm' ]
 
 from jocondelab.models.data import Country, DbpediaFields, TermLinks, DbpediaYears, DbpediaGeo
-from jocondelab.models.contribution import ContributedTerm, ContributedFields, Contribution
\ No newline at end of file
+from jocondelab.models.contribution import ContributedTerm, ContributedFields, Contribution, ContributableTerm
+from jocondelab.models.displaysettings import TagcloudTerm
--- a/src/jocondelab/models/contribution.py	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/models/contribution.py	Wed Sep 18 18:31:29 2013 +0200
@@ -5,7 +5,7 @@
 @author: ymh
 '''
 from django.db import models
-from core.models import Thesaurus, Notice
+from core.models import Thesaurus, Notice, Term
 
 class ContributedTerm(models.Model):
     
@@ -15,6 +15,9 @@
 
     class Meta:
         app_label = 'jocondelab'
+    
+    def __unicode__(self):
+        return self.dbpedia_uri
 
 class ContributedFields(models.Model):
     
@@ -27,6 +30,9 @@
     
     class Meta:
         app_label = 'jocondelab'
+    
+    def __unicode__(self):
+        return u'"%s"@%s'%(self.label, self.language_code)
 
 class Contribution(models.Model):
     
@@ -37,3 +43,16 @@
     
     class Meta:
         app_label = 'jocondelab'
+        
+    def __unicode__(self):
+        return u'%s, %s'%((self.notice.titr or self.notice.deno),self.term.dbpedia_uri)
+
+class ContributableTerm(models.Model):
+    
+    term = models.ForeignKey(Term, blank=False, null=False, db_index=True, unique=True)
+    
+    class Meta:
+        app_label = 'jocondelab'
+    
+    def __unicode__(self):
+        return self.term.label
\ No newline at end of file
--- a/src/jocondelab/models/data.py	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/models/data.py	Wed Sep 18 18:31:29 2013 +0200
@@ -15,6 +15,9 @@
 
     class Meta:
         app_label = 'jocondelab'
+    
+    def __unicode__(self):
+        return self.dbpedia_uri
 
 
 class DbpediaFields(models.Model):
@@ -28,6 +31,9 @@
  
     class Meta:
         app_label = 'jocondelab'
+    
+    def __unicode__(self):
+        return u'"%s"@%s'%(self.label, self.language_code)
  
 class TermLinks(models.Model):
      
@@ -44,6 +50,9 @@
     
     class Meta:
         app_label = 'jocondelab'
+        
+    def __unicode__(self):
+        return u'%s: %d - %d'%(self.term.dbpedia_uri, self.start_year, self.end_year)
 
 class DbpediaGeo(models.Model):
     term = models.ForeignKey(Term, unique=True, blank=False, null=False, db_index=True, related_name="geo")
@@ -51,4 +60,7 @@
     longitude = models.FloatField(null=False, blank=False, db_index=True)
     
     class Meta:
-        app_label = 'jocondelab'
\ No newline at end of file
+        app_label = 'jocondelab'
+        
+    def __unicode__(self):
+        return u'%s: %.4f%s, %.4f%s'%(self.term.dbpedia_uri, abs(self.latitude), 'N' if self.latitude > 0 else 'S', abs(self.longitude), 'E' if self.longitude > 0 else 'W')
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/models/displaysettings.py	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+'''
+Created on Aug 08, 2013
+
+@author: rvelt
+'''
+from django.db import models
+from core.models import (Term)
+
+class TagcloudTerm(models.Model):
+    
+    term = models.ForeignKey(Term, blank=False, null=False, db_index=True, unique=True)
+    
+    class Meta:
+        app_label = 'jocondelab'
+    
+    def __unicode__(self):
+        return self.term.label
\ No newline at end of file
--- a/src/jocondelab/settings.py	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/settings.py	Wed Sep 18 18:31:29 2013 +0200
@@ -46,6 +46,7 @@
     ('de', ugettext('German')),
     ('pt', ugettext('Portuguese')),
     ('ar', ugettext('Arabic')),
+    ('ru', ugettext('Russian')),
     ('zh-cn', ugettext('Chinese')),
     ('ja', ugettext('Japanese')),
     ('ca', ugettext('Catalan')),
--- a/src/jocondelab/static/jocondelab/css/front-common.css	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/static/jocondelab/css/front-common.css	Wed Sep 18 18:31:29 2013 +0200
@@ -130,7 +130,7 @@
 }
 
 footer {
-    margin: 40px auto 20px; text-align: right;
+    padding: 40px 0 20px; text-align: right;
 }
 
 input {
@@ -149,6 +149,10 @@
     float: left; margin-top: 10px; height: 50px; line-height: 50px; overflow: hidden;
 }
 
+html[dir=rtl] .main-title {
+    float: right;
+}
+
 .main-title h1, .main-title h2 {
     display: inline;
 }
@@ -172,7 +176,11 @@
 /* HEADER > SEARCH FORM */
 
 .header-search-form {
-    position: absolute; top: 8px; right: 0; max-width: 35%; text-align: right;
+    position: absolute; top: 8px; right: 0; max-width: 35%;
+}
+
+html[dir=rtl] .header-search-form {
+    left: 0; right: auto;
 }
 
 .search-input, .search-form .tagit {
@@ -181,6 +189,10 @@
     overflow: hidden;
 }
 
+html[dir=rtl] .search-input, html[dir=rtl] .search-form .tagit {
+    background-position: 4px center;
+}
+
 .header-search-input, .header-search-form .tagit {
     margin: 0 auto; width: 260px; max-width: 90%; font-size: 14px; z-index: 1;
 }
@@ -205,12 +217,38 @@
     float: right;
 }
 
+html[dir=rtl] .header-search-form .tagit {
+    float: left;
+}
+
+html[dir=rtl] ul.tagit li {
+    float: right;
+}
+
+/* Big Search Form (on search and home pages) */
+
+.big-search-form {
+    text-align: center; margin: 20px 0; clear: both;
+}
+
+.big-search-input, .big-search-form .tagit {
+    margin: 0 auto; width: 80%; font-size: 15px;
+}
+
+.big-search-input {
+    line-height: 32px; height: 32px; padding: 0 9px;
+}
+
 /* HEADER > MENUS */
 
 .menu-links {
     position: absolute; right: 0; top: 44px; font-size: 14px; font-weight: bold;
 }
 
+html[dir=rtl] .menu-links {
+    left: 0; right: auto;
+}
+
 .menu-link {
     float: right; margin-left: 20px;
 }
@@ -254,6 +292,10 @@
 
 /* RESULTS LIST */
 
+.results {
+    clear: both;
+}
+
 .resultcount {
     font-size: 18px; margin: 10px 0;
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/static/jocondelab/css/front-home.css	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,39 @@
+.about-jl {
+    font-size: 18px; font-weight: bold; margin: 20px 0;
+}
+
+.module-list {
+    margin: 0 0 20px; width: 100%; clear: both; float: left;
+}
+
+.module-item {
+    width: 20%; height: 80px; float: left;
+}
+
+@media screen and (max-width: 720px) and (min-width: 400px){
+    .module-item {
+        width: 33%;
+    }
+}
+
+@media screen and (max-width: 400px) {
+    .module-item {
+        width: 100%;
+    }
+}
+
+.module-item:nth-child(even) {
+    background: #fff8e0;
+}
+
+.module-item:nth-child(odd) {
+    background: #f8f8f8;
+}
+
+.module-item:hover {
+    background: #ffffff;
+}
+
+.module-item h3 {
+    margin: 10px 5px; font-size: 16px; text-decoration: underline; text-align: center;
+}
--- a/src/jocondelab/static/jocondelab/css/front-notice.css	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/static/jocondelab/css/front-notice.css	Wed Sep 18 18:31:29 2013 +0200
@@ -44,6 +44,14 @@
     width: 130px; font-weight: 700; text-align: left; padding-right: 2px;
 }
 
+html[dir=rtl] .notice-datasheet th {
+    text-align: right; padding-right: 0; padding-left: 2px;
+}
+
+html[dir=rtl] .notice-datasheet td {
+    text-align: right;
+}
+
 .notice-datasheet th, .notice-datasheet td {
     padding-top: 3px;
 }
@@ -56,7 +64,7 @@
     margin: -2px 5px 4px 0;
 }
 
-.notice-term.term-untranslated {
+.notice-term.term-untranslated, .notice-term.contribution-null {
     background: transparent; color: #333333; font-style: italic;
 }
 
@@ -74,7 +82,7 @@
 }
 
 .contribution-frame {
-    margin: 10px 10px 0 0; background: #ffe0c0; padding: 10px;
+    margin: 10px 0; background: #ffe8c0; padding: 10px;
 }
 
 .contribution-frame h2 {
@@ -89,6 +97,10 @@
     float: right; height: 16px; width: 13px; margin-left: 3px;
 }
 
+html[dir=rtl] .contribution-vote {
+    float: left; margin-left: 0; margin-right: 3px;
+}
+
 .contribution-upvote, .contribution-downvote {
     display: block; background: url(../img/vote-sprite.png); width: 11px; height: 6px;
 }
--- a/src/jocondelab/static/jocondelab/css/front-search.css	Mon Sep 16 10:44:50 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/* TERM CLOUD */
-
-.term-cloud {
-    line-height: 26px; width: 80%; font-size: 12px; text-align: center; margin: 0 auto;
-}
-
-.term-cloud li {
-    display: inline-block; margin: 0 10px;
-}
-
-.term-frequency {
-    font-size: .8em;
-}
-
-.big-search-form {
-    text-align: center; margin: 20px 0;
-}
-
-.big-search-input, .big-search-form .tagit {
-    margin: 0 auto; width: 80%; font-size: 15px;
-}
-
-.big-search-input {
-    line-height: 32px; height: 32px; padding: 0 9px;
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/static/jocondelab/css/front-termlist.css	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,80 @@
+/* TERM CLOUD */
+
+.term-cloud {
+    line-height: 26px; width: 80%; font-size: 12px; text-align: center; margin: 10px auto; clear: both;
+}
+
+.term-cloud li {
+    display: inline-block; margin: 0 10px;
+}
+
+.term-tabs {
+    width: 100%; clear: both; height: 41px;
+}
+
+.term-tab {
+    width: 25%; float: left;
+}
+
+.term-tab h2 {
+    height: 20px; margin: 0 2px; border: 1px #cccccc; border-style: solid solid none; padding: 10px;
+    font-size: 15px; background: #f8f8f8; color: #666666; border-radius: 8px 8px 0 0; overflow: hidden; line-height: 1.1em;
+}
+
+@media screen and (max-width: 640px) {
+    .term-tab h2 {
+        font-size: 12px;
+    }
+}
+
+.term-tab.active h2 {
+    color: #000000; background: #ffffff; font-weight: bold;
+}
+
+.term-contents {
+    background: #ffffff; border: 1px solid #cccccc; padding: 10px;
+}
+
+.term-filter {
+    margin: 5px; font-size: 16px; font-weight: bold; color: #666666;
+}
+
+.letter {
+    display: inline-block;
+}
+
+.term-filter.active, .letter.active {
+    color: #0000C0;
+}
+
+.term-contents-empty {
+    text-align: center; font-size: 18px; font-style: italic; color: #999999;
+}
+
+.terms {
+    width: 100%;
+}
+
+.term {
+    float: left; width: 290px; margin: 5px; border: 1px solid #e0e0e0; padding: 5px; height: 60px; overflow: hidden;
+}
+
+html[dir=rtl] {
+    float: right;
+}
+
+.term-image-wrap {
+    float: left; width: 48px; height: 60px; margin-right: 5px;
+}
+
+.term h3 {
+    font-size: 13px; font-weight: bold;
+}
+
+.term img {
+    display: block; margin: 0 auto; max-width: 48px; max-height: 60px;
+}
+
+.term p {
+    font-size: 11px; line-height: 1.1em;
+}
Binary file src/jocondelab/static/jocondelab/img/vote-sprite.png has changed
--- a/src/jocondelab/static/jocondelab/js/front-common.js	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/static/jocondelab/js/front-common.js	Wed Sep 18 18:31:29 2013 +0200
@@ -22,12 +22,13 @@
         },
         allowSpaces: true,
         afterTagAdded : submitIfChanged,
-        afterTagRemoved: submitIfChanged
+        afterTagRemoved: submitIfChanged,
+        singleFieldDelimiter: ";"
     });
     
     /* DBPEDIA OVERLAY */
     
-    var lang = $("html").attr("lang"),
+    var lang = $("html").attr("lang").substr(0,2) || "fr",
         sparqlTpl = _.template(
             'select distinct * where { '
             + 'OPTIONAL { <<%= uri %>> rdfs:label ?l FILTER( langMatches( lang(?l), "<%- lang %>" ) ) }. '
--- a/src/jocondelab/static/jocondelab/js/front-notice.js	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/static/jocondelab/js/front-notice.js	Wed Sep 18 18:31:29 2013 +0200
@@ -3,7 +3,7 @@
     $('.notice-images a').magnificPopup({type:'image'});
     dbpediaBox.bind(".notice-term a");
     
-    var lang = document.querySelector("html").lang.substr(0,2) || "en",
+    var lang = document.querySelector("html").lang.substr(0,2) || "fr",
         labelsCache = {},
         dbpCache = {},
         eventCache = {},
@@ -51,6 +51,12 @@
                     t.label = b.lr.value;
                     t.language = b.lr["xml:lang"];
                 }
+                if (!t.label) {
+                    t.label = label;
+                }
+                if (!t.language) {
+                    t.language = lang;
+                }
                 return t;
             });
             res.local = _(res.translations).find(function(t) {
@@ -186,7 +192,8 @@
         $source.attr("href", termdata.wikipedia_url);
     }
     
-    var eltTemplate = '<li class="notice-term term-translated"><a class="term-link" href="#"></a></li>';
+    var tmpTemplate = '<li class="notice-term term-translated"></li>',
+        $ntl = $(".notice-term-list");
     
     $(".notice-contribution-field").autocomplete({
         source: function( request, response ) {
@@ -224,18 +231,17 @@
         },
         select: function(e, ui) {
             var $this = $(this),
-                $newItem = $(eltTemplate);
-            $this.next(".notice-term-list").append($newItem);
-            $newItem.find(".term-link").text(gettext("Validating Resource…"));
+                $tmpItem = $(tmpTemplate);
+            $ntl.append($tmpItem);
+            $tmpItem.text(gettext("Validating Resource…"));
             $this.autocomplete("close");
             $this.val("");
             getDbpedia(ui.item.label, function(label, termdata) {
-                $newItem.find(".term-link").text(gettext("Saving contribution…"));
+                $tmpItem.text(gettext("Saving contribution…"));
                 if (termdata.dbpedia_uri) {
-                    dbpediaBox.bind($newItem.find("term-link"), termdata.dbpedia_uri);
                     $.ajax({
                         url: urls.ajax_contribute,
-                        dataType: "json",
+                        dataType: "html",
                         type: "POST",
                         data: {
                             csrfmiddlewaretoken: csrf_token,
@@ -244,19 +250,27 @@
                             dbpedia_uri: termdata.dbpedia_uri,
                             translations: JSON.stringify(termdata.translations)
                         },
-                        success: function() {
-                            $newItem.find(".term-link").text(termdata.label);
+                        success: function(html) {
+                            var $el = $(html),
+                                samecontrib = $ntl.find("[data-contribution-id='" + $el.attr("data-contribution-id") + "']");
+                            if (samecontrib.length) {
+                                samecontrib.replaceWith($el);
+                            } else {
+                                $ntl.append($el);
+                            }
+                            $tmpItem.remove();
+                            dbpediaBox.bind($el);
                         },
                         error: function() {
-                            $newItem.remove();
+                            $tmpItem.remove();
                         }
                     })
                 } else {
-                    $newItem.remove();
+                    $tmpItem.remove();
                     alert(gettext("No DbPedia resource found for term") + " " + ui.item.label);
                 }
             }, function() {
-                $newItem.remove();
+                $tmpItem.remove();
                 alert(gettext("No DbPedia resource found for term") + " " + ui.item.label);
             });
         },
@@ -266,4 +280,23 @@
         },
         minLength: 2
     });
+    
+    $(".notice-contribution-list").on("click",".contribution-upvote, .contribution-downvote", function() {
+        var $this = $(this),
+            $li = $(this).parents("li"),
+            endpoint = urls[$this.hasClass("contribution-upvote") ? "upvote" : "downvote"];
+        $.ajax({
+            url: endpoint,
+            dataType: "html",
+            type: "POST",
+            data: {
+                csrfmiddlewaretoken: csrf_token,
+                contribution_id: $li.attr("data-contribution-id"),
+            },
+            success: function(html) {
+                $li.replaceWith($(html));
+            }
+        });
+        return false;
+    });
 });
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/static/jocondelab/js/front-termlist.js	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,28 @@
+$(function() {
+    
+    var $tt = $(".term-tab"),
+        $tc = $(".term-contents");
+    
+    function loadUrl(url) {
+        $tc.empty().append($(".loading-please-wait").clone().show());
+        $.ajax({
+            url: url,
+            dataType: "html",
+            success: function(html) {
+                $tc.html(html);
+                $tc.find(".term-filter a").click(function() {
+                    loadUrl($(this).attr("href"));
+                    return false;
+                });
+            }
+        })
+    }
+    
+    $tt.click(function() {
+        var $this = $(this);
+        $tt.removeClass("active");
+        $this.addClass("active");
+        loadUrl($this.find("a").attr("href"));
+        return false;
+    });
+});
--- a/src/jocondelab/templates/jocondelab/front_base.html	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/templates/jocondelab/front_base.html	Wed Sep 18 18:31:29 2013 +0200
@@ -1,6 +1,6 @@
 {% load i18n %}
 <!doctype html>
-<html lang="{% if lang %}{{lang|slice:':2'}}{% else %}{{LANGUAGE_CODE|slice:':2'}}{% endif %}">
+<html lang="{{LANGUAGE_CODE}}"{% if LANGUAGE_CODE == 'ar' %} dir="rtl"{% endif %}>
     <head>
     {% block head %}
     	<meta charset="UTF-8" />
@@ -67,7 +67,7 @@
                     <a href="{% url 'front_home' %}">{% trans 'Accueil' %}</a>
                 </li>
                 <li class="menu-item">
-                    <a href="{% url 'front_search' %}">{% trans 'Recherche' %}</a>
+                    <a href="{% url 'front_termlist' %}">{% trans 'Liste des termes' %}</a>
                 </li>
                 <li class="menu-item">
                     <a href="{% url 'front_timeline' %}">{% trans 'Frise chronologique' %}</a>
--- a/src/jocondelab/templates/jocondelab/front_home.html	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/templates/jocondelab/front_home.html	Wed Sep 18 18:31:29 2013 +0200
@@ -1,32 +1,33 @@
 {% extends "jocondelab/front_search.html" %}
 {% load i18n %}
 
+{% block css_declaration %}
+{{block.super}}
+    <link rel="stylesheet" type="text/css" href="{{STATIC_URL}}jocondelab/css/front-home.css" />
+{% endblock %}
+
 {% block title %}JocondeLab &raquo; {% trans 'Accueil' %}{% endblock %}
 
 {% block breadcrumbs %}<a href="{% url 'front_home' %}">{% trans 'Accueil' %}</a>{% endblock %}
 
 {% block main %}
-
-            <p class="about-jl">{% trans 'Bienvenue sur JocondeLab' %}</p>
+            <h2 class="about-jl">{% trans 'Bienvenue sur JocondeLab' %}</h2>
             
             <ul class="module-list">
                 <li class="module-item">
-                    <h2><a href="{% url 'front_search' %}">{% trans 'Recherche' %}</a></h2>
+                    <h3><a href="{% url 'front_termlist' %}">{% trans 'Liste des termes' %}</a></h3>
                 </li>
                 <li class="module-item">
-                    <h2><a href="{% url 'front_timeline' %}">{% trans 'Frise chronologique' %}</a></h2>
-                </li>
-                <li class="module-item">
-                    <h2><a href="{% url 'front_geo' %}">{% trans 'Mappemonde' %}</a></h2>
+                    <h3><a href="{% url 'front_timeline' %}">{% trans 'Frise chronologique' %}</a></h3>
                 </li>
                 <li class="module-item">
-                    <h2><a href="{% url 'front_search' %}">{% trans 'Liste des termes' %}</a></h2>
+                    <h3><a href="{% url 'front_geo' %}">{% trans 'Mappemonde' %}</a></h3>
                 </li>
                 <li class="module-item">
-                    <h2><a href="{% url 'front_search' %}">{% trans 'À propos' %}</a></h2>
+                    <h3><a href="{% url 'front_search' %}">{% trans 'À propos' %}</a></h3>
                 </li>
             </ul>
-            
-            <div class="results"></div>
-{{block.super}}    
+{{block.super}}
 {% endblock %}
+
+{% block term_cloud %}{% endblock %}
--- a/src/jocondelab/templates/jocondelab/front_notice.html	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/templates/jocondelab/front_notice.html	Wed Sep 18 18:31:29 2013 +0200
@@ -13,6 +13,8 @@
         var notice_id = "{{object.id}}",
             csrf_token = "{{csrf_token}}";
         urls.ajax_contribute = "{% url 'ajax_contribute' %}";
+        urls.upvote = "{% url 'ajax_upvote' %}";
+        urls.downvote = "{% url 'ajax_downvote' %}";
         urls.wikipedia = {{wikipedia_urls|safe}};
     </script>
     <script type="text/javascript" src="{{STATIC_URL}}jocondelab/js/front-notice.js"></script>
@@ -30,7 +32,7 @@
 
 {% block title %}JocondeLab &raquo; {{title}}{% endblock %}
 
-{% block breadcrumbs %}<a href="{% url 'front_notice' object.id %}">{{title|truncatechars:30}}</a>{% endblock %}
+{% block breadcrumbs %}<a href="{% url 'front_notice' object.id %}" dir="ltr">{{title|truncatechars:40}}</a>{% endblock %}
 
 {% block main %}
             <ul class="notice-images">
@@ -91,15 +93,9 @@
                     <div class="contribution-frame">
                         <h2>Contribution (Folksonomie)</h2>
                         <input class="notice-contribution-field" type="text" size="60" placeholder="{% trans 'Complétez les mots-clés de la fiche' %}" />
-                        <ul class="notice-term-list">
+                        <ul class="notice-term-list notice-contribution-list">
                         {% for term in contributions %}
-                            <li class="notice-term term-translated" data-contribution-id="{{term.contribution_id}}">
-                                <div class="contribution-vote">
-                                    <a href="#" class="contribution-upvote" title="{% trans 'Votez pour ce terme' %}"></a>
-                                    <a href="#" class="contribution-downvote" title="{% trans 'Votez contre ce terme' %}"></a>
-                                </div>
-                                <a href="{% url 'front_search' %}?q={{term.label|urlencode}}" data-dbpedia-uri="{{term.dbpedia_uri}}">{{term.label}}</a>
-                            </li>
+                            {% include "jocondelab/partial/contributed_item.html" %}
                         {% endfor %}
                         </ul>
                     </div>
--- a/src/jocondelab/templates/jocondelab/front_search.html	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/templates/jocondelab/front_search.html	Wed Sep 18 18:31:29 2013 +0200
@@ -1,6 +1,5 @@
 {% extends "jocondelab/front_base.html" %}
 {% load i18n %}
-{% load l10n %}
 
 {% block js_declaration %}
     {{block.super}}
@@ -10,33 +9,18 @@
     </script>
 {% endblock %}
 
-{% block css_declaration %}
-    {{block.super}}
-    <link rel="stylesheet" type="text/css" href="{{STATIC_URL}}jocondelab/css/front-search.css"></script>
-{% endblock %}
+{% block title %}JocondeLab &raquo; {% if searchterm %}{% trans 'Résultats pour&nbsp;: &laquo;&nbsp;' %}{{searchterm}}{% trans '&nbsp;&raquo;' %}{% else %}{% trans 'Recherche' %}{% endif %}{% endblock %}
 
-{% block title %}JocondeLab &raquo; {% trans 'Recherche' %}{% endblock %}
-
-{% block breadcrumbs %}<a href="{% url 'front_search' %}">{% trans 'Recherche' %}</a>{% endblock %}
+{% block breadcrumbs %}<a href="{% url 'front_search' %}{% if searchterm %}?q={{searchterm|urlencode}}{% endif %}">{% if searchterm %}{% trans 'Résultats pour&nbsp;: &laquo;&nbsp;' %}{{searchterm}}{% trans '&nbsp;&raquo;' %}{% else %}{% trans 'Recherche' %}{% endif %}</a>{% endblock %}
 
 {% block header_search %}{% endblock %}
 
 {% block main %}
-
+            
             <form class="big-search-form search-form">
                 <input class="big-search-input search-input" type="search" name="q" value="{{searchterm}}" />
             </form>
             
-            {% if words %}
-            <ul class="term-cloud">
-                {% for word in words %}
-                    <li style="font-size: {{word.font_size|unlocalize}}em">
-                        <a href="{% url 'front_search' %}?q={{word.label|urlencode}}" data-dbpedia-uri="{{word.uri}}">{{word.label}}</a>
-                    </li>
-                {% endfor %}
-            </ul>
-            {% endif %}
-            
             {% include 'jocondelab/partial/wrapped_notice_list.html' %}
             
             <div class="loading-please-wait"><img src="{{STATIC_URL}}jocondelab/img/loader.gif" /></div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/templates/jocondelab/front_termlist.html	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,50 @@
+{% extends "jocondelab/front_base.html" %}
+{% load i18n %}
+
+{% block js_declaration %}
+    {{block.super}}
+    <script type="text/javascript" src="{{STATIC_URL}}jocondelab/js/front-termlist.js"></script>
+{% endblock %}
+
+{% block css_declaration %}
+    {{block.super}}
+    <link rel="stylesheet" type="text/css" href="{{STATIC_URL}}jocondelab/css/front-termlist.css" />
+{% endblock %}
+
+{% block title %}JocondeLab &raquo; {% trans 'Liste des termes' %}{% endblock %}
+
+{% block breadcrumbs %}<a href="{% url 'front_termlist' %}">{% trans 'Liste des termes' %}</a>{% endblock %}
+
+{% block main %}
+            
+            <ul class="term-cloud">
+                {% for word in words %}
+                    <li style="font-size: {{word.font_size}}em">
+                        <a href="{% url 'front_search' %}?dbpedia_uri={{word.uri|urlencode}}" data-dbpedia-uri="{{word.uri}}">{{word.label}}</a>
+                    </li>
+                {% endfor %}
+            </ul>
+            
+            <ul class="term-tabs">
+                <li class="term-tab{% if thesaurus == 'AUTR' %} active{% endif %}">
+                    <h2><a href="{% url 'front_termlist' %}?thesaurus=AUTR">{% trans "Auteurs" %}</a></h2>
+                </li>
+                <li class="term-tab{% if thesaurus == 'REPR' %} active{% endif %}">
+                    <h2><a href="{% url 'front_termlist' %}?thesaurus=REPR">{% trans "Sujets Représentés" %}</a></h2>
+                </li>
+                <li class="term-tab{% if thesaurus == 'DOMN' %} active{% endif %}">
+                    <h2><a href="{% url 'front_termlist' %}?thesaurus=DOMN">{% trans "Domaines" %}</a></h2>
+                </li>
+                <li class="term-tab{% if thesaurus == 'EPOQ' %} active{% endif %}">
+                    <h2><a href="{% url 'front_termlist' %}?thesaurus=EPOQ">{% trans "Epoques" %}</a></h2>
+                </li>
+            </ul>
+            
+            <div class="term-contents">
+    {% include "jocondelab/partial/termlist_contents.html" %}
+            </div>
+            
+            <div class="loading-please-wait"><img src="{{STATIC_URL}}jocondelab/img/loader.gif" /></div>
+            <script>$(function() { dbpediaBox.bind(".term h3");});</script>
+            
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/templates/jocondelab/partial/contributed_item.html	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,9 @@
+{% load i18n %}
+
+<li class="notice-term contribution-{{term.li_style}}" data-contribution-id="{{term.contribution_id}}" style="font-size: {{term.font_size}}px">
+    <div class="contribution-vote">
+        <a href="#" class="contribution-upvote" title="{% trans 'Votez pour ce terme' %}"></a>
+        <a href="#" class="contribution-downvote" title="{% trans 'Votez contre ce terme' %}"></a>
+    </div>
+    <a href="{% url 'front_search' %}?q={{term.label|urlencode}}" data-dbpedia-uri="{{term.dbpedia_uri}}">{{term.label}}</a>
+</li>
\ No newline at end of file
--- a/src/jocondelab/templates/jocondelab/partial/datasheet_row.html	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/templates/jocondelab/partial/datasheet_row.html	Wed Sep 18 18:31:29 2013 +0200
@@ -5,12 +5,13 @@
     <th>{% trans fieldname context 'Thesaurus label' %}{% trans ':' %}</th>
     <td>
         <ul class="notice-term-list">
-        {% for termtype, terms in linked_terms.items %}
-            {% for term in terms %}
-            <li class="notice-term term-{{termtype}}">
-                <a href="{% url 'front_search' %}?q={{term.label|urlencode}}" data-dbpedia-uri="{{term.dbpedia_uri}}">{{term.label}}</a>
+        {% for term in linked_terms.translated %}
+            <li class="notice-term term-translated">
+                <a href="{% url 'front_search' %}?dbpedia_uri={{term.dbpedia_uri|urlencode}}" data-dbpedia-uri="{{term.dbpedia_uri}}">{{term.label}}</a>
             </li>
-            {% endfor %}
+        {% endfor %}
+        {% for term in linked_terms.untranslated %}
+            <li class="notice-term term-untranslated" dir="ltr">{{term.label}}</li>
         {% endfor %}
         </ul>
     </td>
@@ -18,7 +19,7 @@
 {% elif base_field %}
 <tr{% if row_class %} class="{{row_class}}"{% endif %}>
     <th>{% trans fieldname context 'Thesaurus label' %}{% trans ':' %}</th>
-    <td>{{base_field}}</td>
+    <td dir="ltr">{{base_field}}</td>
 </tr>
 {% endif %}
 
--- a/src/jocondelab/templates/jocondelab/partial/notice_list.html	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/templates/jocondelab/partial/notice_list.html	Wed Sep 18 18:31:29 2013 +0200
@@ -7,17 +7,13 @@
                 <img class="notice-image" alt="{{notice.imagetitle}}" src="{{ notice.image }}" />
             </a>
             <div class="notice-metadata">
-                {% if notice.title %}<h2><a href="{% url 'front_notice' notice.id %}">{% trans thesaurus 'TITR' 'Thesaurus label' %}{% trans ':' %} <span class="notice-title">{{notice.title}}</span></a></h2>{% endif %}
-                {% if not notice.title and notice.denomination %}<h2><a href="{% url 'front_notice' notice.id %}">{{% trans thesaurus 'DENO' 'Thesaurus label' %}{% trans ':' %} <span class="notice-title">{{notice.denomination}}</span></a></h2>{% endif %}
+                {% if notice.title %}<h2><a href="{% url 'front_notice' notice.id %}">{% trans 'TITR' context 'Thesaurus label' %}{% trans ':' %} <span class="notice-title" dir="ltr">{{notice.title}}</span></a></h2>{% endif %}
+                {% if not notice.title and notice.denomination %}<h2><a href="{% url 'front_notice' notice.id %}">{% trans 'DENO' context 'Thesaurus label' %}{% trans ':' %} <span class="notice-title" dir="ltr">{{notice.denomination}}</span></a></h2>{% endif %}
                 <ul>
-                {% if not notice.terms_by_thesaurus.AUTR and notice.authors %}
+                {% if not notice.terms_by_thesaurus.AUTR and notice.author %}
                     <li class="notice-thesaurus">
                         <h3 class="notice-thesaurus-title">{% trans 'AUTR' context 'Thesaurus label' %}{% trans ':' %}</h3>
-                        <ul class="notice-terms-list">
-                        {% for author in notice.authors %}
-                            <li class="notice-term"><a href="{% url 'front_search' %}?q={{author|urlencode}}">{{author}}</a></li>
-                        {% endfor %}
-                        </ul>
+                        <p class="notice-terms-list" dir="ltr">{{notice.author}}</p>
                     </li>
                 {% endif %}
                 {% for thesaurus, terms in notice.terms_by_thesaurus.items %}
@@ -25,7 +21,7 @@
                          <h3>{% trans thesaurus context 'Thesaurus label' %}{% trans ':' %}</h3>
                          <ul class="notice-term-list">
                          {% for term in terms %}
-                            <li class="notice-term"><a href="{% url 'front_search' %}?q={{term.locale_label|urlencode}}" data-dbpedia-uri="{{term.dbpedia_uri}}">{{term.locale_label}}</a></li>
+                            <li class="notice-term"><a href="{% url 'front_search' %}?dbpedia_uri={{term.dbpedia_uri|urlencode}}" data-dbpedia-uri="{{term.dbpedia_uri}}">{{term.locale_label}}</a></li>
                          {% endfor %}
                          </ul>
                      </li>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jocondelab/templates/jocondelab/partial/termlist_contents.html	Wed Sep 18 18:31:29 2013 +0200
@@ -0,0 +1,31 @@
+{% load i18n %}
+
+{% if thesaurus %}
+        <p class="term-filter{% if not alpha_sort %} active{% endif %}">
+            <a href="{% url 'front_termlist' %}?thesaurus={{thesaurus}}">{% trans "Termes les plus fréquents" %}</a>
+        </p>
+    {% if show_alphabet %}
+        <ul class="term-filter letter-list">
+        {% for letter in alphabet %}
+            <li class="letter{% if letter == current_letter %} active{% endif %}"><a href="{% url 'front_termlist' %}?thesaurus={{thesaurus}}&letter={{letter|urlencode}}">{{letter}}</a></li>
+        {% endfor %}
+        </ul>
+    {% else %}
+        <p class="term-filter{% if alpha_sort %} active{% endif %}">
+            <a href="{% url 'front_termlist' %}?thesaurus={{thesaurus}}&alphabet=1">{% trans "Classer par ordre alphabétique" %}</a>
+        </p>
+    {% endif %}
+        <ul class="terms clearfix">
+        {% for term in terms %}
+            <li class="term" data-dbpedia-uri="{{term.dbpedia_uri}}">
+                <div class="term-image-wrap">
+                    <img class="term-image" src="{{JOCONDE_IMAGE_BASE_URL}}{{term.image_url}}" />
+                </div>
+                <h3 data-dbpedia-uri="{{term.dbpedia_uri}}"><a href="{% url 'front_search' %}?dbpedia_uri={{term.dbpedia_uri|urlencode}}">{{term.label}}</a></h3>
+                    {% if term.abstract %}<p>{{term.abstract|truncatechars:100}}</p>{% endif %}
+            </li>
+        {% endfor %}
+        </ul>
+{% else %}
+        <h3 class="term-contents-empty">{% trans "Choisissez une liste ci-dessus" %}</h3>
+{% endif %}
\ No newline at end of file
--- a/src/jocondelab/templates/jocondelab/partial/wrapped_notice_list.html	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/templates/jocondelab/partial/wrapped_notice_list.html	Wed Sep 18 18:31:29 2013 +0200
@@ -1,6 +1,6 @@
 {% load i18n %}
 
-<h2 class="resultcount"><b>{{count}}</b> {% if searchterm %}{% trans 'results for:' %} <b>{{searchterm}}</b>{% else %}{% trans 'results' %}{% endif %}</h2>
+<h2 class="resultcount"><b>{{count}}</b> {% if searchterm %}{% trans 'résultats pour :' %} <b>{{searchterm}}</b>{% else %}{% trans 'résultats' %}{% endif %}</h2>
 
 <ul class="notice-list clearfix"{% if page_count %} data-page-count="{{page_count}}"{% endif %} data-current-page="{{current_page}}">
 {% include 'jocondelab/partial/notice_list.html' %}
--- a/src/jocondelab/urls.py	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/urls.py	Wed Sep 18 18:31:29 2013 +0200
@@ -1,7 +1,8 @@
 from jocondelab.views.back_office import (TermListView, TermEditView, TermModifyWpLink, 
     TermRemoveWpLink, TermValidate, TermWikipediaEdition, 
     TermLinkSemanticLevelEdition, ThesaurusTree, TermListTableView)
-from jocondelab.views.front_office import (SearchView, NoticeView, GeoView)
+from jocondelab.views.front_office import (SearchView, NoticeView, GeoView, FrontTermListView)
+from jocondelab.views.ajax import (ContributeView, VoteView)
 from core import urls as core_urls
 from django.conf.urls import patterns, include, url
 from django.contrib import admin
@@ -32,15 +33,18 @@
     url(r'^bo/term/validate/$', login_required(TermValidate.as_view()), name='validate_term'),
     url(r'^bo/tree/(?P<thes_id>\d+)/$', login_required(ThesaurusTree.as_view()), name='term_tree'),
     url(r'^$', SearchView.as_view(template_name="jocondelab/front_home.html"), name='front_home'),
+    url(r'^termlist/$', FrontTermListView.as_view(), name='front_termlist'),
     url(r'^search/$', SearchView.as_view(), name='front_search'),
     url(r'^geo/$', GeoView.as_view(), name='front_geo'),
     url(r'^timeline/$', TemplateView.as_view(template_name="jocondelab/front_timeline.html"), name='front_timeline'),
     url(r'^notice/(?P<pk>\d+)/$', NoticeView.as_view(), name='front_notice'),
-    url(r'^notice/$', NoticeView.as_view(), name='front_notice'),
+    url(r'^notice/$', NoticeView.as_view(), name='random_notice'),
     url(r'^ajax/terms/$', 'jocondelab.views.ajax.terms', name='ajax_terms'),
     url(r'^ajax/years/$', 'jocondelab.views.ajax.years', name='ajax_years'),
     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/contribute/$', 'jocondelab.views.ajax.contribute', name='ajax_contribute'),
+    url(r'^ajax/contribute/$', ContributeView.as_view(), name='ajax_contribute'),
+    url(r'^ajax/upvote/$', VoteView.as_view(vote_value=1), name='ajax_upvote'),
+    url(r'^ajax/downvote/$', VoteView.as_view(vote_value=-1), name='ajax_downvote'),
 )
 
--- a/src/jocondelab/views/ajax.py	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/views/ajax.py	Wed Sep 18 18:31:29 2013 +0200
@@ -11,6 +11,7 @@
 from django.core.paginator import Paginator
 from django.http import HttpResponse
 from django.template.response import TemplateResponse
+from django.views.generic import TemplateView, DetailView
 from django.db.models import Sum
 from django.conf import settings
 
@@ -106,45 +107,64 @@
     
     return HttpResponse(content=json.dumps(results), mimetype='application/json')
 
-def contribute(request):
+class BaseContributionView(TemplateView):
+    
+    template_name = "jocondelab/partial/contributed_item.html"
     
-    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', '[]'))
+    def render_contribution(self, contribution, request):
+        lang = request.LANGUAGE_CODE[:2]
+        termdict = {
+            "label": contribution.term.dbpedia_fields.get(language_code=lang).label,
+            "dbpedia_uri": contribution.term.dbpedia_uri,
+            "contribution_id": contribution.id,
+            "li_style": "positive" if contribution.contribution_count > 0 else "null",
+            "font_size": "%.1f"%(12. + .5 * max(0., min(12., contribution.contribution_count)))
+        }
+        return self.render_to_response({"term": termdict})
     
-    thobj = Thesaurus.objects.get(label=thesaurus_label) if thesaurus_label else None
-    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']})
+    def get(self, request):
+        contribution_id = int(request.GET.get('contribution_id', None))
+        return self.render_contribution(Contribution.objects.get(pk=contribution_id), request)
+
+class ContributeView(BaseContributionView):
+    
+    def post(self, 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) if thesaurus_label else None
+        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:
-            fieldsobj.abstract = t['abstract']
-            fieldsobj.thumbnail = t['thumbnail']
-            fieldsobj.label = t['label']
-            fieldsobj.save()
-
-    return HttpResponse(content=json.dumps({ "contribution_id": controbj.id, "contribution_count": controbj.contribution_count }), mimetype='application/json')
-
-def contribution_vote(request, grade):
+            controbj.contribution_count += 1
+            controbj.save()
+        for t in translations:
+            abstract = t.get('abstract', None)
+            thumbnail = t.get('thumbnail', None)
+            label = t['label']
+            language = t.get('language',request.LANGUAGE_CODE[:2])
+            fieldsobj, created = ContributedFields.objects.get_or_create(term=termobj, dbpedia_uri=dbpedia_uri, language_code=language, defaults={'abstract': abstract, 'label': label, 'thumbnail': thumbnail})
+            if not created:
+                fieldsobj.abstract = abstract
+                fieldsobj.thumbnail = thumbnail
+                fieldsobj.label = label
+                fieldsobj.save()
+        return self.render_contribution(controbj, request)
     
-    contribution_id = request.POST.get('contribution_id', None)
-    controbj = ContributedTerm.objects.get(id=contribution_id)
-    controbj.contribution_count += grade
-    controbj.save()
+
+class VoteView(BaseContributionView):
+    
+    vote_value = 0
     
-    return HttpResponse(content=json.dumps({ "contribution_id": controbj.id, "contribution_count": controbj.contribution_count }), mimetype='application/json')
-
-def upvote(request):
-    
-    return contribution_vote(1)
-
-def downvote(request):
-    
-    return contribution_vote(-1)
+    def post(self, request):
+        contribution_id = int(request.POST.get('contribution_id', None))
+        controbj = Contribution.objects.get(id=contribution_id)
+        controbj.contribution_count += self.vote_value
+        controbj.save()
+        return self.render_contribution(controbj, request)
     
\ No newline at end of file
--- a/src/jocondelab/views/front_office.py	Mon Sep 16 10:44:50 2013 +0200
+++ b/src/jocondelab/views/front_office.py	Wed Sep 18 18:31:29 2013 +0200
@@ -6,17 +6,15 @@
 '''
 
 from core.models import (Notice, Thesaurus, Term)
-from jocondelab.models import (DbpediaFields, Country)
+from jocondelab.models import (DbpediaFields, Country, ContributableTerm, TagcloudTerm)
 from django.core.paginator import Paginator
 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
-from django.db.models import Q, Count
-import re
-import time
+from django.views.generic import DetailView, TemplateView
+from django.db.models import Sum, Count
+import random
 
-class SearchView(View, TemplateResponseMixin):
+class SearchView(TemplateView):
     
     def get(self, request):
                 
@@ -25,14 +23,12 @@
         page = request.GET.get('page',1)
         querystr = request.GET.get('q', "")
         is_ajax = request.is_ajax()
-        queryterms = [s.strip(" ") for s in re.split("[,;]",querystr) if s.strip(" ")]
+        queryterms = [s.strip(" ") for s in querystr.split(";") if s.strip(" ")]
         dbpedia_uri = request.GET.get('dbpedia_uri', None)
         emptysearch = (not queryterms and not dbpedia_uri)
-        show_tagcloud = (emptysearch and not is_ajax)
         npp = request.GET.get('count', 12 if emptysearch else 36)
         wpp = 50
         context["current_page"] = page
-        context["lang"] = lang
         
         if self.template_name is None:
             if is_ajax and page > 1:
@@ -85,29 +81,15 @@
                 "title": n.titr,
                 "denomination": n.deno,
                 "image": (settings.JOCONDE_IMG_BASE_URL + n.images.all()[0].url) if n.images.count() else "",
-                "authors": re.split("\s?;\s?", n.autr) if n.autr else [],
+                "author": n.autr,
                 "terms_by_thesaurus": termsbythesaurus
             }
             notices.append(noticedict)
         context["notices"] = notices
-        
-        if show_tagcloud:
-            ts = Term.objects.filter(dbpedia_fields__language_code=lang).order_by('-nb_notice')[:wpp]
-            words = [{
-                "uri": t.dbpedia_uri,
-                "label": t.dbpedia_fields.get(language_code=lang).label,
-                "notice_count": t.nb_notice
-            } for t in ts]
-            fontmax = 2.5
-            fontmin = 1.
-            scale = (fontmax - fontmin)/max(1,words[0]["notice_count"]-words[-1]["notice_count"])
-            for w in words:
-                w["font_size"] = fontmin + scale * w["notice_count"]
-            context["words"] = words
-                
+                        
         return self.render_to_response(context)
 
-class GeoView(View, TemplateResponseMixin):
+class GeoView(TemplateView):
     
     template_name = "jocondelab/front_geo.html"
     
@@ -129,7 +111,6 @@
         context = super(NoticeView, self).get_context_data(**kwargs)
         lang = self.request.GET.get('lang',self.request.LANGUAGE_CODE)[:2]
         
-        context["lang"] = lang
         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
         
@@ -153,7 +134,9 @@
         contributions = [{
                 "label": ct.term.dbpedia_fields.get(language_code=lang).label,
                 "dbpedia_uri": ct.term.dbpedia_uri,
-                "contribution_id": ct.id
+                "contribution_id": ct.id,
+                "li_style": "positive" if ct.contribution_count > 0 else "null",
+                "font_size": "%.1f"%(12. + .5 * max(0., min(12., ct.contribution_count)))
             } for ct in cqs.filter(thesaurus=None,term__dbpedia_fields__language_code=lang).order_by('-contribution_count')]
             
         context["terms_by_thesaurus"] = termsbythesaurus
@@ -167,6 +150,114 @@
         if self.pk_url_kwarg in self.kwargs:
             return super(NoticeView, self).get_object()
         else:
-            queryset = self.get_queryset().filter(image=True, repr='')
-            return queryset.order_by('?')[0]
+            queryset = self.get_queryset().filter(image=True, repr='', noticeterm__term__id__in=ContributableTerm.objects.values('term__id'))
+            return queryset[random.randint(0, queryset.count() - 1)]
+
+class FrontTermListView(TemplateView):
+    
+    template_name = "jocondelab/front_termlist.html"
+    
+    def get(self, request):
+        
+        context = {}
+        lang = self.request.GET.get('lang',self.request.LANGUAGE_CODE)[:2]
+        is_ajax = request.is_ajax()
+        letter = self.request.GET.get('letter',None)
+        alpha_sort = (letter is not None) or self.request.GET.get('alphabet',False)
+        context['alpha_sort'] = alpha_sort
+        thesaurus = self.request.GET.get('thesaurus',None)
+        context['thesaurus'] = thesaurus
+        
+        if is_ajax:
+            self.template_name = "jocondelab/partial/termlist_contents.html"
+        else:
+            wqs = TagcloudTerm.objects.filter(term__dbpedia_fields__language_code=lang).values('term__dbpedia_fields__label','term__dbpedia_uri')
+            wqs = wqs.distinct().annotate(sum_notice=Sum('term__nb_notice')).order_by('-sum_notice')
+            n = wqs.count()
+            context['words'] = [{
+                     'label': w['term__dbpedia_fields__label'],
+                     'uri': w['term__dbpedia_uri'],
+                     'font_size': "%.2f"%(1. + float(n-i)/n)
+                                 } for i, w in enumerate(wqs)]
+        
+        if thesaurus is not None:
+            alphabets = [{
+                  "languages": [ "fr", "en", "de", "it", "es", "pt", "ca", "br", "eu", "oc" ],
+                  "letters": u"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+              }, {
+                  "languages": [ "ru" ],
+                  "letters": u"АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЭЮЯ"
+              }, {
+                  "languages": [ "ar" ],
+                  "letters": u"ابتثجحخدذرزسشصضطظعغفقكلمنهوي"
+            }]
+            latinalph = alphabets[0]
+            alphabet = None
+            for a in alphabets:
+                if lang in a["languages"]:
+                    alphabet = a
+            if alphabet is not None:
+                if thesaurus in ['REPR','AUTR']:
+                    context["show_alphabet"] = True
+                letters = alphabet["letters"]
+                context["alphabet"] = letters
+                if letter is not None:
+                    letterpos = letters.find(letter)
+            context["current_letter"] = letter
+            if (not alpha_sort) or (thesaurus == 'AUTR' and alphabet == latinalph and letter is not None):
+                tqs = Term.objects.filter(dbpedia_fields__language_code=lang)
+                if thesaurus == 'REPR':
+                    tqs = tqs.filter(thesaurus__label__in=['REPR','SREP'])
+                else:
+                    tqs = tqs.filter(thesaurus__label=thesaurus)
+                if alpha_sort:
+                    # Particular case in which thesaurus == AUTR and the alphabet is latin,
+                    # we use original sorting by family name
+                    if letterpos >= 0:
+                        tqs = tqs.filter(label__gte=letters[letterpos])
+                    if letterpos < len(letters)-1:
+                        tqs = tqs.filter(label__lt=letters[letterpos+1])
+                    tqs = tqs.filter(notices__image=True).distinct('label').order_by('label').select_related('notices__images')
+                    tqs = tqs.values('notices__images__relative_url','dbpedia_uri','dbpedia_fields__abstract','dbpedia_fields__label')
+                    terms = []
+                    known_uris = []
+                    for t in tqs:
+                        uri = t['dbpedia_uri']
+                        if uri not in known_uris:
+                            terms.append(t)
+                            known_uris.append(uri)
+                else:
+                    # When we're in sort by most frequent terms
+                    tqs = tqs.order_by('-nb_notice').extra(select={
+                              'image_url': 'SELECT relative_url FROM core_noticeimage AS JL01 JOIN core_notice AS JL02 ON JL02.id = JL01.notice_id JOIN core_noticeterm AS JL03 ON JL02.id = JL03.notice_id WHERE JL03.term_id = core_term.id LIMIT 1'
+                          })[:80]
+                    tqs = tqs.values('image_url','dbpedia_fields__thumbnail','dbpedia_uri','dbpedia_fields__abstract','dbpedia_fields__label')
+                    terms = [t for t in tqs if t['image_url']][:60]
+                terms = [{
+                      "dbpedia_uri": t['dbpedia_uri'],
+                      "label": t['dbpedia_fields__label'],
+                      "abstract": t['dbpedia_fields__abstract'],
+                      "image_url": "%s%s"%(settings.JOCONDE_IMG_BASE_URL, t.get('image_url',t.get('notices__images__relative_url','')))
+                            } for t in terms]
+                context['termcount'] = len(terms)
+            else:
+                tqs = DbpediaFields.objects.filter(language_code=lang,term__notices__image=True).exclude(label=None)
+                if thesaurus == 'REPR':
+                    tqs = tqs.filter(term__thesaurus__label__in=['REPR','SREP'])
+                else:
+                    tqs = tqs.filter(term__thesaurus__label=thesaurus)
+                if thesaurus in ['REPR','AUTR'] and letter is not None: #Pagination required for these two thesaura
+                    if alphabet is not None:
+                        if letterpos >= 0:
+                            tqs = tqs.filter(label__gte=letters[letterpos])
+                        if letterpos < len(letters)-1:
+                            tqs = tqs.filter(label__lt=letters[letterpos+1])
+                tqs = tqs.distinct('label').order_by('label')
+                terms = tqs.select_related('term__notices__images').values('term__notices__images__relative_url','dbpedia_uri','abstract','label')
+                for t in terms:
+                    t['image_url'] = "%s%s"%(settings.JOCONDE_IMG_BASE_URL, t['term__notices__images__relative_url'])
+                context['termcount'] = terms.count()
+            context['terms'] = terms
+        
+        return self.render_to_response(context)
     
\ No newline at end of file