add favorite management
authorymh <ymh.work@gmail.com>
Wed, 04 Mar 2015 15:24:23 +0100
changeset 473 f469ab22542d
parent 472 6575b9f53601
child 474 7ec378cc1f8a
add favorite management
.settings/org.eclipse.core.resources.prefs
src/hdalab/forms.py
src/hdalab/migrations/0014_auto__add_hdalabrenkanstatetransition__chg_field_dbpediafields_tag.py
src/hdalab/migrations/0015_auto__add_field_hdalabrenkan_favorite.py
src/hdalab/models/renkan.py
src/hdalab/static/hdalab/css/footer.css
src/hdalab/static/hdalab/css/profile.css
src/hdalab/static/hdalab/js/manage.js
src/hdalab/static/hdalab/js/renkan-search.js
src/hdalab/templates/base.html
src/hdalab/templates/editorial/manage_renkans.html
src/hdalab/templates/profile_home.html
src/hdalab/templates/renkan_list.html
src/hdalab/urls.py
src/hdalab/views/editorial.py
src/hdalab/views/profile.py
--- a/.settings/org.eclipse.core.resources.prefs	Tue Mar 03 14:03:38 2015 +0100
+++ b/.settings/org.eclipse.core.resources.prefs	Wed Mar 04 15:24:23 2015 +0100
@@ -60,6 +60,7 @@
 encoding//src/hdalab/migrations/0012_auto__add_hdalabrenkan.py=utf-8
 encoding//src/hdalab/migrations/0013_auto__chg_field_dbpediafields_tag__add_unique_tagyears_tag.py=utf-8
 encoding//src/hdalab/migrations/0014_auto__add_hdalabrenkanstatetransition__chg_field_dbpediafields_tag.py=utf-8
+encoding//src/hdalab/migrations/0015_auto__add_field_hdalabrenkan_favorite.py=utf-8
 encoding//src/hdalab/models/dataviz.py=utf-8
 encoding//src/hdalab/models/renkan.py=utf-8
 encoding//src/hdalab/services.py=utf-8
--- a/src/hdalab/forms.py	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/forms.py	Wed Mar 04 15:24:23 2015 +0100
@@ -14,4 +14,9 @@
         fields = ['id','state']
         
     message = forms.CharField(widget=forms.Textarea,required=False)
-    next = forms.CharField(required=False)
\ No newline at end of file
+    next = forms.CharField(required=False)
+    
+class HdalabRenkanFavoriteForm(forms.ModelForm):
+    class Meta:
+        model = HdalabRenkan
+        fields = ['favorite']
--- a/src/hdalab/migrations/0014_auto__add_hdalabrenkanstatetransition__chg_field_dbpediafields_tag.py	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/migrations/0014_auto__add_hdalabrenkanstatetransition__chg_field_dbpediafields_tag.py	Wed Mar 04 15:24:23 2015 +0100
@@ -1,8 +1,6 @@
 # -*- coding: utf-8 -*-
-from south.utils import datetime_utils as datetime
 from south.db import db
 from south.v2 import SchemaMigration
