Commit 5510b90

root <root@tape.intranet.ltsnet.net>
2013-12-18 15:02:51
more admin things
1 parent de5e15b
audit/1387332439.147935.86003
@@ -1,1 +0,0 @@
-{"transferid": "1387332439.147935.86003", "username": "user", "warnings": ["xxxx", "xxxx", "xxxx"], "error": false, "filenames": ["3.txt", "1.txt", "2.txt"]}
\ No newline at end of file
audit/1387343428.412962.14809
@@ -1,1 +0,0 @@
-{"transferid": "1387343428.412962.14809", "username": "userb", "warnings": ["xxxx", "xxxx"], "error": false, "filenames": ["out.gif", "KH8fCJb.jpg"]}
\ No newline at end of file
templates/admin.html
@@ -9,41 +9,49 @@
 <div class="container">
   <div class="row">
     <div class="col-xs-12">
+      <div id="msg-area"></div>
       <ul id="filelist" class="list-group">
       {% if 'items' in globals() %} 
         {% for item in items %}
-          <li><a href="#">{{item}}</a></li>
+          <li id="{{item['transferid']}}" class="list-group-item">
+            <h3 class="list-group-item-heading">{{item['transferid']}} - {{item['username']}}</h2>
+            <div class="btn-group pull-right">
+              <button type='button' class='btn btn-lg btn-success' data-approve="true" data-id="{{item['transferid']}}">Accept</button>
+              <button type='button' class='btn btn-lg btn-danger' data-approve="false" data-id="{{item['transferid']}}">Deny</button>
+            </div>
+            <ul class="bot-padding list-group-item-text">
+            {% for w in item['warnings'] %}
+            <li>{{w}}</li>
+            {% end %}
+            </ul>
+          </li>
         {% end %}
       {% end %}
       </ul>
-      <table id="audit-table">
-        <thead>
-          <th data-dynatable-column="transferid">Transfer ID</th>
-          <th>Username</th>
-          <th>Error</th>
-          <th>Filenames</th>
-          <th>Warnings</th>
-          <th>Actions</th>
-        </thead>
-        <tbody>
-        </tbody>
-      </table>
     </div>
   </div>
 </div><!-- /.container -->
 {% end %}
 
 {% block js %}
-<script src="{{ static_url("jquery.dynatable.js") }}"></script>
 <script>
