Integrate tags with api.js and improve sanity of tag endpoints.

master
voussoir 2018-09-23 16:41:34 -07:00
parent af318414e2
commit 8cfa88e45d
3 changed files with 151 additions and 70 deletions

View File

@ -46,6 +46,28 @@ def post_tag_edit(specific_tag):
response = jsonify.make_json_response(response)
return response
@site.route('/tag/<tagname>/add_child', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['child_name'], forbid_whitespace=True)
def post_tag_add_child(tagname):
parent = common.P_tag(tagname)
child = common.P_tag(request.form['child_name'])
parent.add_child(child)
response = {'action': 'add_child', 'tagname': f'{parent.name}.{child.name}'}
return jsonify.make_json_response(response)
@site.route('/tag/<tagname>/remove_child', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['child_name'], forbid_whitespace=True)
def post_tag_remove_child(tagname):
parent = common.P_tag(tagname)
child = common.P_tag(request.form['child_name'])
parent.remove_child(child)
response = {'action': 'remove_child', 'tagname': f'{parent.name}.{child.name}'}
return jsonify.make_json_response(response)
# Tag listings #####################################################################################
@site.route('/all_tags.json')
@ -115,47 +137,44 @@ def get_tags_json(specific_tag_name=None):
@site.route('/tags/create_tag', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['tagname'], forbid_whitespace=True)
@decorators.required_fields(['name'], forbid_whitespace=True)
def post_tag_create():
easybake_string = request.form['tagname']
user = session_manager.get(request).user
notes = common.P.easybake(easybake_string, author=user)
name = request.form['name']
description = request.form.get('description', None)
tag = P.new_tag(name, description, author=session_manager.get(request).user)
response = etiquette.jsonify.tag(tag)
return jsonify.make_json_response(response)
@site.route('/tags/easybake', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['easybake_string'], forbid_whitespace=True)
def post_tag_easybake():
easybake_string = request.form['easybake_string']
notes = common.P.easybake(easybake_string, author=session_manager.get(request).user)
notes = [{'action': action, 'tagname': tagname} for (action, tagname) in notes]
return jsonify.make_json_response(notes)
@site.route('/tags/delete_synonym', methods=['POST'])
@site.route('/tag/<tagname>/delete', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['tagname'], forbid_whitespace=True)
def post_tag_delete_synonym():
synonym = request.form['tagname']
synonym = synonym.split('+')[-1].split('.')[-1]
try:
master_tag = common.P.get_tag(name=synonym)
except etiquette.exceptions.NoSuchTag as exc:
raise etiquette.exceptions.NoSuchSynonym(*exc.given_args, **exc.given_kwargs)
else:
master_tag.remove_synonym(synonym)
response = {'action':'delete_synonym', 'synonym': synonym}
def post_tag_delete(tagname):
tag = common.P_tag(tagname)
tag.delete()
response = {'action': 'delete_tag', 'tagname': tag.name}
return jsonify.make_json_response(response)
@site.route('/tags/delete_tag', methods=['POST'])
@site.route('/tag/<tagname>/remove_synonym', methods=['POST'])
@decorators.catch_etiquette_exception
@session_manager.give_token
@decorators.required_fields(['tagname'], forbid_whitespace=True)
def post_tag_delete():
tagname = request.form['tagname']
tagname = tagname.split('+')[0]
if '.' in tagname:
(parentname, tagname) = tagname.rsplit('.', 1)
parent = common.P.get_tag(name=parentname)
tag = common.P.get_tag(name=tagname)
parent.remove_child(tag)
response = {'action': 'unlink_tag', 'tagname': f'{parent.name}.{tag.name}'}
else:
tag = common.P.get_tag(name=tagname)
tag.delete()
response = {'action': 'delete_tag', 'tagname': tag.name}
@decorators.required_fields(['syn_name'], forbid_whitespace=True)
def post_tag_remove_synonym(tagname):
syn_name = request.form['syn_name']
master_tag = common.P_tag(tagname)
master_tag.remove_synonym(syn_name)
response = {'action':'delete_synonym', 'synonym': syn_name}
return jsonify.make_json_response(response)

View File

@ -177,5 +177,69 @@ function remove_tag(photo_id, tagname, callback)
/**************************************************************************************************/
api.tags = {};
api.tags.add_child =
function add_child(tag_name, child_name, callback)
{
var url = `/tag/${tag_name}/add_child`;
var data = new FormData();
data.append("child_name", child_name);
common.post(url, data, callback);
}
api.tags.create =
function create(name, description, callback)
{
var url = `/tags/create_tag`;
var data = new FormData();
data.append("name", name);
data.append("description", description);
common.post(url, data, callback);
}
api.tags.delete =
function _delete(tag_name, callback)
{
var url = `/tag/${tag_name}/delete`;
common.post(url, null, callback);
}
api.tags.easybake =
function easybake(easybake_string, callback)
{
var url = "/tags/easybake";
var data = new FormData();
data.append("easybake_string", easybake_string);
common.post(url, data, callback);
}
api.tags.edit =
function edit(tag_name, name, description, callback)
{
var url = `/tag/${tag_name}/edit`;
var data = new FormData();
data.append("name", name);
data.append("description", description);
common.post(url, data, callback);
}
api.tags.remove_child =
function remove_child(tag_name, child_name, callback)
{
var url = `/tag/${tag_name}/remove_child`;
var data = new FormData();
data.append("child_name", child_name);
common.post(url, data, callback);
}
api.tags.remove_synonym =
function remove_synonym(tag_name, syn_name, callback)
{
var url = `/tag/${tag_name}/remove_synonym`;
var data = new FormData();
data.append("syn_name", syn_name);
common.post(url, data, callback);
}
/**************************************************************************************************/
api.users = {};