-from django.db import models
 
 
 class Migration(SchemaMigration):
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hdalab/migrations/0015_auto__add_field_hdalabrenkan_favorite.py	Wed Mar 04 15:24:23 2015 +0100
@@ -0,0 +1,336 @@
+# -*- coding: utf-8 -*-
+from south.db import db
+from south.v2 import SchemaMigration
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+
+        # Adding field 'HdalabRenkan.favorite'
+        db.add_column(u'hdalab_hdalabrenkan', 'favorite',
+                      self.gf('django.db.models.fields.BooleanField')(default=False),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+
+        # Deleting field 'HdalabRenkan.favorite'
+        db.delete_column(u'hdalab_hdalabrenkan', 'favorite')
+
+
+    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'})
+        },
+        u'hdabo.author': {
+            'Meta': {'object_name': 'Author'},
+            'firstname': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'hda_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'lastname': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'})
+        },
+        u'hdabo.datasheet': {
+            'Meta': {'object_name': 'Datasheet'},
+            'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Author']", 'null': 'True', 'blank': 'True'}),
+            'college_periods': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'college_periods_datasheets'", 'symmetrical': 'False', 'through': u"orm['hdabo.Datasheet_college_periods']", 'to': u"orm['hdabo.TimePeriod']"}),
+            'college_themes': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'college_themes_datasheets'", 'symmetrical': 'False', 'through': u"orm['hdabo.Datasheet_college_themes']", 'to': u"orm['hdabo.Domain']"}),
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'domains': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'datasheets'", 'symmetrical': 'False', 'through': u"orm['hdabo.Datasheet_domains']", 'to': u"orm['hdabo.Domain']"}),
+            'format': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.DocumentFormat']", 'null': 'True', 'blank': 'True'}),
+            'hda_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}),
+            'highschool_periods': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'highschool_periods_datasheets'", 'symmetrical': 'False', 'through': u"orm['hdabo.Datasheet_highschool_periods']", 'to': u"orm['hdabo.TimePeriod']"}),
+            'highschool_themes': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'highschool_themes_datasheets'", 'symmetrical': 'False', 'through': u"orm['hdabo.Datasheet_highschool_themes']", 'to': u"orm['hdabo.Domain']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'manual_order': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
+            'modification_datetime': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'organisation': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Organisation']", 'null': 'True'}),
+            'original_creation_date': ('django.db.models.fields.DateField', [], {}),
+            'original_modification_date': ('django.db.models.fields.DateField', [], {}),
+            'primary_periods': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'primary_periods_datasheets'", 'symmetrical': 'False', 'through': u"orm['hdabo.Datasheet_primary_periods']", 'to': u"orm['hdabo.TimePeriod']"}),
+            'primary_themes': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'primary_themes_datasheets'", 'symmetrical': 'False', 'through': u"orm['hdabo.Datasheet_primary_themes']", 'to': u"orm['hdabo.Domain']"}),
+            'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['hdabo.Tag']", 'through': u"orm['hdabo.TaggedSheet']", 'symmetrical': 'False'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '2048'}),
+            'town': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Location']", 'null': 'True', 'blank': 'True'}),
+            'url': ('django.db.models.fields.URLField', [], {'max_length': '2048', 'null': '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': u"orm['hdabo.User']", 'null': 'True', 'blank': 'True'})
+        },
+        u'hdabo.datasheet_college_periods': {
+            'Meta': {'ordering': "['sort_value']", 'object_name': 'Datasheet_college_periods'},
+            'datasheet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Datasheet']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'sort_value': ('django.db.models.fields.IntegerField', [], {}),
+            'timeperiod': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.TimePeriod']"})
+        },
+        u'hdabo.datasheet_college_themes': {
+            'Meta': {'ordering': "['sort_value']", 'object_name': 'Datasheet_college_themes'},
+            'datasheet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Datasheet']"}),
+            'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Domain']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'sort_value': ('django.db.models.fields.IntegerField', [], {})
+        },
+        u'hdabo.datasheet_domains': {
+            'Meta': {'ordering': "['sort_value']", 'object_name': 'Datasheet_domains'},
+            'datasheet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Datasheet']"}),
+            'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Domain']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'sort_value': ('django.db.models.fields.IntegerField', [], {})
+        },
+        u'hdabo.datasheet_highschool_periods': {
+            'Meta': {'ordering': "['sort_value']", 'object_name': 'Datasheet_highschool_periods'},
+            'datasheet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Datasheet']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'sort_value': ('django.db.models.fields.IntegerField', [], {}),
+            'timeperiod': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.TimePeriod']"})
+        },
+        u'hdabo.datasheet_highschool_themes': {
+            'Meta': {'ordering': "['sort_value']", 'object_name': 'Datasheet_highschool_themes'},
+            'datasheet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Datasheet']"}),
+            'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Domain']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'sort_value': ('django.db.models.fields.IntegerField', [], {})
+        },
+        u'hdabo.datasheet_primary_periods': {
+            'Meta': {'ordering': "['sort_value']", 'object_name': 'Datasheet_primary_periods'},
+            'datasheet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Datasheet']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'sort_value': ('django.db.models.fields.IntegerField', [], {}),
+            'timeperiod': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.TimePeriod']"})
+        },
+        u'hdabo.datasheet_primary_themes': {
+            'Meta': {'ordering': "['sort_value']", 'object_name': 'Datasheet_primary_themes'},
+            'datasheet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Datasheet']"}),
+            'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Domain']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'sort_value': ('django.db.models.fields.IntegerField', [], {})
+        },
+        u'hdabo.documentformat': {
+            'Meta': {'object_name': 'DocumentFormat'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'})
+        },
+        u'hdabo.domain': {
+            'Meta': {'unique_together': "(('label', 'school_period'),)", 'object_name': 'Domain'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
+            'natural_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}),
+            'school_period': ('django.db.models.fields.IntegerField', [], {})
+        },
+        u'hdabo.location': {
+            'Meta': {'object_name': 'Location'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'insee': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '5'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '512'})
+        },
+        u'hdabo.organisation': {
+            'Meta': {'object_name': 'Organisation'},
+            'hda_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'location': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
+            'website': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'})
+        },
+        u'hdabo.tag': {
+            'Meta': {'unique_together': "(('label', 'original_label', 'url_status'),)", 'object_name': 'Tag'},
+            'alias': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            'alternative_label': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+            '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'}),
+            'category': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.TagCategory']", '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'}),
+            'natural_key': ('django.db.models.fields.CharField', [], {'max_length': '7168', 'db_index': 'True'}),
+            'normalized_label': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'db_index': 'True'}),
+            'original_label': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'popularity': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}),
+            'url_status': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
+            'wikipedia_pageid': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+            'wikipedia_url': ('django.db.models.fields.URLField', [], {'db_index': 'True', 'max_length': '2048', 'null': 'True', 'blank': 'True'})
+        },
+        u'hdabo.tagcategory': {
+            'Meta': {'object_name': 'TagCategory'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}),
+            'natural_key': ('django.db.models.fields.CharField', [], {'max_length': '512', 'db_index': 'True'})
+        },
+        u'hdabo.taggedsheet': {
+            'Meta': {'object_name': 'TaggedSheet'},
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'datasheet': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Datasheet']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'index_note': ('django.db.models.fields.FloatField', [], {'default': '0.0', 'db_index': 'True'}),
+            'order': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}),
+            'original_order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'tag': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.Tag']"}),
+            'wikipedia_revision_id': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'})
+        },
+        u'hdabo.timeperiod': {
+            'Meta': {'unique_together': "(('label', 'school_period'),)", 'object_name': 'TimePeriod'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
+            'natural_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}),
+            'school_period': ('django.db.models.fields.IntegerField', [], {})
+        },
+        u'hdabo.user': {
+            'Meta': {'object_name': 'User', 'db_table': "'auth_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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+            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'}),
+            '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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'hdalab.country': {
+            'Meta': {'object_name': 'Country'},
+            'dbpedia_uri': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        },
+        'hdalab.datasheetextras': {
+            'Meta': {'object_name': 'DatasheetExtras'},
+            'datasheet': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'extras'", 'unique': 'True', 'to': u"orm['hdabo.Datasheet']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'insee': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['hdalab.InseeCoords']", 'null': 'True', 'blank': 'True'})
+        },
+        'hdalab.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'}),
+            'tag': ('hdalab.fields.OneToOneField', [], {'related_name': "'dbpedia_fields'", 'unique': 'True', 'related_default': None, 'to': u"orm['hdabo.Tag']"}),
+            'thumbnail': ('django.db.models.fields.URLField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'})
+        },
+        'hdalab.dbpediafieldstranslation': {
+            'Meta': {'unique_together': "(('master', 'language_code'),)", 'object_name': 'DbpediaFieldsTranslation'},
+            'abstract': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_abstract_translated': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_label_translated': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}),
+            'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
+            'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'to': "orm['hdalab.DbpediaFields']"})
+        },
+        'hdalab.geoinclusion': {
+            'Meta': {'object_name': 'GeoInclusion'},
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'includes'", 'to': "orm['hdalab.Country']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'tag': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'locatedin'", 'unique': 'True', 'to': u"orm['hdabo.Tag']"})
+        },
+        'hdalab.hdalabrenkan': {
+            'Meta': {'object_name': 'HdalabRenkan'},
+            'favorite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'renkan': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['renkanmanager.Renkan']"}),
+            'state': ('django.db.models.fields.IntegerField', [], {'default': '1'})
+        },
+        'hdalab.hdalabrenkanstatetransition': {
+            'Meta': {'object_name': 'HdalabRenkanStateTransition'},
+            'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.User']"}),
+            'from_state': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'renkan': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['hdalab.HdalabRenkan']"}),
+            'to_state': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+            'ts': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'})
+        },
+        'hdalab.hdasession': {
+            'Meta': {'object_name': 'HdaSession'},
+            'data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'sessionid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36', 'db_index': 'True'})
+        },
+        'hdalab.infoboxparameter': {
+            'Meta': {'unique_together': "(('tag_infobox', 'param_name'),)", 'object_name': 'InfoboxParameter'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'param_name': ('django.db.models.fields.CharField', [], {'max_length': '2048'}),
+            'param_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'tag_infobox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['hdalab.TagInfobox']"})
+        },
+        'hdalab.inseecoords': {
+            'Meta': {'object_name': 'InseeCoords'},
+            'city_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'insee': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'latitude': ('django.db.models.fields.FloatField', [], {}),
+            'longitude': ('django.db.models.fields.FloatField', [], {})
+        },
+        'hdalab.taginfobox': {
+            'Meta': {'unique_together': "(('tag', 'name', 'revision_id'),)", 'object_name': 'TagInfobox'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '2048'}),
+            'revision_id': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'source': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'infoboxes'", 'to': u"orm['hdabo.Tag']"})
+        },
+        'hdalab.taglinks': {
+            'Meta': {'object_name': 'TagLinks'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'object': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taglinks_objects'", 'to': u"orm['hdabo.Tag']"}),
+            'subject': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taglinks_subjects'", 'to': u"orm['hdabo.Tag']"})
+        },
+        'hdalab.tagwpcategory': {
+            'Meta': {'unique_together': "(('tag', 'wp_category', 'hidden'),)", 'object_name': 'TagWpCategory'},
+            'hidden': ('django.db.models.fields.BooleanField', [], {}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'wp_categories'", 'to': u"orm['hdabo.Tag']"}),
+            'wp_category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'to': "orm['hdalab.WpCategory']"})
+        },
+        'hdalab.tagyears': {
+            'Meta': {'object_name': 'TagYears'},
+            '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'}),
+            'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'years'", 'unique': 'True', 'to': u"orm['hdabo.Tag']"})
+        },
+        'hdalab.wpcategory': {
+            'Meta': {'object_name': 'WpCategory'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '2048'})
+        },
+        'hdalab.wpcategoryinclusion': {
+            'Meta': {'unique_together': "(('parent_category', 'child_category'),)", 'object_name': 'WpCategoryInclusion'},
+            'child_category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parent_categories'", 'to': "orm['hdalab.WpCategory']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'parent_category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'child_categories'", 'to': "orm['hdalab.WpCategory']"})
+        },
+        'renkanmanager.renkan': {
+            'Meta': {'object_name': 'Renkan'},
+            'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'image': ('django.db.models.fields.files.ImageField', [], {'default': "'thumbnails/renkan/renkan_default_icon.png'", 'max_length': '100'}),
+            'modification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['hdabo.User']", 'null': 'True', 'blank': 'True'}),
+            'rk_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '1024'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'})
+        }
+    }
+
+    complete_apps = ['hdalab']
\ No newline at end of file
--- a/src/hdalab/models/renkan.py	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/models/renkan.py	Wed Mar 04 15:24:23 2015 +0100
@@ -42,6 +42,7 @@
     
     renkan = models.ForeignKey(Renkan, blank=False, null=False)
     state = models.IntegerField(choices=STATE_CHOICES, default=1)
