wiki upgrade

This commit is contained in:
www
2020-12-27 19:11:52 +00:00
parent c20b688237
commit 35081dee68
4 changed files with 106 additions and 74 deletions

View File

@@ -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):
pass
ep=EtherpadLiteLazyAPI(
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

View File

@@ -3,9 +3,11 @@ import urllib.parse
from etherpad_lite import EtherpadLiteClient, EtherpadException
import logging
logger = logging.getLogger(__name__)
from datetime import datetime, timedelta
#SERVER_URL = settings.ETHERPAD_CLIENT["exturl"]
logger.info("loading api.py")
class EtherpadLiteLazyAPI():
"""This is a small wrapper for EtherpadLiteClient
url is the url with port the client should connect to.
@@ -99,3 +101,23 @@ class EtherpadLiteLazyAPI():
if padID is None: return "#"
if not self.connect(): return "#"
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

View File

@@ -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