From 35081dee68d796076c3fc40f80f4e4b986f23d37 Mon Sep 17 00:00:00 2001 From: www Date: Sun, 27 Dec 2020 19:11:52 +0000 Subject: [PATCH] wiki upgrade --- templates/wiki.html | 12 ++++--- wiki/__init__.py | 81 ++++++++++++++++++++++++++++++++++++++++++--- wiki/api.py | 22 ++++++++++++ wiki/etherpadlib.py | 65 ------------------------------------ 4 files changed, 106 insertions(+), 74 deletions(-) delete mode 100644 wiki/etherpadlib.py diff --git a/templates/wiki.html b/templates/wiki.html index 34735c5..f535c68 100644 --- a/templates/wiki.html +++ b/templates/wiki.html @@ -1,6 +1,10 @@ {% extends "layout.html" %} -{% block content %} -

{{ slug }}

-{{ content }} -asdf +{% block content %}
+ edit + +

{{ page.id }}

+{{page.content | safe}} + +
+ {% endblock %} \ No newline at end of file diff --git a/wiki/__init__.py b/wiki/__init__.py index 0e47001..de1843c 100644 --- a/wiki/__init__.py +++ b/wiki/__init__.py @@ -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 \ No newline at end of file + + +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('/') +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 \ No newline at end of file diff --git a/wiki/api.py b/wiki/api.py index 990e012..306cdde 100644 --- a/wiki/api.py +++ b/wiki/api.py @@ -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 + diff --git a/wiki/etherpadlib.py b/wiki/etherpadlib.py deleted file mode 100644 index 9014d8b..0000000 --- a/wiki/etherpadlib.py +++ /dev/null @@ -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