--- a/src/iconolab/models.py Tue Jul 26 12:07:48 2016 +0200
+++ b/src/iconolab/models.py Tue Jul 26 12:09:09 2016 +0200
@@ -186,13 +186,14 @@
# Call when we're validating an awaiting revision whose parent isn't the current revision OR IF IT WAS CHANGED BY THE ANNOTATION AUTHOR
@transaction.atomic
def merge_existing_revision(self, title, description, fragment, tags, revision_to_merge):
- merged_revision = self.make_new_revision(author=self.author, title=title, description=description, fragment=fragment, tags=tags)
+ merged_revision = self.make_new_revision(author=self.author, title=title, description=description, fragment=fragment, tags_json=tags)
merged_revision.merge_parent_revision = revision_to_merge
merged_revision.save()
revision_to_merge.state = AnnotationRevision.STUDIED
revision_to_merge.save()
self.current_revision=merged_revision
self.save()
+ return merged_revision
class AnnotationRevision(models.Model):
--- a/src/iconolab/templates/iconolab/change_annotation.html Tue Jul 26 12:07:48 2016 +0200
+++ b/src/iconolab/templates/iconolab/change_annotation.html Tue Jul 26 12:09:09 2016 +0200
@@ -101,7 +101,7 @@
</div>
{% endif %}
{% csrf_token %}
- <fieldset class="form-group {% if form.title.errors %}has-errors{% endif %}">
+ <fieldset class="form-group {% if form.title.errors %}has-error{% endif %}">
<label class="control-label" for="id_{{ form.title.name }}">{{ form.title.label }}</label>
{% if form.title.errors %}
<div class="alert alert-danger" role="alert">
@@ -114,7 +114,7 @@
name="{{ form.title.name }}"
id="id_{{ form.title.name }}" value="{% if form.title.value %}{{ form.title.value}}{% endif %}">
</fieldset>
- <fieldset class="form-group {% if form.description.errors %}has-errors{% endif %}">
+ <fieldset class="form-group {% if form.description.errors %}has-error{% endif %}">
<label class="control-label" for="id_{{ form.description.name }}">{{ form.description.label }}</label>
{% if form.description.errors %}
<div class="alert alert-danger" role="alert">
@@ -132,7 +132,7 @@
<typeahead :tags="{{ tags_data }}"></typeahead>
</fieldset>
- <fieldset class="form-group">
+ <fieldset class="form-group {% if form.comment.errors %}has-error{% endif %}">
<label class="control-label" for="id_{{ form.comment.name }}">{{ form.comment.label }}</label>
{% if form.comment.errors %}
<div class="alert alert-danger" role="alert">
--- a/src/iconolab/templates/iconolab/detail_annotation.html Tue Jul 26 12:07:48 2016 +0200
+++ b/src/iconolab/templates/iconolab/detail_annotation.html Tue Jul 26 12:09:09 2016 +0200
@@ -103,7 +103,7 @@
{% endif %}
{% endif %} revision-link">
{% if comment.revision.author == annotation.author %}
- Voir révision
+ Voir révision {% if comment.revision.merge_parent_revision %}(fusion){% endif %}
{% else %}
Voir proposition
{% if comment.revision.state == 0 %}
--- a/src/iconolab/templates/iconolab/detail_revision.html Tue Jul 26 12:07:48 2016 +0200
+++ b/src/iconolab/templates/iconolab/detail_revision.html Tue Jul 26 12:09:09 2016 +0200
@@ -27,7 +27,8 @@
<br>
<a href="{% url 'image_detail' collection_name image_guid %}"><i class="fa fa-picture-o" aria-hidden="true"></i> Revoir l'image </a><br>
<a href="{% url 'annotation_detail' collection_name image_guid annotation_guid %}"><i class="fa fa-reply" aria-hidden="true"></i> Retour sur l'annotation</a><br>
- {% if revision.parent_revision %}<a href="{% url 'revision_detail' collection_name image_guid annotation_guid revision.parent_revision.revision_guid %}"><i class="fa fa-history" aria-hidden="true"></i> Voir révision précédente</a><br>{% endif %}
+ {% if revision.parent_revision %}<a href="{% url 'revision_detail' collection_name image_guid annotation_guid revision.parent_revision.revision_guid %}"><i class="fa fa-history" aria-hidden="true"></i> Voir {% if revision.merge_parent_revision %}première {% endif %}révision précédente</a><br>{% endif %}
+ {% if revision.merge_parent_revision %}<a href="{% url 'revision_detail' collection_name image_guid annotation_guid revision.merge_parent_revision.revision_guid %}"><i class="fa fa-history" aria-hidden="true"></i> Voir seconde révision précédente</a><br>{% endif %}
</div>
<div id="revision-detail" class='col-xs-6' style="">
<h4>Annotation révisée par {{ revision.author.username}} </h4>
--- a/src/iconolab/templates/iconolab/merge_revision.html Tue Jul 26 12:07:48 2016 +0200
+++ b/src/iconolab/templates/iconolab/merge_revision.html Tue Jul 26 12:09:09 2016 +0200
@@ -33,7 +33,7 @@
<a class="btn btn-default btn-xs" title="Comparer avec proposition"><i class="fa fa-exchange" aria-hidden="true"></i></a>
<a class="btn btn-default btn-xs" title="Copier vers proposition"><i class="fa fa-chevron-right" aria-hidden="true"></i></a>
- <typeahead :tags="{{ current_tags_data }}"></typeahead>
+ <typeahead id="merge-current-revision-tags" :tags="{{ current_tags_data }}"></typeahead>
</fieldset>
<label>Image: </label><br>
<label>Commentaire de création: </label>
@@ -51,6 +51,8 @@
</h4>
<div id="merge-parent-revision-alert" class="alert alert-warning revision-info-alert">
Cette révision est la révision à partir de laquelle l'annotation proposée a été créée.
+
+ {% if parent_revision.revision_guid == current_revision.revision_guid %}<br><b>Note: Dans ce cas précis, cette révision est identique à la révision courante. </b>{% endif %}
</div>
<form class="form">
<fieldset class="form-group">
@@ -67,19 +69,19 @@
<a class="btn btn-default btn-xs" title="Comparer avec proposition"><i class="fa fa-exchange" aria-hidden="true"></i></a>
<a class="btn btn-default btn-xs" title="Copier vers proposition"><i class="fa fa-chevron-right" aria-hidden="true"></i></a>
- <textarea class="form-control"
- id="merge-current-revision-description" readonly="readonly">{{ parent_revision.description}}</textarea>
+ <textarea id="merge-parent-revision-description" class="form-control"
+ readonly="readonly">{{ parent_revision.description}}</textarea>
</fieldset>
<fieldset class="form-group">
<label class="control-label">Tags: </label>
<a class="btn btn-default btn-xs" title="Comparer avec proposition"><i class="fa fa-exchange" aria-hidden="true"></i></a>
<a class="btn btn-default btn-xs" title="Copier vers proposition"><i class="fa fa-chevron-right" aria-hidden="true"></i></a>
- <typeahead :tags="{{ current_tags_data }}"></typeahead>
+ <typeahead id="parent-comment" :tags="{{ current_tags_data }}"></typeahead>
</fieldset>
<label>Image: </label><br>
<label>Commentaire de création: </label>
- <div class="alert alert-info" role="alert">
+ <div id="merge-parent-revision-comment" class="alert alert-info" role="alert">
<span class="glyphicon glyphicon-comment" aria-hidden="true"></span>
<span class="sr-only">Info:</span>
<b>Révision par {{ parent_revision.author }} <br> le {{ parent_revision.created|date:"d/m/Y" }} à {{ parent_revision.created|time:"H:i" }}</b><br>
@@ -88,8 +90,75 @@
</form>
</div>
<div class="col-md-4">
- <h3>Révision proposée</h3>
- {{ proposal_revision.title }} - {{ proposal_revision.description }} - {{ proposal_tags_data }} - {{ proposal_comment }}<br>
+ <h4>Révision proposée</h4>
+ <form class="form" action="{% url 'annotation_merge' collection_name image_guid annotation_guid revision_guid %}" method="POST">
+ {% if merge_form.errors %}
+ <div id="errors" style="display: none;">
+ {% for field in merge_form %}
+ {% if field.errors %}
+ * {{ merge_form.name }}: {{ error|striptags }}
+ {% endif %}
+ {% endfor %}
+ </div>
+ {% endif %}
+ {% csrf_token %}
+ <fieldset class="form-group {% if merge_form.title.errors %}has-error{% endif %}">
+ <label class="control-label" for="id_{{ merge_form.title.name }}">Titre </label>
+ {% if merge_form.title.errors %}
+ <div class="alert alert-danger" role="alert">
+ <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
+ <span class="sr-only">Error:</span>
+ {{ merge_form.title.errors | striptags }}
+ </div>
+ {% endif %}
+ <input type="text" class="form-control"
+ name="{{ merge_form.title.name }}"
+ id="id_{{ merge_form.title.name }}" value="{% if merge_form.title.value %}{{ merge_form.title.value}}{% endif %}">
+ </fieldset>
+ <fieldset class="form-group {% if merge_form.description.errors %}has-error{% endif %}">
+ <label class="control-label" for="id_{{ merge_form.description.name }}">Description: </label>
+ {% if merge_form.description.errors %}
+ <div class="alert alert-danger" role="alert">
+ <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
+ <span class="sr-only">Error:</span>
+ {{ form.description.errors | striptags }}
+ </div>
+ {% endif %}
+ <textarea class="form-control"
+ name="{{ merge_form.description.name }}"
+ id="id_{{ merge_form.description.name }}" >{% if merge_form.description.value %}{{ merge_form.description.value}}{% endif %}</textarea>
+ </fieldset>
+ <fieldset class="form-group">
+ <label class="control-label" for="id_{{ form.tags.name }}">{{ merge_form.tags.label }}: </label>
+ <typeahead :tags="{{ tags_data }}"></typeahead>
+ </fieldset>
+ <label class="control-label" for="id_{{ form.tags.name }}">Image: </label><br>
+ <label>Commentaire de création: </label>
+ <div id="merge-proposal-revision-comment" class="alert alert-info" role="alert">
+ <span class="glyphicon glyphicon-comment" aria-hidden="true"></span>
+ <span class="sr-only">Info:</span>
+ <b>Révision par {{ proposal_revision.author }} <br> le {{ proposal_revision.created|date:"d/m/Y" }} à {{ proposal_revision.created|time:"H:i" }}</b><br>
+ <i class="fa fa-quote-left" aria-hidden="true"></i> {{ proposal_comment.comment }} <i class="fa fa-quote-right" aria-hidden="true"></i>
+ </div>
+ <fieldset class="form-group {% if merge_form.comment.errors %}has-error{% endif %}">
+ <label class="control-label" for="id_{{ merge_form.comment.name }}">Commentaire de révision:</label>
+ {% if merge_form.comment.errors %}
+ <div class="alert alert-danger" role="alert">
+ <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
+ <span class="sr-only">Error:</span>
+ {{ merge_form.comment.errors | striptags }}
+ </div>
+ {% endif %}
+ <textarea class="form-control"
+ name="{{ merge_form.comment.name }}"
+ id="id_{{ merge_form.comment.name }}" ></textarea>
+ </fieldset>
+ <input type="hidden" name="tags" value="[]"></input>
+ <input v-model="normalizePath" type="hidden" name="fragment" value=";FREE"></input>
+ <button type="submit" class="save btn btn-default btn-sm">Enregister</button>
+ <a class="btn btn-default btn-sm" href="{% url 'revision_detail' collection_name image_guid annotation_guid revision_guid %}" role="button">Retour</a>
+ <br><br>
+ </form>
</div>
</div>
{% endblock %}
--- a/src/iconolab/views.py Tue Jul 26 12:07:48 2016 +0200
+++ b/src/iconolab/views.py Tue Jul 26 12:09:09 2016 +0200
@@ -397,7 +397,6 @@
)
)(request)
# Auto-reject the revision only if the proper query arg is set
- print(request.GET)
if "auto_reject" in request.GET and request.GET["auto_reject"] in ["True", "true", "1", "yes"]:
annotation.reject_existing_revision(revision)
return RedirectView.as_view(
@@ -426,11 +425,59 @@
context['current_revision'] = annotation.current_revision
context['current_tags_data'] = annotation.current_revision.get_tags_json()
context['current_comment'] = annotation.current_revision.creation_comment.first()
+
+ merge_form = AnnotationRevisionForm(instance=revision)
+ context['merge_form'] = merge_form
return render(request, 'iconolab/merge_revision.html', context)
def post(self, request, *args, **kwargs):
# Handle merge form submit here
- pass
+ success, result = self.check_kwargs(kwargs)
+ if success:
+ (collection, image, annotation, revision) = result
+ else:
+ return result(request)
+ collection_name = kwargs['collection_name']
+ image_guid = kwargs['image_guid']
+ annotation_guid = kwargs['annotation_guid']
+ revision_guid = kwargs['revision_guid']
+
+ merge_revision_form = AnnotationRevisionForm(request.POST)
+ if merge_revision_form.is_valid():
+ revision_title = merge_revision_form.cleaned_data['title']
+ revision_description = merge_revision_form.cleaned_data['description']
+ revision_fragment = merge_revision_form.cleaned_data['fragment']
+ revision_tags_json = merge_revision_form.cleaned_data['tags']
+ new_revision = annotation.merge_existing_revision(revision_title, revision_description, revision_fragment, revision_tags_json, revision)
+ revision_comment = merge_revision_form.cleaned_data['comment']
+ comment = IconolabComment.objects.create(
+ comment = revision_comment,
+ revision = new_revision,
+ content_type = ContentType.objects.get(app_label='iconolab', model='annotation'),
+ content_object = annotation,
+ site = Site.objects.get(id=settings.SITE_ID),
+ object_pk = annotation.id,
+ user = request.user,
+ user_name = request.user.username
+ )
+ return RedirectView.as_view(url=reverse('annotation_detail', kwargs={'collection_name': collection_name, 'image_guid': image_guid, 'annotation_guid': annotation_guid}))(request)
+ context = self.get_context_data(**kwargs)
+ context['image'] = image
+ context['merge_form'] = merge_revision_form
+ context['annotation'] = annotation
+ # Proposal data
+ context['proposal_revision'] = revision
+ context['proposal_tags_data'] = revision.get_tags_json()
+ context['proposal_comment'] = revision.creation_comment.first()
+ # Parent data
+ context['parent_revision'] = revision.parent_revision
+ context['parent_tags_data'] = revision.parent_revision.get_tags_json()
+ context['parent_comment'] = revision.parent_revision.creation_comment.first()
+ # Current data
+ context['current_revision'] = annotation.current_revision
+ context['current_tags_data'] = annotation.current_revision.get_tags_json()
+ context['current_comment'] = annotation.current_revision.creation_comment.first()
+ return render(request, 'iconolab/merge_revision.html', context)
class NotFoundErrorView(View):