diff --git a/pad-bis.py b/pad-bis.py
index 4afcd85..87ba48f 100644
--- a/pad-bis.py
+++ b/pad-bis.py
@@ -7,7 +7,6 @@ import mwclient
# BS to read the html table from the wiki
from bs4 import BeautifulSoup
-
# os and dotenv to store the mediawiki credentials in a safe place
import os
from dotenv import load_dotenv
@@ -42,69 +41,86 @@ class PrefixMiddleware(object):
# create flask application
app = Flask(__name__)
-
-# Url prefix for the soupboat and port
+# Get the URL prefix for the soupboat
+# and register the middleware to use our base_url as prefix on all the requests
base_url = os.environ.get('BASE_URL', '')
-
-port = os.environ.get('FLASK_RUN_PORT', '')
+app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix=base_url)
# Page of the wiki with the pads
padliography = os.environ.get('PAGE', '')
-# register the middleware to prefix all the requests with our base_url
-app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix=base_url)
-
-
def add_pad(link, title, overview, categories, date):
-
+ '''Add a new pad to the wiki page'''
+
+ # 1. Connect to the wiki
site = mwclient.Site('pzwiki.wdka.nl', path='/mw-mediadesign/')
+ # 2. Authenticate using the credential of a bot user registered in the wiki
+ ### This is necesary the edit the contents of the page
site.login(
username=os.environ.get('MW_BOT'),
password=os.environ.get('MW_KEY')
)
+ # 3. Select the page and get the contents
page = site.pages[padliography]
text = page.text()
+ # 4. Append the pad as new row in the table of pads
new_row = f'|-\n| {link} || {title} || {overview} || {categories} || {date} \n|-\n' + '|}'
-
text = text.replace('|}', new_row)
+ # 5. Apply the edit
page.edit(text, f'New pad in the {padliography}: {title}')
def get_pads():
+ '''Retrieve pads from the wiki'''
+ # 1. Connect to the wiki
site = mwclient.Site('pzwiki.wdka.nl', path='/mw-mediadesign/')
+
+ # 2. Log in using the credential of a bot user registered in the wiki
site.login(
username=os.environ.get('MW_BOT'),
password=os.environ.get('MW_KEY'),
)
+ # 3. Use the MediaWiki API to get the wikitext contents in HTML
html = site.api('parse', prop='text', page=padliography)
+
+ # 4. Parse the HTML with BeautifulSoup to extract data from the table of pads
table = BeautifulSoup(html['parse']['text']['*'], features="html.parser").find(
"table", attrs={"class": "padliography"})
+ # 5. Find the headers of the table
headers = [header.text.lower().strip() for header in table.find_all('th')]
+
+ # 6. Create a list of pad, using each header as property of the object pad
pads = [
{headers[i]: cell.text.rstrip('\n')
for i, cell in enumerate(row.find_all('td'))}
for row in table.find_all('tr')]
+
+ #7. Remove empty pads from the list
pads = [pad for pad in pads if pad != {}]
- return pads
+ return pads
@app.route('/')
def home():
+ '''Serve the homepage layout'''
return render_template('home.html')
+
@app.route('/api', methods=['GET', 'POST'])
def api():
+ '''Manage the interaction with the MediaWiki API'''
+ # Add a new pad
if request.method == 'POST':
link = request.json.get('link', None)
title = request.json.get('title', None)
@@ -112,11 +128,10 @@ def api():
categories = request.json.get('categories', '')
date = request.json.get('date', None)
- # date = datetime.strftime(datetime.strptime(
- # date, '%Y-%m-%d'), '%d-%m-%Y')
add_pad(link, title, overview, categories, date)
redirect(url_for('home'))
+ # Return the pad list
response = jsonify({
'page': padliography,
'pads': get_pads()
@@ -125,5 +140,5 @@ def api():
return response
-
+port = os.environ.get('FLASK_RUN_PORT', '')
app.run(port=port)
diff --git a/static/js/PadForm.js b/static/js/PadForm.js
index fd23647..eb9590c 100644
--- a/static/js/PadForm.js
+++ b/static/js/PadForm.js
@@ -36,7 +36,7 @@ export default {
};
PadStore.value.unshift(pad);
- pad.categories.join(", ");
+ pad.categories = pad.categories.join(", ");
fetch("api", {
method: "POST",
@@ -79,7 +79,6 @@ export default {
-