Remove specific metadatas and add specific metadatas fields to model
authorRiwad Salim
Tue, 05 Jun 2018 13:56:20 +0200
changeset 538 5cc429500a11
parent 537 0664c4845ce7
child 539 08e2513dbc2f
Remove specific metadatas and add specific metadatas fields to model
src/iconolab/management/commands/generatethumbnails.py
src/iconolab/migrations/0027_auto_20180528_0904.py
src/iconolab/migrations/0028_itemmetadata_metadata.py
src/iconolab/migrations/0029_auto_itemmetadata_metadata_data.py
src/iconolab/migrations/0030_auto_20180601_1609.py
src/iconolab/models.py
src/iconolab/search_indexes/indexes.py
src/iconolab/templates/iconolab/collection_home.html
src/iconolab/templates/iconolab/detail_image.html
src/iconolab/templates/iconolab/detail_item.html
src/iconolab/templates/iconolab/metadatas/detail_image_metadatas.html
src/iconolab/templates/iconolab/metadatas/detail_item_metadatas.html
src/iconolab/templates/iconolab/metadatas/image_search_metadatas.html
src/iconolab/templates/partials/header_breadcrumbs.html
src/iconolab/templates/partials/item_images_preview.html
src/iconolab/templates/search/image_search.html
src/iconolab/templates/search/indexes/iconolab/item_text.txt
src/iconolab/views/objects.py
--- a/src/iconolab/management/commands/generatethumbnails.py	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/management/commands/generatethumbnails.py	Tue Jun 05 13:56:20 2018 +0200
@@ -2,7 +2,7 @@
 from django.core.management.base import BaseCommand, CommandError
 from django.core.management import call_command
 from django.conf import settings
-from iconolab.models import Collection, Item, ItemMetadata, MetaCategory
+from iconolab.models import Collection, Item, MetaCategory
 from sorl.thumbnail import get_thumbnail
 import os, csv, pprint, re, json, shutil
 
@@ -18,7 +18,7 @@
         )
 
     def handle(self, *args, **options):
-        try: 
+        try:
             if options.get("collection_id"):
                 print("## Finding collection with id "+options.get("collection_id"))
                 try:
@@ -28,7 +28,7 @@
             else:
                 raise ValueError("!!! No collection id, aborting because we don't know which collection to update. !!!")
             for item in collection.items.all():
-                print("# Generating thumbnails for item: "+str(item.metadatas.inventory_number))
+                print("# Generating thumbnails for item: "+str(item.metadatas.natural_key))
                 for image in item.images.all():
                     print("## Processing image "+str(image.name))
                     for size in settings.PREGENERATE_THUMBNAILS_SIZES:
@@ -36,4 +36,4 @@
                         get_thumbnail(image.media, size, crop=False)
             print("## All done!")
         except ValueError as e:
