diff options
-rw-r--r-- | askbot/skins/common/media/js/post.js | 27 | ||||
-rw-r--r-- | askbot/skins/default/templates/macros.html | 3 | ||||
-rw-r--r-- | askbot/skins/default/templates/question_edit.html | 20 | ||||
-rw-r--r-- | askbot/utils/category_tree.py | 53 | ||||
-rw-r--r-- | askbot/views/writers.py | 65 |
5 files changed, 106 insertions, 62 deletions
diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js index cb3ec20f..6e154465 100644 --- a/askbot/skins/common/media/js/post.js +++ b/askbot/skins/common/media/js/post.js @@ -2417,6 +2417,16 @@ TagEditor.prototype.removeSelectedTag = function(tag_name) { this.setSelectedTags(tag_names); }; +TagEditor.prototype.getTagDeleteHandler = function(tag){ + var me = this; + return function(){ + me.removeSelectedTag(tag.getName()); + tag.dispose(); + $('.acResults').hide();//a hack to hide the autocompleter + me.fixHeight(); + }; +}; + TagEditor.prototype.addTag = function(tag_name) { var tag_name = tag_name.replace(/\s+/, ' ').toLowerCase(); if ($.inArray(tag_name, this.getSelectedTags()) !== -1) { @@ -2426,13 +2436,7 @@ TagEditor.prototype.addTag = function(tag_name) { tag.setName(tag_name); tag.setDeletable(true); tag.setLinkable(true); - var me = this; - tag.setDeleteHandler(function(){ - me.removeSelectedTag(tag_name); - tag.dispose(); - $('.acResults').hide();//a hack to hide the autocompleter - me.fixHeight(); - }); + tag.setDeleteHandler(this.getTagDeleteHandler(tag)); this._tags_container.append(tag.getElement()); this.addSelectedTag(tag_name); }; @@ -2541,6 +2545,15 @@ TagEditor.prototype.decorate = function(element) { this._hidden_tags_input = element.find('input[name="tags"]');//this one is hidden this._tags_container = element.find('ul.tags'); + var me = this; + this._tags_container.children().each(function(idx, elem){ + var tag = new Tag(); + tag.setDeletable(true); + tag.setLinkable(false); + tag.decorate($(elem)); + tag.setDeleteHandler(me.getTagDeleteHandler(tag)); + }); + var visible_tags_input = element.find('.new-tags-input'); this._visible_tags_input = visible_tags_input; this.saveHeight(); diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index 4e2ab5d0..56c6e735 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -489,7 +489,8 @@ for the purposes of the AJAX comment editor #} post_type = None, mandatory_tags = None, edit_title = False, - use_category_selector = False + use_category_selector = False, + tag_names = None ) -%} {%include "widgets/edit_post.html" %} diff --git a/askbot/skins/default/templates/question_edit.html b/askbot/skins/default/templates/question_edit.html index 47873e0e..2f252cde 100644 --- a/askbot/skins/default/templates/question_edit.html +++ b/askbot/skins/default/templates/question_edit.html @@ -20,7 +20,9 @@ form, post_type='question', edit_title=True, - mandatory_tags = mandatory_tags + mandatory_tags = mandatory_tags, + use_category_selector = use_category_selector, + tag_names = tag_names ) }} <div class="after-editor"> @@ -94,5 +96,21 @@ }); </script> + {% if use_category_selector %} + <script type='text/javascript'> + (function(){ + var selector = new CategorySelector(); + selector.setData(JSON.parse("{{category_tree_data|escapejs}}")); + if (askbot['data']['userIsAdminOrMod']) { + selector.setEditable(true); + } + selector.decorate($('.category-selector')); + + var tag_editor = new TagEditor(); + tag_editor.decorate($('.tag-editor')); + selector.setSelectHandler(tag_editor.getAddTagHandler()); + })(); + </script> + {% endif %} {% endblock %} <!-- end question_edit.html --> diff --git a/askbot/utils/category_tree.py b/askbot/utils/category_tree.py new file mode 100644 index 00000000..d1f0db8f --- /dev/null +++ b/askbot/utils/category_tree.py @@ -0,0 +1,53 @@ +"""This is temporary code to parse category +tree, stored in the settings. +The tree is plain text, with levels of branching +reflected by indentation (2 spaces per level). +""" +def get_subtree(tree, path): + if len(path) == 1: + assert(path[0] == 0) + return tree + else: + import copy + parent_path = copy.copy(path) + leaf_index = parent_path.pop() + branch_index = parent_path[-1] + parent_tree = get_subtree(tree, parent_path) + return parent_tree[branch_index][1] + +def parse_tree(text): + """parse tree represented as indented text + one item per line, with two spaces per level of indentation + """ + lines = text.split('\n') + import re + in_re = re.compile(r'^([ ]*)') + + tree = [['dummy', []]] + subtree_path = [0] + clevel = 0 + + for line in lines: + if line.strip() == '': + continue + match = in_re.match(line) + level = len(match.group(1))/2 + 1 + + if level > clevel: + subtree_path.append(0)# + elif level < clevel: + subtree_path = subtree_path[:level+1] + leaf_index = subtree_path.pop() + subtree_path.append(leaf_index + 1) + else: + leaf_index = subtree_path.pop() + subtree_path.append(leaf_index + 1) + + clevel = level + try: + subtree = get_subtree(tree, subtree_path) + except: + return tree + subtree.append([line.strip(), []]) + + return tree diff --git a/askbot/views/writers.py b/askbot/views/writers.py index d98814d6..5741ec45 100644 --- a/askbot/views/writers.py +++ b/askbot/views/writers.py @@ -32,6 +32,7 @@ from askbot.utils import decorators from askbot.utils.functions import diff_date from askbot.utils import url_utils from askbot.utils.file_utils import store_file +from askbot.utils import category_tree from askbot.templatetags import extra_filters_jinja as template_filters from askbot.importers.stackexchange import management as stackexchange#todo: may change @@ -259,59 +260,9 @@ def ask(request):#view used to ask a new question 'wiki': request.REQUEST.get('wiki', False), 'is_anonymous': request.REQUEST.get('is_anonymous', False), } - - def get_subtree(tree, path): - if len(path) == 1: - assert(path[0] == 0) - return tree - else: - import copy - parent_path = copy.copy(path) - leaf_index = parent_path.pop() - branch_index = parent_path[-1] - parent_tree = get_subtree(tree, parent_path) - return parent_tree[branch_index][1] - - def parse_tree(text): - """parse tree represented as indented text - one item per line, with two spaces per level of indentation - """ - lines = text.split('\n') - import re - in_re = re.compile(r'^([ ]*)') - - tree = [['dummy', []]] - subtree_path = [0] - clevel = 0 - - for line in lines: - if line.strip() == '': - continue - match = in_re.match(line) - level = len(match.group(1))/2 + 1 - - if level > clevel: - subtree_path.append(0)# - elif level < clevel: - subtree_path = subtree_path[:level+1] - leaf_index = subtree_path.pop() - subtree_path.append(leaf_index + 1) - else: - leaf_index = subtree_path.pop() - subtree_path.append(leaf_index + 1) - - clevel = level - try: - subtree = get_subtree(tree, subtree_path) - except: - return tree - subtree.append([line.strip(), []]) - - return tree - - + if askbot_settings.TAG_SOURCE == 'category-tree': - cat_tree = parse_tree(askbot_settings.CATEGORY_TREE) + cat_tree = category_tree.parse_tree(askbot_settings.CATEGORY_TREE) category_tree_data = simplejson.dumps(cat_tree) else: category_tree_data = None @@ -478,6 +429,12 @@ def edit_question(request, id): user = request.user ) + if askbot_settings.TAG_SOURCE == 'category-tree': + cat_tree = category_tree.parse_tree(askbot_settings.CATEGORY_TREE) + category_tree_data = simplejson.dumps(cat_tree) + else: + category_tree_data = None + data = { 'page_class': 'edit-question-page', 'active_tab': 'questions', @@ -485,7 +442,9 @@ def edit_question(request, id): 'revision_form': revision_form, 'mandatory_tags': models.tag.get_mandatory_tags(), 'form' : form, - 'tag_names': question.thread.get_tag_names() + 'tag_names': question.thread.get_tag_names(), + 'use_category_selector': (askbot_settings.TAG_SOURCE == 'category-tree'), + 'category_tree_data': category_tree_data } return render_into_skin('question_edit.html', data, request) |