# HG changeset patch # User ymh # Date 1425479063 -3600 # Node ID f469ab22542de0cd41c2b4e4936adece742b9a9c # Parent 6575b9f536017fcad29e848411ae8ae023a36532 add favorite management diff -r 6575b9f53601 -r f469ab22542d .settings/org.eclipse.core.resources.prefs --- 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 diff -r 6575b9f53601 -r f469ab22542d src/hdalab/forms.py --- 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'] diff -r 6575b9f53601 -r f469ab22542d src/hdalab/migrations/0014_auto__add_hdalabrenkanstatetransition__chg_field_dbpediafields_tag.py --- 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): diff -r 6575b9f53601 -r f469ab22542d src/hdalab/migrations/0015_auto__add_field_hdalabrenkan_favorite.py --- /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 diff -r 6575b9f53601 -r f469ab22542d src/hdalab/models/renkan.py --- 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' diff -r 6575b9f53601 -r f469ab22542d src/hdalab/static/hdalab/css/footer.css --- 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; } diff -r 6575b9f53601 -r f469ab22542d src/hdalab/static/hdalab/css/profile.css --- 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; +} + diff -r 6575b9f53601 -r f469ab22542d src/hdalab/static/hdalab/js/manage.js --- /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')); + }); + + }); +}); diff -r 6575b9f53601 -r f469ab22542d src/hdalab/static/hdalab/js/renkan-search.js --- /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); + }); + }); +} diff -r 6575b9f53601 -r f469ab22542d src/hdalab/templates/base.html --- 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 @@
  • {% trans 'Domaines Artistiques' %}
  • {% trans 'Thésaurus' %}
  • Renkan
  • +
  • {% trans 'Renkan repères' %}
  • {% trans 'A Propos' %}
  • Histoire des Arts
  • diff -r 6575b9f53601 -r f469ab22542d src/hdalab/templates/editorial/manage_renkans.html --- 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}} + + {% endblock %} @@ -43,6 +41,7 @@

    +

    {% trans 'Favorite' %} : = 1 %} checked="checked" {% endif %} value="{{favorite}}" />

    @@ -50,6 +49,8 @@ + + diff -r 6575b9f53601 -r f469ab22542d src/hdalab/templates/profile_home.html --- 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}} + {% endblock %} @@ -51,9 +48,10 @@

    / {% trans 'Gerer mes Renkan' %}

    -

    - {% trans 'Nouveau Renkan' %} -

    +
    + {% csrf_token %} + +

    {% if page.has_previous %}{% trans 'Previous' %}{% endif %} {% if page.has_previous and page.has_next %} - {% endif %}{% if page.has_next %}{% trans 'Next' %}{% endif %}

    {% if page.has_previous or page.has_next %} - {% endif %}{% trans 'Filter' %} : - {% trans 'Advanced search' %}

    @@ -70,6 +68,7 @@

    +

    {% trans 'Favorite' %} : = 1 %} checked="checked" {% endif %} value="{{favorite}}" />

    {% trans 'Title' %} {% if sort_param == 'title' %}{% endif %}{% trans 'Fav.' %} + {% if sort_param == 'favorite' %}{% endif %} {% trans 'User' %} {% if sort_param == 'user' %}{% endif %} {% trans 'Modification date' %} @@ -65,6 +66,7 @@ {% with hr.renkan as r %}
    {{ r.title }}
    {% csrf_token %}
    {{ r.owner.username }} {{ r.modification_date|date:"Y-m-d H:i" }} {% thumbnail r.image 100x100 as thumb %}
    @@ -77,6 +76,8 @@ + @@ -90,6 +91,7 @@ {% with hr.renkan as r %} + diff -r 6575b9f53601 -r f469ab22542d src/hdalab/templates/renkan_list.html --- 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 @@ {% endblock %} -{% block renkans_actif %}actif{% endblock %} +{% block renkans_actif %}{% if not hide_favorite %}actif{% endif %}{% endblock %} {% block js_import %} {{block.super}} + {% endblock %} @@ -40,6 +37,9 @@

    {% trans 'Modification date' %} : {% trans 'begin' %} - {% trans 'end' %} :

    {% trans 'Username' %} :

    + {% if not hide_favorite %} +

    {% trans 'Favorite' %} : = 1 %} checked="checked" {% endif %} value="{{favorite}}" />

    + {% endif %}

    {% trans 'Title' %} {% if sort_param == 'title' %}{% endif %}{% trans 'Fav.' %} + {% if sort_param == 'favorite' %}{% endif %} {% trans 'Modification date' %} {% if sort_param == 'date' %}{% endif %} {% trans 'Preview' %}
    {{ r.title }}{% if hr.favorite %}✓{% else %} {% endif %} {{ r.modification_date|date:"Y-m-d H:i" }} {% thumbnail r.image 100x100 as thumb %} {{ hr.state|state_to_str }}
    @@ -47,6 +47,10 @@ + {% if not hide_favorite %} + + {% endif %} + {% if not hide_favorite %} + + {% endif %} diff -r 6575b9f53601 -r f469ab22542d src/hdalab/urls.py --- 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.*)$', login_required(HdalabRenkanCopy.as_view()), name='renkan_copy'), - url(r'^renkan/delete/(?P.*)$', login_required(HdalabRenkanDelete.as_view()), name='renkan_delete'), - #url(r'^renkan/moderate/(?P.*)/(?P.*)$', login_required(HdalabRenkanModerate.as_view()), name='renkan_moderate'), - url(r'^renkan/moderate/(?P.*)$', login_required(HdalabRenkanModerate.as_view()), name='renkan_moderate'), + url(r'^renkan/copy/(?P.+)$', login_required(HdalabRenkanCopy.as_view()), name='renkan_copy'), + url(r'^renkan/delete/(?P.+)$', login_required(HdalabRenkanDelete.as_view()), name='renkan_delete'), + url(r'^renkan/moderate/(?P.+)$', login_required(HdalabRenkanModerate.as_view()), name='renkan_moderate'), + url(r'^renkan/favorite/(?P.+)$', 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'), diff -r 6575b9f53601 -r f469ab22542d src/hdalab/views/editorial.py --- 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 diff -r 6575b9f53601 -r f469ab22542d src/hdalab/views/profile.py --- 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
    {% trans 'Title' %} {% if sort_param == 'title' %}{% endif %}{% trans 'Fav.' %} + {% if sort_param == 'favorite' %}{% endif %}{% trans 'User' %} {% if sort_param == 'user' %}{% endif %} {% trans 'Modification date' %} @@ -58,6 +62,9 @@ {% with hr.renkan as r %}
    {{ r.title }}{% if hr.favorite %}✓{% else %} {% endif %}{{ r.owner.username }} {{ r.modification_date|date:"Y-m-d H:i" }} {% thumbnail r.image 100x100 as thumb %}