View File

@ -12,6 +12,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="/static/css/common.css">
<script src="/static/js/common.js"></script>
<script src="/static/js/api.js"></script>
<script src="/static/js/editor.js"></script>
<style>
@ -143,13 +144,13 @@
{{tag_object.tag_object(tag, link='search', innertext=qualified_name, with_alt_description=True)-}}
<button
class="remove_tag_button red_button button_with_confirm"
data-onclick="delete_tag('{{qualified_name}}', receive_callback);"
data-onclick="remove_child_form('{{qualified_name.split('.')[-2]}}', '{{tag.name}}');"
data-prompt="Unlink Tags?"
data-confirm="Unlink"
data-confirm-class="remove_tag_button_perm red_button"
data-cancel-class="remove_tag_button_perm gray_button"
>
unlink
Unlink
</button>
</li>
{% else %}
@ -158,13 +159,13 @@
{{tag_object.tag_object(tag, link='search', innertext=qualified_name, with_alt_description=True)-}}
<button
class="remove_tag_button red_button button_with_confirm"
data-onclick="delete_tag('{{qualified_name}}', receive_callback);"
data-onclick="delete_tag_form('{{qualified_name}}');"
data-prompt="Delete Tag?"
data-confirm="Delete"
data-confirm-class="remove_tag_button_perm red_button"
data-cancel-class="remove_tag_button_perm gray_button"
>
delete
Delete
</button>
</li>
{% endif %}
@ -176,13 +177,13 @@
{{tag_object.tag_object(tag, link='search', innertext=qualified_name + '+' + synonym)-}}
<button
class="remove_tag_button red_button button_with_confirm"
data-onclick="delete_tag_synonym('{{synonym}}', receive_callback);"
data-onclick="remove_synonym_form('{{tag.name}}', '{{synonym}}');"
data-prompt="Remove Synonym?"
data-confirm="Remove"
data-confirm-class="remove_tag_button_perm red_button"
data-cancel-class="remove_tag_button_perm gray_button"
>
remove
Remove
</button>
</li>
{% endfor %}
@ -193,7 +194,7 @@
<div id="right">
<div id="editor_area">
<input type="text" id="add_tag_textbox" autofocus>
<button class="add_tag_button green_button" id="add_tag_button" onclick="submit_tag(receive_callback);">add</button>
<button class="add_tag_button green_button" id="add_tag_button" onclick="easybake_form();">add</button>
</div>
<div id="message_area">
</div>
@ -209,30 +210,27 @@ var message_area = document.getElementById('message_area');
box.addEventListener("keyup", common.entry_with_history_hook);
common.bind_box_to_button(box, button, false);
function submit_tag(callback)
function delete_tag_form(tag_name)
{
create_tag(box.value, callback);
api.tags.delete(tag_name, receive_callback);
}
function easybake_form()
{
var box = document.getElementById('add_tag_textbox');
var easybake_string = box.value;
api.tags.easybake(easybake_string, receive_callback);
box.value = "";
}
function edit_tags(action, tagname, callback)
function remove_child_form(tag_name, child_name)
{
if (tagname === ""){return}
var url = "/tags/" + action;
data = new FormData();
data.append("tagname", tagname);
return common.post(url, data, callback);
api.tags.remove_child(tag_name, child_name, receive_callback);
}
function delete_tag_synonym(tagname, callback)
function remove_synonym_form(tag_name, syn_name)
{
return edit_tags("delete_synonym", tagname, callback);
}
function delete_tag(tagname, callback)
{
return edit_tags("delete_tag", tagname, callback);
}
function create_tag(tagname, callback)
{
return edit_tags("create_tag", tagname, callback);
api.tags.remove_synonym(tag_name, syn_name, receive_callback);
}
function receive_callback(response)
@ -278,7 +276,7 @@ function receive_callback(response)
else if (action == "delete_synonym")
{message_text = `Deleted synonym ${response["synonym"]}`;}
else if (action == "unlink_tag")
else if (action == "remove_child")
{message_text = `Unlinked tags ${tagname}`;}
}
@ -295,12 +293,6 @@ function on_open(ed, edit_element_map)
function on_save(ed, edit_element_map, display_element_map)
{
var name_display = display_element_map["name"];
var name_editor = edit_element_map["name"];
var description_display = display_element_map["description"];
var description_editor = edit_element_map["description"];
ed.show_spinner();
function callback(response)
{
console.log(response);
@ -321,11 +313,17 @@ function on_save(ed, edit_element_map, display_element_map)
}
}
var url = "/tag/" + name_display.innerText + "/edit";
var data = new FormData();
data.append("name", name_editor.value);
data.append("description", description_editor.value);
common.post(url, data, callback);
var name_display = display_element_map["name"];
var name_editor = edit_element_map["name"];
var description_display = display_element_map["description"];
var description_editor = edit_element_map["description"];
var tag_name = name_display.innerText;
var name = name_editor.value;
var description = description_editor.value;
ed.show_spinner();
api.tags.edit(tag_name, name, description, callback)
}
function on_cancel(ed, edit_element_map, display_element_map)