wiki upgrade
This commit is contained in:
@@ -1,6 +1,10 @@
|
|||||||
{% extends "layout.html" %}
|
{% extends "layout.html" %}
|
||||||
{% block content %}
|
{% block content %}<br>
|
||||||
<h2>{{ slug }}</h2>
|
<a href="{{page.editlink}}"> edit </a>
|
||||||
{{ content }}
|
|
||||||
asdf
|
<h2>{{ page.id }}</h2>
|
||||||
|
{{page.content | safe}}
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<iframe src="{{page.editlink}}" style="width:100%; height:30em"></iframe>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -1,7 +1,78 @@
|
|||||||
from misc import SaveFileMapping, SaveFileObject
|
#from misc import SaveFileMapping, SaveFileObject
|
||||||
|
from .api import EtherpadLiteLazyAPI
|
||||||
|
from slugify import slugify
|
||||||
|
from lazymappingstorage import LazyMappingStorage, LazyStorageObject
|
||||||
|
from flask import Blueprint, make_response, render_template
|
||||||
|
import bs4
|
||||||
|
import re
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from anytree import NodeMixin
|
||||||
|
|
||||||
class Page(SaveFileObject):
|
ep=EtherpadLiteLazyAPI(
|
||||||
pass
|
url="http://etherpad:9101",
|
||||||
|
exturl="https://bot.2020.fet.at/etherpad/",
|
||||||
|
keyfile="services/etherpad/APIKEY.txt",
|
||||||
|
groupmapper="fetwiki"
|
||||||
|
)
|
||||||
|
|
||||||
class PageManager(SaveFileMapping):
|
|
||||||
pass
|
|
||||||
|
def clean_path(path):
|
||||||
|
path = path.split("/")
|
||||||
|
return "/".join([slugify(p) for p in path])
|
||||||
|
|
||||||
|
|
||||||
|
def parse_intern_page(text):
|
||||||
|
if not text: return text
|
||||||
|
soup = bs4.BeautifulSoup(text, "html.parser")
|
||||||
|
textNodes = soup.findAll(text=True)
|
||||||
|
if not textNodes: return text
|
||||||
|
for textNode in textNodes:
|
||||||
|
text = re.sub('\[(\w+)\]','replaced!!!: - \g<1> - ',textNode)
|
||||||
|
text = re.sub('^(\w+)\:\s?(.+)$','config param - \g<1> : \g<2> ',text)
|
||||||
|
text = re.sub('(#[\w-]+)\s$','TAG( \g<1> ) ',text)
|
||||||
|
print(text)
|
||||||
|
textNode.replaceWith(text)
|
||||||
|
|
||||||
|
return str(soup)
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Page(LazyStorageObject, NodeMixin):
|
||||||
|
path: str=None
|
||||||
|
count: int=1
|
||||||
|
@property
|
||||||
|
def id(self):
|
||||||
|
return slugify(self.path)
|
||||||
|
@property
|
||||||
|
def editlink(self):
|
||||||
|
return ep.getPadLink(self.id)
|
||||||
|
@property
|
||||||
|
def content(self):
|
||||||
|
return parse_intern_page(ep.getPadHTML(self.id))
|
||||||
|
|
||||||
|
class PageManager(LazyMappingStorage):
|
||||||
|
filename="pages.yaml"
|
||||||
|
object_class=Page
|
||||||
|
def __getitem__(self,key):
|
||||||
|
o = super().__getitem__(clean_path(key))
|
||||||
|
o.path = clean_path(key)
|
||||||
|
if not o.path=="":
|
||||||
|
o.parent=self["/".join(o.path.split("/")[:-1])]
|
||||||
|
|
||||||
|
return o
|
||||||
|
def __setitem__(self,key,value):
|
||||||
|
super().__setitem__(clean_path(key),value)
|
||||||
|
|
||||||
|
pages=PageManager()
|
||||||
|
bp = Blueprint('wiki', __name__, url_prefix='/wiki')
|
||||||
|
|
||||||
|
@bp.route('/')
|
||||||
|
@bp.route('/<path:path>')
|
||||||
|
def web(path=""):
|
||||||
|
|
||||||
|
page=pages[path]
|
||||||
|
pages.to_file()
|
||||||
|
|
||||||
|
response=make_response(render_template("wiki.html", page=page))
|
||||||
|
response.set_cookie("sessionID",str(ep.getSessionID("andis")),path="/etherpad")
|
||||||
|
return response
|
||||||
22
wiki/api.py
22
wiki/api.py
@@ -3,9 +3,11 @@ import urllib.parse
|
|||||||
from etherpad_lite import EtherpadLiteClient, EtherpadException
|
from etherpad_lite import EtherpadLiteClient, EtherpadException
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
#SERVER_URL = settings.ETHERPAD_CLIENT["exturl"]
|
#SERVER_URL = settings.ETHERPAD_CLIENT["exturl"]
|
||||||
logger.info("loading api.py")
|
logger.info("loading api.py")
|
||||||
|
|
||||||
class EtherpadLiteLazyAPI():
|
class EtherpadLiteLazyAPI():
|
||||||
"""This is a small wrapper for EtherpadLiteClient
|
"""This is a small wrapper for EtherpadLiteClient
|
||||||
url is the url with port the client should connect to.
|
url is the url with port the client should connect to.
|
||||||
@@ -99,3 +101,23 @@ class EtherpadLiteLazyAPI():
|
|||||||
if padID is None: return "#"
|
if padID is None: return "#"
|
||||||
if not self.connect(): return "#"
|
if not self.connect(): return "#"
|
||||||
return urllib.parse.urljoin(self.exturl, 'p/' + self.group["groupID"] + '$' + str(padID))
|
return urllib.parse.urljoin(self.exturl, 'p/' + self.group["groupID"] + '$' + str(padID))
|
||||||
|
|
||||||
|
def getSessionID(self, username):
|
||||||
|
if not self.connect(): return "#"
|
||||||
|
author = self.epc.createAuthorIfNotExistsFor(
|
||||||
|
name=str(username),
|
||||||
|
authorMapper=str(username)
|
||||||
|
)['authorID']
|
||||||
|
|
||||||
|
expires = datetime.utcnow() + timedelta(hours=3)
|
||||||
|
try:
|
||||||
|
result = self.epc.createSession(
|
||||||
|
groupID=str(self.group['groupID']),
|
||||||
|
authorID=str(author),
|
||||||
|
validUntil=str(int(expires.timestamp()))
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
raise e
|
||||||
|
return None
|
||||||
|
return result['sessionID']#, expires
|
||||||
|
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
from datetime import datetime, timedelta
|
|
||||||
|
|
||||||
from .api import get_ep_client
|
|
||||||
from authentications.decorators import ep_authenticated_user
|
|
||||||
|
|
||||||
|
|
||||||
@ep_authenticated_user
|
|
||||||
def __get_ep_sessionid(request):
|
|
||||||
epc, group = get_ep_client()
|
|
||||||
if not epc or not group:
|
|
||||||
return None, None
|
|
||||||
|
|
||||||
author = epc.createAuthorIfNotExistsFor(
|
|
||||||
name=str(request.user),
|
|
||||||
authorMapper=str(request.user)
|
|
||||||
)['authorID']
|
|
||||||
|
|
||||||
expires = datetime.utcnow() + timedelta(hours=3)
|
|
||||||
try:
|
|
||||||
result = epc.createSession(
|
|
||||||
groupID=str(group['groupID']),
|
|
||||||
authorID=str(author),
|
|
||||||
validUntil=str(int(expires.timestamp()))
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
raise e
|
|
||||||
return None, None
|
|
||||||
|
|
||||||
return result['sessionID'], expires
|
|
||||||
|
|
||||||
|
|
||||||
def add_ep_cookie(request, response):
|
|
||||||
ep_sessid, expires = __get_ep_sessionid(request)
|
|
||||||
|
|
||||||
if ep_sessid:
|
|
||||||
response.set_cookie(
|
|
||||||
"sessionID",
|
|
||||||
ep_sessid,
|
|
||||||
expires=expires,
|
|
||||||
domain=".2020.fet.at",
|
|
||||||
path="/"
|
|
||||||
)
|
|
||||||
response.set_cookie(
|
|
||||||
"sessionID",
|
|
||||||
ep_sessid,
|
|
||||||
expires=expires,
|
|
||||||
path="/etherpad"
|
|
||||||
)
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
def del_ep_cookie(request, response):
|
|
||||||
|
|
||||||
if 'sessionID' in request.COOKIES:
|
|
||||||
ep_sessionID = request.COOKIES['sessionID']
|
|
||||||
|
|
||||||
epc, group = get_ep_client()
|
|
||||||
epc.deleteSession(sessionID=ep_sessionID)
|
|
||||||
|
|
||||||
response.delete_cookie(
|
|
||||||
"sessionID",
|
|
||||||
domain=".2020.fet.at",
|
|
||||||
path="/"
|
|
||||||
)
|
|
||||||
return response
|
|
||||||
Reference in New Issue
Block a user