diff --git a/app.yaml b/app.yaml index 785d976..76c1433 100644 --- a/app.yaml +++ b/app.yaml @@ -1,5 +1,5 @@ application: fxc-log-service -version: 1 +version: 2 runtime: python api_version: 1 @@ -8,5 +8,21 @@ handlers: - url: /static static_dir: static +- url: /list + login: required + script: upload.py + +- url: /show/.* + login: required + script: upload.py + +- url: /delete/* + login: required + script: upload.py + +- url: /bulk-action + login: required + script: upload.py + - url: /.* script: upload.py diff --git a/config.yaml b/config.yaml deleted file mode 100644 index 8812218..0000000 --- a/config.yaml +++ /dev/null @@ -1 +0,0 @@ -authorized_user: your_account@gmail.com diff --git a/settings.py b/settings.py index 5b93073..33625b2 100644 --- a/settings.py +++ b/settings.py @@ -1 +1 @@ -ALLOWED_USERS = ('test@example.com', 'somebodyelse@me.com' ) \ No newline at end of file +ALLOWED_USERS = ('test@example.com', 'somebodyelse@me.com' ) diff --git a/static/test.html b/static/test.html index 0961144..e50bf45 100644 --- a/static/test.html +++ b/static/test.html @@ -5,6 +5,7 @@ username: uid: filename: + version: file: diff --git a/templates/denied.html b/templates/denied.html new file mode 100644 index 0000000..fa55af6 --- /dev/null +++ b/templates/denied.html @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/templates/dump.html b/templates/dump.html new file mode 100644 index 0000000..b37aae6 --- /dev/null +++ b/templates/dump.html @@ -0,0 +1,11 @@ + + +
  • {{item}}
  • + {% endfor %} +

    + + + \ No newline at end of file diff --git a/templates/list.html b/templates/list.html index dfeb8e6..98db96c 100644 --- a/templates/list.html +++ b/templates/list.html @@ -1,14 +1,57 @@ + + + +

    + +
    \ No newline at end of file diff --git a/upload.py b/upload.py index 871b31a..456cfd3 100644 --- a/upload.py +++ b/upload.py @@ -13,6 +13,7 @@ class Content(db.Model): filename = db.StringProperty() contents = db.BlobProperty() date = db.DateTimeProperty(auto_now_add=True) + version = db.StringProperty() class UploadPage(webapp.RequestHandler): def post(self): @@ -20,6 +21,7 @@ def post(self): username=self.request.get("username"), uid =self.request.get("uid"), filename=self.request.get("filename"), + version =self.request.get("version"), contents=db.Blob(self.request.get("file")) ) item.put() @@ -32,8 +34,13 @@ def get(self): self.redirect(users.create_login_url(self.request.uri)) return - if user.email().lower() not in settings.ALLOWED_USERS: - self.response.out.write("Permission Denied") + if user.email().lower() not in settings.ALLOWED_USERS and not users.is_current_user_admin(): + template_data = { + 'nickname' : user.nickname(), + 'logout_url' : users.create_logout_url("/list"), + } + path = os.path.join(os.path.dirname(__file__), 'templates/denied.html') + self.response.out.write(template.render(path, template_data )) return template_data = { @@ -54,16 +61,39 @@ def get(self, key): class ShowPage(webapp.RequestHandler): def get(self, key): item = Content.get(key) - self.response.headers['Content-Type'] = 'text/plain' - #evaluate the extension, txt and log should be text, otherwise octet-stream - #self.response.headers['Content-Type'] = 'application/octet-stream' + if item.filename[-4:] in (".log", ".txt"): + self.response.headers['Content-Type'] = 'text/plain' + else: + self.response.headers['Content-Type'] = 'application/octet-stream' + self.response.headers['Content-Disposition'] = 'attachment; filename="%s"' % (item.filename) self.response.out.write(item.contents) + +class BulkAction(webapp.RequestHandler): + def post(self): + action = self.request.get("action") + deleted = [] + if action == "Bulk Delete": + keys = self.request.get("bulk-items", allow_multiple=True) + for key in keys: + item = Content.get(key) + deleted.append("User %s, uid %s uploaded on %s: %s with internal key %s" % (item.username, item.uid, item.date, item.filename, key)); + Content.delete(item) + + template_data = { + 'text' : 'Deleted', + 'items' : deleted + } + path = os.path.join(os.path.dirname(__file__), 'templates/dump.html') + self.response.out.write(template.render(path, template_data )) + else: + self.redirect('/list', False) application = webapp.WSGIApplication([ ('/list', ListPage), ('/show/(.*)', ShowPage), ('/delete/(.*)', DeletePage), - ('/upload', UploadPage) + ('/upload', UploadPage), + ('/bulk-action.*', BulkAction) ], debug=True) def main():