Compare commits

...

8 Commits

9 changed files with 135 additions and 133 deletions

View File

@ -1,28 +1,3 @@
title = "CostaPy" title = "CostaPy"
menu = {
"public": {
"navbar": [
{
"name":"Home",
"target":"_self",
"href":"/",
"roles":["guest"]
},
{
"name":"About",
"target":"_self",
"href":"/about",
"roles":["guest"]
},
{
"name":"Docs",
"target":"_blank",
"href":"https://costapy.ditaajipratama.net",
"roles":["guest"]
}
]
}
}
copyright = "Copyright (C) 2022 Dita Aji Pratama" copyright = "Copyright (C) 2022 Dita Aji Pratama"

111
config/navigation.py Normal file
View File

@ -0,0 +1,111 @@
menu = {
"public": {
"navbar": [
{
"name":"Home",
"target":"_self",
"href":"/",
"roles":["guest"]
},
{
"name":"About",
"target":"_self",
"href":"/about",
"roles":["guest"]
},
{
"name":"Docs",
"target":"_blank",
"href":"https://costapy.ditaajipratama.net",
"roles":["guest"]
}
]
}
"sample": {
"navbar": [
{
"name":"Home",
"target":"_self",
"href":"#",
"notification":0,
"roles":[1,2]
},
{
"name":"Customize",
"href":"#",
"target":"_self",
"notification":0,
"roles":[1,2]
},
{
"name":"Notification",
"href":"#",
"target":"_self",
"notification":1,
"roles":[1,2]
}
],
"profile": {
"picture": "https://ditaajipratama.net/img/no-profile-donut.png",
"name" : "User Name",
"menu" : [
{
"name" :"Profile",
"href" :"/profile",
"target":"_self",
"roles" :[1,2]
},
{
"name" :"Settings",
"href" :"/settings",
"target":"_self",
"roles" :[1,2]
},
{
"name" :"Logout",
"href" :"/logout",
"target":"_self",
"roles" :[1,2,3]
}
]
},
"sidebar": [
{
"icon":"fa-solid fa-gauge",
"name":"Dashboard",
"target":"_self",
"href":"#",
"roles":[1,2]
},
{
"icon":"fa-solid fa-users",
"name":"Users",
"target":"_self",
"href":"#",
"roles":[1,2]
},
{
"icon":"fa-solid fa-book",
"name":"Items",
"target":"_self",
"href":"#",
"roles":[1,2]
},
{
"icon":"fa-solid fa-book",
"name":"Analytic",
"target":"_self",
"href":"#",
"roles":[1,2]
},
{
"icon":"fa-solid fa-book",
"name":"Reports",
"target":"_self",
"href":"#",
"roles":[1,2]
}
]
}
}

4
config/placeholder.py Normal file
View File

@ -0,0 +1,4 @@
image = {
"favicon" : "https://ditaajipratama.net/img/no-profile-donut.png",
"profile" : "https://ditaajipratama.net/img/no-profile-donut.png"
}

View File

@ -2,16 +2,16 @@ from bottle import response
host = "localhost" host = "localhost"
port = 11000 port = 11000
reloader = False reloader = True
debug = False debug = False
server = 'gunicorn' # default = 'wsgiref' server = 'wsgiref' # try 'gunicorn'
session_opts = { session_opts = {
'session.type': 'file', 'session.type': 'file',
'session.cookie_expires': 5*60, # Session expiration in seconds: minutes*seconds 'session.cookie_expires': 5*60, # Session expiration in seconds: minutes*seconds
'session.data_dir': './.beaker/data', 'session.data_dir': './.beaker/data',
'session.auto': True 'session.auto': True
} } # beaker's session options
def enable_cors(): def enable_cors():
response.headers['Access-Control-Allow-Origin' ] = '*' response.headers['Access-Control-Allow-Origin' ] = '*'

View File

@ -1,12 +0,0 @@
python3 -m venv .venv # Create .venv
.venv/bin/pip3 install --upgrade pip # Upgrade pip
.venv/bin/pip3 install bottle # Micro Framework
.venv/bin/pip3 install gunicorn # WSGI Server Backend
.venv/bin/pip3 install beaker # Session & caching library
.venv/bin/pip3 install mako # Template library
.venv/bin/pip3 install mysql-connector # Database connector
.venv/bin/pip3 install bcrypt # Password hash
.venv/bin/pip3 install pyjwt[crypto] # JWT