+    favorite = models.BooleanField(null=False, blank=False, default=False)
     
     class Meta:
         app_label = 'hdalab'
--- a/src/hdalab/static/hdalab/css/footer.css	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/static/hdalab/css/footer.css	Wed Mar 04 15:24:23 2015 +0100
@@ -44,7 +44,7 @@
 #innerfooter {
 	margin: auto;
 	background-color: rgb(181, 186, 186);
-	height: 150px;
+	height: 175px;
 	width: 1280px;
 	text-align: center;
 }
--- a/src/hdalab/static/hdalab/css/profile.css	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/static/hdalab/css/profile.css	Wed Mar 04 15:24:23 2015 +0100
@@ -94,4 +94,16 @@
 .sub-content {
   padding: 20px 0;
   border-top: 1px solid #b0b0b0;
-}
\ No newline at end of file
+}
+
+#new-renkan-button {
+  float: none;
+  color: #7CB0BD;
+  font-size: 16px;
+  margin: 10px 10px 0px;
+}
+
+#new-renkan-button:hover {
+  color: #28292D;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hdalab/static/hdalab/js/manage.js	Wed Mar 04 15:24:23 2015 +0100
@@ -0,0 +1,17 @@
+"use strict";
+
+$(document).ready(function() {
+
+    $(".favorite-checkbox").click(function(e) {
+        var chkbox = $(e.target);
+        var form = $(e.target).parents('form')[0];
+        $.post($(form).attr('action'), $(form).serialize(), function(data) {
+            if(chkbox.prop('checked') !== data.renkan.favorite) {
+                chkbox.prop('checked', data.renkan.favorite);
+            }
+        }).fail(function() {
+            chkbox.prop('checked', !chkbox.prop('checked'));
+        });
+        
+    });
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hdalab/static/hdalab/js/renkan-search.js	Wed Mar 04 15:24:23 2015 +0100
@@ -0,0 +1,38 @@
+"use strict";
+
+function setFavorite(val) {
+    var chkbx = $("#filter-favorite-chkbx");
+    chkbx.val(val);
+    $("#filter-favorite").val(val);
+    if(val === 0) {
+        chkbx.prop('indeterminate', false);
+        chkbx.prop('checked', false);
+    }
+    else if (val === 1) {
+        chkbx.prop('indeterminate', false);
+        chkbx.prop('checked', true);
+    }
+    else if (val === 2) {
+        chkbx.prop('indeterminate', true);
+        chkbx.prop('checked', true);
+    }
+}
+
+function initSearch(favorite) {
+    $(document).ready(function() {
+
+        $("#toggle-search").click(function(){
+            $("#advanced-form").toggle();
+        });
+        $(".date").datepicker({ dateFormat: 'yy-mm-dd' });
+
+        setFavorite(favorite);
+
+        $("#filter-favorite-chkbx").click(function (e) {
+            var chkbx = $(e.target);
+            // value must be in 0 (undefined), 1 (true), 2 (false)
+            var val = ($("#filter-favorite").val()+1)%3;
+            setFavorite(val);
+        });
+    });
+}
--- a/src/hdalab/templates/base.html	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/templates/base.html	Wed Mar 04 15:24:23 2015 +0100
@@ -92,6 +92,7 @@
                         <li><a href="{% url 'categories' %}">{% trans 'Domaines Artistiques' %}</a></li>
                         <li><a href="{% url 'thesaurus' %}">{% trans 'Thésaurus' %}</a></li>
                         <li><a href="{% url 'renkan_public_list' %}">Renkan</a></li>
+                        <li><a href="{% url 'renkan_favorite_list' %}">{% trans 'Renkan repères' %}</a></li>
                         <li><a href="{% url 'a_propos' %}">{% trans 'A Propos' %}</a></li>
                         <li><a href="http://www.histoiredesarts.culture.fr/" target="_blank">Histoire des Arts</a></li>
                     </ul>
--- a/src/hdalab/templates/editorial/manage_renkans.html	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/templates/editorial/manage_renkans.html	Wed Mar 04 15:24:23 2015 +0100
@@ -16,13 +16,11 @@
 {% block js_import %}
 {{block.super}}
 <script src="{% static 'hdalab/lib/jquery-ui-1.10.4.min.js' %}"></script>
+<script src="{% static 'hdalab/js/manage.js' %}"></script>
+<script src="{% static 'hdalab/js/renkan-search.js' %}"></script>
 <script type="text/javascript">
-    $(document).ready(function() {
-        $("#toggle-search").click(function(){
-            $("#advanced-form").toggle();
-        });
-        $(".date").datepicker({ dateFormat: 'yy-mm-dd' });
-    });
+    var favorite = {{favorite}};
+    initSearch(favorite);
 </script>
 {% endblock %}
 
@@ -43,6 +41,7 @@
             <option value="4"{% if state == '4' %} selected="selected"{% endif %}>{% trans 'Rejected' %}</option>
         </select>
       </p>
+      <p>{% trans 'Favorite' %} : <input type="checkbox" id="filter-favorite-chkbx" {% if favorite >= 1 %} checked="checked" {% endif %} value="{{favorite}}" /><input type="hidden" id="filter-favorite" name="favorite" value="{{favorite}}"/></p>
       <p><input type="submit" value="{% trans 'Search' %}"/></p>
     </form>
     <table id="rk-table">
@@ -50,6 +49,8 @@
         <tr class="border_bottom">
           <th><a class="" href="?sort=title&order={% if sort_param == 'title' %}{{ opposite }}{% else %}asc{% endif %}{{ filters }}">{% trans 'Title' %}</a>
               {% if sort_param == 'title' %}<span class="ui-icon {% if opposite == 'asc' %}ui-icon-triangle-1-s{% else %}ui-icon-triangle-1-n{% endif %}"></span>{% endif %}</th>
+          <th><a href="?sort=favorite&order={% if sort_param == 'favorite' %}{{ opposite }}{% else %}desc{% endif %}{{ filters }}">{% trans 'Fav.' %}</a>
+              {% if sort_param == 'favorite' %}<span class="ui-icon {% if opposite == 'asc' %}ui-icon-triangle-1-s{% else %}ui-icon-triangle-1-n{% endif %}"></span>{% endif %}</th>
           <th><a href="?sort=user&order={% if sort_param == 'user' %}{{ opposite }}{% else %}desc{% endif %}{{ filters }}">{% trans 'User' %}</a>
               {% if sort_param == 'user' %}<span class="ui-icon {% if opposite == 'asc' %}ui-icon-triangle-1-s{% else %}ui-icon-triangle-1-n{% endif %}"></span>{% endif %}</th>
           <th><a href="?sort=date&order={% if sort_param == 'date' %}{{ opposite }}{% else %}desc{% endif %}{{ filters }}">{% trans 'Modification date' %}</a>
@@ -65,6 +66,7 @@
        {% with hr.renkan as r %}
         <tr class="border_bottom">
             <td><a title="View renkan" href="{% url 'renkan_view' %}?rk_id={{ r.rk_id }}">{{ r.title }}</a></td>
+            <td><form action="{% url 'renkan_favorite' rk_id=r.rk_id %}" method="post">{% csrf_token %}<input class='favorite-checkbox' type='checkbox' name='favorite' value='{{hr.id}}' {% if hr.favorite %} checked='checked'{% endif %}></form></td>
             <td>{{ r.owner.username }}</td>
             <td>{{ r.modification_date|date:"Y-m-d H:i" }}</td>
             <td>{% thumbnail r.image 100x100 as thumb %}<img src="{{ thumb.url }}" width="{{ thumb.width }}" height="{{ thumb.height }}" /></td>
--- a/src/hdalab/templates/profile_home.html	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/templates/profile_home.html	Wed Mar 04 15:24:23 2015 +0100
@@ -18,13 +18,10 @@
 {% block js_import %}
 {{block.super}}
 <script src="{% static 'hdalab/lib/jquery-ui-1.10.4.min.js' %}"></script>
+<script src="{% static 'hdalab/js/renkan-search.js' %}"></script>
 <script type="text/javascript">
-    $(document).ready(function() {
-        $("#toggle-search").click(function(){
-            $("#advanced-form").toggle();
-        });
-        $(".date").datepicker({ dateFormat: 'yy-mm-dd' });
-    });
+    var favorite = {{favorite}};
+    initSearch(favorite);
 </script>
 {% endblock %}
 
@@ -51,9 +48,10 @@
        </div>
     <div class="sub-content">
         <h2>/ {% trans 'Gerer mes Renkan' %}</h2>
-        <p>
-            <a href="{% url 'renkan_new' %}">{% trans 'Nouveau Renkan' %}</a>
-           </p>
+        <form action="{% url 'renkan_new' %}" method="post">
+            {% csrf_token %}
+            <button id="new-renkan-button" title="{% trans 'Nouveau Renkan' %}" class="renkan-basic-action"><div id="new-renkan">{% trans 'Nouveau Renkan' %}</div></button>
+        </form>
         <p class="inline">{% if page.has_previous %}<a href="?page={{ page.previous_page_number }}&sort={{ sort_param }}&order={{ order_param }}{{ filters }}" >{% trans 'Previous' %}</a>{% endif %}
            {% if page.has_previous and page.has_next %} - {% endif %}{% if page.has_next %}<a href="?page={{ page.next_page_number }}&sort={{ sort_param }}&order={{ order_param }}{{ filters }}">{% trans 'Next' %}</a>{% endif %}</p>
         <form class="inline"><p>{% if page.has_previous or page.has_next %} - {% endif %}{% trans 'Filter' %} : <input type="text" name="title" value="{{ title }}"/> - <span class="hand_cursor" id="toggle-search">{% trans 'Advanced search' %}</span></p></p></form>
@@ -70,6 +68,7 @@
                 <option value="4"{% if state == '4' %} selected="selected"{% endif %}>{% trans 'Rejected' %}</option>
             </select>
           </p>
+          <p>{% trans 'Favorite' %} : <input type="checkbox" id="filter-favorite-chkbx" {% if favorite >= 1 %} checked="checked" {% endif %} value="{{favorite}}" /><input type="hidden" id="filter-favorite" name="favorite" value="{{favorite}}"/></p>
           <p><input type="submit" value="{% trans 'Search' %}"/></p>
         </form>
         <table id="rk-table">
@@ -77,6 +76,8 @@
             <tr class="border_bottom">
               <th><a href="?sort=title&order={% if sort_param == 'title' %}{{ opposite }}{% else %}asc{% endif %}{{ filters }}">{% trans 'Title' %}</a>
                   {% if sort_param == 'title' %}<span class="ui-icon {% if opposite == 'asc' %}ui-icon-triangle-1-s{% else %}ui-icon-triangle-1-n{% endif %}"></span>{% endif %}</th>
+              <th><a href="?sort=favorite&order={% if sort_param == 'favorite' %}{{ opposite }}{% else %}desc{% endif %}{{ filters }}">{% trans 'Fav.' %}</a>
+                  {% if sort_param == 'favorite' %}<span class="ui-icon {% if opposite == 'asc' %}ui-icon-triangle-1-s{% else %}ui-icon-triangle-1-n{% endif %}"></span>{% endif %}</th>
               <th><a href="?sort=date&order={% if sort_param == 'date' %}{{ opposite }}{% else %}desc{% endif %}{{ filters }}">{% trans 'Modification date' %}</a>
                   {% if sort_param == 'date' %}<span class="ui-icon {% if opposite == 'asc' %}ui-icon-triangle-1-s{% else %}ui-icon-triangle-1-n{% endif %}"></span>{% endif %}</th>
               <th>{% trans 'Preview' %}</th>
@@ -90,6 +91,7 @@
            {% with hr.renkan as r %}
             <tr class="border_bottom">
                 <td><a title="View renkan" href="{% url 'renkan_view' %}?rk_id={{ r.rk_id }}">{{ r.title }}</a></td>
+                <td>{% if hr.favorite %}✓{% else %}&nbsp;{% endif %}</td>
                 <td>{{ r.modification_date|date:"Y-m-d H:i" }}</td>
                 <td>{% thumbnail r.image 100x100 as thumb %}<img src="{{ thumb.url }}" width="{{ thumb.width }}" height="{{ thumb.height }}" /></td>
                 <td>{{ hr.state|state_to_str }}</td>
--- a/src/hdalab/templates/renkan_list.html	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/templates/renkan_list.html	Wed Mar 04 15:24:23 2015 +0100
@@ -12,18 +12,15 @@
     <link rel="stylesheet" type="text/css" href="{% static 'hdalab/css/profile.css' %}" />
 {% endblock %}
 
-{% block renkans_actif %}actif{% endblock %}
+{% block renkans_actif %}{% if not hide_favorite %}actif{% endif %}{% endblock %}
 
 {% block js_import %}
 {{block.super}}
 <script src="{% static 'hdalab/lib/jquery-ui-1.10.4.min.js' %}"></script>
+<script src="{% static 'hdalab/js/renkan-search.js' %}"></script>
 <script type="text/javascript">
-    $(document).ready(function() {
-        $("#toggle-search").click(function(){
-            $("#advanced-form").toggle();
-        });
-        $(".date").datepicker({ dateFormat: 'yy-mm-dd' });
-    });
+    var favorite = {{favorite}};
+    initSearch(favorite);
 </script>
 {% endblock %}
 
@@ -40,6 +37,9 @@
       <p>{% trans 'Modification date' %} : {% trans 'begin' %} <input type="text" name="startdate" value="{{ startdate }}" class="date" /> -
                                            {% trans 'end' %} : <input type="text" name="enddate" value="{{ enddate }}" class="date" /></p>
       <p>{% trans 'Username' %} : <input type="text" name="username" value="{{ username }}"/></p>
+      {% if not hide_favorite %}
+      <p>{% trans 'Favorite' %} : <input type="checkbox" id="filter-favorite-chkbx" {% if favorite >= 1 %} checked="checked" {% endif %} value="{{favorite}}" /><input type="hidden" id="filter-favorite" name="favorite" value="{{favorite}}"/></p>
+      {% endif %}
       <p><input type="submit" value="{% trans 'Search' %}"/></p>
     </form>
     <table id="rk-table">
@@ -47,6 +47,10 @@
         <tr class="border_bottom">
           <th><a class="" href="?sort=title&order={% if sort_param == 'title' %}{{ opposite }}{% else %}asc{% endif %}{{ filters }}">{% trans 'Title' %}</a>
               {% if sort_param == 'title' %}<span class="ui-icon {% if opposite == 'asc' %}ui-icon-triangle-1-s{% else %}ui-icon-triangle-1-n{% endif %}"></span>{% endif %}</th>
+          {% if not hide_favorite %}
+          <th><a href="?sort=favorite&order={% if sort_param == 'favorite' %}{{ opposite }}{% else %}desc{% endif %}{{ filters }}">{% trans 'Fav.' %}</a>
+              {% if sort_param == 'favorite' %}<span class="ui-icon {% if opposite == 'asc' %}ui-icon-triangle-1-s{% else %}ui-icon-triangle-1-n{% endif %}"></span>{% endif %}</th>
+          {% endif %}
           <th><a href="?sort=user&order={% if sort_param == 'user' %}{{ opposite }}{% else %}desc{% endif %}{{ filters }}">{% trans 'User' %}</a>
               {% if sort_param == 'user' %}<span class="ui-icon {% if opposite == 'asc' %}ui-icon-triangle-1-s{% else %}ui-icon-triangle-1-n{% endif %}"></span>{% endif %}</th>
           <th><a href="?sort=date&order={% if sort_param == 'date' %}{{ opposite }}{% else %}desc{% endif %}{{ filters }}">{% trans 'Modification date' %}</a>
@@ -58,6 +62,9 @@
        {% with hr.renkan as r %}
         <tr class="border_bottom">
             <td><a title="View renkan" href="{% url 'renkan_view' %}?rk_id={{ r.rk_id }}">{{ r.title }}</a></td>
+            {% if not hide_favorite %}
+            <td>{% if hr.favorite %}✓{% else %}&nbsp;{% endif %}</td>
+            {% endif %}
             <td>{{ r.owner.username }}</td>
             <td>{{ r.modification_date|date:"Y-m-d H:i" }}</td>
             <td>{% thumbnail r.image 100x100 as thumb %}<img src="{{ thumb.url }}" width="{{ thumb.width }}" height="{{ thumb.height }}" /></td>
--- a/src/hdalab/urls.py	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/urls.py	Wed Mar 04 15:24:23 2015 +0100
@@ -3,7 +3,7 @@
 from django.views.generic import TemplateView
 from hdalab.views.profile import ProfileHome, RenkanEdit, HdalabRenkanGetPut,\
     RenkanNew, RenkanPublicList, HdalabRenkanCopy, HdalabRenkanDelete,\
-    HdalabRenkanModerate
+    HdalabRenkanModerate, HdalabRenkanFavorite, RenkanFavoriteList
 from django.contrib.auth.decorators import login_required
 from django.contrib.admin.views.decorators import staff_member_required
 from hdalab.views.editorial import HdalabFolders, HdalabAddOrUpdateFolder,\
@@ -40,12 +40,13 @@
     url(r'^renkan/edit/$', RenkanEdit.as_view(), name='renkan_edit'),
     url(r'^renkan/getput/$', HdalabRenkanGetPut.as_view(), name='renkan_get_put'),
     url(r'^renkan/view/$', TemplateView.as_view(template_name="renkan_view.html"), name='renkan_view'),
-    url(r'^renkan/copy/(?P<rk_id>.*)$', login_required(HdalabRenkanCopy.as_view()), name='renkan_copy'),
-    url(r'^renkan/delete/(?P<rk_id>.*)$', login_required(HdalabRenkanDelete.as_view()), name='renkan_delete'),
-    #url(r'^renkan/moderate/(?P<rk_id>.*)/(?P<state>.*)$', login_required(HdalabRenkanModerate.as_view()), name='renkan_moderate'),
-    url(r'^renkan/moderate/(?P<rk_id>.*)$', login_required(HdalabRenkanModerate.as_view()), name='renkan_moderate'),
+    url(r'^renkan/copy/(?P<rk_id>.+)$', login_required(HdalabRenkanCopy.as_view()), name='renkan_copy'),
+    url(r'^renkan/delete/(?P<rk_id>.+)$', login_required(HdalabRenkanDelete.as_view()), name='renkan_delete'),
+    url(r'^renkan/moderate/(?P<rk_id>.+)$', login_required(HdalabRenkanModerate.as_view()), name='renkan_moderate'),
+    url(r'^renkan/favorite/(?P<rk_id>.+)$', login_required(HdalabRenkanFavorite.as_view()), name='renkan_favorite'),
     url(r'^profile/$', login_required(ProfileHome.as_view()), name='profile_home'),
     url(r'^renkan/public/$', RenkanPublicList.as_view(), name='renkan_public_list'),
+    url(r'^renkan/favorite/$', RenkanFavoriteList.as_view(), name='renkan_favorite_list'),
     url(r'^ajaxlogin/$', "hdalab.views.profile.ajax_login", name='ajax_login'),
     url(r'^ajaxloginok/$', TemplateView.as_view(template_name="ajax_identification/ajax_login_ok.html"), name='ajax_login_ok'),
     url(r'^edito/$', staff_member_required(TemplateView.as_view(template_name="editorial/edito_home.html")), name='edito_home'),
--- a/src/hdalab/views/editorial.py	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/views/editorial.py	Wed Mar 04 15:24:23 2015 +0100
@@ -5,11 +5,13 @@
 @author: tc
 '''
 
+import logging
+
+from hdabo.views import Folders, AddOrUpdateFolder, DeleteFolder
 from hdalab.models.renkan import HdalabRenkan
-from hdabo.views import Folders, AddOrUpdateFolder, DeleteFolder
 from hdalab.views.profile import BaseRenkanList
 
-import logging
+
 logger = logging.getLogger(__name__)
 
 
@@ -30,6 +32,5 @@
     redirect_view = 'hdalab_folders'
 
 
-
 class HdalabDeleteFolder(DeleteFolder):
     redirect_view = 'hdalab_folders'
\ No newline at end of file
--- a/src/hdalab/views/profile.py	Tue Mar 03 14:03:38 2015 +0100
+++ b/src/hdalab/views/profile.py	Wed Mar 04 15:24:23 2015 +0100
@@ -6,6 +6,14 @@
 '''
 
 from datetime import datetime
+import json
+import logging
+from renkanmanager.models import Renkan
+from renkanmanager.utils import LineNodePlacer, HorLineNodePlacer, renkan_copier, renkan_deleter, \
+    CircleNodePlacer
+from renkanmanager.views import RenkanGetPut
+import uuid
+
 from django.conf import settings
 from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login
 from django.contrib.auth.forms import AuthenticationForm
@@ -26,22 +34,15 @@
 from django.views.decorators.csrf import csrf_exempt, csrf_protect
 from django.views.decorators.debug import sensitive_post_parameters
 from django.views.generic import TemplateView, View
+
 from hdabo.models import Tag, Datasheet, TaggedSheet, Folder
+from hdalab.forms import HdalabRenkanStateForm, HdalabRenkanFavoriteForm
 from hdalab.models.dataviz import DbpediaFieldsTranslation
 from hdalab.models.renkan import HdalabRenkan
+from hdalab.services import change_renkan_state
 from hdalab.views.ajax import filter_generic
-from renkanmanager.models import Renkan
-from renkanmanager.utils import LineNodePlacer, HorLineNodePlacer, renkan_copier, renkan_deleter,\
-    CircleNodePlacer
-from renkanmanager.views import RenkanGetPut
-import json
-import uuid
 
-import logging
-from django.views.generic.edit import ModelFormMixin
-from hdalab.forms import HdalabRenkanStateForm
-from django.contrib.admin.models import CHANGE
-from hdalab.services import change_renkan_state
+
 logger = logging.getLogger(__name__)
 
 
@@ -75,19 +76,23 @@
         if filter_enddate!="":
             renkan_queryset = renkan_queryset.filter(renkan__modification_date__lt=filter_enddate + " 23:59:59")
             filters += "&enddate=" + filter_enddate
-        
-        
+        filter_favorite = int(self.request.GET.get('favorite', "2"))
+        if filter_favorite == 1:
+            renkan_queryset = renkan_queryset.filter(favorite=True)
+        elif filter_favorite == 0:
+            renkan_queryset = renkan_queryset.filter(favorite=False)
+
         sort_param = self.request.GET.get('sort', "date")
         order_param = self.request.GET.get('order', "desc")
-        sort = {"date":"renkan__modification_date", "title":"renkan__title", "state":"state", "user":"renkan__owner__username"}.get(sort_param)
+        sort = {"date":"renkan__modification_date", "title":"renkan__title", "state":"state", "user":"renkan__owner__username", "favorite":"favorite"}.get(sort_param, None)
         if order_param=="desc":
             order = "-"
             opposite = "asc"
         else:
             order = ""
             opposite = "desc"
-        
-        renkan_queryset = renkan_queryset.order_by(order + sort)
+        if sort:
+            renkan_queryset = renkan_queryset.order_by(order + sort)
         p = Paginator(renkan_queryset, settings.RENKANS_PER_PAGE)
         page_nb = self.request.GET.get('page')
         try:
@@ -99,7 +104,7 @@
         
         context.update({"page": page, "sort_param":sort_param, "order_param":order_param, "opposite":opposite, 
                         "filters":filters, "title": filter_title, "username": filter_username, "state": filter_state,
-                        "startdate":filter_startdate, "enddate":filter_enddate})
+                        "startdate":filter_startdate, "enddate":filter_enddate, "favorite": filter_favorite})
         
         return context
 