-            print(str(e))
\ No newline at end of file
+            print(str(e))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/migrations/0027_auto_20180528_0904.py	Tue Jun 05 13:56:20 2018 +0200
@@ -0,0 +1,110 @@
+# Generated by Django 2.0.5 on 2018-05-28 09:04
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('iconolab', '0026_auto_20170524_1107'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='annotation',
+            name='author',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AlterField(
+            model_name='annotation',
+            name='current_revision',
+            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='current_for_annotation', to='iconolab.AnnotationRevision'),
+        ),
+        migrations.AlterField(
+            model_name='annotation',
+            name='source_revision',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='source_related_annotation', to='iconolab.AnnotationRevision'),
+        ),
+        migrations.AlterField(
+            model_name='annotationrevision',
+            name='annotation',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='revisions', to='iconolab.Annotation'),
+        ),
+        migrations.AlterField(
+            model_name='annotationrevision',
+            name='author',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AlterField(
+            model_name='annotationrevision',
+            name='merge_parent_revision',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='child_revisions_merge', to='iconolab.AnnotationRevision'),
+        ),
+        migrations.AlterField(
+            model_name='annotationrevision',
+            name='parent_revision',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='child_revisions', to='iconolab.AnnotationRevision'),
+        ),
+        migrations.AlterField(
+            model_name='annotationstats',
+            name='annotation',
+            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='stats', to='iconolab.Annotation'),
+        ),
+        migrations.AlterField(
+            model_name='bookmark',
+            name='category',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='iconolab.BookmarkCategory'),
+        ),
+        migrations.AlterField(
+            model_name='bookmark',
+            name='image',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='iconolab.Image'),
+        ),
+        migrations.AlterField(
+            model_name='bookmarkcategory',
+            name='user',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AlterField(
+            model_name='folder',
+            name='collection',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='folders', to='iconolab.Collection'),
+        ),
+        migrations.AlterField(
+            model_name='iconolabcomment',
+            name='revision',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='creation_comment', to='iconolab.AnnotationRevision'),
+        ),
+        migrations.AlterField(
+            model_name='image',
+            name='item',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='images', to='iconolab.Item'),
+        ),
+        migrations.AlterField(
+            model_name='imagestats',
+            name='image',
+            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='stats', to='iconolab.Image'),
+        ),
+        migrations.AlterField(
+            model_name='item',
+            name='collection',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='items', to='iconolab.Collection'),
+        ),
+        migrations.AlterField(
+            model_name='itemmetadata',
+            name='item',
+            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='metadatas', to='iconolab.Item'),
+        ),
+        migrations.AlterField(
+            model_name='metacategory',
+            name='collection',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='metacategories', to='iconolab.Collection'),
+        ),
+        migrations.AlterField(
+            model_name='tag',
+            name='collection',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='iconolab.Collection'),
+        ),
+    ]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/migrations/0028_itemmetadata_metadata.py	Tue Jun 05 13:56:20 2018 +0200
@@ -0,0 +1,24 @@
+# Generated by Django 2.0.5 on 2018-06-01 15:33
+
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('iconolab', '0027_auto_20180528_0904'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='itemmetadata',
+            name='metadata',
+            field=models.TextField(default=''),
+        ),
+        migrations.AddField(
+            model_name='itemmetadata',
+            name='natural_key',
+            field=models.CharField(max_length=1024,  default=''),
+        ),
+    ]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/migrations/0029_auto_itemmetadata_metadata_data.py	Tue Jun 05 13:56:20 2018 +0200
@@ -0,0 +1,39 @@
+# Generated by Django 2.0.5 on 2018-06-01 15:44
+
+from django.db import migrations
+import json
+
+
+
+def copy_metadata(apps, schema_editor):
+    ItemMetadata = apps.get_model('iconolab', 'ItemMetadata')
+    for item_metadata in ItemMetadata.objects.all():
+        new_metadata = {
+            "authors" : item_metadata.authors,
+            "school" : item_metadata.school,
+            "field" : item_metadata.field,
+            "designation" : item_metadata.designation,
+            "datation" : item_metadata.datation,
+            "technics" : item_metadata.technics,
+            "measurements" : item_metadata.measurements,
+            "create_or_usage_location" : item_metadata.create_or_usage_location,
+            "discovery_context" : item_metadata.discovery_context,
+            "conservation_location" : item_metadata.conservation_location,
+            "photo_credits" : item_metadata.photo_credits,
+            "inventory_number" : item_metadata.inventory_number,
+            "joconde_ref" : item_metadata.joconde_ref
+        }
+
+        item_metadata.metadata = json.dumps(new_metadata)
+        item_metadata.natural_key = item_metadata.joconde_ref
+        item_metadata.save()
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('iconolab', '0028_itemmetadata_metadata'),
+    ]
+
+    operations = [
+        migrations.RunPython(copy_metadata),
+    ]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/migrations/0030_auto_20180601_1609.py	Tue Jun 05 13:56:20 2018 +0200
@@ -0,0 +1,70 @@
+# Generated by Django 2.0.5 on 2018-06-01 16:09
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('iconolab', '0029_auto_itemmetadata_metadata_data'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='authors',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='conservation_location',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='create_or_usage_location',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='datation',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='designation',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='discovery_context',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='field',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='inventory_number',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='joconde_ref',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='measurements',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='photo_credits',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='school',
+        ),
+        migrations.RemoveField(
+            model_name='itemmetadata',
+            name='technics',
+        ),
+        migrations.AlterField(
+            model_name='itemmetadata',
+            name='natural_key',
+            field=models.CharField(default='', max_length=1024, unique=True),
+        ),
+    ]
--- a/src/iconolab/models.py	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/models.py	Tue Jun 05 13:56:20 2018 +0200
@@ -127,30 +127,37 @@
     """
         Metadata object for the item class. Each field represents what we can
         import from the provided .csv files
+
     """
