Skip to content

Commit

Permalink
refactors
Browse files Browse the repository at this point in the history
  • Loading branch information
WolfgangFahl committed Apr 10, 2021
1 parent 62cd432 commit 478305c
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 74 deletions.
5 changes: 3 additions & 2 deletions frontend/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,12 +137,13 @@ def sqlBackupState(self,dbName):
result={'size':size,'exists':exists,'mdate':mdate}
return result

def enableFrontend(self,siteName:str,debug:bool=False):
def enableFrontend(self,siteName:str,appWrap=None,debug:bool=False):
'''
enable the given frontend
Args:
siteName(str): the siteName of the frontend to enable
appWrap(appWrap): optional fb4 Application Wrapper
Returns:
Frontend: the configured frontend
'''
Expand All @@ -155,7 +156,7 @@ def enableFrontend(self,siteName:str,debug:bool=False):
config=self.siteLookup[siteName]
frontend.site.configure(config)
frontend.site.debug=debug
frontend.open()
frontend.open(appWrap)
return frontend
pass

Expand Down
25 changes: 14 additions & 11 deletions frontend/site.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
@author: wf
'''
import jinja2
#import jinja2
import os
import sys

class Site(object):
Expand Down Expand Up @@ -37,10 +38,6 @@ def configure(self,config:dict):
self.wikiId=config['wikiId']
self.defaultPage=config['defaultPage']
self.template=config['template']
if "templateFolder" in config:
self.templateFolder=config['templateFolder']
else:
self.templateFolder=self.name
if "packageName" in config:
self.packageName=config["packageName"]
else:
Expand All @@ -51,21 +48,27 @@ def configure(self,config:dict):
self.packageFolder=self.name
self.configured=True

def open(self):
def open(self,appWrap=None):
'''
open this site
Args:
appWrap(appWrap): optional fb4 Application Wrapper
'''
if not self.configured:
raise Exception("need to configure site before opening it")
# https://stackoverflow.com/a/14276993/1497139
# http://code.nabla.net/doc/jinja2/api/jinja2/loaders/jinja2.loaders.PackageLoader.html
self.templateEnv=None
if self.debug:
print("adding %s to PYTHON PATH" % self.packageFolder)
sys.path.insert(1,self.packageFolder)
try:
self.templateEnv = jinja2.Environment( loader=jinja2.PackageLoader(self.packageName, self.templateFolder))
except Exception as ex:
self.error=ex
if appWrap is not None:
templatePath="%s/%s/templates" % (self.packageFolder,self.packageName)
if os.path.isdir(templatePath):
appWrap.addTemplatePath(templatePath)
# TODO: use a more elaborate loader concept if need be
# self.templateEnv = jinja2.Environment( loader=jinja2.PackageLoader(self.packageName))

pass


2 changes: 1 addition & 1 deletion frontend/webserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def enableSites(self, siteNames):
if siteNames is None:
return
for siteName in siteNames:
self.server.enableFrontend(siteName)
self.server.enableFrontend(siteName,self)
self.enabledSites.append(siteName)

def adminMenuList(self,activeItem:str=None):
Expand Down
32 changes: 20 additions & 12 deletions frontend/wikicms.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,19 @@ def log(self,msg):
if self.debug:
print(msg,flush=True)

def open(self):
def open(self,appWrap=None):
'''
open the frontend
Args:
appWrap(appWrap): optional fb4 Application Wrapper
'''
self.appWrap=appWrap
if self.wiki is None:
self.wiki=WikiClient.ofWikiId(self.site.wikiId)
self.wiki.login()
self.smwclient=SMWClient(self.wiki.getSite())
self.site.open()
self.site.open(appWrap)

def errMsg(self,ex):
if self.debug:
Expand Down Expand Up @@ -248,23 +252,27 @@ def getContent(self,pagePath:str):
error=self.errMsg(e)
return pageTitle,content,error

def renderTemplate(self,templateFile,args):
def renderTemplate(self,template,**kwargs):
'''
render the given templateFile with the given arguments
render the given template with the given arguments
Args:
templateFile(str): the template file to be used
args(): same arguments a for dict constructor
template(str): the template file to be used
kwargs(): same arguments a for dict constructor
Returns:
str: the rendered result
'''
if self.site.templateEnv is not None:
template = self.site.templateEnv.get_template( templateFile )
result=template.render(args)
return result,None
else:
# pass on keyword args
if self.appWrap is not None:
with self.appWrap.app.app_context():
result=render_template(template,**kwargs)
else:
result=render_template(template,**kwargs)
if result is None:
return None,self.site.error
else:
return result,None

def toReveal(self,html):
'''
Expand Down Expand Up @@ -309,5 +317,5 @@ def render(self,path:str)->str:
content=self.toReveal(content)
else:
template = self.site.template
result=render_template(template, title=pageTitle, content=content, error=error)
result=self.renderTemplate(template, title=pageTitle, content=content, error=error)
return result
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ beautifulsoup4
# https://pypi.org/project/lxml/
lxml
# https://stackoverflow.com/a/66648061/1497139
sqlalchemy < 1.4.0
sqlalchemy == 1.3.24
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
long_description = open('../../README.md').read()

