@@ -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" | |||
} | |||
} | |||
} | |||
} |
@@ -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 %} |
@@ -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 %} |
@@ -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 %} |
@@ -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) | |||
@@ -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: | |||
@@ -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)) |
@@ -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 |
@@ -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", "") |
@@ -1,3 +1,7 @@ | |||
{# Options: { | |||
"doctype": "Web Page" | |||
} #} | |||
{% extends "app/website/templates/html/page.html" %} | |||
{% block javascript %} |
@@ -0,0 +1,2 @@ | |||
doctype = "Blog Post" | |||
condition_field = "published" |
@@ -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> | |||
@@ -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 %} |
@@ -0,0 +1,2 @@ | |||
doctype = "Web Page" | |||
condition_field = "published" |
@@ -1 +0,0 @@ | |||
{% extends "app/website/templates/html/web_page.html" %} |
@@ -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 %} |
@@ -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) | |||
@@ -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> |
@@ -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 %} |
@@ -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 %} |
@@ -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 %} |
@@ -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 %} |
@@ -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"> |
@@ -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 %} |