diff options
-rw-r--r-- | askbot/conf/forum_data_rules.py | 9 | ||||
-rw-r--r-- | askbot/doc/source/changelog.rst | 1 | ||||
-rw-r--r-- | askbot/forms.py | 38 | ||||
-rw-r--r-- | askbot/models/question.py | 15 | ||||
-rw-r--r-- | askbot/setup_templates/settings.py | 3 | ||||
-rw-r--r-- | askbot/setup_templates/settings.py.mustache | 3 | ||||
-rw-r--r-- | askbot/skins/common/media/js/post.js | 8 | ||||
-rw-r--r-- | askbot/skins/common/templates/authopenid/email_validation.txt | 2 | ||||
-rw-r--r-- | askbot/skins/common/templates/widgets/edit_post.html | 32 | ||||
-rw-r--r-- | askbot/skins/default/templates/main_page/sidebar.html | 14 | ||||
-rw-r--r-- | askbot/skins/default/templates/meta/editor_data.html | 2 | ||||
-rw-r--r-- | askbot/skins/default/templates/question/sidebar.html | 8 | ||||
-rw-r--r-- | askbot/skins/default/templates/user_profile/user.html | 11 | ||||
-rw-r--r-- | askbot/skins/utils.py | 5 | ||||
-rw-r--r-- | askbot/views/writers.py | 4 |
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) |