Ver código fonte

[website] [minor] moving to framework

version-14
Rushabh Mehta 11 anos atrás
pai
commit
fb8c63b2bb
31 arquivos alterados com 298 adições e 282 exclusões
  1. +40
    -6
      config.json
  2. +0
    -14
      templates/pages/404.html
  3. +0
    -13
      templates/pages/error.html
  4. +0
    -11
      templates/pages/message.html
  5. +6
    -4
      webnotes/__init__.py
  6. +1
    -0
      webnotes/build.py
  7. +9
    -2
      webnotes/memc.py
  8. +149
    -135
      webnotes/webutils.py
  9. +2
    -9
      website/doctype/blog_post/blog_post.py
  10. +0
    -0
      website/doctype/blog_post/templates/__init__.py
  11. +0
    -0
      website/doctype/blog_post/templates/generators/__init__.py
  12. +4
    -0
      website/doctype/blog_post/templates/generators/blog_post.html
  13. +2
    -0
      website/doctype/blog_post/templates/generators/blog_post.py
  14. +1
    -1
      website/doctype/blog_post/templates/includes/blog_footer.html
  15. +0
    -0
      website/doctype/blog_post/templates/pages/blog.html
  16. +0
    -0
      website/doctype/web_page/templates/__init__.py
  17. +0
    -0
      website/doctype/web_page/templates/generators/__init__.py
  18. +8
    -0
      website/doctype/web_page/templates/generators/web_page.html
  19. +2
    -0
      website/doctype/web_page/templates/generators/web_page.py
  20. +0
    -1
      website/doctype/web_page/templates/index.html
  21. +0
    -14
      website/doctype/web_page/templates/web_page.html
  22. +1
    -1
      website/doctype/web_page/web_page.py
  23. +15
    -5
      website/templates/base.html
  24. +0
    -0
      website/templates/includes/login.js
  25. +0
    -34
      website/templates/includes/outer.html
  26. +0
    -20
      website/templates/includes/page.html
  27. +15
    -0
      website/templates/pages/404.html
  28. +14
    -0
      website/templates/pages/error.html
  29. +15
    -12
      website/templates/pages/login.html
  30. +14
    -0
      website/templates/pages/message.html
  31. +0
    -0
      website/templates/pages/print.html

+ 40
- 6
config.json Ver arquivo

@@ -27,30 +27,64 @@
"color": "#9b59b6",
"label": "Messages",
"icon": "icon-comments"
},
"Website": {
"type": "module",
"link": "website-home",
"color": "#16a085",
"icon": "icon-globe"
}
},
"web": {
"pages": {
"404": {
"template": "lib/templates/pages/404"
"template": "lib/website/templates/404.html"
},
"error": {
"no_cache": true,
"template": "lib/templates/pages/error"
"template": "lib/website/templates/error.html"
},
"login": {
"template": "lib/templates/pages/login"
"template": "lib/website/templates/login.html"
},
"message": {
"no_cache": true,
"template": "lib/templates/pages/message"
"template": "lib/website/templates/message.html"
},
"print": {
"no_cache": true,
"template": "lib/templates/pages/print",
"template": "lib/website/templates/print.html",
"args_method": "core.doctype.print_format.print_format.get_args"
},
"index": {
"template": "lib/website/doctype/web_page/templates/index.html"
},
"writers": {
"template": "lib/website/doctype/blogger/templates/writers.html",
"args_method": "website.doctype.blogger.blogger.get_writers_args"
},
"blog": {
"template": "lib/website/doctype/blog_post/templates/blog_post.html",
"args_method": "website.doctype.blog_post.blog_post.get_blog_template_args"
},
"contact": {
"template": "lib/website/doctype/contact_us_settings/templates/contact.html",
"args_doctype": "Contact Us Settings"
},
"about": {
"template": "lib/website/doctype/about_us_settings/templates/about.html",
"args_method": "website.doctype.about_us_settings.about_us_settings.get_args"
}
},
"generators": {}
"generators": {
"Web Page": {
"template": "lib/website/doctype/web_page/templates/web_page.html",
"condition_field": "published"
},
"Blog Post": {
"template": "lib/website/doctype/blog_post/templates/blog_post.html",
"condition_field": "published"
}
}
}
}

+ 0
- 14
templates/pages/404.html Ver arquivo

@@ -1,14 +0,0 @@
{% extends "app/website/templates/html/outer.html" %}

{% set title="Not Found" %}