@@ -121,11 +126,19 @@
         return self.update_context( super(RenkanPublicList, self).get_context_data(**kwargs), HdalabRenkan.objects.select_related("renkan", "renkan__owner").filter(state=HdalabRenkan.PUBLISHED) )
 
 
-#TODO  transform in post
+class RenkanFavoriteList(BaseRenkanList):
+    
+    template_name = "renkan_list.html"
+    
+    def get_context_data(self, **kwargs):
+        context = super(BaseRenkanList, self).get_context_data(**kwargs)
+        context['hide_favorite'] = True
+        return self.update_context(context , HdalabRenkan.objects.select_related("renkan", "renkan__owner").filter(state=HdalabRenkan.PUBLISHED, favorite=True) )
+
+
 class RenkanNew(View):
     
-    def get(self, request):
-        
+    def post(self, request):
         rk = Renkan()
         rk_id = unicode(uuid.uuid1())
         rk.rk_id = rk_id
@@ -140,7 +153,6 @@
         return redirect("%s?rk_id=%s" % (reverse('renkan_edit'), rk_id))
 
 
-
 class RenkanEdit(TemplateView):
     
     template_name="renkan_edit.html"
@@ -648,13 +660,13 @@
         return redirect(reverse('profile_home'))
 
 
-class HdalabRenkanModerate(View, ModelFormMixin):
+class HdalabRenkanModerate(View):
     
     def post(self, request, rk_id):
         form = HdalabRenkanStateForm(request.POST)
         if form.is_valid():
             logger.debug("FORM DATA %r", form.cleaned_data)