-  $("#audit-table").dynatable({
-    dataset : {
-      ajax : true,
-      ajaxUrl: '/admin',
-      ajaxOnLoad: true,
-      defaultColumnIdStyle: 'lowercase',
-      records: []
-    }
+RegExp.escape = function(text) {
+    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+}  
+$('.btn').click(function(e){
+    $.ajax({
+      url: "",
+      type: "POST",
+      data: JSON.stringify({id:$(this).data("id"), approve:$(this).data("approve")}),
+      contentType: "application/json; charset=utf-8",
+      dataType: "json",
+      }).done(function(data){
+      $('#msg-area').removeClass();
+      $('#msg-area').attr('class', 'alert alert-'+data['result_type']);
+      $('#msg-area').text('ID ' + data['id'] + ' - ' + data['result']);
+      console.log( $( '[id="' + data['id'] + '"]' ) );
+      $('[id="'+data['id']+'"]').remove();
+    });
   });
 </script>
 {% end %}
templates/admindyna.html
@@ -0,0 +1,49 @@
+{% extends "base-nav.html" %}
+
+{% block css %}
+<link rel="stylesheet" href="{{ static_url("ffu.css") }}">
+<link rel="stylesheet" href="{{ static_url("jquery.dynatable.css") }}">
+{% end %}
+
+{% block content %}
+<div class="container">
+  <div class="row">
+    <div class="col-xs-12">
+      <ul id="filelist" class="list-group">
+      {% if 'items' in globals() %} 
+        {% for item in items %}
+          <li><a href="#">{{item}}</a></li>
+        {% end %}
+      {% end %}
+      </ul>
+      <table id="audit-table">
+        <thead>
+          <th data-dynatable-column="transferid">Transfer ID</th>
+          <th>Username</th>
+          <th>Error</th>
+          <th>Filenames</th>
+          <th>Warnings</th>
+          <th>Actions</th>
+        </thead>
+        <tbody>
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div><!-- /.container -->
+{% end %}
+
+{% block js %}
+<script src="{{ static_url("jquery.dynatable.js") }}"></script>
+<script>
+  $("#audit-table").dynatable({
+    dataset : {
+      ajax : true,
+      ajaxUrl: '/admin',
+      ajaxOnLoad: true,
+      defaultColumnIdStyle: 'lowercase',
+      records: []
+    }
+  });
+</script>
+{% end %}
uploads/.gitignore
@@ -1,1 +0,0 @@
-*.tar.gz
ffu.py
@@ -1,16 +1,19 @@
 import tornado.ioloop
 import tornado.web
-#from config import COOKIE_SECRET, STATIC_DIR, TEMPLATE_DIR, AUDIT_DIR
-#from login import login
-#from soccermove import process_file_import
-# Tornado
+import tarfile
+import json
+from config import IMPORT_AUDIT, IMPORT_FINAL, MANIFEST
+from sublogin import login
+from submove import process_file_import
 from functools import wraps
-import time, random, json, os
+from StringIO import StringIO
+
+import os
 WORKING_DIR = os.path.dirname(os.path.abspath(__file__))
 COOKIE_SECRET = "F+ek4AWESWewGryPRbzq5aSHR1uRD0/ItZenLimCkGI="
 STATIC_DIR = os.path.join(WORKING_DIR,"static")
 TEMPLATE_DIR = os.path.join(WORKING_DIR,"templates")
-AUDIT_DIR = os.path.join(WORKING_DIR,"audit")
+TORNADO_PORT = "8888"
 
 class BaseHandler(tornado.web.RequestHandler):
   def get_login_url(self):
@@ -41,12 +44,9 @@ class LoginHandler(BaseHandler):
   def post(self):
     username = self.get_argument("username", "")
     password = self.get_argument("password", "")
-    #status, error =  login(username, password)
-    error = "error"
-    status = ((username=="user" or username=="userb") and password=="pass")
+    status, error =  login(username, password)
     if status:
-      #adminstatus = error #Yes, ghetto
-      adminstatus = (username=="userb")
+      adminstatus = error #Yes, ghetto
       self.set_current_user(username)
       self.set_admin_status(adminstatus)
       self.redirect(self.get_argument("next",u"/"))
@@ -82,25 +82,7 @@ class UploadHandler(BaseHandler):
       files = []
       for f in self.request.files.itervalues():
           files.append((f[0]['filename'], f[0]['body']))
-      #process_file_import(self.current_user, files)
-      self.create_fake_manifest(files)
-
-  def create_fake_manifest(self,files): 
-    transferid = "%f.%05d" % (time.time(), random.randint(0,99999))
-    manifest = {'transferid': transferid,
-                'username'  : self.current_user,
-                'filenames'  : [],
-                'warnings'   : [],
-                'error'     : False}
-    for name,body in files:
-      manifest['filenames'].append(name) 
-      manifest['warnings'].append("xxxx")
-
-    print json.dumps(manifest)
-    
-    f = open(os.path.join(AUDIT_DIR,transferid), 'w')    
-    f.write(json.dumps(manifest))
-    f.close()
+      process_file_import(self.current_user, files)
 
 def is_admin(method):
   @wraps(method)
@@ -115,17 +97,47 @@ class AdminHandler(BaseHandler):
   @tornado.web.authenticated
   @is_admin
   def get(self):
-    if self.request.headers.get('X-Requested-With') == "XMLHttpRequest":
-      items = []
-      for filename in os.listdir(AUDIT_DIR):
-        fout = open(os.path.join(AUDIT_DIR,filename), 'rb')
-        items.append(json.loads(fout.read()))
-        fout.close()
-      self.write(json.dumps(items))
-      self.set_header("Content-Type", "application/json; charset=UTF-8")
-      self.finish()
+    #if self.request.headers.get('X-Requested-With') == "XMLHttpRequest":
+    audit_tar = False
+    items = []
+    for filename in os.listdir(IMPORT_AUDIT):
+      try: audit_tar = tarfile.open(os.path.join(IMPORT_AUDIT,filename), mode = "r:gz")
+      except: pass
+      if audit_tar:
+        if MANIFEST in audit_tar.getnames():
+          items.append(json.loads(audit_tar.extractfile(MANIFEST).read()))
+          
+    self.render("admin.html", items=items)
+
+  @tornado.web.authenticated
+  @is_admin
+  def post(self):
+    def admin_response(audit_id,result_type,result):
+      self.write(json.dumps({"id":audit_id, "result_type": result_type, "result": result}))
+    
+    if self.request.headers.get("Content-Type").startswith("application/json"):
+      self.json_args = json.loads(self.request.body)
+      audit_id = self.json_args['id']
+      audit_file = audit_id+".tar.gz"
+      audit_approve = self.json_args['approve']
+      if audit_file in os.listdir(IMPORT_AUDIT):
+        if audit_approve:
+          try:
+            os.rename(os.path.join(IMPORT_AUDIT,audit_file), os.path.join(IMPORT_FINAL,audit_file))      
+            admin_response(audit_id, "success", "Transfer Approved")
+          except:
+            admin_response(audit_id, "error", "Transfer Approval Failed")
+        else:
+          try:
+            os.remove(os.path.join(IMPORT_AUDIT,audit_file))
+            admin_response(audit_id, "success", "Transfer Destruction Success")
+          except:
+            admin_response(audit_id, "success", "Transfer Destruction Failed")
+      else:
+        self.write(json.dumps({"id":audit_id, "result_type": "error", "result":"Invalid ID, File not found"}))
     else:
-      self.render("admin.html")
+	pass
+
 
 handlers = [
   (r"/", UploadHandler),
@@ -143,6 +155,6 @@ settings = {
 application = tornado.web.Application(handlers, **settings )
 
 if __name__ == "__main__":
-  application.listen(8888)
+  application.listen(TORNADO_PORT)
   tornado.ioloop.IOLoop.instance().start()
 
sublogin.py
@@ -0,0 +1,12 @@
+ 
+def login(username, password):
+   if username == "user" and password == "pass": return True,False
+   if username == "userb" and password == "pass": return True,True
+   if username == "userc" and password == "pass": return True,"Not in transfer group"
+   else: return False,"Wrong Username or Password"
+
+if __name__ == "__main__":
+    import getpass
+    username = raw_input("Username: ")
+    password = getpass.getpass("Password: ")
+    print login(username, password)
submove.py
@@ -0,0 +1,21 @@
+
+import time, random, json, os
+
+def process_file_import(username, files):
+  pass
+def create_fake_manifest(self,files): 
+  transferid = "%f.%05d" % (time.time(), random.randint(0,99999))
+  manifest = {'transferid': transferid,
+              'username'  : self.current_user,
+              'filenames'  : [],
+              'warnings'   : [],
+              'error'     : False}
+  for name,body in files:
+    manifest['filenames'].append(name) 
+    manifest['warnings'].append("xxxx")
+
+  print json.dumps(manifest)
+    
+  f = open(os.path.join(AUDIT_DIR,transferid), 'w')    
+  f.write(json.dumps(manifest))
+  f.close()