Adding Uploading File Functionality To Dashboard
#controllers/login.py
import os, config, lib, uuid
from pytz import timezone
from datetime import datetime 
from bottle import route, template, request, response, redirect
from models import userdb, postdb, categorydb

def checkLogin(username, password):
  if (username == 'Guest') and (password == 'password'):
    return True
  elif userdb.check(username,password):
    return True
  else:
    return False

def getTimeZone():
  khtz = timezone('Asia/Phnom_Penh')
  date = datetime.now().astimezone(tz=khtz).strftime('%d-%m-%Y')
  time = datetime.now().astimezone(tz=khtz).strftime('%H:%M:%S')
  return (date, time)

@route('/signup', method="POST")
def signup():
  username = request.forms.get('fusername')
  password = request.forms.get('fpassword')
  rights = request.forms.get('frights')
  email = request.forms.get('femail')

  userdb.insert(username, password, rights, email)

  redirect('/login')

@route('/upload')
def upload():
  return template('dashboard/upload', data=config.kargs)

@route('/upload', method='POST')
def saveFile():
  upload = request.files.get('fupload')
  name, ext = os.path.splitext(upload.filename)
  if ext not in ('.png','.jpg','.jpeg'):
    return 'File extension not allowed.'

  upload.filename = str(uuid.uuid4().int) + ext
  ROOT_DIR = os.path.dirname(os.path.abspath("config.py"))
  savePath = ROOT_DIR + "/public/images/uploads/"
  config.kargs['uploadUrl'] = "/static/images/uploads/" + upload.filename
  upload.save(savePath)

  return template('dashboard/uploadurl', data=config.kargs)

@route('/login', method="POST")
def user():
  username = request.forms.get('fusername')
  password = request.forms.get('fpassword')

  if checkLogin(username, password):
    response.set_cookie("logged-in", username, secret=config.kargs['secretKey'])

  redirect('/login')

@route('/login')
def login():
  user = userdb.createTable()
  username = request.get_cookie("logged-in", secret=config.kargs['secretKey'])
  if not user:
    return template('dashboard/signup', data=config.kargs)
  elif username:
    config.kargs['author'] = username
    config.kargs['blogTitle'] = "ទំព័រ​គ្រប់គ្រង"
    config.kargs['datetime'] = getTimeZone()
    config.kargs['posts'] = postdb.select(config.kargs['dashboardPostLimit'])
    config.kargs['categories'] = categorydb.select(amount="all")
    config.kargs['thumbs'] = lib.getPostThumbs(config.kargs['posts'])
    config.kargs['page'] = 1
    return template('dashboard/home', data=config.kargs)
  else:
    return template('login', data=config.kargs)
<!--views/dashboard/upload.tpl-->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>{{data['blogTitle']}}</title>
    <link href="/static/styles/upload.css" rel="stylesheet"></link>
    <link href="/static/images/site_logo.png" rel="icon" ></link>
    <link href="/static/fonts/setup.css" rel="stylesheet"></link>
  </head>
  <body>
    <form id='upload' action="/upload" method="POST" enctype="multipart/form-data">
      <a>ជ្រើសរើស​ឯកសារៈ</a><input type="file" name="fupload" />
      <a></a><input type='submit' value="ចំលងទុក​ក្នុង​គេហទំព័រ" />
    </form>
  </body>
</html>
<!--views/dashboard/uploadurl.tpl-->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>{{data['blogTitle']}}</title>
    <script src="/static/scripts/jQuery.js"></script>
    <link href="/static/styles/upload.css" rel="stylesheet"></link>
    <link href="/static/images/site_logo.png" rel="icon" ></link>
    <link href="/static/fonts/setup.css" rel="stylesheet"></link>
  </head>
  <body>
    <div id="upload">
      <input id="copy" type="button" value="ចំលងតំណរភ្ជាប់" /><input class="url" type="text" value="{{data['uploadUrl']}}" />
      <script>
        $('#copy').click(function(){
          $(this).siblings('input.url').select();      
          document.execCommand("copy");
          window.close();
        });
      </script>
    </div>
  </body>
</html>
/*public/css/login.css*/
body{
  background: lightgrey;
  position: relative;
}

#upload{
  width: 500px;
  background: lavender;
  margin:30px auto;
  padding: 10px;
  display: grid;
  grid-template-columns: 140px auto;
  grid-gap: 10px;
  font: 14px/1.5 OdorMeanChey;
  position: absolute;
  left: 50%;
  transform: translate(-50%,0);
}

#upload input{
  padding: 10px;
}

#upload input[type=file]{
  border: 1px solid black;
}

#upload input[type=button],
#upload input[type=submit]{
  font: 14px/1.5 OdorMeanChey;
}

#upload a{
  text-align: right;
  padding: 10px 0;
}

@media only screen and (max-width: 600px){
  #upload{
    grid-template-columns: 100%;
    width: 100%;
  }

  #upload a{
    text-align: left;
    padding: 0;
  }
}

GitHub: https://github.com/Sokhavuth/kwblog
Heroku: https://khmerweb-kwblog.herokuapp.com/