Fix importing of bookmarks from TOML.

This commit is contained in:
Schimon Jehudah, Adv. 2024-08-23 03:56:10 +03:00
parent 3024f57466
commit 6934b77bd8
2 changed files with 132 additions and 111 deletions

View file

@ -1444,17 +1444,17 @@ class HttpInstance:
override: str = Form(None)): override: str = Form(None)):
jabber_id = Utilities.is_jid_matches_to_session(accounts, sessions, request) jabber_id = Utilities.is_jid_matches_to_session(accounts, sessions, request)
if jabber_id: if jabber_id:
xmpp_instance = accounts[jabber_id]
if file: if file:
# TODO If node does not exist, redirect to result page with # TODO If node does not exist, redirect to result page with
# a message that bookmarks are empty. # a message that bookmarks are empty.
# NOTE No. # NOTE No.
# TODO match/case public, private, read node_id = nodes[node]['name']
node_id = node[node]['name'] node_title = nodes[node]['title']
node_title = node[node]['title'] node_subtitle = nodes[node]['subtitle']
node_subtitle = node[node]['subtitle'] node_access_model = nodes[node]['access_model']
node_access_model = node[node]['access_model']
if not await XmppPubsub.is_node_exist(xmpp_instance, node_id): if not await XmppPubsub.is_node_exist(xmpp_instance, node_id):
iq = XmppPubsub.create_node_atom( iq = XmppPubsub.create_node_atom(
xmpp_instance, jabber_id, node_id, node_title, xmpp_instance, jabber_id, node_id, node_title,
@ -1463,33 +1463,45 @@ class HttpInstance:
#return {"filename": file.filename} #return {"filename": file.filename}
content = file.file.read().decode() content = file.file.read().decode()
# TODO Add match/case for filetype.
entries = tomllib.loads(content) entries = tomllib.loads(content)
# entries_node = entries[node] # entries_node = entries[node]
#breakpoint()
#for entry in entries: print(entry)
name = jabber_id.split('@')[0] name = jabber_id.split('@')[0]
# timestamp = datetime.now().isoformat() # timestamp = datetime.now().isoformat()
db_file = 'main.sqlite' db_file = 'main.sqlite'
for entry in entries: counter = 0
url_hash = item_id = Utilities.hash_url_to_md5(entry['link'])
instances = SQLite.get_entry_instances_by_url_hash(db_file, url_hash) for entry_type in entries:
entry = {'title' : entry['title'], for entry in entries[entry_type]:
'link' : entry['link'], url_hash = item_id = Utilities.hash_url_to_md5(entry['link'])
'summary' : entry['summary'], instances = SQLite.get_entry_instances_by_url_hash(db_file, url_hash)
'published' : entry['published'], entry_new = {
'updated' : entry['published'], 'title' : entry['title'],
#'updated' : entry['updated'], 'link' : entry['link'],
'tags' : entry['tags'], 'summary' : entry['summary'],
'url_hash' : url_hash, 'published' : entry['published'],
'jid' : jabber_id, 'updated' : entry['published'],
'name' : name, #'updated' : entry['updated'],
'instances' : instances} 'tags' : entry['tags'],
#message = 'Discover new links and see who shares them' 'url_hash' : url_hash,
xmpp_instance = accounts[jabber_id] 'jid' : jabber_id,
payload = Syndication.create_rfc4287_entry(entry) 'name' : name,
iq = await XmppPubsub.publish_node_item( 'instances' : instances}
xmpp_instance, jabber_id, node_id, item_id, payload) #message = 'Discover new links and see who shares them'
#await iq.send(timeout=15) xmpp_instance = accounts[jabber_id]
message = 'Blasta system message » Imported {} items.'.format(len(entries)) payload = Syndication.create_rfc4287_entry(entry_new)
iq = await XmppPubsub.publish_node_item(
xmpp_instance, jabber_id, node_id, item_id, payload)
#await iq.send(timeout=15)
counter += 1
message = 'Blasta system message » Imported {} items.'.format(counter)
description = 'Import successful' description = 'Import successful'
path = 'profile' path = 'profile'
return result_post(request, jabber_id, description, message, path) return result_post(request, jabber_id, description, message, path)

View file

@ -117,10 +117,10 @@
</dt> </dt>
<dd> <dd>
<a download="{{jabber_id}}_private.json" <a download="{{jabber_id}}_private.json"
href="/profile/export/private/json"> href="/profile/export/private/json">
JSON</a>, JSON</a>,
<a download="{{jabber_id}}_private.toml" <a download="{{jabber_id}}_private.toml"
href="/profile/export/private/toml"> href="/profile/export/private/toml">
TOML</a>. TOML</a>.
</dd> </dd>
<dt> <dt>
@ -128,10 +128,10 @@
</dt> </dt>
<dd> <dd>
<a download="{{jabber_id}}_public.json" <a download="{{jabber_id}}_public.json"
href="/profile/export/public/json"> href="/profile/export/public/json">
JSON</a>, JSON</a>,
<a download="{{jabber_id}}_public.toml" <a download="{{jabber_id}}_public.toml"
href="/profile/export/public/toml"> href="/profile/export/public/toml">
TOML</a>. TOML</a>.
</dd> </dd>
<dt> <dt>
@ -139,10 +139,10 @@
</dt> </dt>
<dd> <dd>
<a download="{{jabber_id}}_read.json" <a download="{{jabber_id}}_read.json"
href="/profile/export/read/json"> href="/profile/export/read/json">
JSON</a>, JSON</a>,
<a download="{{jabber_id}}_read.toml" <a download="{{jabber_id}}_read.toml"
href="/profile/export/read/toml"> href="/profile/export/read/toml">
TOML</a>. TOML</a>.
</dd> </dd>
</dl> </dl>
@ -153,9 +153,9 @@
your bookmarks to. your bookmarks to.
</p> </p>
<form action="/profile/import" <form action="/profile/import"
enctype="multipart/form-data" enctype="multipart/form-data"
id="import" id="import"
method="post"> method="post">
<table> <table>
<tr> <tr>
<td> <td>
@ -165,10 +165,10 @@
</td> </td>
<td> <td>
<input id="file" <input id="file"
name="file" name="file"
placeholder="Select a file to import." placeholder="Select a file to import."
required="" required=""
type="file" /> type="file" />
</td> </td>
</tr> </tr>
<tr> <tr>
@ -179,20 +179,20 @@
</td> </td>
<td> <td>
<input id="node-private" <input id="node-private"
name="node" name="node"
required="" required=""
type="radio" type="radio"
value="private"/> value="private"/>
<label for="node-private">Private</label> <label for="node-private">Private</label>
<input id="node-public" <input id="node-public"
name="node" name="node"
type="radio" type="radio"
value="public"/> value="public"/>
<label for="node-public">Public</label> <label for="node-public">Public</label>
<input id="node-read" <input id="node-read"
name="node" name="node"
type="radio" type="radio"
value="read"/> value="read"/>
<label for="node-read">Read</label> <label for="node-read">Read</label>
</td> </td>
</tr> </tr>
@ -204,19 +204,20 @@
</td> </td>
<td> <td>
<input id="merge" <input id="merge"
disabled="" disabled=""
name="merge" name="merge"
type="checkbox"/> type="checkbox"/>
<label for="merge" <label for="merge"
title="Merge tags."> title="Merge tags.">
Merge Merge
</label> </label>
<input id="override" <input id="override"
disabled="" checked=""
name="override" disabled=""
type="checkbox"/> name="override"
type="checkbox"/>
<label for="override" <label for="override"
title="Replace properties by the title="Replace properties by the
properties of the imported entries."> properties of the imported entries.">
Override Override
</label> </label>
@ -229,10 +230,12 @@ merge tags.">
</tr> </tr>
</table> </table>
<input class="submit" <input class="submit"
type="submit" type="submit"
value="Import Bookmarks"/> value="Import Bookmarks"/>
</form> </form>
<h4 id="permissions">Permissions</h4> <h4 id="permissions">
Permissions
</h4>
<p> <p>
Choose the desired Choose the desired
<a href="https://xmpp.org/extensions/xep-0060.html#accessmodels"> <a href="https://xmpp.org/extensions/xep-0060.html#accessmodels">
@ -250,25 +253,24 @@ merge tags.">
</td> </td>
<td> <td>
<input id="private-authorize" <input id="private-authorize"
{% if access_models['private'] == 'authorize' %}checked=""{% endif %} {% if access_models['private'] == 'authorize' %}checked=""{% endif %}
disabled="" disabled=""
name="private" name="private"
type="radio"/> type="radio"/>
<label for="private-authorize" <label for="private-authorize"
title="The node owner must approve title="The node owner must approve all
all subscription requests, and only subscribers may retrieve items from the subscription requests, and only subscribers may retrieve items from the node.">
node.">
Authorize Authorize
</label> </label>
</td> </td>
<td> <td>
<input id="private-whitelist" <input id="private-whitelist"
{% if access_models['private'] == 'whitelist' %}checked=""{% endif %} {% if access_models['private'] == 'whitelist' %}checked=""{% endif %}
disabled="" disabled=""
name="private" name="private"
type="radio"/> type="radio"/>
<label for="private-whitelist" <label for="private-whitelist"
title="An entity may subscribe or title="An entity may subscribe or
retrieve items only if on a whitelist managed by the node owner."> retrieve items only if on a whitelist managed by the node owner.">
Whitelist Whitelist
</label> </label>
@ -282,14 +284,14 @@ retrieve items only if on a whitelist managed by the node owner.">
</td> </td>
<td> <td>
<input id="public-open" <input id="public-open"
{% if access_models['public'] == 'open' %}checked=""{% endif %} {% if access_models['public'] == 'open' %}checked=""{% endif %}
disabled="" disabled=""
name="public" name="public"
type="radio"/> type="radio"/>
<label for="public-open" <label for="public-open"
title="Any entity may subscribe to title="Any entity may subscribe to the
the node (i.e., without the necessity for subscription approval) and any entity node (i.e., without the necessity for subscription approval) and any entity may
may retrieve items from the node (i.e., without being subscribed)."> retrieve items from the node (i.e., without being subscribed).">
Open Open
</label> </label>
</td> </td>
@ -300,8 +302,8 @@ may retrieve items from the node (i.e., without being subscribed).">
name="public" name="public"
type="radio"/> type="radio"/>
<label for="public-presence" <label for="public-presence"
title="Any entity with a subscription title="Any entity with a subscription of
of type 'from' or 'both' may subscribe to the node and retrieve items from the type 'from' or 'both' may subscribe to the node and retrieve items from the
node; this access model applies mainly to instant messaging systems (see RFC node; this access model applies mainly to instant messaging systems (see RFC
3921)."> 3921).">
Presence Presence
@ -309,14 +311,14 @@ node; this access model applies mainly to instant messaging systems (see RFC
</td> </td>
<td> <td>
<input id="public-roster" <input id="public-roster"
{% if access_models['public'] == 'roster' %}checked=""{% endif %} {% if access_models['public'] == 'roster' %}checked=""{% endif %}
disabled="" disabled=""
name="public" name="public"
type="radio"/> type="radio"/>
<label for="public-roster" <label for="public-roster"
title="Any entity in the specified title="Any entity in the specified roster
roster group(s) may subscribe to the node and retrieve items from the node; this group(s) may subscribe to the node and retrieve items from the node; this access
access model applies mainly to instant messaging systems (see RFC 3921)."> model applies mainly to instant messaging systems (see RFC 3921).">
Roster Roster
</label> </label>
</td> </td>
@ -329,25 +331,24 @@ access model applies mainly to instant messaging systems (see RFC 3921).">
</td> </td>
<td> <td>
<input id="read-authorize" <input id="read-authorize"
{% if access_models['read'] == 'authorize' %}checked=""{% endif %} {% if access_models['read'] == 'authorize' %}checked=""{% endif %}
disabled="" disabled=""
name="read" name="read"
type="radio"/> type="radio"/>
<label for="read-authorize" <label for="read-authorize"
title="The node owner must approve title="The node owner must approve all
all subscription requests, and only subscribers may retrieve items from the subscription requests, and only subscribers may retrieve items from the node.">
node.">
Authorize Authorize
</label> </label>
</td> </td>
<td> <td>
<input id="read-whitelist" <input id="read-whitelist"
{% if access_models['read'] == 'whitelist' %}checked=""{% endif %} {% if access_models['read'] == 'whitelist' %}checked=""{% endif %}
disabled="" disabled=""
name="read" name="read"
type="radio"/> type="radio"/>
<label for="read-whitelist" <label for="read-whitelist"
title="An entity may subscribe or title="An entity may subscribe or
retrieve items only if on a whitelist managed by the node owner."> retrieve items only if on a whitelist managed by the node owner.">
Whitelist Whitelist
</label> </label>
@ -355,39 +356,47 @@ retrieve items only if on a whitelist managed by the node owner.">
</tr> </tr>
</table> </table>
<input class="submit" <input class="submit"
disabled="" disabled=""
type="submit" type="submit"
value="Save Permissions"/> value="Save Permissions"/>
<input class="submit" <input class="submit"
disabled="" disabled=""
type="reset" type="reset"
value="Reset Permissions"/> value="Reset Permissions"/>
</form> </form>
<h4 id="routine">Routine</h4> <h4 id="routine">
Routine
</h4>
<p> <p>
Choose a routine (i.e. default) directory (i.e. node). Choose a routine (i.e. default) directory (i.e. node).
</p> </p>
<form action="/profile" <form action="/profile"
method="post"> method="post">
<input id="routine-private" <input id="routine-private"
{% if routine == 'private' %}checked=""{% endif %} {% if routine == 'private' %}checked=""{% endif %}
name="routine" name="routine"
required="" required=""
type="radio" type="radio"
value="private"/> value="private"/>
<label for="routine-private">Private</label> <label for="routine-private">
Private
</label>
<input id="routine-public" <input id="routine-public"
{% if not routine or routine == 'public' %}checked=""{% endif %} {% if not routine or routine == 'public' %}checked=""{% endif %}
name="routine" name="routine"
type="radio" type="radio"
value="public"/> value="public"/>
<label for="routine-public">Public</label> <label for="routine-public">
Public
</label>
<input id="routine-read" <input id="routine-read"
{% if routine == 'read' %}checked=""{% endif %} {% if routine == 'read' %}checked=""{% endif %}
name="routine" name="routine"
type="radio" type="radio"
value="read"/> value="read"/>
<label for="routine-read">Read</label> <label for="routine-read">
Read
</label>
<br/> <br/>
<input class="submit" <input class="submit"
type="submit" type="submit"