+
     item = models.OneToOneField('Item', related_name='metadatas', on_delete=models.PROTECT)
-    authors = models.CharField(max_length=255, default="")
-    school = models.CharField(max_length=255, default="")
-    field = models.CharField(max_length=255, default="")
-    designation = models.CharField(max_length=255, default="")
-    datation = models.CharField(max_length=255, default="")
-    technics = models.CharField(max_length=255, default="")
-    measurements = models.CharField(max_length=255, default="")
-    create_or_usage_location = models.CharField(max_length=255, default="")
-    discovery_context = models.CharField(max_length=255, default="")
-    conservation_location = models.CharField(max_length=255, default="")
-    photo_credits = models.CharField(max_length=255, default="")
-    inventory_number = models.CharField(max_length=255, default="")
-    joconde_ref = models.CharField(max_length=255, default="")
+
+    natural_key = models.CharField(max_length=1024, default="", unique=True)
+
+    """
+    JSON field integration
+    """
+    metadata = models.TextField(default="", null=False)
+
+    def __init__(self, *args, **kwargs):
+        self.__metadata_obj = None
+        super().__init__(*args, **kwargs)
+
+    def __setattr__(self, name, value):
+        if name == 'metadata':
+            self.__metadata_obj = None
+        return super().__setattr__(name, value)
 
     @property
-    def get_joconde_url(self):
-        return settings.JOCONDE_NOTICE_BASE_URL + self.joconde_ref.rjust(11, '0')
+    def metadata_obj(self):
+        if self.__metadata_obj is None:
+            self.__metadata_obj = json.loads(self.metadata)
+        return self.__metadata_obj
+
 
     def __str__(self):
         return "metadatas:for:" + str(self.item.item_guid)
 
