summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-05-23 09:46:13 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-05-23 09:46:13 -0400
commit544746442732a36ed44356471ac5a33f942faae2 (patch)
treea63fe92eb60872c91422ad22b36d47ca53a3afe6
parent77ad51fff9abe083542d4d6eceb1c557ecfe6126 (diff)
downloadaskbot-544746442732a36ed44356471ac5a33f942faae2.tar.gz
askbot-544746442732a36ed44356471ac5a33f942faae2.tar.bz2
askbot-544746442732a36ed44356471ac5a33f942faae2.zip
added tag categories to the question edit page
-rw-r--r--askbot/skins/common/media/js/post.js27
-rw-r--r--askbot/skins/default/templates/macros.html3
-rw-r--r--askbot/skins/default/templates/question_edit.html20
-rw-r--r--askbot/utils/category_tree.py53
-rw-r--r--askbot/views/writers.py65
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)