From abed9a80283ed07531ebb2ef8d054f5991a7be5b Mon Sep 17 00:00:00 2001
From: Branson Stephens <stephenb@uwm.edu>
Date: Fri, 12 Jul 2013 10:53:15 -0500
Subject: [PATCH] implemented delete button

---
 gracedb/views.py                    | 24 ++++++++++++++-
 templates/gracedb/event_detail.html | 48 ++++++++++++++++++++++++-----
 2 files changed, 64 insertions(+), 8 deletions(-)

diff --git a/gracedb/views.py b/gracedb/views.py
index b924cb3d1..56ef1d638 100644
--- a/gracedb/views.py
+++ b/gracedb/views.py
@@ -1076,6 +1076,7 @@ def latest(request):
 #-----------------------------------------------------------------------------------
 # For tags.  A new view function.  We need this because the API one would want users
 # to have certs stored in their browser.
+# XXX Get rid of this and use apiweb views instead?
 #-----------------------------------------------------------------------------------
 
 def taglogentry(request, graceid, num, tagname):
@@ -1116,8 +1117,29 @@ def taglogentry(request, graceid, num, tagname):
                 msg = msg + str(e) + '\n'
                 msg = "The tag itself, however, is saved."
                 return HttpResponse(msg, content_type="text")
+    elif request.method == "DELETE":
+        try:
+            # Has this tag-eventlog relationship already been created? 
+            tag = eventlog.tag_set.filter(name=tagname)[0]
+            tag.eventlogs.remove(eventlog)
+        except:
+            msg = "Attempted to delete tag that doesn't exist."
+            return HttpResponseBadRequest(msg)
+
+        # Create a log entry to document the tag deletion.
+        msg = "Removed tag %s for message %s. " % (tagname, num)
+        logentry = EventLog(event=event,
+                           issuer=request.user,
+                           comment=msg)
+        try:
+            logentry.save()
+        except Exception as e:
+            # Since the tag creation was successful, we'll return 200.
+            return HttpResponse("Tag removed, but failed to create log entry: %s" % str(e),
+                        content_type="text")
+
+        return HttpResponse(msg, content_type="text")
     else:
-        # We will only allow PUT here.  Anything else is a bad request: 400
         return HttpResponseBadRequest
 
     # Hopefully, this will only ever be called form inside a script.  Just in case...
diff --git a/templates/gracedb/event_detail.html b/templates/gracedb/event_detail.html
index 94b1afe6c..137d9a166 100644
--- a/templates/gracedb/event_detail.html
+++ b/templates/gracedb/event_detail.html
@@ -47,7 +47,7 @@
                     dc += '                     </td> \n';
                     dc += '                 </tr> \n';
                     dc += '                 <tr> \n';
-                    dc += '                     <td> {{log.comment|sanitize}} \n';
+                    dc += '                     <td> {{log.comment|sanitize|escapejs}} \n';
                     {% if log.fileurl %} 
                     dc += '                         <a href="{{log.fileurl}}">{{log.filename}}.</a> \n';
                     {% endif %} 
@@ -78,9 +78,9 @@
                 {% if not log.hasImage %}
                     dc += '     <tr class="{% cycle 'odd' 'even'%}"> \n';
                     dc += '         <td>{{log.N}}</td> \n';
-                    dc += '         <td>{{log.created|multiTime:"logtime"}}</td> \n';
+                    dc += '         <td>{{log.created|multiTime:"logtime"|escapejs}}</td> \n';
                     dc += '         <td>{{log.issuer.first_name}} {{log.issuer.last_name}}</td> \n';
-                    dc += '         <td>{{log.comment|sanitize}} \n';
+                    dc += '         <td>{{log.comment|sanitize|escapejs}} \n';
                                {% if log.fileurl %}
                     dc += '             <a href="{{log.fileurl}}">{{log.filename}}</a> \n';
                                {% endif %}
@@ -137,10 +137,44 @@
             ret += '        <table> \n';
         {%for tag in log.tag_set.all %} 
             ret += '            <tr> <td> \n';
-            ret += '            <button type="button" id="table_button" data-dojo-type="dijit/form/Button"> \n';
-            ret += '                <span>Click me!</span> \n';
+            ret += '            <button type="button" data-dojo-type="dijit/form/Button"> \n';
+            ret += '                <span>{{tag.name}}</span> \n';
             ret += '                <script type="dojo/on" data-dojo-event="click"> \n';
-            ret += '                      console.log("I was clicked!"); \n';
+/*            ret += '                    console.log("I was clicked."); \n'; */
+            ret += '                    require(["dojo/dom", \n';
+            ret += '                            "dojo/request", \n';
+            ret += '                            "dojo/dom-construct", \n';
+            ret += '                            "dijit/Dialog", \n';
+            ret += '                            "dijit/form/Button"], function(dom,request,domConstruct,Dialog,Button) { \n';
+            ret += '                        var n = {{ log.N }} \n';
+            ret += '                        var tagName = "{{ tag.name }}" \n';
+            ret += '                        var tagUrl = "{% url taglogentry object.graceid "000" "temp" %}" \n';
+            ret += '                        tagUrl = tagUrl.replace("000",n); \n';
+            ret += '                        tagUrl = tagUrl.replace("temp",tagName); \n';
+            ret += '                        var tagResultDialog = new Dialog({ style: "width: 300px" }); \n';
+            ret += '                        var actionBar = domConstruct.create("div", { "class": "dijitDialogPaneActionBar" }); \n';
+            ret += '                        var tbnode = domConstruct.create("div", { \n';
+            ret += '                                style: "margin: 0px auto 0px auto; text-align: center;" \n';
+            ret += '                        }, actionBar); \n';
+            ret += '                        var tagButton = new Button({ \n';
+            ret += '                            label: "Ok", \n';
+            ret += '                            onClick: function(){ \n';
+            ret += '                            tagResultDialog.hide(); \n';
+            ret += '                        }}).placeAt(tbnode); \n';
+            ret += '                        request.del(tagUrl).then( \n';
+            ret += '                            function(text){ \n';
+            ret += '                                tagResultDialog.set("content", text); \n';
+            ret += '                                domConstruct.place(actionBar, tagResultDialog.containerNode); \n';
+            ret += '                                tagResultDialog.show(); \n';
+            ret += '                                //location.reload(true); \n';
+            ret += '                            }, \n';
+            ret += '                            function(error){ \n';
+            ret += '                                tagResultDialog.set("content", "Error: " + error); \n';
+            ret += '                                domConstruct.place(actionBar, tagResultDialog.containerNode); \n';
+            ret += '                                tagResultDialog.show();  \n';
+            ret += '                            } \n';
+            ret += '                       ); \n';
+            ret += '                    }); \n'; 
             ret += '                <\/script>\n';
             ret += '            </button> \n';
             ret += '            </td> </tr> \n';
@@ -148,7 +182,7 @@
             ret += '        </table> \n';
             ret += '        </td> \n';
     {% endif %}
-            ret += '        <td>{{log.comment|sanitize}} \n';
+            ret += '        <td>{{log.comment|sanitize|escapejs}} \n';
     {% if log.fileurl %}
             ret += '            <a href="{{log.fileurl}}">{{log.filename}}</a> \n';
     {% endif %}
-- 
GitLab