first pass on merge system
authordurandn
Tue, 26 Jul 2016 12:09:09 +0200
changeset 77 89bfc5499455
parent 76 cfb718dadcdf
child 80 9675cdd079df
first pass on merge system
src/iconolab/models.py
src/iconolab/templates/iconolab/change_annotation.html
src/iconolab/templates/iconolab/detail_annotation.html
src/iconolab/templates/iconolab/detail_revision.html
src/iconolab/templates/iconolab/merge_revision.html
src/iconolab/views.py
--- 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 @@
         &nbsp;
         <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 @@
         &nbsp;
         <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>
         &nbsp;
         <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):