View File

@ -1,5 +1,5 @@
from mako.template import Template from mako.template import Template
from config import globalvar from config import globalvar, navigation
class main: class main:
@ -11,7 +11,7 @@ class main:
title = globalvar.title, title = globalvar.title,
header = "Welcome to CostaPy", header = "Welcome to CostaPy",
navbar = Template(params["mako"]["website"]['navbar']).render( navbar = Template(params["mako"]["website"]['navbar']).render(
menu = globalvar.menu['public']['navbar'], menu = navigation.menu['public']['navbar'],
user_roles = ["guest"], user_roles = ["guest"],
active_page = "Home" active_page = "Home"
), ),

View File

@ -1,5 +1,5 @@
from mako.template import Template from mako.template import Template
from config import globalvar from config import navigation, placeholder
class main: class main:
@ -16,105 +16,19 @@ class main:
copyright = "Copyright (C) 2022 Dita Aji Pratama" copyright = "Copyright (C) 2022 Dita Aji Pratama"
greeting = "A prime dashboard based on bootstrap 5" greeting = "A prime dashboard based on bootstrap 5"
menu_navbar = [
{
"name":"Home",
"target":"_self",
"href":"#",
"notification":0,
"roles":[1,2]
},
{
"name":"Customize",
"href":"#",
"target":"_self",
"notification":0,
"roles":[1,2]
},
{
"name":"Notification",
"href":"#",
"target":"_self",
"notification":1,
"roles":[1,2]
}
]
menu_profile = {
"picture": "https://ditaajipratama.net/img/no-profile-donut.png",
"name" : "Dita Aji Pratama",
"menu" : [
{
"name" :"Profile",
"href" :"/profile",
"target":"_self",
"roles" :[1,2]
},
{
"name" :"Settings",
"href" :"/settings",
"target":"_self",
"roles" :[1,2]
},
{
"name" :"Logout",
"href" :"/logout",
"target":"_self",
"roles" :[1,2,3]
}
]
}
menu_sidebar = [
{
"icon":"fa-solid fa-gauge",
"name":"Dashboard",
"target":"_self",
"href":"#",
"roles":[1,2]
},
{
"icon":"fa-solid fa-users",
"name":"Users",
"target":"_self",
"href":"#",
"roles":[1,2]
},
{
"icon":"fa-solid fa-book",
"name":"Items",
"target":"_self",
"href":"#",
"roles":[1,2]
},
{
"icon":"fa-solid fa-book",
"name":"Analytic",
"target":"_self",
"href":"#",
"roles":[1,2]
},
{
"icon":"fa-solid fa-book",
"name":"Reports",
"target":"_self",
"href":"#",
"roles":[1,2]
}
]
return Template(params["mako"]["website"]['index']).render( return Template(params["mako"]["website"]['index']).render(
favicon = placeholder.image["favicon"],
title = title, title = title,
navbar = Template(params["mako"]["website"]['navbar']).render( navbar = Template(params["mako"]["website"]['navbar']).render(
title = title, title = title,
home = home, home = home,
menu = menu_navbar, menu = navigation["sample"]["navbar"],
profile = menu_profile, profile = navigation["sample"]["profile"],
user_roles = user_roles, user_roles = user_roles,
active_page = active_page active_page = active_page
), ),
sidebar = Template(params["mako"]["website"]['sidebar']).render( sidebar = Template(params["mako"]["website"]['sidebar']).render(
menu = menu_sidebar, menu = navigation["sample"]["sidebar"],
user_roles = user_roles, user_roles = user_roles,
active_page = active_page active_page = active_page
), ),
@ -125,3 +39,4 @@ class main:
greeting = greeting greeting = greeting
) )
) )

8
requirements.txt Normal file
View File

@ -0,0 +1,8 @@
bottle
gunicorn
beaker
mako
mysql-connector
bcrypt
pyjwt[crypto]

View File

@ -4,6 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>${title}</title> <title>${title}</title>
<link rel="icon" href="${favicon}" type="image/x-icon">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/templates/prime/css/style.css"> <link rel="stylesheet" href="/templates/prime/css/style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">