-
 class Image(models.Model):
     """
         Each image object is linked to one item, users can create annotations on images
@@ -173,37 +180,6 @@
     def wh_ratio(self):
         return self.width / self.height
 
-    @property
-    def collection(self):
-        return self.item.collection.name
-
-    @property
-    def title(self):
-        return self.item.metadatas.designation
-
-    @property
-    def authors(self):
-        return self.item.metadatas.authors
-
-    @property
-    def school(self):
-        return self.item.metadatas.school
-
-    @property
-    def designation(self):
-        return self.item.metadatas.designation
-
-    @property
-    def datation(self):
-        return self.item.metadatas.datation
-
-    @property
-    def technics(self):
-        return self.item.metadatas.technics
-
-    @property
-    def measurements(self):
-        return self.item.metadatas.measurements
 
     @property
     def latest_annotations(self):
--- a/src/iconolab/search_indexes/indexes.py	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/search_indexes/indexes.py	Tue Jun 05 13:56:20 2018 +0200
@@ -42,15 +42,8 @@
 
     collection = fields.KeywordField(attr="collection.name")
 
-    authors = fields.TextField(attr="metadatas.authors")
-    school = fields.TextField(attr="metadatas.school")
-    designation = fields.TextField(attr="metadatas.designation")
-    datation = fields.TextField(attr="metadatas.datation")
-    technics = fields.TextField(attr="metadatas.technics")
-    measurements = fields.TextField(attr="metadatas.measurements")
-    create_or_usage_location = fields.TextField(attr="metadatas.create_or_usage_location")
-    discovery_context = fields.TextField(attr="metadatas.discovery_context")
-    conservation_location = fields.TextField(attr="metadatas.conservation_location")
+    natural_key = fields.KeywordField(attr="metadatas.natural_key")
+
 
     def prepare_text(self, instance):
         return render_to_string('search/indexes/iconolab/item_text.txt', { 'object': instance })
--- a/src/iconolab/templates/iconolab/collection_home.html	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/templates/iconolab/collection_home.html	Tue Jun 05 13:56:20 2018 +0200
@@ -164,7 +164,7 @@
               <div class="form-group">
                 <label class="col-sm-2 control-label">Objet</label>
                 <div class="col-sm-10">
-                  <input ype="text" class="form-control bookmark-title" disabled="disabled" value="">
+                  <input type="text" class="form-control bookmark-title" disabled="disabled" value="">
                 </div>
               </div>
               <div class="form-group bookmark-folder">
--- a/src/iconolab/templates/iconolab/detail_image.html	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/templates/iconolab/detail_image.html	Tue Jun 05 13:56:20 2018 +0200
@@ -77,26 +77,9 @@
   </div>
 </div>
 <div class="annotation-navigator-metadata">
-  <dl class="dl-horizontal">
-    {% if item.metadatas.designation %}<dt>Désignation</dt><dd>{{item.metadatas.designation}}</dd>{% endif %}
-    {% if item.metadatas.authors %}<dt>Auteur(s)</dt><dd>{{item.metadatas.designation}}</dd>{% endif %}
-    {% if item.metadatas.field %}<dt>Domaine</dt><dd>{{item.metadatas.field}}</dd>{% endif %}
-    {% if item.metadatas.conservation_location %}<dt>Conservé à</dt><dd>{{item.metadatas.conservation_location}}</dd>{% endif %}
-    {% if item.metadatas.datation %}<dt>Datation</dt><dd>{{item.metadatas.datation}}</dd>{% endif %}
-    {% if item.metadatas.technics %}<dt>Techniques</dt><dd>{{item.metadatas.technics}}</dd>{% endif %}
-    {% if item.metadatas.measurements %}<dt>Mesures : {{item.metadatas.measurements}}</h5>{% endif %}
-    {% if item.metadatas.create_or_usage_location %}<dt>Lieu de création/utilisation</dt><dd>{{item.metadatas.create_or_usage_location}}</dd>{% endif %}
-    {% if item.metadatas.discovery_context %}<dt>Contexte de découverte</dt><dd>{{item.metadatas.discovery_context}}</dd>{% endif %}
-    {% if item.metadatas.photo_credits %}<dt>Crédits photographiques</dt><dd>{{item.metadatas.photo_credits}}</dd>{% endif %}
-    {% if item.metadatas.inventory_number %}<dt>Numéro d'inventaire</dt><dd>{{item.metadatas.inventory_number}}</dd>{% endif %}
-  </dl>
-  {% if item.metadatas.joconde_ref %}
-  <p class="text-center">
-    <a href="{{item.metadatas.get_joconde_url}}" target="_blank">
-    Cet objet dans Joconde, catalogue collectif des collections des musées de France
-    </a>
-  </p>
-  {% endif %}
+
+  {% include "iconolab/metadatas/detail_image_metadatas.html" %}
+
 </div>
 
 {% endblock %}
--- a/src/iconolab/templates/iconolab/detail_item.html	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/templates/iconolab/detail_item.html	Tue Jun 05 13:56:20 2018 +0200
@@ -20,19 +20,7 @@
         {% endfor %}
     </div>
     <div class="col-md-6">
-        {% if item.metadatas.designation %}<h3>Désignation : <small>{{item.metadatas.designation}}</small></h3>{% endif %}
-        {% if item.metadatas.authors %}<h4>Auteur(s) : <small>{{item.metadatas.designation}}</small></h4>{% endif %}
-        {% if item.metadatas.field %}<h4>Domaine : <small>{{item.metadatas.field}}</small></h4>{% endif %}
-        {% if item.metadatas.conservation_location %}<h4>Conservé à : <small>{{item.metadatas.conservation_location}}</small></h4>{% endif %}
-        {% if item.metadatas.datation %}<h4>Datation : <small>{{item.metadatas.datation}}</small></h4>{% endif %}
-        {% if item.metadatas.technics %}<h5>Techniques : <small>{{item.metadatas.technics}}</small></h5>{% endif %}
-        {% if item.metadatas.measurements %}<h5>Mesures : {{item.metadatas.measurements}}</h5>{% endif %}
-        {% if item.metadatas.create_or_usage_location %}<h5>Lieu de création/utilisation : <small>{{item.metadatas.create_or_usage_location}}</small></h5>{% endif %}
-        {% if item.metadatas.discovery_context %}<h5>Contexte de découverte : <small>{{item.metadatas.discovery_context}}</small></h5>{% endif %}
-        {% if item.metadatas.photo_credits %}<h5>Crédits photographiques : <small>{{item.metadatas.photo_credits}}</small></h5>{% endif %}
-        {% if item.metadatas.inventory_number %}<h5>Numéro d'inventaire : <small>{{item.metadatas.inventory_number}}</small></h5>{% endif %}
-        {% if item.metadatas.joconde_ref %}<h5><a href="{{item.metadatas.get_joconde_url}}" target="_blank">Cet objet dans Joconde, catalogue collectif des collections des musées de France</a></h5>{% endif %}
-        <br>
+        {% include "iconolab/metadatas/detail_item_metadatas.html" %}
         {% if images|length > 1 %}
           <h4>Autres images pour cet objet: </h4>
           {% for image in images %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/templates/iconolab/metadatas/detail_image_metadatas.html	Tue Jun 05 13:56:20 2018 +0200
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+    {% for metadata_key, metadata_value in item.metadatas.metadata_obj.items %}
+    <dt>{{metadata_key}}</dt><dd>{{metadata_value}}</dd>
+  {% endfor %}
+</dl>
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/templates/iconolab/metadatas/detail_item_metadatas.html	Tue Jun 05 13:56:20 2018 +0200
@@ -0,0 +1,4 @@
+{% for metadata_key, metadata_value in item.metadatas.metadata_obj.items %}
+  <h4>{{metadata_key}} : <small>{{metadata_value}}</small></h4>
+{% endfor %}
+<br>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/templates/iconolab/metadatas/image_search_metadatas.html	Tue Jun 05 13:56:20 2018 +0200
@@ -0,0 +1,3 @@
+{% for metadata_key, metadata_value in item.object.metadatas.metadata_obj.items %}
+  <h4>{{metadata_key}} : <small>{{metadata_value}}</small></h4>
+{% endfor %}
--- a/src/iconolab/templates/partials/header_breadcrumbs.html	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/templates/partials/header_breadcrumbs.html	Tue Jun 05 13:56:20 2018 +0200
@@ -6,9 +6,9 @@
   {% else %}
     <li><a href="{% url 'collection_home' collection.name %}">Fond {{collection.verbose_name}}</a></li>
     {% if not annotation %}
-      <li class="active">Objet {{ item.metadatas.joconde_ref }}</li>
+      <li class="active">Objet {{ item.metadatas.natural_key }}</li>
     {% else %}
-      <li><a href="{% url 'item_detail' collection.name image.item.item_guid %}">Objet {{ image.item.metadatas.joconde_ref }}</a></li>
+      <li><a href="{% url 'item_detail' collection.name image.item.item_guid %}">Objet {{ image.item.metadatas.natural_key }}</a></li>
       {% if not revision %}
         <li class="active">Annotation</li>
       {% else %}
--- a/src/iconolab/templates/partials/item_images_preview.html	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/templates/partials/item_images_preview.html	Tue Jun 05 13:56:20 2018 +0200
@@ -18,7 +18,7 @@
       {% if request.user.is_authenticated %}
       <a href="#" class="bookmark {% if is_bookmarked %}active{% endif %}"
         title="{% if is_bookmarked %}Ajouté à vos favoris{% else %}Ajouter à mes favoris{% endif %}"
-        data-item="{{ item.metadatas.joconde_ref }}"
+        data-item="{{ item.metadatas.natural_key }}"
         data-image-id="{{ first_image.id }}"
         data-image-guid="{{ first_image.image_guid }}">
           <span class="fa-stack fa-lg">
--- a/src/iconolab/templates/search/image_search.html	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/templates/search/image_search.html	Tue Jun 05 13:56:20 2018 +0200
@@ -39,16 +39,7 @@
             <div class="search-item-info text-left col-md-7" style="display:inline-block; margin: 10px 0px;">
               <h1 class="search-title" style="display:inline-block; margin-top: 0px;"><small>Métadonnées de l'objet</small></h1>
                <a class="btn btn-default btn-xs pull-right collection-home-item-btn" href="{% url 'item_detail' item.object.collection.name item.object.item_guid %}" style="display:inline-block;"><i class="fa fa-eye"></i> Détail de l'objet</a>
-              {% if item.object.metadatas.designation %}<h3>Désignation : <small>{{item.object.metadatas.designation}}</small></h3>{% endif %}
-              {% if item.object.metadatas.authors %}<h4>Auteur(s) : <small>{{item.object.metadatas.designation}}</small></h4>{% endif %}
-              {% if item.object.metadatas.conservation_location %}<h4>Conservé à : <small>{{item.object.metadatas.conservation_location}}</small></h4>{% endif %}
-              {% if item.object.metadatas.datation %}<h4>Datation : <small>{{item.object.metadatas.datation}}</small></h4>{% endif %}
-              {% if item.object.metadatas.technics %}<h5>Techniques : <small>{{item.object.metadatas.technics}}</small></h5>{% endif %}
-              {% if item.object.metadatas.measurements %}<h5>Mesures : {{item.object.metadatas.measurements}}</h5>{% endif %}
-              {% if item.object.metadatas.create_or_usage_location %}<h5>Lieu de création/utilisation : <small>{{item.object.metadatas.create_or_usage_location}}</small></h5>{% endif %}
-              {% if item.object.metadatas.discovery_context %}<h5>Contexte de découverte : <small>{{item.object.metadatas.discovery_context}}</small></h5>{% endif %}
-              {% if item.object.metadatas.photo_credits %}<h5>Crédits photographiques : <small>{{item.object.metadatas.photo_credits}}</small></h5>{% endif %}
-              {% if item.object.metadatas.inventory_number %}<h5>Numéro d'inventaire : <small>{{item.object.metadatas.inventory_number}}</small></h5>{% endif %}
+              {% include "iconolab/metadatas/image_search_metadatas.html" %}
             </div>
           </li>
         {% endfor %}
--- a/src/iconolab/templates/search/indexes/iconolab/item_text.txt	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/templates/search/indexes/iconolab/item_text.txt	Tue Jun 05 13:56:20 2018 +0200
@@ -1,9 +1,3 @@
-{{ object.metadatas.school }}
-{{ object.metadatas.authors }}
-{{ object.metadatas.designation }}
-{{ object.metadatas.datation }}
-{{ object.metadatas.technics }}
-{{ object.metadatas.measurements }}
-{{ object.metadatas.create_or_usage_location }}
-{{ object.metadatas.discovery_context }}
-{{ object.metadatas.conservation_location }}
\ No newline at end of file
+{% for metadata_value in object.metadatas.metadata_obj.values %}
+  {{metadata_value}}
+{% endfor %}
--- a/src/iconolab/views/objects.py	Wed May 23 11:08:54 2018 +0200
+++ b/src/iconolab/views/objects.py	Tue Jun 05 13:56:20 2018 +0200
@@ -266,7 +266,7 @@
         adjacent_pages_count = 2
 
         # Paginated objects list
-        items_list = collection.items.order_by("metadatas__inventory_number").prefetch_related('images', 'images__stats')
+        items_list = collection.items.order_by("metadatas__natural_key").prefetch_related('images', 'images__stats')
 
         folder = request.GET.get('folder', None)