{% block content %}
<div class="content">
<div class="layout-wrapper layout-main col-md-12">
<h3><i class="icon-exclamation-sign"></i> Page missing or moved</h3>
<br>
<p>We are very sorry for this, but the page you are looking for is missing
(this could be because of a typo in the address) or moved.</p>
</div>
</div>
{% endblock %}

+ 0
- 13
templates/pages/error.html Ver arquivo

@@ -1,13 +0,0 @@
{% extends "lib/templates/base.html" %}

{% set title="Error" %}

{% block body %}
<div class="container">
<div class="outer well">
<h3><i class="icon-exclamation-sign"></i> Oops, a server error has occured</h3>
<br>
<pre>%(error)s</pre>
</div>
</div>
{% endblock %}

+ 0
- 11
templates/pages/message.html Ver arquivo

@@ -1,11 +0,0 @@
{% extends "lib/templates/base.html" %}

{% set title=webnotes.message_title %}

{% block body %}
<div class="container">
<div class="outer">
{{ webnotes.message }}
</div>
</div>
{% endblock %}

+ 6
- 4
webnotes/__init__.py Ver arquivo

@@ -384,14 +384,16 @@ def insert(doclist):
import webnotes.model
return webnotes.model.insert(doclist)

def get_module(modulename):
__import__(modulename)
import sys
return sys.modules[modulename]

def get_method(method_string):
modulename = '.'.join(method_string.split('.')[:-1])
methodname = method_string.split('.')[-1]

__import__(modulename)
import sys
moduleobj = sys.modules[modulename]
return getattr(moduleobj, methodname)
return getattr(get_module(modulename), methodname)
def make_property_setter(args):
args = _dict(args)


+ 1
- 0
webnotes/build.py Ver arquivo

@@ -19,6 +19,7 @@ def bundle(no_compress, cms_make=True):
bundle = Bundle()
bundle.no_compress = no_compress
bundle.make()
webnotes.cache().delete_value("website_routes")

if cms_make:
try:


+ 9
- 2
webnotes/memc.py Ver arquivo

@@ -12,8 +12,15 @@ class MClient(memcache.Client):
def set_value(self, key, val):
self.set(self.n(key), val)
def get_value(self, key):
return self.get(self.n(key))
def get_value(self, key, builder=None):
if builder and getattr(conf, "auto_cache_clear", False):
return builder()
val = self.get(self.n(key))
if val==None and builder:
val = builder()
self.set_value(key, val)
return val
def delete_value(self, key):
self.delete(self.n(key))

+ 149
- 135
webnotes/webutils.py Ver arquivo

@@ -7,42 +7,43 @@ import conf
import webnotes
import webnotes.utils

class PageNotFoundError(Exception): pass

def render(page_name):
"""render html page"""
try:
if page_name:
html = get_html(page_name)
else:
html = get_html('index')
html = render_page(page_name or "index")
except PageNotFoundError:
html = render_page("404")
except Exception:
html = get_html('error')
html = render_page('error')

from webnotes.handler import eprint, print_zip
eprint("Content-Type: text/html; charset: utf-8")
print_zip(html)

def get_html(page_name):
def render_page(page_name):
"""get page html"""
page_name = scrub_page_name(page_name)
html = ''
# load from cache, if auto cache clear is falsy
if page_name=="index":
page_name = get_home_page()
if not (hasattr(conf, 'auto_cache_clear') and conf.auto_cache_clear or 0):
if not get_page_settings().get(page_name, {}).get("no_cache"):
html = webnotes.cache().get_value("page:" + page_name)
from_cache = True
html = webnotes.cache().get_value("page:" + page_name)
from_cache = True

if not html:
from webnotes.auth import HTTPRequest
webnotes.http_request = HTTPRequest()
#webnotes.connect()
html = load_into_cache(page_name)
html = build_page(page_name)
from_cache = False
if not html:
html = get_html("404")
raise PageNotFoundError

if page_name=="error":
html = html.replace("%(error)s", webnotes.getTraceback())
@@ -52,135 +53,124 @@ def get_html(page_name):
html += """\n<!-- %s -->""" % webnotes.utils.cstr(comments)

return html
def scrub_page_name(page_name):
if page_name.endswith('.html'):
page_name = page_name[:-5]

return page_name

def page_name(title):
"""make page name from title"""
import re
name = title.lower()
name = re.sub('[~!@#$%^&*()<>,."\']', '', name)
name = re.sub('[:/]', '-', name)