-            renkan_hda =  get_object_or_404(HdalabRenkan, renkan__rk_id=rk_id)
+            renkan_hda =  get_object_or_404(HdalabRenkan.objects.select_related(), renkan__rk_id=rk_id)
             change_renkan_state(renkan_hda, form.cleaned_data['state'], form.cleaned_data['message'], request.user)
             next_url = form.cleaned_data.get('next', None)
             if next_url:
@@ -665,6 +677,18 @@
             logger.debug("FORM INVALID %r : %r", request.POST, form.errors)
             return HttpResponseBadRequest("State form invalid")
 
+class HdalabRenkanFavorite(View):
+    
+    def post(self, request, rk_id):
+        form = HdalabRenkanFavoriteForm(request.POST)
+        if form.is_valid():
+            renkan_hda =  get_object_or_404(HdalabRenkan.objects.select_related(), renkan__rk_id=rk_id)
+            renkan_hda.favorite = form.cleaned_data['favorite']
+            renkan_hda.save()
+            return HttpResponse(
+                json.dumps({'status': 'ok', 'renkan': {'rk_id': renkan_hda.renkan.rk_id, 'favorite': renkan_hda.favorite}}),
+                content_type="application/json"
+            )
 
 
 # Function copied from django.contrib.auth.views to simplify ajax login
@@ -707,4 +731,3 @@
         context.update(extra_context)
     return TemplateResponse(request, template_name, context,
                             current_app=current_app)
-    
\ No newline at end of file