setup(name='pyWikiCMS',
version='0.0.17',
version='0.0.18',
description='python implementation of a Mediawiki based Content Management System',
long_description=long_description,
long_description_content_type='text/markdown',
Expand Down
2 changes: 1 addition & 1 deletion templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
{% if title is not none %}<title>{{ title }}</title>{%endif %}
{% endblock %}
</head>
<body>å
<body>
{% if menuList %}{{ macros.menu(menuList) }}{%endif %}
<main class="container">
{{ render_messages(container=False, dismissible=True) }}
Expand Down
38 changes: 0 additions & 38 deletions tests/test_frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,44 +72,6 @@ def testIssue18(self):
self.assertEqual("200 OK",imageResponse.status)
self.assertEqual(33742,len(imageResponse.data))

def createPackage(self,packageFolder,templateFolder,moduleName,moduleCode,templateCode):
moduleFolder="%s/%s" % (packageFolder,moduleName)
os.makedirs(moduleFolder,exist_ok=True)
absTemplateFolder="%s/%s" % (moduleFolder,templateFolder)
os.makedirs(absTemplateFolder,exist_ok=True)
modulePath="%s/__init__.py" % moduleFolder
with open(modulePath,"w") as moduleFile:
moduleFile.write(moduleCode)
templatePath="%s/test.html" % (absTemplateFolder)
with open(templatePath,"w") as templateFile:
templateFile.write(templateCode)

def testIssue14Templates(self):
'''
test template handling
'''
# work around CI environment problem
# https://github.com/pallets/jinja/issues/1365
if TestFrontend.inPublicCI():
return
packageFolder='%s/www.wikicms' % tempfile.gettempdir()
templateFolder='templates'
moduleName='bitplan_webfrontend'
moduleCode="""
def test():
pass
"""
templateCode="""
{{ msg }}
"""
self.createPackage(packageFolder, templateFolder, moduleName, moduleCode, templateCode)
frontend=self.server.enableFrontend('www',debug=False)
#self.assertEqual(templateFolder,frontend.site.templateFolder)
self.assertEqual(moduleName,frontend.site.packageName)
html,error=frontend.renderTemplate("test.html",{"msg":"Hello world!"})
self.assertIsNone(error)
self.assertTrue("Hello world!" in html)

def testIssue14(self):
'''
test Allow to use templates specified in Wiki
Expand Down
8 changes: 5 additions & 3 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
from io import StringIO

class InsertSections(xml.sax.handler.ContentHandler):
def __init__(self):
def __init__(self,debug=False):
self.debug=debug
pass

def startElement(self, name, attrs):
print (name,attrs)
if self.debug:
print (name,attrs)

def endElement(self, name):
pass
Expand Down Expand Up @@ -43,7 +45,7 @@ def tearDown(self):


def testSax(self):
handler = InsertSections()
handler = InsertSections(debug=False)
xml.sax.parseString(self.html,handler)
pass

Expand Down
56 changes: 52 additions & 4 deletions tests/test_webserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
'''
import unittest
import warnings
import getpass
import os
from fb4.app import AppWrap
from frontend.server import Server
from tests.test_wikicms import TestWikiCMS
Expand All @@ -22,16 +24,24 @@ def setUp(self):
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
app.config['DEBUG'] = False
self.app = app.test_client()
self.app=app
self.client = app.test_client()

# make sure tests run in travis
sites=['or','cr','sharks','www']
frontend.webserver.wcw.enableSites(sites)
self.wcw=frontend.webserver.wcw
pass

def tearDown(self):
pass

def inPublicCI(self):
'''
are we running in a public Continuous Integration Environment?
'''
return getpass.getuser() in [ "travis", "runner" ];

@staticmethod
def initServer():
'''
Expand Down Expand Up @@ -101,7 +111,7 @@ def testSplit(self):
self.assertEqual(epath,path)

def getHtml(self,path):
response=self.app.get(path)
response=self.client.get(path)
self.assertEqual(response.status_code, 200)
self.assertTrue(response.data is not None)
html=response.data.decode()
Expand Down Expand Up @@ -132,10 +142,48 @@ def testReveal(self):
support reveal.js slideshow if frame is "reveal" #20
'''
html=self.getHtml("www/SMWConTalk2015-05")

print(html)
if self.debug:
print(html)
self.assertTrue("reveal.min.css" in html)
self.assertTrue("Reveal.initialize({" in html)

def createPackage(self,packageFolder,templateFolder,moduleName,moduleCode,templateCode):
moduleFolder="%s/%s" % (packageFolder,moduleName)
os.makedirs(moduleFolder,exist_ok=True)
absTemplateFolder="%s/%s" % (moduleFolder,templateFolder)
os.makedirs(absTemplateFolder,exist_ok=True)
modulePath="%s/__init__.py" % moduleFolder
with open(modulePath,"w") as moduleFile:
moduleFile.write(moduleCode)
templatePath="%s/test.html" % (absTemplateFolder)
with open(templatePath,"w") as templateFile:
templateFile.write(templateCode)

def testIssue14Templates(self):
'''
test template handling
'''
# work around CI environment problem
# https://github.com/pallets/jinja/issues/1365
if self.inPublicCI():
return
packageFolder='%s/www.wikicms' % tempfile.gettempdir()
templateFolder='templates'
moduleName='bitplan_webfrontend'
moduleCode="""
def test():
return "test result"
"""
templateCode="""
{{ msg }}
"""
self.createPackage(packageFolder, templateFolder, moduleName, moduleCode, templateCode)
frontend=self.server.enableFrontend('www',self.wcw,debug=False)
#self.assertEqual(templateFolder,frontend.site.templateFolder)
self.assertEqual(moduleName,frontend.site.packageName)
html,error=frontend.renderTemplate("test.html",msg="Hello world!")
self.assertIsNone(error)
self.assertTrue("Hello world!" in html)

if __name__ == "__main__":
#import sys;sys.argv = ['', 'Test.testName']
Expand Down

0 comments on commit 478305c

Please sign in to comment.