name = '-'.join(name.split())
def build_page(page_name):
from jinja2 import Environment, FileSystemLoader

# replace repeating hyphens
name = re.sub(r"(-)\1+", r"\1", name)
return name
if not webnotes.conn:
webnotes.connect()

def update_page_name(doc, title):
"""set page_name and check if it is unique"""
webnotes.conn.set(doc, "page_name", page_name(title))
if doc.page_name in get_standard_pages():
webnotes.conn.sql("""Page Name cannot be one of %s""" % ', '.join(get_standard_pages()))
res = webnotes.conn.sql("""\
select count(*) from `tab%s`
where page_name=%s and name!=%s""" % (doc.doctype, '%s', '%s'),
(doc.page_name, doc.name))
if res and res[0][0] > 0:
webnotes.msgprint("""A %s with the same title already exists.
Please change the title of %s and save again."""
% (doc.doctype, doc.name), raise_exception=1)
sitemap = webnotes.cache().get_value("website_sitemap", build_sitemap)
page_options = sitemap.get(page_name)
module = None
no_cache = False

delete_page_cache(doc.page_name)
if page_options.get("controller"):
module = webnotes.get_module(page_options["controller"])
no_cache = getattr(module, "no_cache", False)

def load_into_cache(page_name):
args = prepare_args(page_name)
if not args:
return ""
html = build_html(args)
webnotes.cache().set_value("page:" + page_name, html)
return html
# if generator, then load bean, pass arguments
if page_options.get("is_generator"):
if not module:
raise Exception("Generator controller not defined")
name = webnotes.conn.get_value(module.doctype, {"page_name": page_name})
obj = webnotes.get_obj(module.doctype, name, with_children=True)

def build_html(args):
from jinja2 import Environment, FileSystemLoader
if hasattr(obj, 'get_context'):
obj.get_context()

args["len"] = len
context = webnotes._dict(obj.doc.fields)
context["obj"] = obj
else:
# page
context = webnotes._dict({ 'name': page_name })
if module:
context.update(module.get_context())
context = update_context(context)
jenv = Environment(loader = FileSystemLoader(webnotes.utils.get_base_path()))
template_name = args['template']
if not template_name.endswith(".html"):
template_name = template_name + ".html"
html = jenv.get_template(template_name).render(args)
template_name = page_options['template']
html = jenv.get_template(template_name).render(context)
if not no_cache:
webnotes.cache().set_value("page:" + page_name, html)
return html
def prepare_args(page_name):
def build_sitemap():
sitemap = {}
config = webnotes.cache().get_value("website_sitemap_config", build_website_sitemap_config)
sitemap.update(config["pages"])

has_app = True
# generators
for g in config["generators"].values():
g["is_generator"] = True
module = webnotes.get_module(g["controller"])
doctype = module.doctype
for name in webnotes.conn.sql_list("""select name from `tab%s` where
ifnull(%s, 0)=1""" % (module.doctype, module.condition_field)):
sitemap[name] = g
return sitemap
def get_home_page():
if not webnotes.conn:
webnotes.connect()
doc_name = webnotes.conn.get_value('Website Settings', None, 'home_page')
if doc_name:
page_name = webnotes.conn.get_value('Web Page', doc_name, 'page_name')
else:
page_name = 'login'

return page_name

def update_context(context):
try:
from startup.webutils import update_template_args, get_home_page
from startup.webutils import update_template_args
context = update_template_args(page_name, context)
except ImportError:
has_app = False
pass

