# 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 @@