Commit 187f92fc by Owo Sugiana

Mendukung virtual directory

1 parent e5fa8596
0.3 2022-04-21
--------------
- Dukungan terhadap virtual directory
- Tambah route /client-info
0.2.2 2022-04-18
----------------
- Tambah route /theme2/user untuk table khas OpenSIPKD
......
###
# app configuration
# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html
###
[app:utama]
use = egg:web_starter
pyramid.reload_templates = false
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = id
sqlalchemy.url = postgresql://user:pass@localhost/dbname
timezone = Asia/Jakarta
localization = id_ID.UTF-8
auth_key = s0secret
mail.host = localhost
mail.port = 25
mail.username = user@example.com
mail.password = FIXME
mail.sender_name = Example Name
###
# wsgi server configuration
###
[server:main]
use = egg:waitress#main
listen = *:6543
url_scheme = https
[filter:proxy-prefix]
use = egg:PasteDeploy#prefix
prefix = /starter
[pipeline:main]
pipeline =
proxy-prefix
utama
###
# logging configuration
# https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html
###
[loggers]
keys = root, web_starter
[handlers]
keys = console, file
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console, file
[logger_web_starter]
level = WARN
handlers =
qualname = web_starter
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[handler_file]
class = FileHandler
args = ('/home/sugiana/log/web-starter.log','a')
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s
......@@ -31,6 +31,7 @@ mail.sender_name = Example Name
[server:main]
use = egg:waitress#main
listen = *:6543
url_scheme = https
###
# logging configuration
......@@ -41,14 +42,14 @@ listen = *:6543
keys = root, web_starter
[handlers]
keys = console
keys = console, file
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
handlers = console, file
[logger_web_starter]
level = WARN
......@@ -61,5 +62,11 @@ args = (sys.stderr,)
level = NOTSET
formatter = generic
[handler_file]
class = FileHandler
args = ('/home/sugiana/log/web-starter.log','a')
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s
......@@ -22,3 +22,4 @@ theme1-user-add,/theme1/user/add
theme1-user-edit,/theme1/user/{id}
theme2-user-act,/theme2/user/{act}/act
theme2-user,/theme2/user
client-info,/client-info
from pyramid.view import view_config
@view_config(route_name='client-info', renderer='templates/client-info.pt')
def view(request):
return dict(title='Client Info')
<div metal:use-macro="load: layout.pt">
<div metal:fill-slot="content">
<div class="content">
<h1><span class="font-semi-bold">Client Info</span></h1>
<p>IP ${request.client_addr}</p>
<p>Browser ${request.user_agent}</p>
</div>
</div>
</div>
......@@ -9,11 +9,11 @@
application generated&nbsp;by<br><span class="font-normal">Cookiecutter</span>.</p>
<p tal:condition="not request.user">
<a href="/login" i18n:translate="login-link">Login please</a>
<a href="${home}/login" i18n:translate="login-link">Login please</a>
</p>
<p i18n:translate="you-are-logged-in" tal:condition="request.user">You are logged in as
<span tal:replace="request.user.user_name" i18n:name="username" />. Click <a href="/logout">here</a> to
<span tal:replace="request.user.user_name" i18n:name="username" />. Click <a href="${home}/logout">here</a> to
logout.</p>
</div>
......
<!DOCTYPE html>
<html lang="en">
<html
lang="en"
tal:define="home request.route_url('home').rstrip('/')">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="/static/pyramid-16x16.png">
<link rel="shortcut icon" href="${home}/static/pyramid-16x16.png">
<title tal:content="title"/>
<!-- Bootstrap core CSS -->
<link href="/deform_static/css/bootstrap.min.css" rel="stylesheet"/>
<link href="/deform_static/css/form.css" rel="stylesheet"/>
<link href="${home}/deform_static/css/bootstrap.min.css" rel="stylesheet"/>
<link href="${home}/deform_static/css/form.css" rel="stylesheet"/>
<!-- Custom styles for this template -->
<link href="/static/signin.css" rel="stylesheet">
<link href="${home}/static/signin.css" rel="stylesheet">
</head>
......@@ -42,9 +44,9 @@
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script type="text/javascript" src="/deform_static/scripts/jquery-2.0.3.min.js"></script>
<script type="text/javascript" src="/deform_static/scripts/bootstrap.min.js"></script>
<script type="text/javascript" src="/deform_static/scripts/deform.js"></script>
<script type="text/javascript" src="${home}/deform_static/scripts/jquery-2.0.3.min.js"></script>
<script type="text/javascript" src="${home}/deform_static/scripts/bootstrap.min.js"></script>
<script type="text/javascript" src="${home}/deform_static/scripts/deform.js"></script>
<div metal:define-slot="content-script"/>
......
<!DOCTYPE html>
<html lang="en" i18n:domain="menu">
<html
lang="en"
i18n:domain="menu"
tal:define="home request.route_url('home').rstrip('/')">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="/static/pyramid-16x16.png">
<link rel="shortcut icon" href="${home}/static/pyramid-16x16.png">
<title tal:content="title"/>
<!-- Bootstrap core CSS -->
<link href="/deform_static/css/bootstrap.min.css" rel="stylesheet"/>
<link href="/deform_static/css/form.css" rel="stylesheet"/>
<link href="${home}/deform_static/css/bootstrap.min.css" rel="stylesheet"/>
<link href="${home}/deform_static/css/form.css" rel="stylesheet"/>
<!-- Custom styles for this template -->
<link href="/static/signin.css" rel="stylesheet">
<link href="${home}/static/signin.css" rel="stylesheet">
<script type="text/javascript" src="/deform_static/scripts/jquery-2.0.3.min.js"></script>
<script type="text/javascript" src="/deform_static/scripts/bootstrap.min.js"></script>
<script type="text/javascript" src="/deform_static/scripts/deform.js"></script>
<script type="text/javascript" src="${home}/deform_static/scripts/jquery-2.0.3.min.js"></script>
<script type="text/javascript" src="${home}/deform_static/scripts/bootstrap.min.js"></script>
<script type="text/javascript" src="${home}/deform_static/scripts/deform.js"></script>
<div metal:define-slot="head"/>
</head>
......@@ -42,29 +45,29 @@
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li tal:attributes="class request.path == '/' and 'active'">
<a href="/" i18n:translate="Home">Home</a></li>
<a href="${home}" i18n:translate="Home">Home</a></li>
<li class="dropdown"
tal:attributes="class request.matched_route.name in ['user',
'user-add', 'user-edit', 'user-delete', 'group', 'group-edit',
'group-delete'] and 'active'">
'user-add', 'user-edit', 'user-delete', 'group', 'group-add',
'group-edit', 'group-delete'] and 'active'">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
i18n:translate="Admin">Admin<b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/user" i18n:translate="Users">Users</a></li>
<li><a href="/user/add" i18n:translate="Add user">Add user</a></li>
<li><a href="/group" i18n:translate="Users groups">Users groups</a></li>
<li><a href="/group/add" i18n:translate="Add users group">Add users group</a></li>
<li><a href="${home}/user" i18n:translate="Users">Users</a></li>
<li><a href="${home}/user/add" i18n:translate="Add user">Add user</a></li>
<li><a href="${home}/group" i18n:translate="Users groups">Users groups</a></li>
<li><a href="${home}/group/add" i18n:translate="Add users group">Add users group</a></li>
</ul>
</li>
<li class="dropdown" tal:attributes="class request.path in
['/change-password'] and 'active'">
<li class="dropdown" tal:attributes="class request.matched_route.name in
['change-password'] and 'active'">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
i18n:translate="My account">My account <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/change-password" i18n:translate="Change password">Change password</a></li>
<li><a href="/logout" i18n:translate="username-logout">
<li><a href="${home}/change-password" i18n:translate="Change password">Change password</a></li>
<li><a href="${home}/logout" i18n:translate="username-logout">
<span tal:replace="request.user.user_name" i18n:name="username"/> logout
</a>
</li>
......
<!DOCTYPE html metal:define-macro="layout">
<html lang="${request.locale_name}"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
i18n:domain="home">
i18n:domain="home"
tal:define="home request.route_url('home').rstrip('/')">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="pyramid web application">
<meta name="author" content="Pylons Project">
<link rel="shortcut icon" href="/static/pyramid-16x16.png">
<link rel="shortcut icon" href="${home}/static/pyramid-16x16.png">
<title>Web Starter - <span tal:replace="title"/></title>
......@@ -16,7 +17,7 @@
<link href="//oss.maxcdn.com/libs/twitter-bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom styles for this scaffold -->
<link href="/static/theme.css" rel="stylesheet">
<link href="${home}/static/theme.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
......@@ -32,7 +33,7 @@
<div class="row">
<div class="col-md-2">
<img class="logo img-responsive"
src="/static/pyramid.png" alt="pyramid web framework">
src="${home}/static/pyramid.png" alt="pyramid web framework">
</div>
<div class="col-md-10">
<div metal:define-slot="content">No content</div>
......
<div metal:use-macro="load: ../layout-menu.pt">
<div metal:fill-slot="head">
<link href="/static/grid.css" rel="stylesheet"/>
<link href="${home}/static/grid.css" rel="stylesheet"/>
</div>
<div metal:fill-slot="content" i18n:domain="user">
<h1 i18n:translate="">Users</h1>
......@@ -32,10 +32,10 @@
<td tal:condition="not user.last_login_date"/>
<td tal:content="user.registered_date.strftime('%d-%m-%Y %H:%M:%S %z')"/>
<td>
<a href="/user/${user.id}" i18n:translate="">Edit</a>
<a href="${home}/user/${user.id}" i18n:translate="">Edit</a>
</td>
<td tal:condition="user.id > 1 and user.id != request.user.id">
<a href="/user/${user.id}/delete" i18n:translate="">Delete</a>
<a href="${home}/user/${user.id}/delete" i18n:translate="">Delete</a>
</td>
<td tal:condition="user.id <= 1" i18n:translate="">System</td>
<td tal:condition="user.id > 1 and user.id == request.user.id" i18n:translate="">You</td>
......
<div metal:use-macro="load: ../../../templates/layout-menu.pt">
<div metal:fill-slot="head">
<link rel="stylesheet" type="text/css" href="/static/datatables.min.css"/>
<link rel="stylesheet" type="text/css" href="${home}/static/datatables.min.css"/>
</div>
<div metal:fill-slot="content" i18n:domain="user">
<h1 i18n:translate="">Users</h1>
......@@ -19,11 +19,11 @@
</table>
</div>
<div metal:fill-slot="content-script">
<script type="text/javascript" src="/static/datatables.min.js"></script>
<script type="text/javascript" src="${home}/static/datatables.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#table-grid').DataTable({
ajax: '/user/grid/act',
ajax: '${home}/user/grid/act',
processing: true,
serverSide: true,
});
......
<div metal:use-macro="load: ../../../templates/layout-menu.pt">
<div metal:fill-slot="head">
<link rel="stylesheet" type="text/css" href="/static/datatables.min.css"/>
<link rel="stylesheet" type="text/css" href="/static/smartadmin-production-plugins.min.css"/>
<link rel="stylesheet" type="text/css" href="/detable_static/css/demo_table.css"/>
<link rel="stylesheet" type="text/css" href="/detable_static/css/osipkd.css"/>
<script type="text/javascript" src="/static/datatables.min.js"></script>
<link rel="stylesheet" type="text/css" href="${home}/static/datatables.min.css"/>
<link rel="stylesheet" type="text/css" href="${home}/static/smartadmin-production-plugins.min.css"/>
<link rel="stylesheet" type="text/css" href="${home}/detable_static/css/demo_table.css"/>
<link rel="stylesheet" type="text/css" href="${home}/detable_static/css/osipkd.css"/>
<script type="text/javascript" src="${home}/static/datatables.min.js"></script>
</div>
<div metal:fill-slot="content" i18n:domain="user">
<h1 i18n:translate="">Users</h1>
......
......@@ -53,7 +53,8 @@ class ListSchema(colander.Schema):
route_name='theme2-user', renderer='templates/user/list.pt',
permission='user-edit')
def view_list(request):
url = request.route_url('home') + 'theme2/user'
table = DeTable(
ListSchema(), action=f'/theme2/user',
ListSchema(), action=url,
buttons=(btn_view, btn_add, btn_edit, btn_delete, btn_close))
return dict(table=table.render(), title=_('Users'))
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!