if page_name == 'index':
if has_app:
page_name = get_home_page()
else:
page_name = "login"
return context
def build_website_sitemap_config():
import os, json
pages = get_page_settings()
config = {"pages": {}, "generators":{}}
basepath = webnotes.utils.get_base_path()
if page_name in pages:
page_info = pages[page_name]
args = webnotes._dict({
'template': page_info["template"],
'name': page_name,
def get_options(path, fname):
name = fname[:-5]
options = webnotes._dict({
"link_name": name,
"template": os.path.relpath(os.path.join(path, fname), basepath),
})

# additional args
if "args_method" in page_info:
args.update(webnotes.get_method(page_info["args_method"])())
elif "args_doctype" in page_info:
bean = webnotes.bean(page_info["args_doctype"])
bean.run_method("onload")
args.obj = bean.make_controller()
else:
args = get_doc_fields(page_name)
if not args:
return False
if has_app:
args = update_template_args(page_name, args)
controller_path = os.path.join(path, name + ".py")
if os.path.exists(controller_path):
options.controller = os.path.relpath(controller_path[:-3], basepath).replace(os.path.sep, ".")
options.controller = ".".join(options.controller.split(".")[1:])
return options
return args
for path, folders, files in os.walk(basepath):
if os.path.basename(path)=="pages" and os.path.basename(os.path.dirname(path))=="templates":
for fname in files:
if fname.endswith(".html"):
options = get_options(path, fname)
config["pages"][options.link_name] = options

if os.path.basename(path)=="generators" and os.path.basename(os.path.dirname(path))=="templates":
for fname in files:
if fname.endswith(".html"):
options = get_options(path, fname)
config["generators"][fname] = options
return config

def get_doc_fields(page_name):
doc_type, doc_name = get_source_doc(page_name)
if not doc_type:
return False
obj = webnotes.get_obj(doc_type, doc_name, with_children=True)

if hasattr(obj, 'prepare_template_args'):
obj.prepare_template_args()

args = obj.doc.fields
args['template'] = get_generators()[doc_type]["template"]
args['obj'] = obj
args['int'] = int
return args

def get_source_doc(page_name):
"""get source doc for the given page name"""
for doctype in get_generators():
name = webnotes.conn.sql("""select name from `tab%s` where
page_name=%s and ifnull(%s, 0)=1""" % (doctype, "%s",
get_generators()[doctype]["condition_field"]), page_name)
if name:
return doctype, name[0][0]

return None, None
def clear_cache(page_name=None):
if page_name:
delete_page_cache(page_name)
@@ -190,12 +180,7 @@ def clear_cache(page_name=None):
cache.delete_value("page:" + p)

def get_all_pages():
all_pages = get_standard_pages()
for doctype in get_generators():
all_pages += [p[0] for p in webnotes.conn.sql("""select distinct page_name
from `tab%s`""" % doctype) if p[0]]

return all_pages
return webnotes.cache().get_value("website_sitemap", build_sitemap).keys()

def delete_page_cache(page_name):
if page_name:
@@ -226,15 +211,12 @@ def get_hex_shade(color, percent):
return p(r) + p(g) + p(b)

def get_standard_pages():
return webnotes.get_config()["web"]["pages"].keys()
def get_generators():
return webnotes.get_config()["web"]["generators"]
def get_page_settings():
return webnotes.get_config()["web"]["pages"]
def scrub_page_name(page_name):
if page_name.endswith('.html'):
page_name = page_name[:-5]

return page_name
def get_portal_links():
portal_args = {}
for page, opts in webnotes.get_config()["web"]["pages"].items():
@@ -256,3 +238,35 @@ def is_portal_enabled():
_is_portal_enabled = False
return _is_portal_enabled

def update_page_name(doc, title):
"""set page_name and check if it is unique"""
webnotes.conn.set(doc, "page_name", page_name(title))
if doc.page_name in get_all_pages():
webnotes.conn.sql("""Page Name cannot be one of %s""" % ', '.join(get_standard_pages()))
res = webnotes.conn.sql("""\
select count(*) from `tab%s`
where page_name=%s and name!=%s""" % (doc.doctype, '%s', '%s'),
(doc.page_name, doc.name))
if res and res[0][0] > 0:
webnotes.msgprint("""A %s with the same title already exists.
Please change the title of %s and save again."""
% (doc.doctype, doc.name), raise_exception=1)

delete_page_cache(doc.page_name)

def page_name(title):
"""make page name from title"""
import re
name = title.lower()
name = re.sub('[~!@#$%^&*()<>,."\']', '', name)
name = re.sub('[:/]', '-', name)

name = '-'.join(name.split())

# replace repeating hyphens
name = re.sub(r"(-)\1+", r"\1", name)
return name

+ 2
- 9
website/doctype/blog_post/blog_post.py Ver arquivo

@@ -28,7 +28,7 @@ class DocType:
webnotes.webutils.update_page_name(self.doc, self.doc.title)
webnotes.webutils.delete_page_cache("writers")

def prepare_template_args(self):
def get_context(self):
import webnotes.utils
import markdown2
@@ -166,11 +166,4 @@ def add_comment(args=None):
message='%(comment)s<p>By %(comment_by_fullname)s</p>' % args,
ref_doctype='Blog Post', ref_docname=blog.name)
return comment_html.replace("\n", "")

def get_blog_template_args():
args = {
"categories": webnotes.conn.sql_list("select name from `tabBlog Category` order by name")
}
args.update(webnotes.doc("Blog Settings", "Blog Settings").fields)
return args
return comment_html.replace("\n", "")

+ 0
- 0
website/doctype/blog_post/templates/__init__.py Ver arquivo


+ 0
- 0
website/doctype/blog_post/templates/generators/__init__.py Ver arquivo


website/doctype/blog_post/templates/blog_post.html → website/doctype/blog_post/templates/generators/blog_post.html Ver arquivo

@@ -1,3 +1,7 @@
{# Options: {
"doctype": "Web Page"
} #}

{% extends "app/website/templates/html/page.html" %}

{% block javascript %}

+ 2
- 0
website/doctype/blog_post/templates/generators/blog_post.py Ver arquivo

@@ -0,0 +1,2 @@
doctype = "Blog Post"
condition_field = "published"

+ 1
- 1
website/doctype/blog_post/templates/includes/blog_footer.html Ver arquivo

@@ -3,7 +3,7 @@
{% if categories %}
<h5>Explore posts by categories</h5>
<ul class="breadcrumb" style="background-color: transparent; padding-left: 20px;">
{% for category in categories %}
{% for category in webnotes.conn.sql_list("select name from `tabBlog Category` order by name") %}
<li><a href="blog?category={{ category }}">{{ category }}</a>
{% endfor %}
</ul>


website/doctype/blog_post/templates/blog.html → website/doctype/blog_post/templates/pages/blog.html Ver arquivo


+ 0
- 0
website/doctype/web_page/templates/__init__.py Ver arquivo


+ 0
- 0
website/doctype/web_page/templates/generators/__init__.py Ver arquivo


+ 8
- 0
website/doctype/web_page/templates/generators/web_page.html Ver arquivo

@@ -0,0 +1,8 @@
{% extends "lib/website/templates/base.html" %}

{% block content %}
<div class="col-md-12" style="margin-top: 15px;">
{% include "lib/website/doctype/website_slideshow/templates/includes/slideshow.html" %}
{{ main_section }}
</div>
{% endblock %}

+ 2
- 0
website/doctype/web_page/templates/generators/web_page.py Ver arquivo

@@ -0,0 +1,2 @@
doctype = "Web Page"
condition_field = "published"

+ 0
- 1
website/doctype/web_page/templates/index.html Ver arquivo

@@ -1 +0,0 @@
{% extends "app/website/templates/html/web_page.html" %}

+ 0
- 14
website/doctype/web_page/templates/web_page.html Ver arquivo

@@ -1,14 +0,0 @@
{% extends "app/website/templates/html/page.html" %}

{% block javascript %}
{% if insert_code %}
{{ javascript }}
{% endif %}
{% endblock %}

{% block content %}
<div class="col-md-12" style="margin-top: 15px;">
{% include "app/website/templates/html/slideshow.html" %}
{{ main_section }}
</div>
{% endblock %}

+ 1
- 1
website/doctype/web_page/web_page.py Ver arquivo

@@ -27,7 +27,7 @@ class DocType():
clear_cache(self.doc.page_name)
clear_cache('index')
def prepare_template_args(self):
def get_context(self):
if self.doc.slideshow:
from website.doctype.website_slideshow.website_slideshow import get_slideshow
get_slideshow(self)


templates/base.html → website/templates/base.html Ver arquivo

@@ -12,14 +12,24 @@
<link type="text/css" rel="stylesheet" href="css/wn-web.css">
<link rel="shortcut icon" href="{{ favicon }}" type="image/x-icon">
<link rel="icon" href="{{ favicon }}" type="image/x-icon">
{% if meta_description -%}
<meta name="description" content="{{ meta_description }}">
{% if meta_description -%}<meta name="description" content="{{ meta_description }}">
{%- endif %}
{% block header -%}
{% block javascript -%}
{% if javascript %}<script>{{ javascript }}</script>{% endif %}
{%- endblock %}
{% block css -%}
{% if css %}<style>{{ css }}</style>{% endif %}
{%- endblock %}
</head>
<body>
{% block body %}
{% endblock %}
{% block navbar %}{% endblock %}
<div class="container" style="padding-top: 50px">
{% block toolbar %}{% endblock %}
{% block banner %}{% endblock %}
<div class="content" id="page-{{ name }}" style="display: block;">
{% block content %}{% endblock %}
</div>
</div>
{% block footer %}{% endblock %}
</body>
</html>

templates/js/login.js → website/templates/includes/login.js Ver arquivo


+ 0
- 34
website/templates/includes/outer.html Ver arquivo

@@ -1,34 +0,0 @@
{% extends "lib/templates/base.html" %}

{% block body %}
{% include "app/website/templates/html/navbar.html" %}
<div class="container">
<div class="pull-right" style="margin:4px;" id="user-tools">
{% if shopping_cart_enabled -%}
<a href="cart" title="Shopping Cart"><i class="icon-shopping-cart"></i>
<span class="cart-count"></span></a> |
{%- endif %}
<a id="login-link" href="login">Login</a>
</div>
<div class="pull-right hide" style="margin:4px;" id="user-tools-post-login">
<a href="account" title="My Account" id="user-full-name"></a> |
{% if shopping_cart_enabled -%}
<a href="cart" title="Shopping Cart"><i class="icon-shopping-cart"></i>
<span class="cart-count"></span></a> |
{%- endif %}
<a href="server.py?cmd=web_logout" title="Sign Out"><i class="icon-signout"></i></a>
</div>
<div class="clearfix"></div>
{% if banner_html %}<div class="row banner">
<div class="col-md-12">{{ banner_html }}</div>
</div>{% endif %}
<div class="outer">
<div class="content row" id="page-{{ name }}" style="display: block;">
{%- block content -%}
{%- endblock -%}
</div>
</div>
</div>
{% include "app/website/templates/html/footer.html" %}

{% endblock %}

+ 0
- 20
website/templates/includes/page.html Ver arquivo

@@ -1,20 +0,0 @@
{% extends "app/website/templates/html/outer.html" %}

{% block title -%}{{ title }}{%- endblock %}

{% block header -%}
{{ super() }}
<script>
{% block javascript -%}
{%- endblock %}
</script>
{% block css -%}
{% if insert_style -%}
<style>{{ css }}</style>
{%- endif %}
{%- endblock %}
{%- endblock -%}

{%- block content -%}
{{ content }}
{%- endblock %}

+ 15
- 0
website/templates/pages/404.html Ver arquivo

@@ -0,0 +1,15 @@
{% extends "lib/website/templates/base.html" %}

{% set title="Not Found" %}

{% block content %}
<div class="panel panel-danger">
<div class="panel-heading">
<i class="icon-exclamation-sign"></i> Page missing or moved
</div>
<div class="panel-body">
<p>We are very sorry for this, but the page you are looking for is missing
(this could be because of a typo in the address) or moved.</p>
</div>
</div>
{% endblock %}

+ 14
- 0
website/templates/pages/error.html Ver arquivo

@@ -0,0 +1,14 @@
{% extends "lib/website/templates/base.html" %}

{% set title="Error" %}

{% block content %}
<div class="panel panel-danger">
<div class="panel-heading">
<i class="icon-exclamation-sign"></i> Oops, a server error has occured
</div>
<div class="panel-body">
<pre>%(error)s</pre>
</div>
</div>
{% endblock %}

templates/pages/login.html → website/templates/pages/login.html Ver arquivo

@@ -1,20 +1,23 @@
{% extends "lib/templates/base.html" %}
{% extends "lib/website/templates/base.html" %}

{% block header %}
<script>
{% include "lib/templates/js/login.js" %}
</script>
<style>
body, #container, .outer {
background-color: #F5EFE6;
}
</style>
{% block javascript %}
<script>
{% include "lib/website/templates/includes/login.js" %}
</script>
{% endblock %}

{% block css %}
<style>
body {
background-color: #F5EFE6;
}
</style>
{% endblock %}

{% set title="Login" %}

{% block body %}
<div class="container" style="max-width: 750px;">
{% block content %}
<div style="max-width: 750px;">
<div class="row" style="margin-top: 100px;">
<div class="col-sm-offset-3 col-sm-6">
<div class="panel panel-default">

+ 14
- 0
website/templates/pages/message.html Ver arquivo

@@ -0,0 +1,14 @@
{% extends "lib/website/templates/base.html" %}

{% set title=webnotes.message_title %}

{% block content %}
<div class="panel panel-danger">
<div class="panel-heading">
{{ title }}
</div>
<div class="panel-body">
<p>{{ webnotes.message }}</p>
</div>
</div>
{% endblock %}

templates/pages/print.html → website/templates/pages/print.html Ver arquivo


Carregando…
Cancelar
Salvar