# HG changeset patch # User Riwad Salim # Date 1528199780 -7200 # Node ID 5cc429500a1123d8c60f4958f04bd3a253e9ad40 # Parent 0664c4845ce79af840448a4a50e5d132be1c58e2 Remove specific metadatas and add specific metadatas fields to model diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/management/commands/generatethumbnails.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)) diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/migrations/0027_auto_20180528_0904.py --- /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'), + ), + ] diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/migrations/0028_itemmetadata_metadata.py --- /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=''), + ), + ] diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/migrations/0029_auto_itemmetadata_metadata_data.py --- /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), + ] diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/migrations/0030_auto_20180601_1609.py --- /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), + ), + ] diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/models.py --- 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): diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/search_indexes/indexes.py --- 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 }) diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/iconolab/collection_home.html --- 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 @@
- +
diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/iconolab/detail_image.html --- 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 @@
-
- {% if item.metadatas.designation %}
Désignation
{{item.metadatas.designation}}
{% endif %} - {% if item.metadatas.authors %}
Auteur(s)
{{item.metadatas.designation}}
{% endif %} - {% if item.metadatas.field %}
Domaine
{{item.metadatas.field}}
{% endif %} - {% if item.metadatas.conservation_location %}
Conservé à
{{item.metadatas.conservation_location}}
{% endif %} - {% if item.metadatas.datation %}
Datation
{{item.metadatas.datation}}
{% endif %} - {% if item.metadatas.technics %}
Techniques
{{item.metadatas.technics}}
{% endif %} - {% if item.metadatas.measurements %}
Mesures : {{item.metadatas.measurements}}{% endif %} - {% if item.metadatas.create_or_usage_location %}
Lieu de création/utilisation
{{item.metadatas.create_or_usage_location}}
{% endif %} - {% if item.metadatas.discovery_context %}
Contexte de découverte
{{item.metadatas.discovery_context}}
{% endif %} - {% if item.metadatas.photo_credits %}
Crédits photographiques
{{item.metadatas.photo_credits}}
{% endif %} - {% if item.metadatas.inventory_number %}
Numéro d'inventaire
{{item.metadatas.inventory_number}}
{% endif %} -
- {% if item.metadatas.joconde_ref %} -

- - Cet objet dans Joconde, catalogue collectif des collections des musées de France - -

- {% endif %} + + {% include "iconolab/metadatas/detail_image_metadatas.html" %} +
{% endblock %} diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/iconolab/detail_item.html --- 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 %}
- {% if item.metadatas.designation %}

Désignation : {{item.metadatas.designation}}

{% endif %} - {% if item.metadatas.authors %}

Auteur(s) : {{item.metadatas.designation}}

{% endif %} - {% if item.metadatas.field %}

Domaine : {{item.metadatas.field}}

{% endif %} - {% if item.metadatas.conservation_location %}

Conservé à : {{item.metadatas.conservation_location}}

{% endif %} - {% if item.metadatas.datation %}

Datation : {{item.metadatas.datation}}

{% endif %} - {% if item.metadatas.technics %}
Techniques : {{item.metadatas.technics}}
{% endif %} - {% if item.metadatas.measurements %}
Mesures : {{item.metadatas.measurements}}
{% endif %} - {% if item.metadatas.create_or_usage_location %}
Lieu de création/utilisation : {{item.metadatas.create_or_usage_location}}
{% endif %} - {% if item.metadatas.discovery_context %}
Contexte de découverte : {{item.metadatas.discovery_context}}
{% endif %} - {% if item.metadatas.photo_credits %}
Crédits photographiques : {{item.metadatas.photo_credits}}
{% endif %} - {% if item.metadatas.inventory_number %}
Numéro d'inventaire : {{item.metadatas.inventory_number}}
{% endif %} - {% if item.metadatas.joconde_ref %}
Cet objet dans Joconde, catalogue collectif des collections des musées de France
{% endif %} -
+ {% include "iconolab/metadatas/detail_item_metadatas.html" %} {% if images|length > 1 %}

Autres images pour cet objet:

{% for image in images %} diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/iconolab/metadatas/detail_image_metadatas.html --- /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 @@ +
+ {% for metadata_key, metadata_value in item.metadatas.metadata_obj.items %} +
{{metadata_key}}
{{metadata_value}}
+ {% endfor %} +
+ + + diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/iconolab/metadatas/detail_item_metadatas.html --- /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 %} +

{{metadata_key}} : {{metadata_value}}

+{% endfor %} +
diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/iconolab/metadatas/image_search_metadatas.html --- /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 %} +

{{metadata_key}} : {{metadata_value}}

+{% endfor %} diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/partials/header_breadcrumbs.html --- 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 %}
  • Fond {{collection.verbose_name}}
  • {% if not annotation %} -
  • Objet {{ item.metadatas.joconde_ref }}
  • +
  • Objet {{ item.metadatas.natural_key }}
  • {% else %} -
  • Objet {{ image.item.metadatas.joconde_ref }}
  • +
  • Objet {{ image.item.metadatas.natural_key }}
  • {% if not revision %}
  • Annotation
  • {% else %} diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/partials/item_images_preview.html --- 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 %} diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/search/image_search.html --- 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 @@

    Métadonnées de l'objet

    Détail de l'objet - {% if item.object.metadatas.designation %}

    Désignation : {{item.object.metadatas.designation}}

    {% endif %} - {% if item.object.metadatas.authors %}

    Auteur(s) : {{item.object.metadatas.designation}}

    {% endif %} - {% if item.object.metadatas.conservation_location %}

    Conservé à : {{item.object.metadatas.conservation_location}}

    {% endif %} - {% if item.object.metadatas.datation %}

    Datation : {{item.object.metadatas.datation}}

    {% endif %} - {% if item.object.metadatas.technics %}
    Techniques : {{item.object.metadatas.technics}}
    {% endif %} - {% if item.object.metadatas.measurements %}
    Mesures : {{item.object.metadatas.measurements}}
    {% endif %} - {% if item.object.metadatas.create_or_usage_location %}
    Lieu de création/utilisation : {{item.object.metadatas.create_or_usage_location}}
    {% endif %} - {% if item.object.metadatas.discovery_context %}
    Contexte de découverte : {{item.object.metadatas.discovery_context}}
    {% endif %} - {% if item.object.metadatas.photo_credits %}
    Crédits photographiques : {{item.object.metadatas.photo_credits}}
    {% endif %} - {% if item.object.metadatas.inventory_number %}
    Numéro d'inventaire : {{item.object.metadatas.inventory_number}}
    {% endif %} + {% include "iconolab/metadatas/image_search_metadatas.html" %}
    {% endfor %} diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/templates/search/indexes/iconolab/item_text.txt --- 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 %} diff -r 0664c4845ce7 -r 5cc429500a11 src/iconolab/views/objects.py --- 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)