Commit 5510b90
Changed files (8)
templates
uploads
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()