--- a/.hgignore Wed Aug 17 18:36:44 2016 +0200
+++ b/.hgignore Thu Aug 18 10:49:18 2016 +0200
@@ -7,7 +7,7 @@
^src/iconolab/static/iconolab/js/node_modules/
^src/iconolab/static/iconolab/js/iconolab-bundle/node_modules/
^src/iconolab/static/iconolab/js/iconolab-bundle/dist/
-
+\.orig$
^web/*
^\.pydevproject$
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/migrations/0009_auto_20160812_1417.py Thu Aug 18 10:49:18 2016 +0200
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-08-12 14:17
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('iconolab', '0008_auto_20160811_1050'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='collection',
+ name='height',
+ field=models.IntegerField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name='collection',
+ name='image',
+ field=models.ImageField(blank=True, height_field='height', null=True, upload_to='uploads/', width_field='width'),
+ ),
+ migrations.AddField(
+ model_name='collection',
+ name='width',
+ field=models.IntegerField(blank=True, null=True),
+ ),
+ ]
--- a/src/iconolab/models.py Wed Aug 17 18:36:44 2016 +0200
+++ b/src/iconolab/models.py Thu Aug 18 10:49:18 2016 +0200
@@ -31,6 +31,9 @@
name = models.SlugField(max_length=50, unique=True)
verbose_name = models.CharField(max_length=50, null=True, blank=True)
description = models.CharField(max_length=255)
+ image = models.ImageField(upload_to='uploads/', height_field='height', width_field='width', null=True, blank=True)
+ height = models.IntegerField(null=True, blank=True)
+ width = models.IntegerField(null=True, blank=True)
def __str__(self):
return self.name
@@ -144,7 +147,7 @@
tag_list = []
for annotation in self.annotations.all():
revision_tags = annotation.current_revision.tags.all()
- tag_list = [tag.label for tag in revision_tags]
+ tag_list = [tag.label for tag in revision_tags]
return tag_list
class AnnotationManager(models.Manager):
@@ -171,13 +174,13 @@
initial_revision.save()
initial_revision.set_tags(tags_json)
- new_annotation.current_revision = initial_revision
- new_annotation.save()
-
# Create stats object
new_annotation_stats = AnnotationStats(annotation=new_annotation)
new_annotation_stats.save()
new_annotation_stats.set_tags_stats()
+
+ # Link everything to parent
+ new_annotation.current_revision = initial_revision
new_annotation.stats = new_annotation_stats
new_annotation.save()
return new_annotation
@@ -274,7 +277,6 @@
if new_revision.state == AnnotationRevision.ACCEPTED:
self.current_revision = new_revision
self.save()
- print(new_revision)
iconolab_signals.revision_created.send(sender=AnnotationRevision, instance=new_revision)
return new_revision
--- a/src/iconolab/signals/handlers.py Wed Aug 17 18:36:44 2016 +0200
+++ b/src/iconolab/signals/handlers.py Thu Aug 18 10:49:18 2016 +0200
@@ -12,7 +12,6 @@
def increment_stats_on_new_revision(sender, instance, **kwargs):
from iconolab.models import AnnotationRevision
if sender == AnnotationRevision:
- print(instance)
# Annotation stats
annotation = instance.annotation
annotation.stats.submitted_revisions_count += 1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/templates/errors/404error.html Thu Aug 18 10:49:18 2016 +0200
@@ -0,0 +1,7 @@
+{% extends 'iconolab_base.html' %}
+
+{% block content %}
+
+<h1>Erreur 404: <small>le contenu que vous essayez d'atteindre n'a pas été trouvé</small></h1>
+
+{% endblock %}
\ No newline at end of file
--- a/src/iconolab/templates/iconolab/collection_home.html Wed Aug 17 18:36:44 2016 +0200
+++ b/src/iconolab/templates/iconolab/collection_home.html Thu Aug 18 10:49:18 2016 +0200
@@ -9,13 +9,12 @@
{% block content %}
<h2>Fonds {{collection.verbose_name}}</h2>
-
+
+ <p><strong>Images du fonds</strong></p>
<ul class="image-list-wrapper list-inline">
- <p><strong>Images du fonds</strong></p>
{% for item in collection.items.all %}
- <li class="small-image-wrapper">
-
+ <li class="small-image-wrapper" style="margin-bottom: 5px;">
<div class="image-container text-center" style="position: relative">
{% with item.images.first as image %}
{% thumbnail image.media "300x300" crop=False as im %}
@@ -23,11 +22,11 @@
<img v-el:small-image src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" />
</a>
{% endthumbnail %}
- <div class="fragment-infos">
+ <div class="object-infos">
<a class="btn btn-default btn-xs collection-home-btn" href="{% url 'item_detail' collection_name item.item_guid %}"><i class="fa fa-eye"></i> Détail de l'objet</a>
</div>
{% endwith %}
- </li>
+ </li>
{% endfor %}
</ul>
--- a/src/iconolab/templates/iconolab/detail_annotation.html Wed Aug 17 18:36:44 2016 +0200
+++ b/src/iconolab/templates/iconolab/detail_annotation.html Thu Aug 18 10:49:18 2016 +0200
@@ -47,7 +47,8 @@
{% else %}
<span class="glyphicon glyphicon-share"></span> Proposer une révision
{% endif %}
- </a>
+ </a>
+ <br>
{% endif %}
<br>
{% include "partials/annotation_stats_panel.html" with annotation=annotation label="Statistiques sur cette annotation:" %}
--- a/src/iconolab/templates/partials/header.html Wed Aug 17 18:36:44 2016 +0200
+++ b/src/iconolab/templates/partials/header.html Thu Aug 18 10:49:18 2016 +0200
@@ -1,5 +1,5 @@
{% load notifications_tags %}
-<nav class="navbar navbar-default" style="">
+<nav class="navbar navbar-default" {% if collection %} style="margin-bottom: 5px;" {% endif %}>
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
@@ -12,7 +12,6 @@
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
- <li><a href="{% url 'home' %}">Accueil</a></li>
<li><a href="#">Le projet</a></li>
{% if collection_name %}<li><a href="{% url 'collection_home' collection_name %}">Contribuer</a></li>{% endif %}
</ul>
@@ -34,4 +33,5 @@
</ul>
</div><!--/.nav-collapse -->
</div><!--/.container-fluid -->
-</nav>
\ No newline at end of file
+</nav>
+{% include "partials/header_breadcrumbs.html" %}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/templates/partials/header_breadcrumbs.html Thu Aug 18 10:49:18 2016 +0200
@@ -0,0 +1,21 @@
+{% if collection %}
+<ol class="breadcrumb">
+ <li><a href="{% url 'home' %}">Liste fonds</a></li>
+ {% if not image and not item %}
+ <li>Fond {{collection.verbose_name}}</li>
+ {% else %}
+ <li><a href="{% url 'collection_home' collection.name %}">Fond {{collection.verbose_name}}</a></li>
+ {% if not annotation %}
+ <li class="active">Objet</li>
+ {% else %}
+ <li><a href="{% url 'item_detail' collection.name image.item.item_guid %}">Objet</a></li>
+ {% if not revision %}
+ <li class="active">Annotation</li>
+ {% else %}
+ <li><a href="{% url 'annotation_detail' collection.name image.image_guid annotation.annotation_guid %}">Annotation</a></li>
+ <li class="active">Révision</li>
+ {% endif %}
+ {% endif %}
+ {% endif %}
+</ol>
+{% endif %}
\ No newline at end of file
--- a/src/iconolab/urls.py Wed Aug 17 18:36:44 2016 +0200
+++ b/src/iconolab/urls.py Thu Aug 18 10:49:18 2016 +0200
@@ -16,6 +16,7 @@
from django.core.urlresolvers import reverse_lazy
from django.conf.urls import url, include
from django.contrib import admin
+from django import views as django_views
from iconolab import views
from iconolab.search_indexes.views import IconolabSearchView
from . import settings
@@ -26,15 +27,19 @@
import notifications.urls
urlpatterns = [
- url(r'^$', views.iconolab.RedirectView.as_view(url=reverse_lazy("home"))),
+ url(r'^$', django_views.generic.RedirectView.as_view(url=reverse_lazy("home"))),
url(r'^admin/', admin.site.urls),
url(r'^home$', views.iconolab.GlobalHomepageView.as_view(), name="home"),
url(r'^collections/(?P<collection_name>[a-z0-9\-]+)$', views.iconolab.CollectionHomepageView.as_view(), name='collection_home'), # Home fond
url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/items/(?P<item_guid>[^/]+)$', views.iconolab.ShowItemView.as_view(), name='item_detail'),
+ url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/items/?$', django_views.generic.RedirectView.as_view(pattern_name="collection_home")),
+ url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/images/?$', django_views.generic.RedirectView.as_view(pattern_name="collection_home")),
url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/images/(?P<image_guid>[^/]+)$', views.iconolab.ShowImageView.as_view(), name='image_detail'),
+ url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/images/(?P<image_guid>[^/]+)/annotations/?$', django_views.generic.RedirectView.as_view(pattern_name="image_detail")),
url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/images/(?P<image_guid>[^/]+)/annotations/create$', login_required(views.iconolab.CreateAnnotationView.as_view()), name='annotation_create'),
url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/detail$', views.iconolab.ShowAnnotationView.as_view(), name='annotation_detail'),
url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/edit$', login_required(views.iconolab.EditAnnotationView.as_view()), name='annotation_edit'),
+ url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/revisions/?$', django_views.generic.RedirectView.as_view(pattern_name="annotation_detail")),
url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/revisions/(?P<revision_guid>[^/]+)/detail', views.iconolab.ShowRevisionView.as_view(), name='revision_detail'),
url(r'^collections/(?P<collection_name>[a-z0-9\-]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/revisions/(?P<revision_guid>[^/]+)/merge$', login_required(views.iconolab.MergeProposalView.as_view()), name='annotation_merge'),
url(r'^user/(?P<slug>[a-z0-9\-]+)/home/?$', views.iconolab.UserHomeView.as_view(), name="user_home"),
--- a/src/iconolab/views/iconolab.py Wed Aug 17 18:36:44 2016 +0200
+++ b/src/iconolab/views/iconolab.py Thu Aug 18 10:49:18 2016 +0200
@@ -2,7 +2,7 @@
from django.http import Http404
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
-from django.views.generic import View, DetailView, RedirectView
+from django.views.generic import View, DetailView, RedirectView, TemplateView
from django.views.generic.base import ContextMixin
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse
@@ -80,7 +80,7 @@
def check_kwargs(self, kwargs):
try:
collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
- except Collection.DoesNotExist:
+ except (ValueError, Collection.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
return True, (collection)
@@ -102,11 +102,11 @@
def check_kwargs(self, kwargs):
try:
collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
- except Collection.DoesNotExist:
+ except (ValueError, Collection.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
item = Item.objects.prefetch_related("images").get(item_guid=kwargs.get('item_guid'))
- except Item.DoesNotExist:
+ except (ValueError, Item.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
return True, (collection, item)
@@ -131,11 +131,11 @@
def check_kwargs(self, kwargs):
try:
collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
- except Collection.DoesNotExist:
+ except (ValueError, Collection.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
- except Image.DoesNotExist:
+ except (ValueError, Image.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
return True, (collection, image)
@@ -163,11 +163,11 @@
def check_kwargs(self, kwargs):
try:
collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
- except Collection.DoesNotExist:
+ except (ValueError, Collection.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
- except Image.DoesNotExist:
+ except (ValueError, Image.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
return True, (collection, image)
@@ -230,15 +230,15 @@
def check_kwargs(self, kwargs):
try:
collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
- except Collection.DoesNotExist:
+ except (ValueError, Collection.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
- except Image.DoesNotExist:
+ except (ValueError, Image.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
- except Annotation.DoesNotExist:
+ except (ValueError, Annotation.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
return True, (collection, image, annotation)
@@ -300,15 +300,15 @@
def check_kwargs(self, kwargs):
try:
collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
- except Collection.DoesNotExist:
+ except (ValueError, Collection.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
- except Image.DoesNotExist:
+ except (ValueError, Image.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
- except Annotation.DoesNotExist:
+ except (ValueError, Annotation.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
return True, (collection, image, annotation)
@@ -376,19 +376,19 @@
def check_kwargs(self, kwargs):
try:
collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
- except Collection.DoesNotExist:
+ except (ValueError, Collection.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
- except Image.DoesNotExist:
+ except (ValueError, Image.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
- except Annotation.DoesNotExist:
+ except (ValueError, Annotation.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
revision = AnnotationRevision.objects.select_related('parent_revision').get(revision_guid=kwargs.get('revision_guid'))
- except AnnotationRevision.DoesNotExist:
+ except (ValueError, AnnotationRevision.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
return True, (collection, image, annotation, revision)
@@ -434,19 +434,19 @@
def check_kwargs(self, kwargs):
try:
collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
- except Collection.DoesNotExist:
+ except (ValueError, Collection.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
- except Image.DoesNotExist:
+ except (ValueError, Image.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
- except Annotation.DoesNotExist:
+ except (ValueError, Annotation.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
try:
revision = AnnotationRevision.objects.select_related('parent_revision').get(revision_guid=kwargs.get('revision_guid'))
- except AnnotationRevision.DoesNotExist:
+ except (ValueError, AnnotationRevision.DoesNotExist):
return False, RedirectView.as_view(url=reverse('404error'))
return True, (collection, image, annotation, revision)
@@ -564,7 +564,5 @@
return render(request, 'iconolab/merge_revision.html', context)
-class NotFoundErrorView(View):
- def get(self, request, *args, **kwargs):
- # Handle image display here
- pass
\ No newline at end of file
+class NotFoundErrorView(TemplateView):
+ template_name="errors/404error.html"
\ No newline at end of file