diff --git a/templates/wiki.html b/templates/wiki.html
new file mode 100644
index 0000000..34735c5
--- /dev/null
+++ b/templates/wiki.html
@@ -0,0 +1,6 @@
+{% extends "layout.html" %}
+{% block content %}
+
{{ slug }}
+{{ content }}
+asdf
+{% endblock %}
\ No newline at end of file
diff --git a/wiki/__init__.py b/wiki/__init__.py
new file mode 100644
index 0000000..0e47001
--- /dev/null
+++ b/wiki/__init__.py
@@ -0,0 +1,7 @@
+from misc import SaveFileMapping, SaveFileObject
+
+class Page(SaveFileObject):
+ pass
+
+class PageManager(SaveFileMapping):
+ pass
\ No newline at end of file
diff --git a/wiki/api.py b/wiki/api.py
new file mode 100644
index 0000000..990e012
--- /dev/null
+++ b/wiki/api.py
@@ -0,0 +1,101 @@
+import os
+import urllib.parse
+from etherpad_lite import EtherpadLiteClient, EtherpadException
+import logging
+logger = logging.getLogger(__name__)
+
+#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.
+ keyfile is the file path to the APIKEY
+ """
+ def __init__(self,url="http://etherpad", exturl="https://bot.2020.fet.at", keyfile=None, groupmapper="mygroup"):
+ self.url=url
+ self.keyfile=keyfile
+ self.groupmapper=groupmapper
+ self.epc=None
+ self.group=None
+ self.connect()
+ self.exturl=exturl
+ #self.epc, self.group = self.get_ep_client()
+
+ @property
+ def isConnected(self):
+ if self.epc and self.group: return True
+ return False
+
+ def connect(self):
+ """ Try to establish the connection.
+ This sets the internal variables self.epc = Etherpad Client
+ and self.group which represents the group this instance is associated with
+ """
+ if self.epc and self.group: return True # if connection exists return
+ logger.info("connecting")
+ try:
+ with open(os.path.abspath(self.keyfile), "r") as f:
+ apikey = f.read().rstrip()
+ epc = EtherpadLiteClient(
+ base_params={'apikey': apikey, },
+ base_url=urllib.parse.urljoin(self.url, "api"),
+ api_version='1.2.14',
+ )
+ group = epc.createGroupIfNotExistsFor(groupMapper=self.groupmapper)
+ except Exception as e:
+ logger.error(f"Can't get connection to Etherpad Server. Error: {e}")
+ return None
+ self.epc=epc
+ self.group= group
+ return True
+
+
+ def padExists(self, padID=None):
+ if not padID: return False # padID needed
+ if not self.connect(): return None
+ try:
+ lists = self.epc.listAllPads()
+ except Exception as e:
+ raise e
+ return None
+ string = self.group["groupID"] + "$" + str(padID)
+ if string in lists["padIDs"]: return True
+ return False
+
+ def createPadifNotExists(self,padID):
+ if not self.connect(): return None
+ # Pad doesn't exist
+ if not self.padExists(padID=padID):
+ try:
+ self.epc.createGroupPad(groupID=self.group["groupID"], padName=padID, text="helloworld")
+ except EtherpadException as e:
+ logger.error("Can't create Pad '{}'. EtherpadException: {}".format(padID, e))
+ return None
+ except Exception as e:
+ raise e
+ return None
+ return padID
+
+ def getPadHTML(self,padID):
+ if not self.connect():
+ return None
+ try:
+ text = self.epc.getHTML(padID=self.group["groupID"] + "$" + padID)["html"]
+ except EtherpadException as e:
+ logger.error("Can't get HTML from padID '{}'. EtherpadException: {}".format(padID, e))
+ return None
+ except Exception as e:
+ raise e
+ return None
+ return text
+
+
+ def setPadHTML(self,padID, html):
+ if not self.connect(): return None
+ self.epc.setHTML(padID=self.group["groupID"] + "$" + padID, html=html)
+ return html
+
+ def getPadLink(self,padID):
+ if padID is None: return "#"
+ if not self.connect(): return "#"
+ return urllib.parse.urljoin(self.exturl, 'p/' + self.group["groupID"] + '$' + str(padID))
diff --git a/wiki/etherpadlib.py b/wiki/etherpadlib.py
new file mode 100644
index 0000000..9014d8b
--- /dev/null
+++ b/wiki/etherpadlib.py
@@ -0,0 +1,65 @@
+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