summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdolfo Fitoria <adolfo.fitoria@gmail.com>2012-03-20 08:50:53 -0600
committerAdolfo Fitoria <adolfo.fitoria@gmail.com>2012-03-20 08:50:53 -0600
commit89c0da21cc840299975c78b01192a69a12643714 (patch)
tree4967f22ed9ed8cd3c30408500c8a0cd497bad7e4
parent6a13bd7950d8a5fe2bab211bcb81796d0e75df6e (diff)
parent6d5f9b2dd775918e1170827c80d8b4fff3b1166a (diff)
downloadaskbot-89c0da21cc840299975c78b01192a69a12643714.tar.gz
askbot-89c0da21cc840299975c78b01192a69a12643714.tar.bz2
askbot-89c0da21cc840299975c78b01192a69a12643714.zip
Merge branch 'master' of github.com:ASKBOT/askbot-devel
-rw-r--r--askbot/conf/forum_data_rules.py9
-rw-r--r--askbot/doc/source/changelog.rst1
-rw-r--r--askbot/forms.py38
-rw-r--r--askbot/models/question.py15
-rw-r--r--askbot/setup_templates/settings.py3
-rw-r--r--askbot/setup_templates/settings.py.mustache3
-rw-r--r--askbot/skins/common/media/js/post.js8
-rw-r--r--askbot/skins/common/templates/authopenid/email_validation.txt2
-rw-r--r--askbot/skins/common/templates/widgets/edit_post.html32
-rw-r--r--askbot/skins/default/templates/main_page/sidebar.html14
-rw-r--r--askbot/skins/default/templates/meta/editor_data.html2
-rw-r--r--askbot/skins/default/templates/question/sidebar.html8
-rw-r--r--askbot/skins/default/templates/user_profile/user.html11
-rw-r--r--askbot/skins/utils.py5
-rw-r--r--askbot/views/writers.py4
15 files changed, 103 insertions, 52 deletions
diff --git a/askbot/conf/forum_data_rules.py b/askbot/conf/forum_data_rules.py
index d6d2efd3..7b35fb44 100644
--- a/askbot/conf/forum_data_rules.py
+++ b/askbot/conf/forum_data_rules.py
@@ -120,6 +120,15 @@ settings.register(
)
settings.register(
+ livesettings.BooleanValue(
+ FORUM_DATA_RULES,
+ 'TAGS_ARE_REQUIRED',
+ description = _('Are tags required?'),
+ default = False,
+ )
+)
+
+settings.register(
livesettings.StringValue(
FORUM_DATA_RULES,
'MANDATORY_TAGS',
diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst
index 65020d71..a1a2eaf7 100644
--- a/askbot/doc/source/changelog.rst
+++ b/askbot/doc/source/changelog.rst
@@ -24,6 +24,7 @@ Development version (not released yet)
* Check order of middleware classes (Daniel Mican)
* Added "reply by email" function (`Vasil Vangelovski <http://www.atomidata.com>`_)
* Enabled "ask by email" via Lamson (Evgeny)
+* Tags can be optional (Evgeny)
0.7.39 (Jan 11, 2012)
---------------------
diff --git a/askbot/forms.py b/askbot/forms.py
index 500bedd9..1816c202 100644
--- a/askbot/forms.py
+++ b/askbot/forms.py
@@ -179,10 +179,10 @@ class AnswerEditorField(EditorField):
class TagNamesField(forms.CharField):
def __init__(self, *args, **kwargs):
super(TagNamesField, self).__init__(*args, **kwargs)
- self.required = True
+ self.required = askbot_settings.TAGS_ARE_REQUIRED
self.widget = forms.TextInput(attrs={'size' : 50, 'autocomplete' : 'off'})
self.max_length = 255
- self.label = _('tags')
+ self.label = _('tags')
#self.help_text = _('please use space to separate tags (this enables autocomplete feature)')
self.help_text = ungettext_lazy(
'Tags are short keywords, with no spaces within. '
@@ -195,7 +195,7 @@ class TagNamesField(forms.CharField):
def need_mandatory_tags(self):
"""true, if list of mandatory tags is not empty"""
- return len(models.tag.get_mandatory_tags()) > 0
+ return askbot_settings.TAGS_ARE_REQUIRED and len(models.tag.get_mandatory_tags()) > 0
def tag_string_matches(self, tag_string, mandatory_tag):
"""true if tag string matches the mandatory tag"""
@@ -218,8 +218,10 @@ class TagNamesField(forms.CharField):
value = super(TagNamesField, self).clean(value)
data = value.strip()
if len(data) < 1:
- raise forms.ValidationError(_('tags are required'))
-
+ if askbot_settings.TAGS_ARE_REQUIRED:
+ raise forms.ValidationError(_('tags are required'))
+ else:
+ return ''#don't test for required characters when tags is ''
split_re = re.compile(const.TAG_SPLIT_REGEX)
tag_strings = split_re.split(data)
entered_tags = []
@@ -671,21 +673,27 @@ class AskByEmailForm(forms.Form):
``tagnames`` and ``title``
"""
raw_subject = self.cleaned_data['subject'].strip()
- subject_re = re.compile(r'^\[([^]]+)\](.*)$')
+ if askbot_settings.TAGS_ARE_REQUIRED:
+ subject_re = re.compile(r'^\[([^]]+)\](.*)$')
+ else:
+ subject_re = re.compile(r'^(?:\[([^]]+)\])?(.*)$')
match = subject_re.match(raw_subject)
if match:
#make raw tags comma-separated
- tagnames = match.group(1).replace(';',',')
+ if match.group(1) is None:#no tags
+ self.cleaned_data['tagnames'] = ''
+ else:
+ tagnames = match.group(1).replace(';',',')
- #pre-process tags
- tag_list = [tag.strip() for tag in tagnames.split(',')]
- tag_list = [re.sub(r'\s+', ' ', tag) for tag in tag_list]
- if askbot_settings.REPLACE_SPACE_WITH_DASH_IN_EMAILED_TAGS:
- tag_list = [tag.replace(' ', '-') for tag in tag_list]
- tagnames = ' '.join(tag_list)#todo: use tag separator char here
+ #pre-process tags
+ tag_list = [tag.strip() for tag in tagnames.split(',')]
+ tag_list = [re.sub(r'\s+', ' ', tag) for tag in tag_list]
+ if askbot_settings.REPLACE_SPACE_WITH_DASH_IN_EMAILED_TAGS:
+ tag_list = [tag.replace(' ', '-') for tag in tag_list]
+ tagnames = ' '.join(tag_list)#todo: use tag separator char here
- #clean tags - may raise ValidationError
- self.cleaned_data['tagnames'] = TagNamesField().clean(tagnames)
+ #clean tags - may raise ValidationError
+ self.cleaned_data['tagnames'] = TagNamesField().clean(tagnames)
#clean title - may raise ValidationError
title = match.group(2).strip()
diff --git a/askbot/models/question.py b/askbot/models/question.py
index ff39bb7d..8c61385c 100644
--- a/askbot/models/question.py
+++ b/askbot/models/question.py
@@ -64,7 +64,15 @@ class ThreadManager(models.Manager):
def create_new(self, title, author, added_at, wiki, text, tagnames=None, is_anonymous=False):
# TODO: Some of this code will go to Post.objects.create_new
- thread = super(ThreadManager, self).create(title=title, tagnames=tagnames, last_activity_at=added_at, last_activity_by=author)
+ thread = super(
+ ThreadManager,
+ self
+ ).create(
+ title=title,
+ tagnames=tagnames,
+ last_activity_at=added_at,
+ last_activity_by=author
+ )
question = Post(
post_type='question',
@@ -389,7 +397,10 @@ class Thread(models.Model):
def get_tag_names(self):
"Creates a list of Tag names from the ``tagnames`` attribute."
- return self.tagnames.split(u' ')
+ if self.tagnames.strip() == '':
+ return list()
+ else:
+ return self.tagnames.split(u' ')
def get_title(self, question=None):
if not question:
diff --git a/askbot/setup_templates/settings.py b/askbot/setup_templates/settings.py
index 6d263816..b1d7dd06 100644
--- a/askbot/setup_templates/settings.py
+++ b/askbot/setup_templates/settings.py
@@ -222,6 +222,7 @@ import djcelery
djcelery.setup_loader()
CSRF_COOKIE_NAME = 'askbot_csrf'
-CSRF_COOKIE_DOMAIN = ''#enter domain name here - e.g. example.com
+#enter domain name here - e.g. example.com
+#CSRF_COOKIE_DOMAIN = ''
STATICFILES_DIRS = ( os.path.join(ASKBOT_ROOT, 'skins'),)
diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache
index 71ccf0f2..855e6294 100644
--- a/askbot/setup_templates/settings.py.mustache
+++ b/askbot/setup_templates/settings.py.mustache
@@ -222,7 +222,8 @@ djcelery.setup_loader()
DOMAIN_NAME = '{{domain_name}}'
CSRF_COOKIE_NAME = '{{domain_name}}_csrf'
-CSRF_COOKIE_DOMAIN = DOMAIN_NAME #note that this can be edited
+#https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/
+#CSRF_COOKIE_DOMAIN = DOMAIN_NAME
STATIC_ROOT = os.path.join(PROJECT_ROOT, "static")
STATICFILES_DIRS = (os.path.join(ASKBOT_ROOT, 'skins'),)
diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js
index 0ad59c69..1992b635 100644
--- a/askbot/skins/common/media/js/post.js
+++ b/askbot/skins/common/media/js/post.js
@@ -106,7 +106,7 @@ var CPValidator = function(){
getQuestionFormRules : function(){
return {
tags: {
- required: true,
+ required: askbot['settings']['tagsAreRequired'],
maxlength: 105,
limit_tag_count: true,
limit_tag_length: true
@@ -961,6 +961,10 @@ var questionRetagger = function(){
};
var drawNewTags = function(new_tags){
+ if (new_tags === ''){
+ tagsDiv.html('');
+ return;
+ }
new_tags = new_tags.split(/\s+/);
var tags_html = ''
$.each(new_tags, function(index, name){
@@ -1032,7 +1036,7 @@ var questionRetagger = function(){
div.validate({//copy-paste from utils.js
rules: {
tags: {
- required: true,
+ required: askbot['settings']['tagsAreRequired'],
maxlength: askbot['settings']['maxTagsPerPost'] * askbot['settings']['maxTagLength'],
limit_tag_count: true,
limit_tag_length: true
diff --git a/askbot/skins/common/templates/authopenid/email_validation.txt b/askbot/skins/common/templates/authopenid/email_validation.txt
index 4a58ab86..bd68c61a 100644
--- a/askbot/skins/common/templates/authopenid/email_validation.txt
+++ b/askbot/skins/common/templates/authopenid/email_validation.txt
@@ -7,7 +7,7 @@
{% trans %}Following the link above will help us verify your email address.{% endtrans %}
{% trans %}If you believe that this message was sent in mistake -
-no further action is needed. Just ingore this email, we apologize
+no further action is needed. Just ignore this email, we apologize
for any inconvenience{% endtrans %}
{% trans %}Sincerely,
diff --git a/askbot/skins/common/templates/widgets/edit_post.html b/askbot/skins/common/templates/widgets/edit_post.html
index 16970a78..ee84f443 100644
--- a/askbot/skins/common/templates/widgets/edit_post.html
+++ b/askbot/skins/common/templates/widgets/edit_post.html
@@ -15,23 +15,25 @@
{# need label element for resizable input, b/c form validation won't find span #}
{% if post_type == 'question' %}
<div class="form-item">
- {% if mandatory_tags %}
- <label for="id_tags">
- <strong>{% trans %}tags{% endtrans %},</strong>
- {% trans %}one of these is required{% endtrans %}
- </label>
- {{
- tag_list_widget(
- mandatory_tags,
- make_links = False,
- css_class = 'clearfix'
- )
- }}
- {% else %}
- <label for="id_tags">
- <strong>{% trans %}tags{% endtrans %}:</strong>
+ {% if tags_are_required %}
+ <label for=id_tags">
+ {% if mandatory_tags %}
+ <strong>{% trans %}tags{% endtrans %}</strong>
+ {% trans %}, one of these is required{% endtrans %}
+ {{
+ tag_list_widget(
+ mandatory_tags,
+ make_links = False,
+ css_class = 'clearfix'
+ )
+ }}
+ {% else %}
+ <strong>{% trans %}tags:{% endtrans %}</strong>
{% trans %}(required){% endtrans %}
+ {% endif %}
</label>
+ {% else %}
+ <strong>{% trans %}tags:{% endtrans %}</strong>
{% endif %}
<span class="form-error">{{ post_form.tags.errors }}</span><br/>
{{ post_form.tags }}
diff --git a/askbot/skins/default/templates/main_page/sidebar.html b/askbot/skins/default/templates/main_page/sidebar.html
index c89d62f4..9fb8fab9 100644
--- a/askbot/skins/default/templates/main_page/sidebar.html
+++ b/askbot/skins/default/templates/main_page/sidebar.html
@@ -1,17 +1,21 @@
{% import "macros.html" as macros %}
-{{ settings.SIDEBAR_MAIN_HEADER }}
+<div class="box">
+ {{ settings.SIDEBAR_MAIN_HEADER }}
+</div>
{% if contributors and settings.SIDEBAR_MAIN_SHOW_AVATARS %}
- {% include "widgets/contributors.html" %}
+ {% include "widgets/contributors.html" %}
{% endif %}
{% if request.user.is_authenticated() and settings.SIDEBAR_MAIN_SHOW_TAG_SELECTOR %}
- {% include "widgets/tag_selector.html" %}
+ {% include "widgets/tag_selector.html" %}
{% endif %}
{% if tags and settings.SIDEBAR_MAIN_SHOW_TAGS %}
- {% include "widgets/related_tags.html" %}
+ {% include "widgets/related_tags.html" %}
{% endif %}
-{{ settings.SIDEBAR_MAIN_FOOTER }}
+<div class="box">
+ {{ settings.SIDEBAR_MAIN_FOOTER }}
+</div>
diff --git a/askbot/skins/default/templates/meta/editor_data.html b/askbot/skins/default/templates/meta/editor_data.html
index 025be8a0..2363281c 100644
--- a/askbot/skins/default/templates/meta/editor_data.html
+++ b/askbot/skins/default/templates/meta/editor_data.html
@@ -1,5 +1,7 @@
<script type="text/javascript">
{# data necessary for the post editor, goes into endjs block #}
+ askbot['settings']['tagsAreRequired'] =
+ {% if settings.TAGS_ARE_REQUIRED %}true{% else %}false{% endif %};
askbot['settings']['maxTagLength'] = {{settings.MAX_TAG_LENGTH}};
'each tag must be shorter than %(max_chars)d characters',
askbot['messages']['maxTagLength'] = '{% trans max_chars = settings.MAX_TAG_LENGTH %}each tag must be shorter that {{max_chars}} character{% pluralize %}each tag must be shorter than {{max_chars}} characters{% endtrans %}';
diff --git a/askbot/skins/default/templates/question/sidebar.html b/askbot/skins/default/templates/question/sidebar.html
index 30a6990c..86a543c7 100644
--- a/askbot/skins/default/templates/question/sidebar.html
+++ b/askbot/skins/default/templates/question/sidebar.html
@@ -1,5 +1,7 @@
{% import "macros.html" as macros %}
-{{ settings.SIDEBAR_QUESTION_HEADER }}
+<div class="box">
+ {{ settings.SIDEBAR_QUESTION_HEADER }}
+</div>
<div class="box vote-buttons">
<h2 >{% trans %}Question tools{% endtrans %}</h2>
{% if favorited %}
@@ -69,4 +71,6 @@
{#% endcache %#}
{% endif %}
-{{ settings.SIDEBAR_QUESTION_FOOTER }}
+<div class="box">
+ {{ settings.SIDEBAR_QUESTION_FOOTER }}
+</div>
diff --git a/askbot/skins/default/templates/user_profile/user.html b/askbot/skins/default/templates/user_profile/user.html
index 1693303e..789c3c86 100644
--- a/askbot/skins/default/templates/user_profile/user.html
+++ b/askbot/skins/default/templates/user_profile/user.html
@@ -31,10 +31,11 @@
{% endblock %}
{% endblock %}
{% block sidebar %}
-
-{{ settings.SIDEBAR_PROFILE_HEADER }}
-
-{{ settings.SIDEBAR_PROFILE_FOOTER }}
-
+<div class="box">
+ {{ settings.SIDEBAR_PROFILE_HEADER }}
+</div>
+<div class="box">
+ {{ settings.SIDEBAR_PROFILE_FOOTER }}
+</div>
{% endblock %}
<!-- end of user.html -->
diff --git a/askbot/skins/utils.py b/askbot/skins/utils.py
index 520fa2f7..a07b1fa9 100644
--- a/askbot/skins/utils.py
+++ b/askbot/skins/utils.py
@@ -179,7 +179,10 @@ def update_media_revision(skin = None):
skin = 'default'
skin_path = get_path_to_skin(askbot_settings.ASKBOT_DEFAULT_SKIN)
- media_dirs = [os.path.join(skin_path, 'media'),]
+ media_dirs = [
+ os.path.join(skin_path, 'media'),
+ os.path.join(get_path_to_skin('common'), 'media')#we always use common
+ ]
if skin != 'default':
#we have default skin as parent of the custom skin
diff --git a/askbot/views/writers.py b/askbot/views/writers.py
index 4b1ae744..d9a6f855 100644
--- a/askbot/views/writers.py
+++ b/askbot/views/writers.py
@@ -336,7 +336,7 @@ def edit_question(request, id):
# Replace with those from the selected revision
rev_id = revision_form.cleaned_data['revision']
selected_revision = models.PostRevision.objects.question_revisions().get(
- question = question,
+ post = question,
revision = rev_id
)
form = forms.EditQuestionForm(
@@ -423,7 +423,7 @@ def edit_answer(request, id):
# Replace with those from the selected revision
rev = revision_form.cleaned_data['revision']
selected_revision = models.PostRevision.objects.answer_revisions().get(
- answer = answer,
+ post = answer,
revision = rev
)
form = forms.EditAnswerForm(answer, selected_revision)