Introduce folders.
authorAlexandre Segura <mex.zktk@gmail.com>
Thu, 09 Mar 2017 12:11:46 +0100
changeset 416 5daa15b87404
parent 415 c4b700679964
child 417 3a2a2a798bf4
Introduce folders.
src/iconolab/admin.py
src/iconolab/migrations/0019_auto_20170309_1022.py
src/iconolab/models.py
src/iconolab/templates/iconolab/collection_home.html
src/iconolab/views/objects.py
src_js/iconolab-bundle/src/iconolab.scss
--- a/src/iconolab/admin.py	Thu Mar 02 16:59:01 2017 +0100
+++ b/src/iconolab/admin.py	Thu Mar 09 12:11:46 2017 +0100
@@ -3,6 +3,7 @@
 
 # Iconolab objects
 admin.site.register(models.Collection)
+admin.site.register(models.Folder)
 admin.site.register(models.Item)
 admin.site.register(models.Image)
 admin.site.register(models.Annotation)
@@ -17,4 +18,4 @@
 # Comment system
 admin.site.register(models.IconolabComment)
 admin.site.register(models.MetaCategory)
-admin.site.register(models.MetaCategoryInfo)
\ No newline at end of file
+admin.site.register(models.MetaCategoryInfo)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/migrations/0019_auto_20170309_1022.py	Thu Mar 09 12:11:46 2017 +0100
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-03-09 10:22
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('iconolab', '0018_auto_20161215_1731'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Folder',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.TextField()),
+            ],
+        ),
+        migrations.AddField(
+            model_name='item',
+            name='folders',
+            field=models.ManyToManyField(to='iconolab.Folder'),
+        ),
+    ]
--- a/src/iconolab/models.py	Thu Mar 02 16:59:01 2017 +0100
+++ b/src/iconolab/models.py	Thu Mar 09 12:11:46 2017 +0100
@@ -43,9 +43,21 @@
     width = models.IntegerField(null=True, blank=True)
     show_image_on_home = models.BooleanField(default=False)
 
+    @property
+    def folders(self):
+        return Folder.objects.filter(item__collection=self).distinct()
+
     def __str__(self):
         return self.name
 
+class Folder(models.Model):
+    """
+        Some items may belong to a "folder". This is actually a physical folder
+    """
+    name = models.TextField(null=False, blank=False)
+
+    def __str__(self):
+        return 'Folder ' + self.name
 
 class Item(models.Model):
     """
@@ -54,6 +66,7 @@
     """
     collection = models.ForeignKey(Collection, related_name="items")
     item_guid = models.UUIDField(default=uuid.uuid4, editable=False)
+    folders = models.ManyToManyField('Folder')
 
     def __str__(self):
         return str(self.item_guid) + ":from:" + self.collection.name
--- a/src/iconolab/templates/iconolab/collection_home.html	Thu Mar 02 16:59:01 2017 +0100
+++ b/src/iconolab/templates/iconolab/collection_home.html	Thu Mar 09 12:11:46 2017 +0100
@@ -16,6 +16,24 @@
       <p>
         {{ collection.description | safe }}
       </p>
+      {% if collection.folders %}
+        <h3>{{ collection.folders|length }} dossier{% if collection.folders|length > 1 %}s{% endif %}</h3>
+        <ul class="list-unstyled">
+        {% for folder in collection.folders %}
+          <li>
+            {% if folder_id == folder.id %}
+            <a href="{% url 'collection_home' collection_name %}">
+              <i class="fa fa-close"></i> {{ folder.name }}
+            </a>
+            {% else %}
+            <a href="{% url 'collection_home' collection_name %}?folder={{ folder.id }}">
+              <i class="fa fa-folder"></i> {{ folder.name }}
+            </a>
+            {% endif %}
+          </li>
+        {% endfor %}
+        </ul>
+      {% endif %}
     </div>
     <div class="col-md-9">
       <h1>{{ collection.verbose_name }} <small>Fonds Iconolab</small></h1>
--- a/src/iconolab/views/objects.py	Thu Mar 02 16:59:01 2017 +0100
+++ b/src/iconolab/views/objects.py	Thu Mar 09 12:11:46 2017 +0100
@@ -220,9 +220,18 @@
         adjacent_pages_count = 2
 
         # Paginated objects list
-        items_list = collection.items.order_by("metadatas__inventory_number").all()
+        items_list = collection.items.order_by("metadatas__inventory_number")
+
+        folder = request.GET.get('folder', None)
+
+        if folder is not None:
+            folder = int(folder)
+            items_list = items_list.filter(folders__id=folder)
+
+        context['folder_id'] = folder
+
         context["items_pagination_data"] = self.get_pagination_data(
-            items_list,
+            items_list.all(),
             items_page,
             items_per_page,
             adjacent_pages_count,
--- a/src_js/iconolab-bundle/src/iconolab.scss	Thu Mar 02 16:59:01 2017 +0100
+++ b/src_js/iconolab-bundle/src/iconolab.scss	Thu Mar 09 12:11:46 2017 +0100
@@ -481,7 +481,4 @@
         margin: 0 auto;
         margin-bottom: 20px;
     }
-    > a {
-        text-align: center;
-    }
 }