initial commit (it has come late tho 🙁)
This commit is contained in:
commit
c2bf966dac
27 changed files with 1618 additions and 0 deletions
70
extensions/importexport.py
Normal file
70
extensions/importexport.py
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
from flask import Blueprint, render_template, request
|
||||
import json, datetime
|
||||
|
||||
from app import Page, PageTag
|
||||
|
||||
bp = Blueprint('importexport', __name__)
|
||||
|
||||
class Exporter(object):
|
||||
def __init__(self):
|
||||
self.root = {'pages': [], 'users': {}}
|
||||
def add_page(self, p, include_history=True, include_users=False):
|
||||
pobj = {}
|
||||
pobj['title'] = p.title
|
||||
pobj['url'] = p.url
|
||||
pobj['tags'] = [tag.name for tag in p.tags]
|
||||
hist = []
|
||||
for rev in (p.revisions if include_history else [p.latest]):
|
||||
revobj = {}
|
||||
revobj['text'] = rev.text
|
||||
revobj['timestamp'] = rev.pub_date.timestamp()
|
||||
if include_users:
|
||||
revobj['user'] = rev.user_id
|
||||
if rev.user_id not in self.root['users']:
|
||||
self.root['users'][rev.user_id] = rev.user_info()
|
||||
else:
|
||||
revobj['user'] = None
|
||||
revobj['comment'] = rev.comment
|
||||
revobj['length'] = rev.length
|
||||
hist.append(revobj)
|
||||
pobj['history'] = hist
|
||||
self.root['pages'].append(pobj)
|
||||
def add_page_list(self, pl, include_history=True, include_users=False):
|
||||
for p in pl:
|
||||
self.add_page(p, include_history=include_history, include_users=include_users)
|
||||
def export(self):
|
||||
return json.dumps(self.root)
|
||||
|
||||
@bp.route('/manage/export/', methods=['GET', 'POST'])
|
||||
def exportpages():
|
||||
if request.method == 'POST':
|
||||
raw_list = request.form['export-list']
|
||||
q_list = []
|
||||
for item in raw_list.split('\n'):
|
||||
item = item.strip()
|
||||
if len(item) < 2:
|
||||
continue
|
||||
if item.startswith('+'):
|
||||
q_list.append(Page.select().where(Page.id == item[1:]))
|
||||
elif item.startswith('#'):
|
||||
q_list.append(Page.select().join(PageTag, on=PageTag.page).where(PageTag.name == item[1:]))
|
||||
elif item.startswith('/'):
|
||||
q_list.append(Page.select().where(Page.url == item[1:].rstrip('/')))
|
||||
else:
|
||||
q_list.append(Page.select().where(Page.title == item))
|
||||
if not q_list:
|
||||
flash('Failed to export pages: The list is empty!')
|
||||
return render_template('exportpages.html')
|
||||
query = q_list.pop(0)
|
||||
while q_list:
|
||||
query |= q_list.pop(0)
|
||||
e = Exporter()
|
||||
e.add_page_list(query)
|
||||
return e.export(), {'Content-Type': 'application/json', 'Content-Disposition': 'attachment; ' +
|
||||
'filename=export-{}.json'.format(datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))}
|
||||
return render_template('exportpages.html')
|
||||
|
||||
@bp.route('/manage/import/', methods=['GET', 'POST'])
|
||||
def importpages():
|
||||
return render_template('importpages.html')
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue