diff options
120 files changed, 17241 insertions, 4053 deletions
@@ -26,16 +26,13 @@ tmp/* load askbot/skins/default/media/js/flot askbot/skins/common/media/js/closure/google-closure +askbot/skins/common/media/js/jquery.fancybox-1.3.4 askbot/fixtures *.egg dist *.egg-info build -askbot/upfiles/*.jpg -askbot/upfiles/*.jpeg -askbot/upfiles/*.gif -askbot/upfiles/*.png -askbot/upfiles/*.ico +askbot/upfiles/ askbot/upfiles/avatars/ askbot/skins/common/media/mathjax/ /jinja2 diff --git a/askbot/__init__.py b/askbot/__init__.py index 12e4f7d7..1c822e05 100644 --- a/askbot/__init__.py +++ b/askbot/__init__.py @@ -9,7 +9,7 @@ import smtplib import sys import logging -VERSION = (0, 7, 26) +VERSION = (0, 7, 29) #necessary for interoperability of django and coffin try: diff --git a/askbot/admin.py b/askbot/admin.py index af62ed84..34722416 100644 --- a/askbot/admin.py +++ b/askbot/admin.py @@ -31,10 +31,7 @@ class VoteAdmin(admin.ModelAdmin): class FavoriteQuestionAdmin(admin.ModelAdmin): """ admin class""" -class QuestionRevisionAdmin(admin.ModelAdmin): - """ admin class""" - -class AnswerRevisionAdmin(admin.ModelAdmin): +class PostRevisionAdmin(admin.ModelAdmin): """ admin class""" class AwardAdmin(admin.ModelAdmin): @@ -52,8 +49,7 @@ admin.site.register(models.Answer, AnswerAdmin) admin.site.register(models.Comment, CommentAdmin) admin.site.register(models.Vote, VoteAdmin) admin.site.register(models.FavoriteQuestion, FavoriteQuestionAdmin) -admin.site.register(models.QuestionRevision, QuestionRevisionAdmin) -admin.site.register(models.AnswerRevision, AnswerRevisionAdmin) +admin.site.register(models.PostRevision, PostRevisionAdmin) admin.site.register(models.Award, AwardAdmin) admin.site.register(models.Repute, ReputeAdmin) admin.site.register(models.Activity, ActivityAdmin) diff --git a/askbot/conf/__init__.py b/askbot/conf/__init__.py index 64fe41fb..4f228ea7 100644 --- a/askbot/conf/__init__.py +++ b/askbot/conf/__init__.py @@ -19,6 +19,7 @@ import askbot.conf.markup import askbot.conf.social_sharing import askbot.conf.badges import askbot.conf.login_providers +import askbot.conf.access_control import askbot.conf.site_modes #import main settings object diff --git a/askbot/conf/access_control.py b/askbot/conf/access_control.py new file mode 100644 index 00000000..cd2364b5 --- /dev/null +++ b/askbot/conf/access_control.py @@ -0,0 +1,21 @@ +from askbot.conf.settings_wrapper import settings +from askbot.conf.super_groups import LOGIN_USERS_COMMUNICATION +from askbot.deps import livesettings +from django.utils.translation import ugettext as _ + +ACCESS_CONTROL = livesettings.ConfigurationGroup( + 'ACCESS_CONTROL', + _('Access control settings'), + super_group = LOGIN_USERS_COMMUNICATION + ) + +settings.register( + livesettings.BooleanValue( + ACCESS_CONTROL, + 'ASKBOT_CLOSED_FORUM_MODE', + default = False, + description=_('Allow only registered user to access the forum'), + ) +) + + diff --git a/askbot/conf/email.py b/askbot/conf/email.py index 195c14ee..3db80e7a 100644 --- a/askbot/conf/email.py +++ b/askbot/conf/email.py @@ -39,24 +39,6 @@ settings.register( ) ) -#settings.register( -# livesettings.StringValue( -# EMAIL, -# 'DEFAULT_NOTIFICATION_DELIVERY_SCHEDULE', -# default='w', -# choices=const.NOTIFICATION_DELIVERY_SCHEDULE_CHOICES, -# description=_('Default news notification frequency'), -# help_text=_( -# 'This option currently defines default frequency ' -# 'of emailed updates in the following five categories: ' -# 'questions asked by user, answered by user, individually ' -# 'selected, entire forum (per person tag filter applies) ' -# 'and posts mentioning the user and comment responses' -# ) -# ) -#) - - settings.register( livesettings.StringValue( EMAIL, @@ -139,7 +121,6 @@ settings.register( 'NOTE: in order to use this feature, it is necessary to ' 'run the management command "send_unanswered_question_reminders" ' '(for example, via a cron job - with an appropriate frequency) ' - 'and an IMAP server with a dedicated inbox must be configured ' ) ) ) @@ -182,6 +163,55 @@ settings.register( settings.register( livesettings.BooleanValue( EMAIL, + 'ENABLE_ACCEPT_ANSWER_REMINDERS', + default = False, + description = _('Send periodic reminders to accept the best answer'), + help_text = _( + 'NOTE: in order to use this feature, it is necessary to ' + 'run the management command "send_accept_answer_reminders" ' + '(for example, via a cron job - with an appropriate frequency) ' + ) + ) +) + +settings.register( + livesettings.IntegerValue( + EMAIL, + 'DAYS_BEFORE_SENDING_ACCEPT_ANSWER_REMINDER', + default = 3, + description = _( + 'Days before starting to send reminders to accept an answer' + ), + ) +) + +settings.register( + livesettings.IntegerValue( + EMAIL, + 'ACCEPT_ANSWER_REMINDER_FREQUENCY', + default = 3, + description = _( + 'How often to send accept answer reminders ' + '(in days between the reminders sent).' + ) + ) +) + +settings.register( + livesettings.IntegerValue( + EMAIL, + 'MAX_ACCEPT_ANSWER_REMINDERS', + default = 5, + description = _( + 'Max. number of reminders to send ' + 'to accept the best answer' + ) + ) +) + +settings.register( + livesettings.BooleanValue( + EMAIL, 'EMAIL_VALIDATION', default=False, hidden=True, diff --git a/askbot/conf/login_providers.py b/askbot/conf/login_providers.py index 0cc20a9a..b6073eea 100644 --- a/askbot/conf/login_providers.py +++ b/askbot/conf/login_providers.py @@ -56,11 +56,11 @@ settings.register( livesettings.ImageValue( LOGIN_PROVIDERS, 'WORDPRESS_SITE_ICON', - upload_directory = django_settings.ASKBOT_FILE_UPLOAD_DIR, - upload_url = '/' + django_settings.ASKBOT_UPLOADED_FILES_URL, - default = '/images/logo.gif', - description = _('Upload your icon'), - url_resolver = skin_utils.get_media_url + upload_directory=django_settings.ASKBOT_FILE_UPLOAD_DIR, + upload_url='/' + django_settings.ASKBOT_UPLOADED_FILES_URL, + default='/images/logo.gif', + description=_('Upload your icon'), + url_resolver=skin_utils.get_media_url ) ) diff --git a/askbot/const/__init__.py b/askbot/const/__init__.py index 73c71800..764a3234 100644 --- a/askbot/const/__init__.py +++ b/askbot/const/__init__.py @@ -113,6 +113,7 @@ TYPE_ACTIVITY_USER_FULL_UPDATED = 17 TYPE_ACTIVITY_EMAIL_UPDATE_SENT = 18 TYPE_ACTIVITY_MENTION = 19 TYPE_ACTIVITY_UNANSWERED_REMINDER_SENT = 20 +TYPE_ACTIVITY_ACCEPT_ANSWER_REMINDER_SENT = 21 #TYPE_ACTIVITY_EDIT_QUESTION = 17 #TYPE_ACTIVITY_EDIT_ANSWER = 18 @@ -140,6 +141,10 @@ TYPE_ACTIVITY = ( TYPE_ACTIVITY_UNANSWERED_REMINDER_SENT, _('reminder about unanswered questions sent'), ), + ( + TYPE_ACTIVITY_ACCEPT_ANSWER_REMINDER_SENT, + _('reminder about accepting the best answer sent'), + ), (TYPE_ACTIVITY_MENTION, _('mentioned in the post')), ) @@ -291,8 +296,8 @@ MIN_REPUTATION = 1 AVATAR_STATUS_CHOICE = ( ('n', _('None')), - ('g', _('Gravatar')), - ('a', _('Uploaded Avatar')), + ('g', _('Gravatar')),#only if user has real uploaded gravatar + ('a', _('Uploaded Avatar')),#avatar uploaded locally - with django-avatar app ) #an exception import * because that file has only strings diff --git a/askbot/context.py b/askbot/context.py index 6dc38f79..f3665240 100644 --- a/askbot/context.py +++ b/askbot/context.py @@ -13,8 +13,9 @@ from askbot.utils import url_utils def application_settings(request): """The context processor function""" my_settings = askbot_settings.as_dict() - my_settings['LANGUAGE_CODE'] = settings.LANGUAGE_CODE + my_settings['LANGUAGE_CODE'] = getattr(request, 'LANGUAGE_CODE', settings.LANGUAGE_CODE) my_settings['ASKBOT_URL'] = settings.ASKBOT_URL + my_settings['ASKBOT_CSS_DEVEL'] = getattr(settings, 'ASKBOT_CSS_DEVEL', False) my_settings['DEBUG'] = settings.DEBUG my_settings['ASKBOT_VERSION'] = askbot.get_version() my_settings['LOGIN_URL'] = url_utils.get_login_url() diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index 3f04e39d..6f7a86f6 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -2,8 +2,11 @@ module for deploying askbot """ import os.path +import sys +from optparse import OptionParser from askbot.utils import console from askbot.deployment import messages +from askbot.deployment.messages import print_message from askbot.deployment import path_utils def askbot_setup(): @@ -13,91 +16,130 @@ def askbot_setup(): or gives hints on how to add askbot to an existing Django project """ - #ask - print messages.DEPLOY_PREAMBLE - - directory = None #directory where to put stuff - create_new = False #create new django project or not - where_to_deploy_msg = messages.WHERE_TO_DEPLOY - while directory is None: - - directory = raw_input(where_to_deploy_msg + ' ') - - where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT - - directory = os.path.normpath(directory) - directory = os.path.abspath(directory) - - if os.path.isfile(directory): - print messages.CANT_INSTALL_INTO_FILE % {'path':directory} - directory = None - continue - - if path_utils.can_create_path(directory): - if os.path.exists(directory): - if path_utils.path_is_clean_for_django(directory): - if path_utils.has_existing_django_project(directory): - message = messages.SHOULD_ADD_APP_HERE % \ - { - 'path': directory - } - should_add_app = console.choice_dialog( - message, - choices = ['yes','no'], - invalid_phrase = messages.INVALID_INPUT - ) - if should_add_app == 'yes': - assert(create_new == False) - if path_utils.dir_name_acceptable(directory): - break - else: - print messages.format_msg_bad_dir_name(directory) - directory = None - continue - else: - directory = None - continue - else: - assert(directory != None) - if path_utils.dir_name_acceptable(directory): - create_new = True - break - else: - print messages.format_msg_bad_dir_name(directory) - directory = None - continue - else: - print messages.format_msg_dir_unclean_django(directory) - directory = None - continue - else: - message = messages.format_msg_create(directory) - should_create_new = console.choice_dialog( - message, - choices = ['yes','no'], - invalid_phrase = messages.INVALID_INPUT - ) - if should_create_new == 'yes': - if path_utils.dir_name_acceptable(directory): - create_new = True - break - else: - print messages.format_msg_bad_dir_name(directory) - directory = None - continue - else: - directory = None - continue - else: - print messages.format_msg_dir_not_writable(directory) - directory = None - continue + parser = OptionParser(usage = "%prog [options]") + + parser.add_option( + "-v", "--verbose", + dest = "verbosity", + type = "int", + default = 1, + help = "verbosity level available values 0, 1, 2." + ) + + parser.add_option( + "-n", "--dir-name", + dest = "dir_name", + default = None, + help = "Directory where you want to install." + ) + + parser.add_option( + "-d", "--db-name", + dest = "database_name", + default = None, + help = "The database name" + ) + + parser.add_option( + "-u", "--db-user", + dest = "database_user", + default = None, + help = "The database user" + ) + + parser.add_option( + "-p", "--db-password", + dest = "database_password", + default = None, + help = "the database password" + ) + + parser.add_option( + "--domain", + dest = "domain_name", + default = None, + help = "the domain name of the instance" + ) + + parser.add_option( + "--append-settings", + dest = "local_settings", + default = '', + help = "Extra settings file to append custom settings" + ) + + parser.add_option( + "--force", + dest = "force", + action = 'store_true', + help = "Force overwrite settings.py file" + ) + + try: + options = parser.parse_args()[0] + #ask + if options.verbosity >= 1: + print messages.DEPLOY_PREAMBLE + + directory = path_utils.clean_directory(options.dir_name) + while directory is None: + directory = path_utils.get_install_directory(force = options.force) + + deploy_askbot(directory, options) + except KeyboardInterrupt: + print "\n\nAborted." + sys.exit(1) + + +#separated all the directory creation process to make it more useful + +def deploy_askbot(directory, options): + """function that creates django project files, + all the neccessary directories for askbot, + and the log file + """ help_file = path_utils.get_path_to_help_file() - if create_new: - path_utils.create_path(directory) - path_utils.deploy_into(directory, new_project = True) - print messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file} + context = { + 'database_name': options.database_name, + 'database_password': options.database_password, + 'database_user': options.database_user, + 'domain_name': options.domain_name, + 'local_settings': options.local_settings, + } + if not options.force: + for key in context.keys(): + if context[key] == None: + input_message = 'Please enter a value for %s:' \ + % (key.replace('_', ' ')) + new_value = raw_input(input_message) + context[key] = new_value + + create_new_project = False + if os.path.exists(directory): + if path_utils.has_existing_django_project(directory): + create_new_project = bool(options.force) + else: + create_new_project = True + else: + create_new_project = True + + path_utils.create_path(directory) + + path_utils.deploy_into( + directory, + new_project = create_new_project, + verbosity = options.verbosity, + context = context + ) + + if create_new_project: + print_message( + messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file}, + options.verbosity + ) else: - path_utils.deploy_into(directory, new_project = False) - print messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file} + print_message( + messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file}, + options.verbosity + ) diff --git a/askbot/deployment/assertions.py b/askbot/deployment/assertions.py index 0db62b84..d8dee828 100644 --- a/askbot/deployment/assertions.py +++ b/askbot/deployment/assertions.py @@ -12,7 +12,8 @@ def assert_package_compatibility(): """raises an exception if any known incompatibilities are found """ - (django_major, django_minor, django_micro) = package_utils.get_django_version() + (django_major, django_minor, django_micro) = \ + package_utils.get_django_version() if django_major < 1: raise DeploymentError('Django version < 1.0 is not supported by askbot') diff --git a/askbot/deployment/messages.py b/askbot/deployment/messages.py index 1569de6c..44dde979 100644 --- a/askbot/deployment/messages.py +++ b/askbot/deployment/messages.py @@ -9,9 +9,9 @@ Problems installing? -> please email admin@askbot.org To CANCEL - hit Ctr-C at any time""" -WHERE_TO_DEPLOY = 'Where to deploy (in which directory)?' +WHERE_TO_DEPLOY = 'In which directory to deploy the forum?' -WHERE_TO_DEPLOY_QUIT = 'Where deploy forum (directory)? (Ctrl-C to quit)' +WHERE_TO_DEPLOY_QUIT = 'Where deploy the forum (directory)? Ctrl-C to quit.' CANT_INSTALL_INTO_FILE = '%(path)s is a file\ncannot install there' @@ -32,6 +32,10 @@ but %(existing_prefix)s is not writable""" CONFIRM_DIR_CREATION = """Adding new directories:\n%(existing_prefix)s <-/%(non_existing_tail)s Accept?""" +CANNOT_OVERWRITE_DJANGO_PROJECT = """Directory %(directory)s +already has a django project. If you want to overwrite +settings.py and urls.py files, use parameter --force""" + INVALID_INPUT = 'Please type one of: %(opt_string)s ' \ + '(or hit Ctrl-C to quit)' @@ -78,7 +82,7 @@ def format_msg_dir_unclean_django(directory): directories contains a django project so that users don't create nested projects """ - parent_django_dir = path_utils.find_parent_dir_with_django(directory) + return path_utils.find_parent_dir_with_django(directory) def format_msg_bad_dir_name(directory): """directory name must be bad - i.e. taken by other python module @@ -89,3 +93,7 @@ def format_msg_bad_dir_name(directory): return DIR_NAME_TAKEN_BY_ASKBOT else: return DIR_NAME_TAKEN_BY_PYTHON % {'dir': dir_name} + +def print_message(message, verbosity): + if verbosity >= 1: + print message diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py index 6ad9fc99..e0704a96 100644 --- a/askbot/deployment/path_utils.py +++ b/askbot/deployment/path_utils.py @@ -1,5 +1,5 @@ """utilities in addition to os.path -that +that * help to test existing paths on usability for the installation * create necessary directories * install deployment files @@ -11,6 +11,9 @@ import re import glob import shutil import imp +from askbot.utils import console +from askbot.deployment.template_loader import SettingsTemplate + def split_at_break_point(directory): """splits directory path into two pieces @@ -28,6 +31,25 @@ def split_at_break_point(directory): tail_bits.insert(0, tail) return head, os.path.join(*tail_bits) +def clean_directory(directory): + """Returns normalized absolute path to the directory + regardless of whether it exists or not + or ``None`` - if the path is a file or if ``directory`` + parameter is ``None``""" + if directory is None: + return None + + directory = os.path.normpath(directory) + directory = os.path.abspath(directory) + + if os.path.isfile(directory): + if options.verbosity >= 1 and os.path.isfile(directory): + print messages.CANT_INSTALL_INTO_FILE % {'path':directory} + sys.exit(1) + + return None + return directory + def directory_is_writable(directory): """returns True if directory exists @@ -47,7 +69,7 @@ def directory_is_writable(directory): def can_create_path(directory): - """returns True if user can write file into + """returns True if user can write file into directory even if it does not exist yet and False otherwise """ @@ -55,7 +77,7 @@ def can_create_path(directory): if not os.path.isdir(directory): return False else: - directory, junk = split_at_break_point(directory) + directory = split_at_break_point(directory)[0] return directory_is_writable(directory) @@ -65,8 +87,12 @@ def has_existing_django_project(directory): """returns True is any of the .py files in a given directory imports anything from django """ - file_list = glob.glob(directory + '*.py') + directory = os.path.normpath(directory) + file_list = glob.glob(directory + os.path.sep + '*.py') for file_name in file_list: + if file_name.endswith(os.path.sep + 'manage.py'): + #a hack allowing to install into the distro directory + continue py_file = open(file_name) for line in py_file: if IMPORT_RE1.match(line) or IMPORT_RE2.match(line): @@ -123,24 +149,31 @@ def get_path_to_help_file(): """returns path to the main plain text help file""" return os.path.join(SOURCE_DIR, 'doc', 'INSTALL') -def deploy_into(directory, new_project = None): +def deploy_into(directory, new_project = False, verbosity = 1, context = None): """will copy necessary files into the directory """ - assert(new_project is not None) + assert(isinstance(new_project, bool)) if new_project: - copy_files = ('__init__.py', 'settings.py', 'manage.py', 'urls.py') + copy_files = ('__init__.py', 'manage.py', 'urls.py') blank_files = ('__init__.py', 'manage.py') - print 'Copying files: ' + if verbosity >= 1: + print 'Copying files: ' for file_name in copy_files: src = os.path.join(SOURCE_DIR, 'setup_templates', file_name) if os.path.exists(os.path.join(directory, file_name)): if file_name in blank_files: continue else: - print '* %s' % file_name, - print "- you already have one, please add contents of %s" % src + if file_name == 'urls.py' and new_project: + #overwrite urls.py + shutil.copy(src, directory) + else: + if verbosity >= 1: + print '* %s' % file_name, + print "- you already have one, please add contents of %s" % src else: - print '* %s ' % file_name + if verbosity >= 1: + print '* %s ' % file_name shutil.copy(src, directory) #copy log directory src = os.path.join(SOURCE_DIR, 'setup_templates', 'log') @@ -148,7 +181,29 @@ def deploy_into(directory, new_project = None): create_path(log_dir) touch(os.path.join(log_dir, 'askbot.log')) - print '' + #creating settings file from template + if verbosity >= 1: + print "Creating settings file" + settings_contents = SettingsTemplate(context).render() + settings_path = os.path.join(directory, 'settings.py') + if os.path.exists(settings_path) and new_project == False: + if verbosity >= 1: + print "* you already have a settings file please merge the contents" + elif new_project == True: + settings_file = open(settings_path, 'w+') + settings_file.write(settings_contents) + #Grab the file! + if os.path.exists(context['local_settings']): + local_settings = open(context['local_settings'], 'r').read() + settings_file.write('\n') + settings_file.write(local_settings) + + settings_file.close() + if verbosity >= 1: + print "settings file created" + + if verbosity >= 1: + print '' app_dir = os.path.join(directory, 'askbot') copy_dirs = ('doc', 'cron', 'upfiles') @@ -158,17 +213,22 @@ def deploy_into(directory, new_project = None): dst = os.path.join(app_dir, dir_name) if os.path.abspath(src) != os.path.abspath(dst): if dirs_copied == 0: - print 'copying directories: ', - print '* ' + dir_name + if verbosity >= 1: + print 'copying directories: ', + if verbosity >= 1: + print '* ' + dir_name if os.path.exists(dst): if os.path.isdir(dst): - print 'Directory %s not empty - skipped' % dst + if verbosity >= 1: + print 'Directory %s not empty - skipped' % dst else: - print 'File %s already exists - skipped' % dst + if verbosity >= 1: + print 'File %s already exists - skipped' % dst continue shutil.copytree(src, dst) dirs_copied += 1 - print '' + if verbosity >= 1: + print '' def dir_name_acceptable(directory): """True if directory is not taken by another python module""" @@ -178,3 +238,47 @@ def dir_name_acceptable(directory): return False except ImportError: return True + +def get_install_directory(force = False): + """returns a directory where a new django app/project + can be installed. + If ``force`` is ``True`` - will permit + using a directory with an existing django project. + """ + from askbot.deployment import messages + where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT + directory = raw_input(where_to_deploy_msg + ' ') + directory = clean_directory(directory) + + if directory is None: + return None + + if can_create_path(directory) == False: + print messages.format_msg_dir_not_writable(directory) + return None + + if os.path.exists(directory): + if path_is_clean_for_django(directory): + if has_existing_django_project(directory): + if not force: + print messages.CANNOT_OVERWRITE_DJANGO_PROJECT % \ + {'directory': directory} + return None + else: + print messages.format_msg_dir_unclean_django(directory) + return None + elif force == False: + message = messages.format_msg_create(directory) + should_create_new = console.choice_dialog( + message, + choices = ['yes','no'], + invalid_phrase = messages.INVALID_INPUT + ) + if should_create_new == 'no': + return None + + if not dir_name_acceptable(directory): + print messages.format_msg_bad_dir_name(directory) + return None + + return directory diff --git a/askbot/deployment/template_loader.py b/askbot/deployment/template_loader.py new file mode 100644 index 00000000..fe7c11e6 --- /dev/null +++ b/askbot/deployment/template_loader.py @@ -0,0 +1,13 @@ +import os +import pystache + +SOURCE_DIR = os.path.dirname(os.path.dirname(__file__)) + +class SettingsTemplate(pystache.View): + '''Class for settings''' + + template_path = os.path.join(SOURCE_DIR, 'setup_templates') + template_name = "settings.py" + + def __init__(self, context, **kwargs): + super(SettingsTemplate, self).__init__(context=context, **kwargs) diff --git a/askbot/deps/django_authopenid/views.py b/askbot/deps/django_authopenid/views.py index 5a81f702..ac406f1d 100644 --- a/askbot/deps/django_authopenid/views.py +++ b/askbot/deps/django_authopenid/views.py @@ -289,7 +289,13 @@ def signin(request): on_failure = signin_failure email_feeds_form = askbot_forms.SimpleEmailSubscribeForm() - next_url = get_next_url(request) + #we need a special priority on where to redirect on successful login + #here: + #1) url parameter "next" - if explicitly set + #2) url from django setting LOGIN_REDIRECT_URL + #3) home page of the forum + login_redirect_url = getattr(settings, 'LOGIN_REDIRECT_URL', None) + next_url = get_next_url(request, default = login_redirect_url) logging.debug('next url is %s' % next_url) if askbot_settings.ALLOW_ADD_REMOVE_LOGIN_METHODS == False \ diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst index 0c05deb2..0ba88155 100644 --- a/askbot/doc/source/changelog.rst +++ b/askbot/doc/source/changelog.rst @@ -3,9 +3,24 @@ Changes in Askbot Development version (not yet published) --------------------------------------- +* Context-sensitive RSS url (`Dejan Noveski <http://www.atomidata.com/>`_) +* Implemented new version of skin (Byron Corrales) * Show unused vote count (Tomasz Zielinski) * Categorized live settings (Evgeny) +* Merge users management command (Daniel Mican) +* Added management command ``send_accept_answer_reminders`` (Evgeny) +* Improved the ``askbot-setup`` script (Adolfo, Evgeny) +* Merge users management command (Daniel Mican) * Anonymous caching of the question page (Vlad Bokov) +* Fixed sharing button bug, css fixes for new template (Alexander Werner) +* Added ASKBOT_TRANSLATE_URL setting for url localization(Alexander Werner) +* Changed javascript translation model, moved from jqueryi18n to django (Rosandra Cuello Suñol) +* Private forum mode (Vlad Bokov) +* Improved text search query in Postgresql (Alexander Werner) +* Take LANGUAGE_CODE from request (Alexander Werner) +* Added support for LOGIN_REDIRECT_URL to the login app (hjwp, Evgeny) +* Updated Italian localization (Luca Ferroni) +* Added Catalan localization (Jordi Bofill) 0.7.26 (Current Version) ------------------------ diff --git a/askbot/doc/source/contributors.rst b/askbot/doc/source/contributors.rst index 3e62af26..30656c60 100644 --- a/askbot/doc/source/contributors.rst +++ b/askbot/doc/source/contributors.rst @@ -18,6 +18,8 @@ Programming and documentation * `Jishnu <http://thecodecracker.com/>`_ * `Hrishi <https://github.com/stultus>`_ * Andrei Mamoutkine +* `Daniel Mican <http://www.crunchbase.com/person/daniel-mican>`_ +* `Dejan Noveski <http://www.atomidata.com/>`_ * `Ramiro Morales <http://rmorales.com.ar/>`_ (with Machinalis) * Vladimir Bokov * `NoahY <https://github.com/NoahY>`_ @@ -28,6 +30,9 @@ Programming and documentation * `Tomasz Zielinski <http://pyconsultant.eu/>`_ * `Tomasz Szynalski <http://antimoon.com>`_ * `Raghu Udiyar <http://raags.tumblr.com/>`_ +* `Alexander Werner <https://twitter.com/#!/bundeswerner>`_ +* Rosandra Cuello Suñol +* `hjwp <https://github.com/hjwp>`_ Translations ------------ @@ -40,5 +45,6 @@ Translations * Pekka Gaiser - German * Pekka Järvinen - Finnish * Adi Robian - Romanian -* Dario Ghilardi, Federico Poloni - Italian +* Dario Ghilardi, Federico Poloni, `Luca Ferroni <http://www.linkedin.com/in/lucaferroni>`_ - Italian +* `Jordi Bofill <https://github.com/jbofill>`_ - Catalan diff --git a/askbot/doc/source/initial-configuration.rst b/askbot/doc/source/initial-configuration.rst index 0cd2c033..340324a1 100644 --- a/askbot/doc/source/initial-configuration.rst +++ b/askbot/doc/source/initial-configuration.rst @@ -29,10 +29,38 @@ There may be an error message; ignore it. `askbot-setup` adds those files to the directory you select (and some more things specific to Askbot). +.. versionadded:: 0.7.24 + `askbot-setup` also have command line arguments such as folder name(name), database name, database password and database user also added verbosity support. + You can also specify a local settings file to append it's contents to the deployment settings file. + + +----------------------------------+------------------------------------------------------------+ + | Parameter | Purpose | + +==================================+============================================================+ + | -n <NAME> | Name of the instance, this is the name that the | + | | folder will use. | + +----------------------------------+------------------------------------------------------------+ + | -d <DATABASE_NAME> | The database name that the instance will use. | + +----------------------------------+------------------------------------------------------------+ + | -u <DATABASE_USER> | The database user that the instance will use. | + +----------------------------------+------------------------------------------------------------+ + | -p <DATABASE_PASSWORD> | The database password for the user. | + +----------------------------------+------------------------------------------------------------+ + | --domain=<DOMAIN_NAME> | Domain name for the application. | + +----------------------------------+------------------------------------------------------------+ + | --append-settings=<SETTINGS_FILE>| Allows to append a setting file content to the | + | | settings file, the parameter is the file to use. | + +----------------------------------+------------------------------------------------------------+ + + +.. note:: + + `askbot-setup` command line arguments detail parameter is available when you type: askbot-setup --h. Note that if you already have a Django site you will not want to use `askbot-setup`, because you don't want to just overwrite your existing settings.py. See below for instructions. -Another thing you have to do if you are creating a brand new Django project is edit the file `settings.py`_. At the very minimum, you will need to provide the correct values to:: +Another thing you have to do if you are creating a brand new Django project is edit the file `settings.py`_. At the very minimum, you will need to provide the correct values to some settings. + +All values must be enclosed in single quotes, as shown below:: DATABASE_ENGINE = '' #e.g. 'mysql' DATABASE_NAME = '' #name of the database you created, e.g. 'askbot'. @@ -40,8 +68,6 @@ Another thing you have to do if you are creating a brand new Django project is e DATABASE_PASSWORD = '' #password to the database CSRF_COOKIE_DOMAIN = ''#e.g. 'example.com' or 'askbot.example.com' (localhost/IP address for tests) -All values must be enclosed in single quotes, as shown above. - .. note:: The files settings.py_ and urls.py_ may also need to be touched up diff --git a/askbot/doc/source/management-commands.rst b/askbot/doc/source/management-commands.rst index 1da3fdee..d69c8673 100644 --- a/askbot/doc/source/management-commands.rst +++ b/askbot/doc/source/management-commands.rst @@ -29,10 +29,13 @@ The bulk of the management commands fall into this group and will probably be th | | the `add_admin` command | +---------------------------------+-------------------------------------------------------------+ | `add_askbot_user --user-name | Create a user account. If password is not given, an | -| --email [--password] | unusable password will be set. | +| --email [--password]` | unusable password will be set. | | | The command does not create associations with | | | any of the external login providers. | +---------------------------------+-------------------------------------------------------------+ +| `merge_users <from_id> | Merges user accounts and all related data from one user | +| <to_id>` | to another, the "from user" account is deleted. | ++---------------------------------+-------------------------------------------------------------+ | `dump_forum [--dump-name | Save forum contents into a file. `--dump-name` parameter is | | some_name]` | optional | +---------------------------------+-------------------------------------------------------------+ @@ -111,6 +114,11 @@ Any configurable options, related to these commands are accessible via "Email" s | | of :ref:`live settings <live-settings>`, as well as | | | an initial wait period and the recurrence delay may be set. | +-------------------------------------+-------------------------------------------------------------+ +| `send_accept_answer_reminders` | Sends periodic reminders about accepting best answers. | +| | This command may be disabled from the "email" section | +| | of the live settings, as well as the appropriate delay | +| | parameters may be set. | ++-------------------------------------+-------------------------------------------------------------+ Data repair commands ==================== diff --git a/askbot/feed.py b/askbot/feed.py index e0c69454..7f41fd4f 100644 --- a/askbot/feed.py +++ b/askbot/feed.py @@ -137,11 +137,27 @@ class RssLastestQuestionsFeed(Feed): def items(self, item): """get questions for the feed """ - return Question.objects.filter( - deleted=False - ).order_by( - '-last_activity_at' - )[:30] + #initial filtering + qs = Question.objects.filter(deleted=False) + + #get search string and tags from GET + query = self.request.GET.get("q", None) + tags = self.request.GET.getlist("tags") + + if query: + #if there's a search string, use the + #question search method + qs = qs.get_by_text_query(query) + + if tags: + #if there are tags in GET, filter the + #questions additionally + for tag in tags: + qs = qs.filter(tags__name = tag) + + return qs.order_by('-last_activity_at')[:30] + + def main(): """main function for use as a script diff --git a/askbot/locale/ca/LC_MESSAGES/django.mo b/askbot/locale/ca/LC_MESSAGES/django.mo Binary files differnew file mode 100644 index 00000000..187c04a8 --- /dev/null +++ b/askbot/locale/ca/LC_MESSAGES/django.mo diff --git a/askbot/locale/ca/LC_MESSAGES/django.po b/askbot/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 00000000..65de6ef9 --- /dev/null +++ b/askbot/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,6526 @@ +# English translation for CNPROG package. +# Copyright (C) 2009 Gang Chen, 2010 Askbot +# This file is distributed under the same license as the CNPROG package. +# Evgeny Fadeev <evgeny.fadeev@gmail.com>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.7\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-17 17:24-0500\n" +"PO-Revision-Date: 2011-11-21:10:00-0100\n" +"Last-Translator: Jordi Bofill <jordi.bofill@upc.edu>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"Plural-Forms: nplurals=2; plural=n!= 1;\n" + +#: exceptions.py:13 +msgid "Sorry, but anonymous visitors cannot access this function" +msgstr "Els visitants anònims no tenen accés a aquesta funció" + +#: feed.py:26 feed.py:100 +msgid " - " +msgstr "" + +#: feed.py:26 +msgid "Individual question feed" +msgstr "Canal de pregunta individual" + +#: feed.py:100 +msgid "latest questions" +msgstr "preguntes recents" + +#: forms.py:74 +msgid "select country" +msgstr "escollir país" + +#: forms.py:83 +msgid "Country" +msgstr "País" + +#: forms.py:91 +msgid "Country field is required" +msgstr "Els país és necessari" + +#: forms.py:104 skins/default/templates/blocks/answer_edit_tips.html:43 +#: skins/default/templates/blocks/answer_edit_tips.html:47 +#: skins/default/templates/blocks/question_edit_tips.html:38 +#: skins/default/templates/blocks/question_edit_tips.html:43 +msgid "title" +msgstr "títol" + +#: forms.py:105 +msgid "please enter a descriptive title for your question" +msgstr "Introduir un títol descriptiu de la pregunta" + +#: forms.py:110 +msgid "title must be > 10 characters" +msgstr "el títol ha de tenir més de 10 caràcters" + +#: forms.py:119 +msgid "content" +msgstr "contingut" + +#: forms.py:125 +msgid "question content must be > 10 characters" +msgstr "la pregunta ha de tenir més de 10 caràcters" + +#: forms.py:134 skins/default/templates/macros.html:660 +#: skins/default/templates/macros.html:672 +#: skins/default/templates/blocks/header.html:25 +msgid "tags" +msgstr "etiquetes" + +#: forms.py:136 +msgid "" +"Tags are short keywords, with no spaces within. Up to five tags can be used." +msgstr "Les etiquetes són paraules clau curtes, sense espais. Es poden usar fins a 5 etiquetes." + +#: forms.py:164 skins/default/templates/question_retag.html:58 +msgid "tags are required" +msgstr "es requereixen etiquetes" + +#: forms.py:173 +#, python-format +msgid "please use %(tag_count)d tag or less" +msgid_plural "please use %(tag_count)d tags or less" +msgstr[0] "usar %(tag_count)d etiqueta o menys" +msgstr[1] "usar %(tag_count)d etiquetes o menys" + +#: forms.py:181 +#, python-format +msgid "At least one of the following tags is required : %(tags)s" +msgstr "Es requereixen com a mínim una de les etiquetes següents: %(tags)s" + +#: forms.py:190 +#, python-format +msgid "each tag must be shorter than %(max_chars)d character" +msgid_plural "each tag must be shorter than %(max_chars)d characters" +msgstr[0] "les etiquetes han de tenir menys de %(max_chars)d caràcter" +msgstr[1] "les etiquetes han de tenir menys de %(max_chars)d caràcters" + +#: forms.py:198 +msgid "use-these-chars-in-tags" +msgstr "" + +#: forms.py:233 +msgid "community wiki (karma is not awarded & many others can edit wiki post)" +msgstr "wiki comunitari (no es concedeix karma; altres usuaris poden editar l'entrada)" + +#: forms.py:234 +msgid "" +"if you choose community wiki option, the question and answer do not generate " +"points and name of author will not be shown" +msgstr "Amb l'opció de wiki comunitari la pregunta i la resposta no generen punts per l'autor i no es mostra el nom de l'autor." + +#: forms.py:250 +msgid "update summary:" +msgstr "resum actualitzat:" + +#: forms.py:251 +msgid "" +"enter a brief summary of your revision (e.g. fixed spelling, grammar, " +"improved style, this field is optional)" +msgstr "breu resum de la revisió (p.e. correcció ortogràfica, gramàtica, millora d'estil, aquest camp és opcional)" + +#: forms.py:327 +msgid "Enter number of points to add or subtract" +msgstr "Introduir el nombre de punts a sumar o restar" + +#: forms.py:341 const/__init__.py:245 +msgid "approved" +msgstr "aprovat" + +#: forms.py:342 const/__init__.py:246 +msgid "watched" +msgstr "vist" + +#: forms.py:343 const/__init__.py:247 +msgid "suspended" +msgstr "suspès" + +#: forms.py:344 const/__init__.py:248 +msgid "blocked" +msgstr "bloquejat" + +#: forms.py:346 +msgid "administrator" +msgstr "administrador" + +#: forms.py:347 const/__init__.py:244 +msgid "moderator" +msgstr "moderador" + +#: forms.py:367 +msgid "Change status to" +msgstr "Canviar estat a" + +#: forms.py:394 +msgid "which one?" +msgstr "quin?" + +#: forms.py:415 +msgid "Cannot change own status" +msgstr "No es pot canviar el pròpi estat" + +#: forms.py:421 +msgid "Cannot turn other user to moderator" +msgstr "No es pot canviar l'altre usuari a moderador" + +#: forms.py:428 +msgid "Cannot change status of another moderator" +msgstr "No es pot canviar l'estat d'un altre moderador" + +#: forms.py:434 +msgid "Cannot change status to admin" +msgstr "No es pot canviar a l'estat d'administrador " + +#: forms.py:440 +#, python-format +msgid "" +"If you wish to change %(username)s's status, please make a meaningful " +"selection." +msgstr "Si es vol canviar l'estat de %(username)s, feu una selecció " +"amb significat" + +#: forms.py:449 +msgid "Subject line" +msgstr "Línia d'assumpte" + +#: forms.py:456 +msgid "Message text" +msgstr "Text del missatge" + +#: forms.py:542 +msgid "Your name:" +msgstr "El seu nom:" + +#: forms.py:543 +msgid "Email (not shared with anyone):" +msgstr "Correu electrònic (no es comparteix amb ningú)" + +#: forms.py:544 +msgid "Your message:" +msgstr "El vostre missatge:" + +#: forms.py:581 +msgid "ask anonymously" +msgstr "preguntar anònimament" + +#: forms.py:583 +msgid "Check if you do not want to reveal your name when asking this question" +msgstr "Marcar si no voleu mostrar el vostre nom al fer aquesta pregunta" + +#: forms.py:743 +msgid "" +"You have asked this question anonymously, if you decide to reveal your " +"identity, please check this box." +msgstr "Heu fet aquesta pregunta anònimament, si voleu mostrar la vostra " +"identitat marqueu aquesta opció." + +#: forms.py:747 +msgid "reveal identity" +msgstr "mostrar identitat" + +#: forms.py:805 +msgid "" +"Sorry, only owner of the anonymous question can reveal his or her identity, " +"please uncheck the box" +msgstr "Només l'autor de la pregunta anònima pot mostrar la seva identitat. Desmarqueu l'opció" + +#: forms.py:818 +msgid "" +"Sorry, apparently rules have just changed - it is no longer possible to ask " +"anonymously. Please either check the \"reveal identity\" box or reload this " +"page and try editing the question again." +msgstr "" +"Sembla què les regles han canviat; ara no es poden fer preguntes anònimament." +"Si us plau, marqueu «mostrar identitat» o tornareu a carregar aquesta pàgina i " +"editeu de nou la pregunta" +#: forms.py:856 +msgid "this email will be linked to gravatar" +msgstr "aquest correu electrònic s'enllaçarà al Gravatar" + +#: forms.py:863 +msgid "Real name" +msgstr "Nom real" + +#: forms.py:870 +msgid "Website" +msgstr "Lloc web" + +#: forms.py:877 +msgid "City" +msgstr "Ciutat" + +#: forms.py:886 +msgid "Show country" +msgstr "Mostrar país" + +#: forms.py:891 +msgid "Date of birth" +msgstr "Data de naixament" + +#: forms.py:892 +msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" +msgstr "no es mostrarà, s'usa per calcular l'edat, format: AAAA-MM-DD" + +#: forms.py:898 +msgid "Profile" +msgstr "Perfil" + +#: forms.py:907 +msgid "Screen name" +msgstr "Nom a mostrar" + +#: forms.py:938 forms.py:939 +msgid "this email has already been registered, please use another one" +msgstr "aquesta adreça de correu ja està registrada, useu una altra" + +#: forms.py:946 +msgid "Choose email tag filter" +msgstr "Escollir etiqueta filtre per el correu electrònic" + +#: forms.py:993 +msgid "Asked by me" +msgstr "Preguntat per mi" + +#: forms.py:996 +msgid "Answered by me" +msgstr "Respost per mi" + +#: forms.py:999 +msgid "Individually selected" +msgstr "Seleccionat individualment" + +#: forms.py:1002 +msgid "Entire forum (tag filtered)" +msgstr "Forum senser (filtrar per etiqueta)" + +#: forms.py:1006 +msgid "Comments and posts mentioning me" +msgstr "Comentaris i entrades us mencionen" + +#: forms.py:1085 +msgid "okay, let's try!" +msgstr "d'acord, provem-ho!" + +#: forms.py:1086 +msgid "no community email please, thanks" +msgstr "no correus electrònics de la comunitat" + +#: forms.py:1090 +msgid "please choose one of the options above" +msgstr "escollir una de les opcions anteriors" + +#: urls.py:53 +msgid "about/" +msgstr "sobre/" + +#: urls.py:54 +msgid "faq/" +msgstr "" + +#: urls.py:55 +msgid "privacy/" +msgstr "privacitat" + +#: urls.py:57 urls.py:62 +msgid "answers/" +msgstr "respostes" + +#: urls.py:57 urls.py:83 urls.py:203 +msgid "edit/" +msgstr "editar" + +#: urls.py:62 urls.py:113 +msgid "revisions/" +msgstr "revisions/" + +#: urls.py:68 urls.py:78 urls.py:83 urls.py:88 urls.py:93 urls.py:98 +#: urls.py:103 urls.py:108 urls.py:113 urls.py:290 +#: skins/default/templates/question.html:508 +msgid "questions/" +msgstr "preguntes/" + +#: urls.py:78 +msgid "ask/" +msgstr "preguntar/" + +#: urls.py:88 +msgid "retag/" +msgstr "reetiquetar/" + +#: urls.py:93 +msgid "close/" +msgstr "tancar/" + +#: urls.py:98 +msgid "reopen/" +msgstr "reobrir/" + +#: urls.py:103 +msgid "answer/" +msgstr "resposta/" + +#: urls.py:108 skins/default/templates/question.html:508 +msgid "vote/" +msgstr "vot/" + +#: urls.py:149 +msgid "tags/" +msgstr "etiquetes/" + +#: urls.py:192 +msgid "subscribe-for-tags/" +msgstr "subscriure-per-etiquetes" + +#: urls.py:197 urls.py:203 urls.py:209 urls.py:217 +#: skins/default/templates/main_page/javascript.html:38 +msgid "users/" +msgstr "usuaris/" + +#: urls.py:210 +msgid "subscriptions/" +msgstr "subscripcions/" + +#: urls.py:222 +msgid "users/update_has_custom_avatar/" +msgstr "usuaris/actualitzacio_te_avatar_personalitzat/" + +#: urls.py:227 urls.py:232 +msgid "badges/" +msgstr "insignies/" + +#: urls.py:237 +msgid "messages/" +msgstr "missatges/" + +#: urls.py:237 +msgid "markread/" +msgstr "marcarllegit/" + +#: urls.py:253 +msgid "upload/" +msgstr "penjar/" + +#: urls.py:254 +msgid "feedback/" +msgstr "comentaris/" + +#: urls.py:296 skins/default/templates/question.html:506 +#: skins/default/templates/main_page/javascript.html:37 +msgid "question/" +msgstr "pregunta/" + +#: urls.py:303 setup_templates/settings.py:203 +#: skins/default/templates/authopenid/providers_javascript.html:7 +msgid "account/" +msgstr "compte/" + +#: conf/badges.py:12 +msgid "Badge settings" +msgstr "Configuració de les insígnies" + +#: conf/badges.py:21 +msgid "Disciplined: minimum upvotes for deleted post" +msgstr "Disciplinat: mínim vots positius per entrada esborrada" + +#: conf/badges.py:30 +msgid "Peer Pressure: minimum downvotes for deleted post" +msgstr "Pressió Companys: mínim vots negatius per a l'entrada eliminada" + +#: conf/badges.py:39 +msgid "Teacher: minimum upvotes for the answer" +msgstr "Mestre: mínim vots positius per la resposta" + +#: conf/badges.py:48 +msgid "Nice Answer: minimum upvotes for the answer" +msgstr "" + +#: conf/badges.py:57 +msgid "Good Answer: minimum upvotes for the answer" +msgstr "" + +#: conf/badges.py:66 +msgid "Great Answer: minimum upvotes for the answer" +msgstr "" + +#: conf/badges.py:75 +msgid "Nice Question: minimum upvotes for the question" +msgstr "" + +#: conf/badges.py:84 +msgid "Good Question: minimum upvotes for the question" +msgstr "" + +#: conf/badges.py:93 +msgid "Great Question: minimum upvotes for the question" +msgstr "" + +#: conf/badges.py:102 +msgid "Popular Question: minimum views" +msgstr "" + +#: conf/badges.py:111 +msgid "Notable Question: minimum views" +msgstr "" + +#: conf/badges.py:120 +msgid "Famous Question: minimum views" +msgstr "" + +#: conf/badges.py:129 +msgid "Self-Learner: minimum answer upvotes" +msgstr "" + +#: conf/badges.py:138 +msgid "Civic Duty: minimum votes" +msgstr "" + +#: conf/badges.py:147 +msgid "Enlightened Duty: minimum upvotes" +msgstr "" + +#: conf/badges.py:156 +msgid "Guru: minimum upvotes" +msgstr "" + +#: conf/badges.py:165 +msgid "Necromancer: minimum upvotes" +msgstr "" + +#: conf/badges.py:174 +msgid "Necromancer: minimum delay in days" +msgstr "" + +#: conf/badges.py:183 +msgid "Associate Editor: minimum number of edits" +msgstr "" + +#: conf/badges.py:192 +msgid "Favorite Question: minimum stars" +msgstr "" + +#: conf/badges.py:201 +msgid "Stellar Question: minimum stars" +msgstr "" + +#: conf/badges.py:210 +msgid "Commentator: minimum comments" +msgstr "" + +#: conf/badges.py:219 +msgid "Taxonomist: minimum tag use count" +msgstr "" + +#: conf/badges.py:228 +msgid "Enthusiast: minimum days" +msgstr "" + +#: conf/email.py:14 +msgid "Email and email alert settings" +msgstr "Configuració del correu electrònic i alertes per correu electrònic" + +#: conf/email.py:22 +msgid "Prefix for the email subject line" +msgstr "Prefix de assumpte del correu electrònic " + +#: conf/email.py:24 +msgid "" +"This setting takes default from the django settingEMAIL_SUBJECT_PREFIX. A " +"value entered here will overridethe default." +msgstr "" + +#: conf/email.py:36 +msgid "Maximum number of news entries in an email alert" +msgstr "Màxim nombre de missatges en un avís per correu electrònic" + +#: conf/email.py:64 +msgid "Default notification frequency all questions" +msgstr "Freqüència predeterminada de notificació per a totes les preguntes" + +#: conf/email.py:66 +msgid "Option to define frequency of emailed updates for: all questions." +msgstr "Opció per definir la freqüència de les actualitzacions per correu de: totes les preguntes." + +#: conf/email.py:78 +msgid "Default notification frequency questions asked by the user" +msgstr "Freqüència predeterminada de notificació de preguntes fets per l'usuari" + +#: conf/email.py:80 +msgid "" +"Option to define frequency of emailed updates for: Question asked by the " +"user." +msgstr "Opció per definir la freqüència de les actualitzacions per correu de: Preguntes fetes per l'usuari" + +#: conf/email.py:92 +msgid "Default notification frequency questions answered by the user" +msgstr "Freqüència predeterminada de notificació de respostes fetes per l'usuari" + +#: conf/email.py:94 +msgid "" +"Option to define frequency of emailed updates for: Question answered by the " +"user." +msgstr "Opció per definir la freqüència de les actualitzacions per correu de: Respostes fetes per l'usuari" + +#: conf/email.py:106 +msgid "" +"Default notification frequency questions individually " +"selected by the user" +msgstr "" + +#: conf/email.py:109 +msgid "" +"Option to define frequency of emailed updates for: Question individually " +"selected by the user." +msgstr "" + +#: conf/email.py:121 +msgid "" +"Default notification frequency for mentions and " +"comments" +msgstr "" + +#: conf/email.py:124 +msgid "" +"Option to define frequency of emailed updates for: Mentions and comments." +msgstr "" + +#: conf/email.py:135 +msgid "Send periodic reminders about unanswered questions" +msgstr "" + +#: conf/email.py:137 +msgid "" +"NOTE: in order to use this feature, it is necessary to run the management " +"command \"send_unanswered_question_reminders\" (for example, via a cron job " +"- with an appropriate frequency) and an IMAP server with a dedicated inbox " +"must be configured " +msgstr "" + +#: conf/email.py:151 +msgid "Days before starting to send reminders about unanswered questions" +msgstr "" + +#: conf/email.py:162 +msgid "" +"How often to send unanswered question reminders (in days between the " +"reminders sent)." +msgstr "" + +#: conf/email.py:174 +msgid "Max. number of reminders to send about unanswered questions" +msgstr "" + +#: conf/email.py:186 +msgid "Require email verification before allowing to post" +msgstr "" + +#: conf/email.py:187 +msgid "" +"Active email verification is done by sending a verification key in email" +msgstr "" + +#: conf/email.py:196 +msgid "Allow only one account per email address" +msgstr "" + +#: conf/email.py:205 +msgid "Fake email for anonymous user" +msgstr "" + +#: conf/email.py:206 +msgid "Use this setting to control gravatar for email-less user" +msgstr "" + +#: conf/email.py:215 +#, fuzzy +msgid "Allow posting questions by email" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: conf/email.py:217 +msgid "" +"Before enabling this setting - please fill out IMAP settings in the settings." +"py file" +msgstr "" + +#: conf/email.py:228 +msgid "Replace space in emailed tags with dash" +msgstr "" + +#: conf/email.py:230 +msgid "" +"This setting applies to tags written in the subject line of questions asked " +"by email" +msgstr "" + +#: conf/external_keys.py:10 +msgid "Keys to connect the site with external services like Facebook, etc." +msgstr "" + +#: conf/external_keys.py:18 +msgid "Google site verification key" +msgstr "" + +#: conf/external_keys.py:20 +#, python-format +msgid "" +"This key helps google index your site please obtain is at <a href=\"%(url)s?" +"hl=%(lang)s\">google webmasters tools site</a>" +msgstr "" + +#: conf/external_keys.py:35 +msgid "Google Analytics key" +msgstr "" + +#: conf/external_keys.py:37 +#, python-format +msgid "" +"Obtain is at <a href=\"%(url)s\">Google Analytics</a> site, if you wish to " +"use Google Analytics to monitor your site" +msgstr "" + +#: conf/external_keys.py:50 +msgid "Enable recaptcha (keys below are required)" +msgstr "" + +#: conf/external_keys.py:59 +msgid "Recaptcha public key" +msgstr "" + +#: conf/external_keys.py:67 +msgid "Recaptcha private key" +msgstr "" + +#: conf/external_keys.py:69 +#, python-format +msgid "" +"Recaptcha is a tool that helps distinguish real people from annoying spam " +"robots. Please get this and a public key at the <a href=\"%(url)s\">%(url)s</" +"a>" +msgstr "" + +#: conf/external_keys.py:81 +msgid "Facebook public API key" +msgstr "" + +#: conf/external_keys.py:83 +#, python-format +msgid "" +"Facebook API key and Facebook secret allow to use Facebook Connect login " +"method at your site. Please obtain these keys at <a href=\"%(url)s" +"\">facebook create app</a> site" +msgstr "" + +#: conf/external_keys.py:96 +msgid "Facebook secret key" +msgstr "" + +#: conf/external_keys.py:104 +msgid "Twitter consumer key" +msgstr "" + +#: conf/external_keys.py:106 +#, python-format +msgid "" +"Please register your forum at <a href=\"%(url)s\">twitter applications site</" +"a>" +msgstr "" + +#: conf/external_keys.py:117 +msgid "Twitter consumer secret" +msgstr "" + +#: conf/external_keys.py:125 +msgid "LinkedIn consumer key" +msgstr "" + +#: conf/external_keys.py:127 +#, python-format +msgid "" +"Please register your forum at <a href=\"%(url)s\">LinkedIn developer site</a>" +msgstr "" + +#: conf/external_keys.py:138 +msgid "LinkedIn consumer secret" +msgstr "" + +#: conf/external_keys.py:146 +msgid "ident.ca consumer key" +msgstr "" + +#: conf/external_keys.py:148 +#, python-format +msgid "" +"Please register your forum at <a href=\"%(url)s\">Identi.ca applications " +"site</a>" +msgstr "" + +#: conf/external_keys.py:159 +msgid "ident.ca consumer secret" +msgstr "" + +#: conf/external_keys.py:167 +msgid "Use LDAP authentication for the password login" +msgstr "" + +#: conf/external_keys.py:176 +msgid "LDAP service provider name" +msgstr "" + +#: conf/external_keys.py:184 +msgid "URL for the LDAP service" +msgstr "" + +#: conf/external_keys.py:192 +msgid "Explain how to change LDAP password" +msgstr "" + +#: conf/flatpages.py:10 +msgid "Flatpages - about, privacy policy, etc." +msgstr "" + +#: conf/flatpages.py:17 +msgid "Text of the Q&A forum About page (html format)" +msgstr "" + +#: conf/flatpages.py:20 +msgid "" +"Save, then <a href=\"http://validator.w3.org/\">use HTML validator</a> on " +"the \"about\" page to check your input." +msgstr "" + +#: conf/flatpages.py:30 +msgid "Text of the Q&A forum FAQ page (html format)" +msgstr "" + +#: conf/flatpages.py:33 +msgid "" +"Save, then <a href=\"http://validator.w3.org/\">use HTML validator</a> on " +"the \"faq\" page to check your input." +msgstr "" + +#: conf/flatpages.py:44 +msgid "Text of the Q&A forum Privacy Policy (html format)" +msgstr "" + +#: conf/flatpages.py:47 +msgid "" +"Save, then <a href=\"http://validator.w3.org/\">use HTML validator</a> on " +"the \"privacy\" page to check your input." +msgstr "" + +#: conf/forum_data_rules.py:11 +msgid "Data entry and display" +msgstr "" + +#: conf/forum_data_rules.py:20 +#, python-format +msgid "" +"Enable embedding videos. <em>Note: please read <a href=\"%(url)s>read this</" +"a> first.</em>" +msgstr "" + +#: conf/forum_data_rules.py:31 +msgid "Check to enable community wiki feature" +msgstr "" + +#: conf/forum_data_rules.py:40 +msgid "Allow asking questions anonymously" +msgstr "" + +#: conf/forum_data_rules.py:42 +msgid "" +"Users do not accrue reputation for anonymous questions and their identity is " +"not revealed until they change their mind" +msgstr "" + +#: conf/forum_data_rules.py:54 +#, fuzzy +msgid "Allow posting before logging in" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: conf/forum_data_rules.py:56 +msgid "" +"Check if you want to allow users start posting questions or answers before " +"logging in. Enabling this may require adjustments in the user login system " +"to check for pending posts every time the user logs in. The builtin Askbot " +"login system supports this feature." +msgstr "" + +#: conf/forum_data_rules.py:71 +#, fuzzy +msgid "Allow swapping answer with question" +msgstr "Post Your Answer" + +#: conf/forum_data_rules.py:73 +msgid "" +"This setting will help import data from other forums such as zendesk, when " +"automatic data import fails to detect the original question correctly." +msgstr "" + +#: conf/forum_data_rules.py:85 +msgid "Maximum length of tag (number of characters)" +msgstr "" + +#: conf/forum_data_rules.py:93 +msgid "Mandatory tags" +msgstr "" + +#: conf/forum_data_rules.py:96 +msgid "" +"At least one of these tags will be required for any new or newly edited " +"question. A mandatory tag may be wildcard, if the wildcard tags are active." +msgstr "" + +#: conf/forum_data_rules.py:108 +msgid "Force lowercase the tags" +msgstr "" + +#: conf/forum_data_rules.py:110 +msgid "" +"Attention: after checking this, please back up the database, and run a " +"management command: <code>python manage.py fix_question_tags</code> to " +"globally rename the tags" +msgstr "" + +#: conf/forum_data_rules.py:124 +msgid "Format of tag list" +msgstr "" + +#: conf/forum_data_rules.py:126 +msgid "" +"Select the format to show tags in, either as a simple list, or as a tag cloud" +msgstr "" + +#: conf/forum_data_rules.py:138 +#, fuzzy +msgid "Use wildcard tags" +msgstr "Tags" + +#: conf/forum_data_rules.py:140 +msgid "" +"Wildcard tags can be used to follow or ignore many tags at once, a valid " +"wildcard tag has a single wildcard at the very end" +msgstr "" + +#: conf/forum_data_rules.py:153 +msgid "Default max number of comments to display under posts" +msgstr "" + +#: conf/forum_data_rules.py:164 +#, python-format +msgid "Maximum comment length, must be < %(max_len)s" +msgstr "" + +#: conf/forum_data_rules.py:174 +msgid "Limit time to edit comments" +msgstr "" + +#: conf/forum_data_rules.py:176 +msgid "If unchecked, there will be no time limit to edit the comments" +msgstr "" + +#: conf/forum_data_rules.py:187 +msgid "Minutes allowed to edit a comment" +msgstr "" + +#: conf/forum_data_rules.py:188 +msgid "To enable this setting, check the previous one" +msgstr "" + +#: conf/forum_data_rules.py:197 +msgid "Save comment by pressing <Enter> key" +msgstr "" + +#: conf/forum_data_rules.py:206 +msgid "Minimum length of search term for Ajax search" +msgstr "" + +#: conf/forum_data_rules.py:207 +msgid "Must match the corresponding database backend setting" +msgstr "" + +#: conf/forum_data_rules.py:216 +msgid "Do not make text query sticky in search" +msgstr "" + +#: conf/forum_data_rules.py:218 +msgid "" +"Check to disable the \"sticky\" behavior of the search query. This may be " +"useful if you want to move the search bar away from the default position or " +"do not like the default sticky behavior of the text search query." +msgstr "" + +#: conf/forum_data_rules.py:231 +msgid "Maximum number of tags per question" +msgstr "" + +#: conf/forum_data_rules.py:243 +msgid "Number of questions to list by default" +msgstr "" + +#: conf/forum_data_rules.py:253 +msgid "What should \"unanswered question\" mean?" +msgstr "" + +#: conf/license.py:12 +msgid "License settings" +msgstr "" + +#: conf/license.py:19 +msgid "Show license clause in the site footer" +msgstr "" + +#: conf/license.py:28 +msgid "Short name for the license" +msgstr "" + +#: conf/license.py:37 +msgid "Full name of the license" +msgstr "" + +#: conf/license.py:38 +msgid "Creative Commons Attribution Share Alike 3.0" +msgstr "" + +#: conf/license.py:46 +msgid "Add link to the license page" +msgstr "" + +#: conf/license.py:55 +msgid "License homepage" +msgstr "" + +#: conf/license.py:57 +msgid "URL of the official page with all the license legal clauses" +msgstr "" + +#: conf/license.py:67 +msgid "Use license logo" +msgstr "" + +#: conf/license.py:76 +msgid "License logo image" +msgstr "" + +#: conf/login_providers.py:12 +msgid "Login provider setings" +msgstr "" + +#: conf/login_providers.py:20 +msgid "" +"Show alternative login provider buttons on the password \"Sign Up\" page" +msgstr "" + +#: conf/login_providers.py:29 +msgid "Always display local login form and hide \"Askbot\" button." +msgstr "" + +#: conf/login_providers.py:38 +msgid "Activate to allow login with self-hosted wordpress site" +msgstr "" + +#: conf/login_providers.py:39 +msgid "" +"to activate this feature you must fill out the wordpress xml-rpc setting " +"bellow" +msgstr "" + +#: conf/login_providers.py:48 +msgid "" +"Fill it with the wordpress url to the xml-rpc, normally http://mysite.com/" +"xmlrpc.php" +msgstr "" + +#: conf/login_providers.py:49 +msgid "" +"To enable, go to Settings->Writing->Remote Publishing and check the box for " +"XML-RPC" +msgstr "" + +#: conf/login_providers.py:60 +msgid "Upload your icon" +msgstr "" + +#: conf/login_providers.py:90 +#, python-format +msgid "Activate %(provider)s login" +msgstr "" + +#: conf/login_providers.py:95 +#, python-format +msgid "" +"Note: to really enable %(provider)s login some additional parameters will " +"need to be set in the \"External keys\" section" +msgstr "" + +#: conf/markup.py:14 +msgid "Markup formatting" +msgstr "" + +#: conf/markup.py:39 +msgid "Enable code-friendly Markdown" +msgstr "" + +#: conf/markup.py:41 +msgid "" +"If checked, underscore characters will not trigger italic or bold formatting " +"- bold and italic text can still be marked up with asterisks. Note that " +"\"MathJax support\" implicitly turns this feature on, because underscores " +"are heavily used in LaTeX input." +msgstr "" + +#: conf/markup.py:56 +msgid "Mathjax support (rendering of LaTeX)" +msgstr "" + +#: conf/markup.py:58 +#, python-format +msgid "" +"If you enable this feature, <a href=\"%(url)s\">mathjax</a> must be " +"installed on your server in its own directory." +msgstr "" + +#: conf/markup.py:72 +msgid "Base url of MathJax deployment" +msgstr "" + +#: conf/markup.py:74 +msgid "" +"Note - <strong>MathJax is not included with askbot</strong> - you should " +"deploy it yourself, preferably at a separate domain and enter url pointing " +"to the \"mathjax\" directory (for example: http://mysite.com/mathjax)" +msgstr "" + +#: conf/markup.py:89 +msgid "Enable autolinking with specific patterns" +msgstr "" + +#: conf/markup.py:91 +msgid "" +"If you enable this feature, the application will be able to detect patterns " +"and auto link to URLs" +msgstr "" + +#: conf/markup.py:104 +msgid "Regexes to detect the link patterns" +msgstr "" + +#: conf/markup.py:106 +msgid "" +"Enter valid regular expressions for the patters, one per line. For example " +"to detect a bug pattern like #bug123, use the following regex: #bug(\\d+). " +"The numbers captured by the pattern in the parentheses will be transferred " +"to the link url template. Please look up more information about regular " +"expressions elsewhere." +msgstr "" + +#: conf/markup.py:125 +msgid "URLs for autolinking" +msgstr "" + +#: conf/markup.py:127 +msgid "" +"Here, please enter url templates for the patterns entered in the previous " +"setting, also one entry per line. <strong>Make sure that number of lines in " +"this setting and the previous one are the same</strong> For example template " +"https://bugzilla.redhat.com/show_bug.cgi?id=\\1 together with the pattern " +"shown above and the entry in the post #123 will produce link to the bug 123 " +"in the redhat bug tracker." +msgstr "" + +#: conf/minimum_reputation.py:11 +msgid "Minimum reputation required to perform actions" +msgstr "" + +#: conf/minimum_reputation.py:20 +msgid "Upvote" +msgstr "" + +#: conf/minimum_reputation.py:29 +msgid "Downvote" +msgstr "" + +#: conf/minimum_reputation.py:38 +#, fuzzy +msgid "Answer own question immediately" +msgstr "Post Your Answer" + +#: conf/minimum_reputation.py:47 +msgid "Accept own answer" +msgstr "" + +#: conf/minimum_reputation.py:56 +msgid "Flag offensive" +msgstr "" + +#: conf/minimum_reputation.py:65 +msgid "Leave comments" +msgstr "" + +#: conf/minimum_reputation.py:74 +msgid "Delete comments posted by others" +msgstr "" + +#: conf/minimum_reputation.py:83 +msgid "Delete questions and answers posted by others" +msgstr "" + +#: conf/minimum_reputation.py:92 +msgid "Upload files" +msgstr "" + +#: conf/minimum_reputation.py:101 +msgid "Close own questions" +msgstr "" + +#: conf/minimum_reputation.py:110 +msgid "Retag questions posted by other people" +msgstr "" + +#: conf/minimum_reputation.py:119 +msgid "Reopen own questions" +msgstr "" + +#: conf/minimum_reputation.py:128 +msgid "Edit community wiki posts" +msgstr "" + +#: conf/minimum_reputation.py:137 +msgid "Edit posts authored by other people" +msgstr "" + +#: conf/minimum_reputation.py:146 +msgid "View offensive flags" +msgstr "" + +#: conf/minimum_reputation.py:155 +msgid "Close questions asked by others" +msgstr "" + +#: conf/minimum_reputation.py:164 +msgid "Lock posts" +msgstr "" + +#: conf/minimum_reputation.py:173 +msgid "Remove rel=nofollow from own homepage" +msgstr "" + +#: conf/minimum_reputation.py:175 +msgid "" +"When a search engine crawler will see a rel=nofollow attribute on a link - " +"the link will not count towards the rank of the users personal site." +msgstr "" + +#: conf/reputation_changes.py:12 +msgid "Reputation loss and gain rules" +msgstr "" + +#: conf/reputation_changes.py:21 +msgid "Maximum daily reputation gain per user" +msgstr "" + +#: conf/reputation_changes.py:30 +msgid "Gain for receiving an upvote" +msgstr "" + +#: conf/reputation_changes.py:39 +msgid "Gain for the author of accepted answer" +msgstr "" + +#: conf/reputation_changes.py:48 +msgid "Gain for accepting best answer" +msgstr "" + +#: conf/reputation_changes.py:57 +msgid "Gain for post owner on canceled downvote" +msgstr "" + +#: conf/reputation_changes.py:66 +msgid "Gain for voter on canceling downvote" +msgstr "" + +#: conf/reputation_changes.py:76 +msgid "Loss for voter for canceling of answer acceptance" +msgstr "" + +#: conf/reputation_changes.py:86 +msgid "Loss for author whose answer was \"un-accepted\"" +msgstr "" + +#: conf/reputation_changes.py:96 +msgid "Loss for giving a downvote" +msgstr "" + +#: conf/reputation_changes.py:106 +msgid "Loss for owner of post that was flagged offensive" +msgstr "" + +#: conf/reputation_changes.py:116 +msgid "Loss for owner of post that was downvoted" +msgstr "" + +#: conf/reputation_changes.py:126 +msgid "Loss for owner of post that was flagged 3 times per same revision" +msgstr "" + +#: conf/reputation_changes.py:136 +msgid "Loss for owner of post that was flagged 5 times per same revision" +msgstr "" + +#: conf/reputation_changes.py:146 +msgid "Loss for post owner when upvote is canceled" +msgstr "" + +#: conf/sidebar_main.py:11 +msgid "Sidebar widget settings - main page" +msgstr "" + +#: conf/sidebar_main.py:18 conf/sidebar_profile.py:18 +#: conf/sidebar_question.py:18 +msgid "Custom sidebar header" +msgstr "" + +#: conf/sidebar_main.py:21 conf/sidebar_profile.py:21 +#: conf/sidebar_question.py:21 +msgid "" +"Use this area to enter content at the TOP of the sidebarin HTML format. " +"When using this option (as well as the sidebar footer), please use the HTML " +"validation service to make sure that your input is valid and works well in " +"all browsers." +msgstr "" + +#: conf/sidebar_main.py:34 +msgid "Show avatar block in sidebar" +msgstr "" + +#: conf/sidebar_main.py:36 +msgid "Uncheck this if you want to hide the avatar block from the sidebar " +msgstr "" + +#: conf/sidebar_main.py:47 +msgid "Limit how many avatars will be displayed on the sidebar" +msgstr "" + +#: conf/sidebar_main.py:57 +msgid "Show tag selector in sidebar" +msgstr "" + +#: conf/sidebar_main.py:59 +msgid "" +"Uncheck this if you want to hide the options for choosing interesting and " +"ignored tags " +msgstr "" + +#: conf/sidebar_main.py:70 +msgid "Show tag list/cloud in sidebar" +msgstr "" + +#: conf/sidebar_main.py:72 +msgid "" +"Uncheck this if you want to hide the tag cloud or tag list from the sidebar " +msgstr "" + +#: conf/sidebar_main.py:83 conf/sidebar_profile.py:34 +#: conf/sidebar_question.py:74 +msgid "Custom sidebar footer" +msgstr "" + +#: conf/sidebar_main.py:86 conf/sidebar_profile.py:37 +#: conf/sidebar_question.py:77 +msgid "" +"Use this area to enter content at the BOTTOM of the sidebarin HTML format. " +"When using this option (as well as the sidebar header), please use the HTML " +"validation service to make sure that your input is valid and works well in " +"all browsers." +msgstr "" + +#: conf/sidebar_profile.py:11 +msgid "Sidebar widget settings - profile page" +msgstr "" + +#: conf/sidebar_question.py:11 +msgid "Sidebar widget settings - question page" +msgstr "" + +#: conf/sidebar_question.py:34 +msgid "Show tag list in sidebar" +msgstr "" + +#: conf/sidebar_question.py:36 +msgid "Uncheck this if you want to hide the tag list from the sidebar " +msgstr "" + +#: conf/sidebar_question.py:47 +msgid "Show meta information in sidebar" +msgstr "" + +#: conf/sidebar_question.py:49 +msgid "" +"Uncheck this if you want to hide the meta information about the question " +"(post date, views, last updated). " +msgstr "" + +#: conf/sidebar_question.py:61 +msgid "Show related questions in sidebar" +msgstr "" + +#: conf/sidebar_question.py:63 +msgid "Uncheck this if you want to hide the list of related questions. " +msgstr "" + +#: conf/site_modes.py:63 +msgid "Site modes" +msgstr "" + +#: conf/site_modes.py:72 +msgid "Activate a \"Bootstrap\" mode" +msgstr "" + +#: conf/site_modes.py:74 +msgid "" +"Bootstrap mode lowers reputation and certain badge thresholds, to values, " +"more suitable for the smaller communities, <strong>WARNING:</strong> your " +"current value for Minimum reputation, Bagde Settings and Vote Rules will be " +"changed after you modify this setting." +msgstr "" + +#: conf/site_settings.py:11 +msgid "Q&A forum website parameters and urls" +msgstr "" + +#: conf/site_settings.py:19 +msgid "Site title for the Q&A forum" +msgstr "" + +#: conf/site_settings.py:28 +msgid "Comma separated list of Q&A site keywords" +msgstr "" + +#: conf/site_settings.py:37 +msgid "Copyright message to show in the footer" +msgstr "" + +#: conf/site_settings.py:47 +msgid "Site description for the search engines" +msgstr "" + +#: conf/site_settings.py:56 +msgid "Short name for your Q&A forum" +msgstr "" + +#: conf/site_settings.py:66 +msgid "Base URL for your Q&A forum, must start with http or https" +msgstr "" + +#: conf/site_settings.py:77 +msgid "Check to enable greeting for anonymous user" +msgstr "" + +#: conf/site_settings.py:88 +msgid "Text shown in the greeting message shown to the anonymous user" +msgstr "" + +#: conf/site_settings.py:92 +msgid "Use HTML to format the message " +msgstr "" + +#: conf/site_settings.py:101 +msgid "Feedback site URL" +msgstr "" + +#: conf/site_settings.py:103 +msgid "If left empty, a simple internal feedback form will be used instead" +msgstr "" + +#: conf/skin_counter_settings.py:11 +msgid "Skin: view, vote and answer counters" +msgstr "" + +#: conf/skin_counter_settings.py:19 +msgid "Vote counter value to give \"full color\"" +msgstr "" + +#: conf/skin_counter_settings.py:29 +msgid "Background color for votes = 0" +msgstr "" + +#: conf/skin_counter_settings.py:30 conf/skin_counter_settings.py:41 +#: conf/skin_counter_settings.py:52 conf/skin_counter_settings.py:62 +#: conf/skin_counter_settings.py:72 conf/skin_counter_settings.py:85 +#: conf/skin_counter_settings.py:106 conf/skin_counter_settings.py:117 +#: conf/skin_counter_settings.py:128 conf/skin_counter_settings.py:138 +#: conf/skin_counter_settings.py:148 conf/skin_counter_settings.py:163 +#: conf/skin_counter_settings.py:186 conf/skin_counter_settings.py:196 +#: conf/skin_counter_settings.py:206 conf/skin_counter_settings.py:216 +#: conf/skin_counter_settings.py:228 conf/skin_counter_settings.py:239 +#: conf/skin_counter_settings.py:252 conf/skin_counter_settings.py:262 +msgid "HTML color name or hex value" +msgstr "" + +#: conf/skin_counter_settings.py:40 +msgid "Foreground color for votes = 0" +msgstr "" + +#: conf/skin_counter_settings.py:51 +msgid "Background color for votes" +msgstr "" + +#: conf/skin_counter_settings.py:61 +msgid "Foreground color for votes" +msgstr "" + +#: conf/skin_counter_settings.py:71 +msgid "Background color for votes = MAX" +msgstr "" + +#: conf/skin_counter_settings.py:84 +msgid "Foreground color for votes = MAX" +msgstr "" + +#: conf/skin_counter_settings.py:95 +msgid "View counter value to give \"full color\"" +msgstr "" + +#: conf/skin_counter_settings.py:105 +msgid "Background color for views = 0" +msgstr "" + +#: conf/skin_counter_settings.py:116 +msgid "Foreground color for views = 0" +msgstr "" + +#: conf/skin_counter_settings.py:127 +msgid "Background color for views" +msgstr "" + +#: conf/skin_counter_settings.py:137 +msgid "Foreground color for views" +msgstr "" + +#: conf/skin_counter_settings.py:147 +msgid "Background color for views = MAX" +msgstr "" + +#: conf/skin_counter_settings.py:162 +msgid "Foreground color for views = MAX" +msgstr "" + +#: conf/skin_counter_settings.py:173 +msgid "Answer counter value to give \"full color\"" +msgstr "" + +#: conf/skin_counter_settings.py:185 +msgid "Background color for answers = 0" +msgstr "" + +#: conf/skin_counter_settings.py:195 +msgid "Foreground color for answers = 0" +msgstr "" + +#: conf/skin_counter_settings.py:205 +msgid "Background color for answers" +msgstr "" + +#: conf/skin_counter_settings.py:215 +msgid "Foreground color for answers" +msgstr "" + +#: conf/skin_counter_settings.py:227 +msgid "Background color for answers = MAX" +msgstr "" + +#: conf/skin_counter_settings.py:238 +msgid "Foreground color for answers = MAX" +msgstr "" + +#: conf/skin_counter_settings.py:251 +msgid "Background color for accepted" +msgstr "" + +#: conf/skin_counter_settings.py:261 +msgid "Foreground color for accepted answer" +msgstr "" + +#: conf/skin_general_settings.py:14 +msgid "Skin and User Interface settings" +msgstr "" + +#: conf/skin_general_settings.py:21 +msgid "Q&A site logo" +msgstr "" + +#: conf/skin_general_settings.py:23 +msgid "To change the logo, select new file, then submit this whole form." +msgstr "" + +#: conf/skin_general_settings.py:37 +msgid "Show logo" +msgstr "" + +#: conf/skin_general_settings.py:39 +msgid "" +"Check if you want to show logo in the forum header or uncheck in the case " +"you do not want the logo to appear in the default location" +msgstr "" + +#: conf/skin_general_settings.py:51 +msgid "Site favicon" +msgstr "" + +#: conf/skin_general_settings.py:53 +#, python-format +msgid "" +"A small 16x16 or 32x32 pixel icon image used to distinguish your site in the " +"browser user interface. Please find more information about favicon at <a " +"href=\"%(favicon_info_url)s\">this page</a>." +msgstr "" + +#: conf/skin_general_settings.py:71 +msgid "Password login button" +msgstr "" + +#: conf/skin_general_settings.py:73 +msgid "" +"An 88x38 pixel image that is used on the login screen for the password login " +"button." +msgstr "" + +#: conf/skin_general_settings.py:88 +msgid "Show all UI functions to all users" +msgstr "" + +#: conf/skin_general_settings.py:90 +msgid "" +"If checked, all forum functions will be shown to users, regardless of their " +"reputation. However to use those functions, moderation rules, reputation and " +"other limits will still apply." +msgstr "" + +#: conf/skin_general_settings.py:105 +msgid "Select skin" +msgstr "" + +#: conf/skin_general_settings.py:116 +msgid "Customize HTML <HEAD>" +msgstr "" + +#: conf/skin_general_settings.py:125 +msgid "Custom portion of the HTML <HEAD>" +msgstr "" + +#: conf/skin_general_settings.py:127 +msgid "" +"<strong>To use this option</strong>, check \"Customize HTML <HEAD>\" " +"above. Contents of this box will be inserted into the <HEAD> portion " +"of the HTML output, where elements such as <script>, <link>, <" +"meta> may be added. Please, keep in mind that adding external javascript " +"to the <HEAD> is not recommended because it slows loading of the " +"pages. Instead, it will be more efficient to place links to the javascript " +"files into the footer. <strong>Note:</strong> if you do use this setting, " +"please test the site with the W3C HTML validator service." +msgstr "" + +#: conf/skin_general_settings.py:149 +msgid "Custom header additions" +msgstr "" + +#: conf/skin_general_settings.py:151 +msgid "" +"Header is the bar at the top of the content that contains user info and site " +"links, and is common to all pages. Use this area to enter contents of the " +"headerin the HTML format. When customizing the site header (as well as " +"footer and the HTML <HEAD>), use the HTML validation service to make " +"sure that your input is valid and works well in all browsers." +msgstr "" + +#: conf/skin_general_settings.py:166 +msgid "Site footer mode" +msgstr "" + +#: conf/skin_general_settings.py:168 +msgid "" +"Footer is the bottom portion of the content, which is common to all pages. " +"You can disable, customize, or use the default footer." +msgstr "" + +#: conf/skin_general_settings.py:185 +msgid "Custom footer (HTML format)" +msgstr "" + +#: conf/skin_general_settings.py:187 +msgid "" +"<strong>To enable this function</strong>, please select option 'customize' " +"in the \"Site footer mode\" above. Use this area to enter contents of the " +"footer in the HTML format. When customizing the site footer (as well as the " +"header and HTML <HEAD>), use the HTML validation service to make sure " +"that your input is valid and works well in all browsers." +msgstr "" + +#: conf/skin_general_settings.py:202 +msgid "Apply custom style sheet (CSS)" +msgstr "" + +#: conf/skin_general_settings.py:204 +msgid "" +"Check if you want to change appearance of your form by adding custom style " +"sheet rules (please see the next item)" +msgstr "" + +#: conf/skin_general_settings.py:216 +msgid "Custom style sheet (CSS)" +msgstr "" + +#: conf/skin_general_settings.py:218 +msgid "" +"<strong>To use this function</strong>, check \"Apply custom style sheet\" " +"option above. The CSS rules added in this window will be applied after the " +"default style sheet rules. The custom style sheet will be served dynamically " +"at url \"<forum url>/custom.css\", where the \"<forum url> part " +"depends (default is empty string) on the url configuration in your urls.py." +msgstr "" + +#: conf/skin_general_settings.py:234 +msgid "Add custom javascript" +msgstr "" + +#: conf/skin_general_settings.py:237 +msgid "Check to enable javascript that you can enter in the next field" +msgstr "" + +#: conf/skin_general_settings.py:247 +msgid "Custom javascript" +msgstr "" + +#: conf/skin_general_settings.py:249 +msgid "" +"Type or paste plain javascript that you would like to run on your site. Link " +"to the script will be inserted at the bottom of the HTML output and will be " +"served at the url \"<forum url>/custom.js\". Please, bear in mind that " +"your javascript code may break other functionalities of the site and that " +"the behavior may not be consistent across different browsers (<strong>to " +"enable your custom code</strong>, check \"Add custom javascript\" option " +"above)." +msgstr "" + +#: conf/skin_general_settings.py:267 +msgid "Skin media revision number" +msgstr "" + +#: conf/skin_general_settings.py:269 +msgid "Will be set automatically but you can modify it if necessary." +msgstr "" + +#: conf/skin_general_settings.py:280 +msgid "Hash to update the media revision number automatically." +msgstr "" + +#: conf/skin_general_settings.py:284 +msgid "Will be set automatically, it is not necesary to modify manually." +msgstr "" + +#: conf/social_sharing.py:10 +msgid "Sharing content on social networks" +msgstr "" + +#: conf/social_sharing.py:18 +msgid "Check to enable sharing of questions on Twitter" +msgstr "" + +#: conf/social_sharing.py:27 +msgid "Check to enable sharing of questions on Facebook" +msgstr "" + +#: conf/social_sharing.py:36 +msgid "Check to enable sharing of questions on LinkedIn" +msgstr "" + +#: conf/social_sharing.py:45 +msgid "Check to enable sharing of questions on Identi.ca" +msgstr "" + +#: conf/social_sharing.py:54 +msgid "Check to enable sharing of questions on Google+" +msgstr "" + +#: conf/spam_and_moderation.py:9 +msgid "Spam control and content moderation" +msgstr "" + +#: conf/spam_and_moderation.py:16 +msgid "Enable Akismet spam detection(keys below are required)" +msgstr "" + +#: conf/spam_and_moderation.py:19 +#, python-format +msgid "To get an Akismet key please visit <a href=\"%(url)s\">Akismet site</a>" +msgstr "" + +#: conf/spam_and_moderation.py:29 +msgid "Akismet key for spam detection" +msgstr "" + +#: conf/user_settings.py:11 +#, fuzzy +msgid "User settings" +msgstr "User login" + +#: conf/user_settings.py:19 +msgid "Allow editing user screen name" +msgstr "" + +#: conf/user_settings.py:28 +#, fuzzy +msgid "Allow account recovery by email" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: conf/user_settings.py:37 +msgid "Allow adding and removing login methods" +msgstr "" + +#: conf/user_settings.py:47 +msgid "Minimum allowed length for screen name" +msgstr "" + +#: conf/user_settings.py:57 +msgid "Default Gravatar icon type" +msgstr "" + +#: conf/user_settings.py:59 +msgid "" +"This option allows you to set the default avatar type for email addresses " +"without associated gravatar images. For more information, please visit <a " +"href=\"http://en.gravatar.com/site/implement/images/\">this page</a>." +msgstr "" + +#: conf/user_settings.py:69 +msgid "Name for the Anonymous user" +msgstr "" + +#: conf/vote_rules.py:13 +msgid "Limits applicable to votes and moderation flags" +msgstr "" + +#: conf/vote_rules.py:22 +msgid "Number of votes a user can cast per day" +msgstr "" + +#: conf/vote_rules.py:31 +msgid "Maximum number of flags per user per day" +msgstr "" + +#: conf/vote_rules.py:40 +msgid "Threshold for warning about remaining daily votes" +msgstr "" + +#: conf/vote_rules.py:49 +msgid "Number of days to allow canceling votes" +msgstr "" + +#: conf/vote_rules.py:58 +msgid "Number of days required before answering own question" +msgstr "" + +#: conf/vote_rules.py:67 +msgid "Number of flags required to automatically hide posts" +msgstr "" + +#: conf/vote_rules.py:76 +msgid "Number of flags required to automatically delete posts" +msgstr "" + +#: const/__init__.py:10 +msgid "duplicate question" +msgstr "pregunta repetida" + +#: const/__init__.py:11 +msgid "question is off-topic or not relevant" +msgstr "pregunta no pertinent o fora de tema" + +#: const/__init__.py:12 +msgid "too subjective and argumentative" +msgstr "massa subjectiva o argumentativa" + +#: const/__init__.py:13 +msgid "not a real question" +msgstr "no és una pregunta real" + +#: const/__init__.py:14 +msgid "the question is answered, right answer was accepted" +msgstr "s'ha respost la pregunta, es va acceptar la resposta correcta" + +#: const/__init__.py:15 +msgid "question is not relevant or outdated" +msgstr "" + +#: const/__init__.py:16 +msgid "question contains offensive or malicious remarks" +msgstr "" + +#: const/__init__.py:17 +msgid "spam or advertising" +msgstr "" + +#: const/__init__.py:18 +msgid "too localized" +msgstr "" + +#: const/__init__.py:41 +msgid "newest" +msgstr "més recent" + +#: const/__init__.py:42 skins/default/templates/users.html:26 +msgid "oldest" +msgstr "més antic" + +#: const/__init__.py:43 +msgid "active" +msgstr "actiu" + +#: const/__init__.py:44 +msgid "inactive" +msgstr "inactiu" + +#: const/__init__.py:45 +msgid "hottest" +msgstr "més populars" + +#: const/__init__.py:46 +msgid "coldest" +msgstr "" + +#: const/__init__.py:47 +msgid "most voted" +msgstr "" + +#: const/__init__.py:48 +msgid "least voted" +msgstr "més votat" + +#: const/__init__.py:49 +msgid "relevance" +msgstr "" + +#: const/__init__.py:57 skins/default/templates/main_page/tab_bar.html:10 +#: skins/default/templates/user_profile/user_inbox.html:50 +msgid "all" +msgstr "tot" + +#: const/__init__.py:58 skins/default/templates/main_page/tab_bar.html:15 +msgid "unanswered" +msgstr "sense resposta" + +#: const/__init__.py:59 +msgid "favorite" +msgstr "favorit" + +#: const/__init__.py:64 +#, fuzzy +msgid "list" +msgstr "llista" + +#: const/__init__.py:65 +msgid "cloud" +msgstr "núbol" + +#: const/__init__.py:78 +msgid "Question has no answers" +msgstr "La pregunta no té respostes" + +#: const/__init__.py:79 +msgid "Question has no accepted answers" +msgstr "La pregunta no té respostes acceptades" + +#: const/__init__.py:121 +msgid "asked a question" +msgstr "ha fet una pregunta" + +#: const/__init__.py:122 +msgid "answered a question" +msgstr "ha respost una pregunta" + +#: const/__init__.py:123 +msgid "commented question" +msgstr "ha comentat una pregunta" + +#: const/__init__.py:124 +msgid "commented answer" +msgstr "ha commentat una resposta" + +#: const/__init__.py:125 +msgid "edited question" +msgstr "ha editat una pregunta" + +#: const/__init__.py:126 +msgid "edited answer" +msgstr "ha editat una resposta" + +#: const/__init__.py:127 +msgid "received award" +msgstr "ha rebut una insígnia" + +#: const/__init__.py:128 +msgid "marked best answer" +msgstr "ha marcat la millor resposta" + +#: const/__init__.py:129 +msgid "upvoted" +msgstr "votat positivament" + +#: const/__init__.py:130 +msgid "downvoted" +msgstr "votat negativament" + +#: const/__init__.py:131 +msgid "canceled vote" +msgstr "cancelat el vot" + +#: const/__init__.py:132 +msgid "deleted question" +msgstr "pregunta esborrada" + +#: const/__init__.py:133 +msgid "deleted answer" +msgstr "resposta esborrada" + +#: const/__init__.py:134 +msgid "marked offensive" +msgstr "marcat com ofensiu" + +#: const/__init__.py:135 +msgid "updated tags" +msgstr "etiquetes actualitzades" + +#: const/__init__.py:136 +msgid "selected favorite" +msgstr "seleccionat com a favorit" + +#: const/__init__.py:137 +msgid "completed user profile" +msgstr "completat perfil d'usuari" + +#: const/__init__.py:138 +msgid "email update sent to user" +msgstr "enviat missatge d'actualitació a l'usuari" + +#: const/__init__.py:141 +msgid "reminder about unanswered questions sent" +msgstr "enviat recordatori d'una pregunta sense resposta" + +#: const/__init__.py:143 +msgid "mentioned in the post" +msgstr "citat en l'entrada" + +#: const/__init__.py:194 +msgid "question_answered" +msgstr "pregunta resposta" + +#: const/__init__.py:195 +msgid "question_commented" +msgstr "pregunta comentada" + +#: const/__init__.py:196 +msgid "answer_commented" +msgstr "resposta comentada" + +#: const/__init__.py:197 +msgid "answer_accepted" +msgstr "resposta acceptada" + +#: const/__init__.py:201 +msgid "[closed]" +msgstr "[tancat]" + +#: const/__init__.py:202 +msgid "[deleted]" +msgstr "[esborrat]" + +#: const/__init__.py:203 views/readers.py:613 +msgid "initial version" +msgstr "versió inicial" + +#: const/__init__.py:204 +msgid "retagged" +msgstr "reetiquetat" + +#: const/__init__.py:212 +msgid "off" +msgstr "no" + +#: const/__init__.py:213 +msgid "exclude ignored" +msgstr "excloure ignorades" + +#: const/__init__.py:214 +msgid "only selected" +msgstr "només seleccionades" + +#: const/__init__.py:218 +msgid "instantly" +msgstr "instantàniament" + +#: const/__init__.py:219 +msgid "daily" +msgstr "diari" + +#: const/__init__.py:220 +msgid "weekly" +msgstr "setmanal" + +#: const/__init__.py:221 +msgid "no email" +msgstr "no correu electrònic" + +#: const/__init__.py:228 +msgid "identicon" +msgstr "" + +#: const/__init__.py:229 +msgid "mystery-man" +msgstr "" + +#: const/__init__.py:230 +msgid "monsterid" +msgstr "" + +#: const/__init__.py:231 +#, fuzzy +msgid "wavatar" +msgstr "How to change my picture (gravatar) and what is gravatar?" + +#: const/__init__.py:232 +msgid "retro" +msgstr "" + +#: const/__init__.py:279 skins/default/templates/badges.html:37 +msgid "gold" +msgstr "or" + +#: const/__init__.py:280 skins/default/templates/badges.html:46 +msgid "silver" +msgstr "plata" + +#: const/__init__.py:281 skins/default/templates/badges.html:53 +msgid "bronze" +msgstr "bronze" + +#: const/__init__.py:293 +msgid "None" +msgstr "Cap" + +#: const/__init__.py:294 +#, fuzzy +msgid "Gravatar" +msgstr "How to change my picture (gravatar) and what is gravatar?" + +#: const/__init__.py:295 +#, fuzzy +msgid "Uploaded Avatar" +msgstr "How to change my picture (gravatar) and what is gravatar?" + +#: const/message_keys.py:15 +msgid "most relevant questions" +msgstr "" + +#: const/message_keys.py:16 +msgid "click to see most relevant questions" +msgstr "clicar per mostra les preguntes més rellevants" + +#: const/message_keys.py:17 +msgid "by relevance" +msgstr "rellevància" + +#: const/message_keys.py:18 +msgid "click to see the oldest questions" +msgstr "clicar per mostrar les preguntes més antigues" + +#: const/message_keys.py:19 +msgid "by date" +msgstr "data" + +#: const/message_keys.py:20 +msgid "click to see the newest questions" +msgstr "clicar per mostrar les preguntes més recents" + +#: const/message_keys.py:21 +msgid "click to see the least recently updated questions" +msgstr "clicar per mostar les preguntes que porten més temps sense actualitzar" + +#: const/message_keys.py:22 +msgid "by activity" +msgstr "activitat" + +#: const/message_keys.py:23 +msgid "click to see the most recently updated questions" +msgstr "clicar per mostar les preguntes actualitzades recentment" + +#: const/message_keys.py:24 +msgid "click to see the least answered questions" +msgstr "clicar per mostrar les preguntes amb menys respostes" + +#: const/message_keys.py:25 +msgid "by answers" +msgstr "respostes" + +#: const/message_keys.py:26 +msgid "click to see the most answered questions" +msgstr "clicar per mostrar les preguntes amb més respostes" + +#: const/message_keys.py:27 +msgid "click to see least voted questions" +msgstr "clicar per mostrar les preguntes amb menys votades" + +#: const/message_keys.py:28 +msgid "by votes" +msgstr "vots" + +#: const/message_keys.py:29 +msgid "click to see most voted questions" +msgstr "clicar per mostrar les preguntes amb més votades" + +#: deps/django_authopenid/backends.py:88 +msgid "" +"Welcome! Please set email address (important!) in your profile and adjust " +"screen name, if necessary." +msgstr "Us donem la benvinguda. Indiqueu la vostra adreça de correu electrònic (important) i el nom a mostrar, si ho creieu necessari." + +#: deps/django_authopenid/forms.py:110 deps/django_authopenid/views.py:151 +msgid "i-names are not supported" +msgstr "" + +#: deps/django_authopenid/forms.py:233 +#, python-format +msgid "Please enter your %(username_token)s" +msgstr "Introduïu el vostre %(username_token)s" + +#: deps/django_authopenid/forms.py:259 +msgid "Please, enter your user name" +msgstr "Introduïu el vostre nom d'usuari" + +#: deps/django_authopenid/forms.py:263 +msgid "Please, enter your password" +msgstr "Introduïu la vostra contrasenya" + +#: deps/django_authopenid/forms.py:270 deps/django_authopenid/forms.py:274 +msgid "Please, enter your new password" +msgstr "Introduïu la vostra contrasenya nova" + +#: deps/django_authopenid/forms.py:285 +msgid "Passwords did not match" +msgstr "Les contrasenyes no coincideixen" + +#: deps/django_authopenid/forms.py:297 +#, python-format +msgid "Please choose password > %(len)s characters" +msgstr "Escollir una contrasenya de més de %(len)s caràcters" + +#: deps/django_authopenid/forms.py:335 +msgid "Current password" +msgstr "Contrasenya actual" + +#: deps/django_authopenid/forms.py:346 +msgid "" +"Old password is incorrect. Please enter the correct " +"password." +msgstr "La contrasenya antiga és incorrecta. Introduïu la contrasenya correcta." + +#: deps/django_authopenid/forms.py:399 +msgid "Sorry, we don't have this email address in the database" +msgstr "Adreça de correu electrònic inexistent a la base de dades" + +#: deps/django_authopenid/forms.py:435 +msgid "Your user name (<i>required</i>)" +msgstr "El vostre nom d'usuari (<i>requerit</i>)" + +#: deps/django_authopenid/forms.py:450 +msgid "Incorrect username." +msgstr "Nom d'usuari inexistent" + +#: deps/django_authopenid/urls.py:9 deps/django_authopenid/urls.py:12 +#: deps/django_authopenid/urls.py:15 setup_templates/settings.py:203 +msgid "signin/" +msgstr "entrar/" + +#: deps/django_authopenid/urls.py:10 +msgid "signout/" +msgstr "sortir/" + +#: deps/django_authopenid/urls.py:12 +msgid "complete/" +msgstr "" + +#: deps/django_authopenid/urls.py:15 +msgid "complete-oauth/" +msgstr "" + +#: deps/django_authopenid/urls.py:19 +msgid "register/" +msgstr "" + +#: deps/django_authopenid/urls.py:21 +msgid "signup/" +msgstr "registre/" + +#: deps/django_authopenid/urls.py:25 +msgid "logout/" +msgstr "sortir/" + +#: deps/django_authopenid/urls.py:30 +msgid "recover/" +msgstr "recuperar/" + +#: deps/django_authopenid/util.py:378 +#, python-format +msgid "%(site)s user name and password" +msgstr "nom d'usuari i contrasenya %(site)s" + +#: deps/django_authopenid/util.py:384 +#: skins/default/templates/authopenid/signin.html:108 +msgid "Create a password-protected account" +msgstr "Crear un compte amb contrasenya" + +#: deps/django_authopenid/util.py:385 +msgid "Change your password" +msgstr "Canviar la vostra contrasenya" + +#: deps/django_authopenid/util.py:473 +msgid "Sign in with Yahoo" +msgstr "Registrar-se mitjançant Yahoo" + +#: deps/django_authopenid/util.py:480 +msgid "AOL screen name" +msgstr "" + +#: deps/django_authopenid/util.py:488 +msgid "OpenID url" +msgstr "" + +#: deps/django_authopenid/util.py:517 +msgid "Flickr user name" +msgstr "" + +#: deps/django_authopenid/util.py:525 +msgid "Technorati user name" +msgstr "" + +#: deps/django_authopenid/util.py:533 +msgid "WordPress blog name" +msgstr "" + +#: deps/django_authopenid/util.py:541 +msgid "Blogger blog name" +msgstr "" + +#: deps/django_authopenid/util.py:549 +msgid "LiveJournal blog name" +msgstr "" + +#: deps/django_authopenid/util.py:557 +msgid "ClaimID user name" +msgstr "" + +#: deps/django_authopenid/util.py:565 +msgid "Vidoop user name" +msgstr "" + +#: deps/django_authopenid/util.py:573 +msgid "Verisign user name" +msgstr "" + +#: deps/django_authopenid/util.py:608 +#, python-format +msgid "Change your %(provider)s password" +msgstr "" + +#: deps/django_authopenid/util.py:612 +#, python-format +msgid "Click to see if your %(provider)s signin still works for %(site_name)s" +msgstr "" + +#: deps/django_authopenid/util.py:621 +#, python-format +msgid "Create password for %(provider)s" +msgstr "" + +#: deps/django_authopenid/util.py:625 +#, python-format +msgid "Connect your %(provider)s account to %(site_name)s" +msgstr "" + +#: deps/django_authopenid/util.py:634 +#, python-format +msgid "Signin with %(provider)s user name and password" +msgstr "" + +#: deps/django_authopenid/util.py:641 +#, python-format +msgid "Sign in with your %(provider)s account" +msgstr "" + +#: deps/django_authopenid/views.py:158 +#, python-format +msgid "OpenID %(openid_url)s is invalid" +msgstr "" + +#: deps/django_authopenid/views.py:270 deps/django_authopenid/views.py:415 +#: deps/django_authopenid/views.py:443 +#, python-format +msgid "" +"Unfortunately, there was some problem when connecting to %(provider)s, " +"please try again or use another provider" +msgstr "" + +#: deps/django_authopenid/views.py:365 +msgid "Your new password saved" +msgstr "" + +#: deps/django_authopenid/views.py:469 +msgid "The login password combination was not correct" +msgstr "" + +#: deps/django_authopenid/views.py:573 +msgid "Please click any of the icons below to sign in" +msgstr "" + +#: deps/django_authopenid/views.py:575 +msgid "Account recovery email sent" +msgstr "" + +#: deps/django_authopenid/views.py:578 +msgid "Please add one or more login methods." +msgstr "" + +#: deps/django_authopenid/views.py:580 +msgid "If you wish, please add, remove or re-validate your login methods" +msgstr "" + +#: deps/django_authopenid/views.py:582 +msgid "Please wait a second! Your account is recovered, but ..." +msgstr "" + +#: deps/django_authopenid/views.py:584 +msgid "Sorry, this account recovery key has expired or is invalid" +msgstr "" + +#: deps/django_authopenid/views.py:657 +#, python-format +msgid "Login method %(provider_name)s does not exist" +msgstr "" + +#: deps/django_authopenid/views.py:663 +msgid "Oops, sorry - there was some error - please try again" +msgstr "" + +#: deps/django_authopenid/views.py:754 +#, python-format +msgid "Your %(provider)s login works fine" +msgstr "" + +#: deps/django_authopenid/views.py:1065 deps/django_authopenid/views.py:1071 +#, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" +"Your email needs to be validated. Please see details <a " +"id='validate_email_alert' href='%(details_url)s'>here</a>." + +#: deps/django_authopenid/views.py:1092 +#, python-format +msgid "Recover your %(site)s account" +msgstr "" + +#: deps/django_authopenid/views.py:1162 +msgid "Please check your email and visit the enclosed link." +msgstr "" + +#: deps/livesettings/models.py:101 deps/livesettings/models.py:140 +msgid "Site" +msgstr "" + +#: deps/livesettings/values.py:106 +msgid "Base Settings" +msgstr "" + +#: deps/livesettings/values.py:213 +msgid "Default value: \"\"" +msgstr "" + +#: deps/livesettings/values.py:220 +msgid "Default value: " +msgstr "" + +#: deps/livesettings/values.py:223 +#, python-format +msgid "Default value: %s" +msgstr "" + +#: deps/livesettings/values.py:601 +#, python-format +msgid "Allowed image file types are %(types)s" +msgstr "" + +#: deps/livesettings/templates/livesettings/_admin_site_views.html:4 +msgid "Sites" +msgstr "" + +#: deps/livesettings/templates/livesettings/group_settings.html:11 +#: deps/livesettings/templates/livesettings/site_settings.html:23 +msgid "Documentation" +msgstr "" + +#: deps/livesettings/templates/livesettings/group_settings.html:11 +#: deps/livesettings/templates/livesettings/site_settings.html:23 +#: skins/default/templates/authopenid/signin.html:132 +msgid "Change password" +msgstr "" + +#: deps/livesettings/templates/livesettings/group_settings.html:11 +#: deps/livesettings/templates/livesettings/site_settings.html:23 +msgid "Log out" +msgstr "" + +#: deps/livesettings/templates/livesettings/group_settings.html:14 +#: deps/livesettings/templates/livesettings/site_settings.html:26 +msgid "Home" +msgstr "" + +#: deps/livesettings/templates/livesettings/group_settings.html:15 +msgid "Edit Group Settings" +msgstr "" + +#: deps/livesettings/templates/livesettings/group_settings.html:22 +#: deps/livesettings/templates/livesettings/site_settings.html:50 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#: deps/livesettings/templates/livesettings/group_settings.html:28 +#, python-format +msgid "Settings included in %(name)s." +msgstr "" + +#: deps/livesettings/templates/livesettings/group_settings.html:62 +#: deps/livesettings/templates/livesettings/site_settings.html:97 +msgid "You don't have permission to edit values." +msgstr "" + +#: deps/livesettings/templates/livesettings/group_settings.html:68 +msgid "Setting groups" +msgstr "" + +#: deps/livesettings/templates/livesettings/site_settings.html:27 +msgid "Edit Site Settings" +msgstr "" + +#: deps/livesettings/templates/livesettings/site_settings.html:43 +msgid "Livesettings are disabled for this site." +msgstr "" + +#: deps/livesettings/templates/livesettings/site_settings.html:44 +msgid "All configuration options must be edited in the site settings.py file" +msgstr "" + +#: deps/livesettings/templates/livesettings/site_settings.html:66 +#, python-format +msgid "Group settings: %(name)s" +msgstr "" + +#: deps/livesettings/templates/livesettings/site_settings.html:93 +msgid "Uncollapse all" +msgstr "" + +#: importers/stackexchange/management/commands/load_stackexchange.py:141 +msgid "Congratulations, you are now an Administrator" +msgstr "" + +#: management/commands/initialize_ldap_logins.py:51 +msgid "" +"This command may help you migrate to LDAP password authentication by " +"creating a record for LDAP association with each user account. There is an " +"assumption that ldap user id's are the same as user names registered at the " +"site. Before running this command it is necessary to set up LDAP parameters " +"in the \"External keys\" section of the site settings." +msgstr "" + +#: management/commands/post_emailed_questions.py:35 +msgid "" +"<p>To ask by email, please:</p>\n" +"<ul>\n" +" <li>Format the subject line as: [Tag1; Tag2] Question title</li>\n" +" <li>Type details of your question into the email body</li>\n" +"</ul>\n" +"<p>Note that tags may consist of more than one word, and tags\n" +"may be separated by a semicolon or a comma</p>\n" +msgstr "" + +#: management/commands/post_emailed_questions.py:55 +#, python-format +msgid "" +"<p>Sorry, there was an error posting your question please contact the %(site)" +"s administrator</p>" +msgstr "" + +#: management/commands/post_emailed_questions.py:61 +#, python-format +msgid "" +"<p>Sorry, in order to post questions on %(site)s by email, please <a href=\"%" +"(url)s\">register first</a></p>" +msgstr "" + +#: management/commands/post_emailed_questions.py:69 +msgid "" +"<p>Sorry, your question could not be posted due to insufficient privileges " +"of your user account</p>" +msgstr "" + +#: management/commands/send_email_alerts.py:411 +#, python-format +msgid "%(question_count)d updated question about %(topics)s" +msgid_plural "%(question_count)d updated questions about %(topics)s" +msgstr[0] "" +msgstr[1] "" + +#: management/commands/send_email_alerts.py:421 +#, python-format +msgid "%(name)s, this is an update message header for %(num)d question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "" +"<p>Dear %(name)s,</p></p>The following question has been updated on the Q&A " +"forum:</p>" +msgstr[1] "" +"<p>Dear %(name)s,</p><p>The following %(num)d questions have been updated on " +"the Q&A forum:</p>" + +#: management/commands/send_email_alerts.py:438 +msgid "new question" +msgstr "" + +#: management/commands/send_email_alerts.py:455 +msgid "" +"Please visit the askbot and see what's new! Could you spread the word about " +"it - can somebody you know help answering those questions or benefit from " +"posting one?" +msgstr "" + +#: management/commands/send_email_alerts.py:465 +msgid "" +"Your most frequent subscription setting is 'daily' on selected questions. If " +"you are receiving more than one email per dayplease tell about this issue to " +"the askbot administrator." +msgstr "" + +#: management/commands/send_email_alerts.py:471 +msgid "" +"Your most frequent subscription setting is 'weekly' if you are receiving " +"this email more than once a week please report this issue to the askbot " +"administrator." +msgstr "" + +#: management/commands/send_email_alerts.py:477 +msgid "" +"There is a chance that you may be receiving links seen before - due to a " +"technicality that will eventually go away. " +msgstr "" + +#: management/commands/send_email_alerts.py:490 +#, python-format +msgid "" +"go to %(email_settings_link)s to change frequency of email updates or %" +"(admin_email)s administrator" +msgstr "" +"<p>Please remember that you can always <a href='%(email_settings_link)" +"s'>adjust</a> frequency of the email updates or turn them off entirely.<br/" +">If you believe that this message was sent in an error, please email about " +"it the forum administrator at %(admin_email)s.</p><p>Sincerely,</p><p>Your " +"friendly Q&A forum server.</p>" + +#: management/commands/send_unanswered_question_reminders.py:80 +#, python-format +msgid "%(question_count)d unanswered question about %(topics)s" +msgid_plural "%(question_count)d unanswered questions about %(topics)s" +msgstr[0] "" +msgstr[1] "" + +#: models/__init__.py:316 +msgid "" +"Sorry, you cannot accept or unaccept best answers because your account is " +"blocked" +msgstr "" + +#: models/__init__.py:320 +msgid "" +"Sorry, you cannot accept or unaccept best answers because your account is " +"suspended" +msgstr "" + +#: models/__init__.py:333 +#, python-format +msgid "" +">%(points)s points required to accept or unaccept your own answer to your " +"own question" +msgstr "" + +#: models/__init__.py:347 +#, python-format +msgid "" +"Sorry, only original author of the question - %(username)s - can accept or " +"unaccept the best answer" +msgstr "" + +#: models/__init__.py:375 +msgid "cannot vote for own posts" +msgstr "Sorry, you cannot vote for your own posts" + +#: models/__init__.py:378 +msgid "Sorry your account appears to be blocked " +msgstr "" + +#: models/__init__.py:383 +msgid "Sorry your account appears to be suspended " +msgstr "" + +#: models/__init__.py:393 +#, python-format +msgid ">%(points)s points required to upvote" +msgstr ">%(points)s points required to upvote " + +#: models/__init__.py:399 +#, python-format +msgid ">%(points)s points required to downvote" +msgstr ">%(points)s points required to downvote " + +#: models/__init__.py:414 +msgid "Sorry, blocked users cannot upload files" +msgstr "" + +#: models/__init__.py:415 +msgid "Sorry, suspended users cannot upload files" +msgstr "" + +#: models/__init__.py:417 +#, python-format +msgid "" +"uploading images is limited to users with >%(min_rep)s reputation points" +msgstr "sorry, file uploading requires karma >%(min_rep)s" + +#: models/__init__.py:436 models/__init__.py:503 models/__init__.py:918 +msgid "blocked users cannot post" +msgstr "" +"Sorry, your account appears to be blocked and you cannot make new posts " +"until this issue is resolved. Please contact the forum administrator to " +"reach a resolution." + +#: models/__init__.py:437 models/__init__.py:921 +msgid "suspended users cannot post" +msgstr "" +"Sorry, your account appears to be suspended and you cannot make new posts " +"until this issue is resolved. You can, however edit your existing posts. " +"Please contact the forum administrator to reach a resolution." + +#: models/__init__.py:464 +#, python-format +msgid "" +"Sorry, comments (except the last one) are editable only within %(minutes)s " +"minute from posting" +msgid_plural "" +"Sorry, comments (except the last one) are editable only within %(minutes)s " +"minutes from posting" +msgstr[0] "" +msgstr[1] "" + +#: models/__init__.py:476 +msgid "Sorry, but only post owners or moderators can edit comments" +msgstr "" + +#: models/__init__.py:489 +msgid "" +"Sorry, since your account is suspended you can comment only your own posts" +msgstr "" + +#: models/__init__.py:493 +#, python-format +msgid "" +"Sorry, to comment any post a minimum reputation of %(min_rep)s points is " +"required. You can still comment your own posts and answers to your questions" +msgstr "" + +#: models/__init__.py:521 +msgid "" +"This post has been deleted and can be seen only by post owners, site " +"administrators and moderators" +msgstr "" + +#: models/__init__.py:538 +msgid "" +"Sorry, only moderators, site administrators and post owners can edit deleted " +"posts" +msgstr "" + +#: models/__init__.py:553 +msgid "Sorry, since your account is blocked you cannot edit posts" +msgstr "" + +#: models/__init__.py:557 +msgid "Sorry, since your account is suspended you can edit only your own posts" +msgstr "" + +#: models/__init__.py:562 +#, python-format +msgid "" +"Sorry, to edit wiki posts, a minimum reputation of %(min_rep)s is required" +msgstr "" + +#: models/__init__.py:569 +#, python-format +msgid "" +"Sorry, to edit other people's posts, a minimum reputation of %(min_rep)s is " +"required" +msgstr "" + +#: models/__init__.py:632 +msgid "" +"Sorry, cannot delete your question since it has an upvoted answer posted by " +"someone else" +msgid_plural "" +"Sorry, cannot delete your question since it has some upvoted answers posted " +"by other users" +msgstr[0] "" +msgstr[1] "" + +#: models/__init__.py:647 +msgid "Sorry, since your account is blocked you cannot delete posts" +msgstr "" + +#: models/__init__.py:651 +msgid "" +"Sorry, since your account is suspended you can delete only your own posts" +msgstr "" + +#: models/__init__.py:655 +#, python-format +msgid "" +"Sorry, to deleted other people' posts, a minimum reputation of %(min_rep)s " +"is required" +msgstr "" + +#: models/__init__.py:675 +msgid "Sorry, since your account is blocked you cannot close questions" +msgstr "" + +#: models/__init__.py:679 +msgid "Sorry, since your account is suspended you cannot close questions" +msgstr "" + +#: models/__init__.py:683 +#, python-format +msgid "" +"Sorry, to close other people' posts, a minimum reputation of %(min_rep)s is " +"required" +msgstr "" + +#: models/__init__.py:692 +#, python-format +msgid "" +"Sorry, to close own question a minimum reputation of %(min_rep)s is required" +msgstr "" + +#: models/__init__.py:716 +#, python-format +msgid "" +"Sorry, only administrators, moderators or post owners with reputation > %" +"(min_rep)s can reopen questions." +msgstr "" + +#: models/__init__.py:722 +#, python-format +msgid "" +"Sorry, to reopen own question a minimum reputation of %(min_rep)s is required" +msgstr "" + +#: models/__init__.py:742 +msgid "cannot flag message as offensive twice" +msgstr "You have flagged this question before and cannot do it more than once" + +#: models/__init__.py:747 +msgid "blocked users cannot flag posts" +msgstr "" +"Sorry, since your account is blocked you cannot flag posts as offensive" + +#: models/__init__.py:749 +msgid "suspended users cannot flag posts" +msgstr "" +"Sorry, your account appears to be suspended and you cannot make new posts " +"until this issue is resolved. You can, however edit your existing posts. " +"Please contact the forum administrator to reach a resolution." + +#: models/__init__.py:751 +#, python-format +msgid "need > %(min_rep)s points to flag spam" +msgstr "" +"Sorry, to flag posts as offensive a minimum reputation of %(min_rep)s is " +"required" + +#: models/__init__.py:770 +#, python-format +msgid "%(max_flags_per_day)s exceeded" +msgstr "" +"Sorry, you have exhausted the maximum number of %(max_flags_per_day)s " +"offensive flags per day." + +#: models/__init__.py:785 +msgid "" +"Sorry, only question owners, site administrators and moderators can retag " +"deleted questions" +msgstr "" + +#: models/__init__.py:792 +msgid "Sorry, since your account is blocked you cannot retag questions" +msgstr "" + +#: models/__init__.py:796 +msgid "" +"Sorry, since your account is suspended you can retag only your own questions" +msgstr "" + +#: models/__init__.py:800 +#, python-format +msgid "" +"Sorry, to retag questions a minimum reputation of %(min_rep)s is required" +msgstr "" + +#: models/__init__.py:819 +msgid "Sorry, since your account is blocked you cannot delete comment" +msgstr "" + +#: models/__init__.py:823 +msgid "" +"Sorry, since your account is suspended you can delete only your own comments" +msgstr "" + +#: models/__init__.py:827 +#, python-format +msgid "Sorry, to delete comments reputation of %(min_rep)s is required" +msgstr "" + +#: models/__init__.py:850 +msgid "cannot revoke old vote" +msgstr "sorry, but older votes cannot be revoked" + +#: models/__init__.py:1325 utils/functions.py:70 +#, python-format +msgid "on %(date)s" +msgstr "" + +#: models/__init__.py:1327 +msgid "in two days" +msgstr "" + +#: models/__init__.py:1329 +msgid "tomorrow" +msgstr "" + +#: models/__init__.py:1331 +#, python-format +msgid "in %(hr)d hour" +msgid_plural "in %(hr)d hours" +msgstr[0] "" +msgstr[1] "" + +#: models/__init__.py:1333 +#, python-format +msgid "in %(min)d min" +msgid_plural "in %(min)d mins" +msgstr[0] "" +msgstr[1] "" + +#: models/__init__.py:1334 +#, python-format +msgid "%(days)d day" +msgid_plural "%(days)d days" +msgstr[0] "" +msgstr[1] "" + +#: models/__init__.py:1336 +#, python-format +msgid "" +"New users must wait %(days)s before answering their own question. You can " +"post an answer %(left)s" +msgstr "" + +#: models/__init__.py:1502 skins/default/templates/feedback_email.txt:9 +msgid "Anonymous" +msgstr "" + +#: models/__init__.py:1598 views/users.py:365 +msgid "Site Adminstrator" +msgstr "" + +#: models/__init__.py:1600 views/users.py:367 +msgid "Forum Moderator" +msgstr "" + +#: models/__init__.py:1602 views/users.py:369 +msgid "Suspended User" +msgstr "" + +#: models/__init__.py:1604 views/users.py:371 +msgid "Blocked User" +msgstr "" + +#: models/__init__.py:1606 views/users.py:373 +msgid "Registered User" +msgstr "" + +#: models/__init__.py:1608 +msgid "Watched User" +msgstr "" + +#: models/__init__.py:1610 +msgid "Approved User" +msgstr "" + +#: models/__init__.py:1719 +#, python-format +msgid "%(username)s karma is %(reputation)s" +msgstr "" + +#: models/__init__.py:1729 +#, python-format +msgid "one gold badge" +msgid_plural "%(count)d gold badges" +msgstr[0] "" +msgstr[1] "" + +#: models/__init__.py:1736 +#, python-format +msgid "one silver badge" +msgid_plural "%(count)d silver badges" +msgstr[0] "" +msgstr[1] "" + +#: models/__init__.py:1743 +#, python-format +msgid "one bronze badge" +msgid_plural "%(count)d bronze badges" +msgstr[0] "" +msgstr[1] "" + +#: models/__init__.py:1754 +#, python-format +msgid "%(item1)s and %(item2)s" +msgstr "" + +#: models/__init__.py:1758 +#, python-format +msgid "%(user)s has %(badges)s" +msgstr "" + +#: models/__init__.py:2165 models/__init__.py:2171 models/__init__.py:2176 +#: models/__init__.py:2181 +#, python-format +msgid "Re: \"%(title)s\"" +msgstr "" + +#: models/__init__.py:2186 models/__init__.py:2191 +#, python-format +msgid "Question: \"%(title)s\"" +msgstr "" + +#: models/__init__.py:2372 +#, python-format +msgid "" +"Congratulations, you have received a badge '%(badge_name)s'. Check out <a " +"href=\"%(user_profile)s\">your profile</a>." +msgstr "" + +#: models/__init__.py:2551 views/commands.py:396 +msgid "Your tag subscription was saved, thanks!" +msgstr "" + +#: models/answer.py:105 +msgid "" +"Sorry, the answer you are looking for is no longer available, because the " +"parent question has been removed" +msgstr "" + +#: models/answer.py:112 +msgid "Sorry, this answer has been removed and is no longer accessible" +msgstr "" + +#: models/badges.py:129 +#, python-format +msgid "Deleted own post with %(votes)s or more upvotes" +msgstr "" + +#: models/badges.py:133 +msgid "Disciplined" +msgstr "" + +#: models/badges.py:151 +#, python-format +msgid "Deleted own post with %(votes)s or more downvotes" +msgstr "" + +#: models/badges.py:155 +msgid "Peer Pressure" +msgstr "" + +#: models/badges.py:174 +#, python-format +msgid "Received at least %(votes)s upvote for an answer for the first time" +msgstr "" + +#: models/badges.py:178 +msgid "Teacher" +msgstr "" + +#: models/badges.py:218 +msgid "Supporter" +msgstr "" + +#: models/badges.py:219 +msgid "First upvote" +msgstr "" + +#: models/badges.py:227 +msgid "Critic" +msgstr "" + +#: models/badges.py:228 +msgid "First downvote" +msgstr "" + +#: models/badges.py:237 +msgid "Civic Duty" +msgstr "" + +#: models/badges.py:238 +#, python-format +msgid "Voted %(num)s times" +msgstr "" + +#: models/badges.py:252 +#, python-format +msgid "Answered own question with at least %(num)s up votes" +msgstr "" + +#: models/badges.py:256 +msgid "Self-Learner" +msgstr "" + +#: models/badges.py:304 +msgid "Nice Answer" +msgstr "" + +#: models/badges.py:309 models/badges.py:321 models/badges.py:333 +#, python-format +msgid "Answer voted up %(num)s times" +msgstr "" + +#: models/badges.py:316 +msgid "Good Answer" +msgstr "" + +#: models/badges.py:328 +msgid "Great Answer" +msgstr "" + +#: models/badges.py:340 +msgid "Nice Question" +msgstr "" + +#: models/badges.py:345 models/badges.py:357 models/badges.py:369 +#, python-format +msgid "Question voted up %(num)s times" +msgstr "" + +#: models/badges.py:352 +msgid "Good Question" +msgstr "" + +#: models/badges.py:364 +msgid "Great Question" +msgstr "" + +#: models/badges.py:376 +msgid "Student" +msgstr "" + +#: models/badges.py:381 +msgid "Asked first question with at least one up vote" +msgstr "" + +#: models/badges.py:414 +msgid "Popular Question" +msgstr "" + +#: models/badges.py:418 models/badges.py:429 models/badges.py:441 +#, python-format +msgid "Asked a question with %(views)s views" +msgstr "" + +#: models/badges.py:425 +msgid "Notable Question" +msgstr "" + +#: models/badges.py:436 +msgid "Famous Question" +msgstr "" + +#: models/badges.py:450 +msgid "Asked a question and accepted an answer" +msgstr "" + +#: models/badges.py:453 +msgid "Scholar" +msgstr "" + +#: models/badges.py:495 +msgid "Enlightened" +msgstr "" + +#: models/badges.py:499 +#, python-format +msgid "First answer was accepted with %(num)s or more votes" +msgstr "" + +#: models/badges.py:507 +msgid "Guru" +msgstr "" + +#: models/badges.py:510 +#, python-format +msgid "Answer accepted with %(num)s or more votes" +msgstr "" + +#: models/badges.py:518 +#, python-format +msgid "" +"Answered a question more than %(days)s days later with at least %(votes)s " +"votes" +msgstr "" + +#: models/badges.py:525 +msgid "Necromancer" +msgstr "" + +#: models/badges.py:548 +msgid "Citizen Patrol" +msgstr "" + +#: models/badges.py:551 +msgid "First flagged post" +msgstr "" + +#: models/badges.py:563 +msgid "Cleanup" +msgstr "" + +#: models/badges.py:566 +msgid "First rollback" +msgstr "" + +#: models/badges.py:577 +msgid "Pundit" +msgstr "" + +#: models/badges.py:580 +msgid "Left 10 comments with score of 10 or more" +msgstr "" + +#: models/badges.py:612 +msgid "Editor" +msgstr "" + +#: models/badges.py:615 +msgid "First edit" +msgstr "" + +#: models/badges.py:623 +msgid "Associate Editor" +msgstr "" + +#: models/badges.py:627 +#, python-format +msgid "Edited %(num)s entries" +msgstr "" + +#: models/badges.py:634 +msgid "Organizer" +msgstr "" + +#: models/badges.py:637 +msgid "First retag" +msgstr "" + +#: models/badges.py:644 +msgid "Autobiographer" +msgstr "" + +#: models/badges.py:647 +msgid "Completed all user profile fields" +msgstr "" + +#: models/badges.py:663 +#, python-format +msgid "Question favorited by %(num)s users" +msgstr "" + +#: models/badges.py:689 +msgid "Stellar Question" +msgstr "" + +#: models/badges.py:698 +msgid "Favorite Question" +msgstr "" + +#: models/badges.py:710 +msgid "Enthusiast" +msgstr "" + +#: models/badges.py:714 +#, python-format +msgid "Visited site every day for %(num)s days in a row" +msgstr "" + +#: models/badges.py:732 +msgid "Commentator" +msgstr "" + +#: models/badges.py:736 +#, python-format +msgid "Posted %(num_comments)s comments" +msgstr "" + +#: models/badges.py:752 +msgid "Taxonomist" +msgstr "" + +#: models/badges.py:756 +#, python-format +msgid "Created a tag used by %(num)s questions" +msgstr "" + +#: models/badges.py:776 +msgid "Expert" +msgstr "" + +#: models/badges.py:779 +msgid "Very active in one tag" +msgstr "" + +#: models/meta.py:112 +msgid "" +"Sorry, the comment you are looking for is no longer accessible, because the " +"parent question has been removed" +msgstr "" + +#: models/meta.py:119 +msgid "" +"Sorry, the comment you are looking for is no longer accessible, because the " +"parent answer has been removed" +msgstr "" + +#: models/question.py:72 +#, python-format +msgid "\" and \"%s\"" +msgstr "" + +#: models/question.py:75 +msgid "\" and more" +msgstr "" + +#: models/question.py:452 +msgid "Sorry, this question has been deleted and is no longer accessible" +msgstr "" + +#: models/question.py:908 +#, python-format +msgid "%(author)s modified the question" +msgstr "" + +#: models/question.py:912 +#, python-format +msgid "%(people)s posted %(new_answer_count)s new answers" +msgstr "" + +#: models/question.py:917 +#, python-format +msgid "%(people)s commented the question" +msgstr "" + +#: models/question.py:922 +#, python-format +msgid "%(people)s commented answers" +msgstr "" + +#: models/question.py:924 +#, python-format +msgid "%(people)s commented an answer" +msgstr "" + +#: models/repute.py:142 +#, python-format +msgid "<em>Changed by moderator. Reason:</em> %(reason)s" +msgstr "" + +#: models/repute.py:153 +#, python-format +msgid "" +"%(points)s points were added for %(username)s's contribution to question %" +"(question_title)s" +msgstr "" + +#: models/repute.py:158 +#, python-format +msgid "" +"%(points)s points were subtracted for %(username)s's contribution to " +"question %(question_title)s" +msgstr "" + +#: models/tag.py:151 +msgid "interesting" +msgstr "" + +#: models/tag.py:151 +msgid "ignored" +msgstr "" + +#: models/user.py:264 +msgid "Entire forum" +msgstr "" + +#: models/user.py:265 +msgid "Questions that I asked" +msgstr "" + +#: models/user.py:266 +msgid "Questions that I answered" +msgstr "" + +#: models/user.py:267 +msgid "Individually selected questions" +msgstr "" + +#: models/user.py:268 +msgid "Mentions and comment responses" +msgstr "" + +#: models/user.py:271 +msgid "Instantly" +msgstr "" + +#: models/user.py:272 +msgid "Daily" +msgstr "" + +#: models/user.py:273 +msgid "Weekly" +msgstr "" + +#: models/user.py:274 +msgid "No email" +msgstr "" + +#: skins/default/templates/404.jinja.html:3 +#: skins/default/templates/404.jinja.html:10 +msgid "Page not found" +msgstr "" + +#: skins/default/templates/404.jinja.html:13 +msgid "Sorry, could not find the page you requested." +msgstr "" + +#: skins/default/templates/404.jinja.html:15 +msgid "This might have happened for the following reasons:" +msgstr "" + +#: skins/default/templates/404.jinja.html:17 +msgid "this question or answer has been deleted;" +msgstr "" + +#: skins/default/templates/404.jinja.html:18 +msgid "url has error - please check it;" +msgstr "" + +#: skins/default/templates/404.jinja.html:19 +msgid "" +"the page you tried to visit is protected or you don't have sufficient " +"points, see" +msgstr "" + +#: skins/default/templates/404.jinja.html:19 +#: skins/default/templates/blocks/footer.html:5 +#: skins/default/templates/blocks/header_meta_links.html:13 +#: skins/default/templates/blocks/question_edit_tips.html:15 +msgid "faq" +msgstr "" + +#: skins/default/templates/404.jinja.html:20 +msgid "if you believe this error 404 should not have occured, please" +msgstr "" + +#: skins/default/templates/404.jinja.html:21 +msgid "report this problem" +msgstr "" + +#: skins/default/templates/404.jinja.html:30 +#: skins/default/templates/500.jinja.html:11 +msgid "back to previous page" +msgstr "" + +#: skins/default/templates/404.jinja.html:31 +#: skins/default/templates/main_page/tab_bar.html:9 +#, fuzzy +msgid "see all questions" +msgstr "Ask Your Question" + +#: skins/default/templates/404.jinja.html:32 +#, fuzzy +msgid "see all tags" +msgstr "Tags" + +#: skins/default/templates/500.jinja.html:3 +#: skins/default/templates/500.jinja.html:5 +msgid "Internal server error" +msgstr "" + +#: skins/default/templates/500.jinja.html:8 +msgid "system error log is recorded, error will be fixed as soon as possible" +msgstr "" + +#: skins/default/templates/500.jinja.html:9 +msgid "please report the error to the site administrators if you wish" +msgstr "" + +#: skins/default/templates/500.jinja.html:12 +#, fuzzy +msgid "see latest questions" +msgstr "Post Your Answer" + +#: skins/default/templates/500.jinja.html:13 +#, fuzzy +msgid "see tags" +msgstr "Tags" + +#: skins/default/templates/about.html:3 skins/default/templates/about.html:5 +#, python-format +msgid "About %(site_name)s" +msgstr "" + +#: skins/default/templates/answer_edit.html:4 +#: skins/default/templates/answer_edit.html:10 +#, fuzzy +msgid "Edit answer" +msgstr "oldest" + +#: skins/default/templates/answer_edit.html:10 +#: skins/default/templates/question_edit.html:9 +#: skins/default/templates/question_retag.html:5 +#: skins/default/templates/revisions.html:7 +msgid "back" +msgstr "" + +#: skins/default/templates/answer_edit.html:14 +msgid "revision" +msgstr "" + +#: skins/default/templates/answer_edit.html:17 +#: skins/default/templates/question_edit.html:16 +msgid "select revision" +msgstr "" + +#: skins/default/templates/answer_edit.html:21 +#: skins/default/templates/question_edit.html:27 +msgid "Save edit" +msgstr "" + +#: skins/default/templates/answer_edit.html:22 +#: skins/default/templates/close.html:16 +#: skins/default/templates/feedback.html:42 +#: skins/default/templates/question_edit.html:28 +#: skins/default/templates/question_retag.html:22 +#: skins/default/templates/reopen.html:27 +#: skins/default/templates/subscribe_for_tags.html:16 +#: skins/default/templates/authopenid/changeemail.html:38 +#: skins/default/templates/user_profile/user_edit.html:84 +msgid "Cancel" +msgstr "" + +#: skins/default/templates/answer_edit.html:60 +#: skins/default/templates/answer_edit.html:63 +#: skins/default/templates/ask.html:46 skins/default/templates/ask.html:49 +#: skins/default/templates/macros.html:698 +#: skins/default/templates/question.html:576 +#: skins/default/templates/question.html:579 +#: skins/default/templates/question_edit.html:72 +#: skins/default/templates/question_edit.html:75 +msgid "hide preview" +msgstr "" + +#: skins/default/templates/answer_edit.html:63 +#: skins/default/templates/ask.html:49 +#: skins/default/templates/question.html:579 +#: skins/default/templates/question_edit.html:75 +msgid "show preview" +msgstr "" + +#: skins/default/templates/ask.html:4 +#, fuzzy +msgid "Ask a question" +msgstr "Ask Your Question" + +#: skins/default/templates/badge.html:4 skins/default/templates/badge.html:8 +#: skins/default/templates/user_profile/user_recent.html:16 +#: skins/default/templates/user_profile/user_stats.html:110 +#, python-format +msgid "%(name)s" +msgstr "" + +#: skins/default/templates/badge.html:4 +msgid "Badge" +msgstr "" + +#: skins/default/templates/badge.html:6 +#, python-format +msgid "Badge \"%(name)s\"" +msgstr "" + +#: skins/default/templates/badge.html:8 +#: skins/default/templates/user_profile/user_recent.html:16 +#: skins/default/templates/user_profile/user_stats.html:108 +#, python-format +msgid "%(description)s" +msgstr "" + +#: skins/default/templates/badge.html:13 +msgid "user received this badge:" +msgid_plural "users received this badge:" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/badges.html:3 +msgid "Badges summary" +msgstr "Badges" + +#: skins/default/templates/badges.html:5 +#, fuzzy +msgid "Badges" +msgstr "Badges" + +#: skins/default/templates/badges.html:7 +msgid "Community gives you awards for your questions, answers and votes." +msgstr "" + +#: skins/default/templates/badges.html:8 +#, python-format +msgid "" +"Below is the list of available badges and number \n" +"of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +msgstr "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Have ideas about fun " +"badges? Please, give us your <a href='%(feedback_faq_url)s'>feedback</a>\n" + +#: skins/default/templates/badges.html:35 +msgid "Community badges" +msgstr "Badge levels" + +#: skins/default/templates/badges.html:37 +msgid "gold badge: the highest honor and is very rare" +msgstr "" + +#: skins/default/templates/badges.html:40 +msgid "gold badge description" +msgstr "" +"Gold badge is the highest award in this community. To obtain it have to show " +"profound knowledge and ability in addition to your active participation." + +#: skins/default/templates/badges.html:45 +msgid "" +"silver badge: occasionally awarded for the very high quality contributions" +msgstr "" + +#: skins/default/templates/badges.html:49 +msgid "silver badge description" +msgstr "" +"silver badge: occasionally awarded for the very high quality contributions" + +#: skins/default/templates/badges.html:52 +msgid "bronze badge: often given as a special honor" +msgstr "" + +#: skins/default/templates/badges.html:56 +msgid "bronze badge description" +msgstr "bronze badge: often given as a special honor" + +#: skins/default/templates/close.html:3 skins/default/templates/close.html:5 +#, fuzzy +msgid "Close question" +msgstr "Post Your Answer" + +#: skins/default/templates/close.html:6 +#, fuzzy +msgid "Close the question" +msgstr "Post Your Answer" + +#: skins/default/templates/close.html:11 +msgid "Reasons" +msgstr "" + +#: skins/default/templates/close.html:15 +msgid "OK to close" +msgstr "" + +#: skins/default/templates/faq.html:3 +#: skins/default/templates/faq_static.html:3 +#: skins/default/templates/faq_static.html:5 +msgid "FAQ" +msgstr "" + +#: skins/default/templates/faq_static.html:5 +msgid "Frequently Asked Questions " +msgstr "" + +#: skins/default/templates/faq_static.html:6 +msgid "What kinds of questions can I ask here?" +msgstr "" + +#: skins/default/templates/faq_static.html:7 +msgid "" +"Most importanly - questions should be <strong>relevant</strong> to this " +"community." +msgstr "" + +#: skins/default/templates/faq_static.html:8 +msgid "" +"Before asking the question - please make sure to use search to see whether " +"your question has alredy been answered." +msgstr "" +"Before you ask - please make sure to search for a similar question. You can " +"search questions by their title or tags." + +#: skins/default/templates/faq_static.html:10 +msgid "What questions should I avoid asking?" +msgstr "What kinds of questions should be avoided?" + +#: skins/default/templates/faq_static.html:11 +msgid "" +"Please avoid asking questions that are not relevant to this community, too " +"subjective and argumentative." +msgstr "" + +#: skins/default/templates/faq_static.html:13 +#, fuzzy +msgid "What should I avoid in my answers?" +msgstr "What kinds of questions should be avoided?" + +#: skins/default/templates/faq_static.html:14 +msgid "" +"is a Q&A site, not a discussion group. Therefore - please avoid having " +"discussions in your answers, comment facility allows some space for brief " +"discussions." +msgstr "" +"is a <strong>question and answer</strong> site - <strong>it is not a " +"discussion group</strong>. Please avoid holding debates in your answers as " +"they tend to dilute the essense of questions and answers. For the brief " +"discussions please use commenting facility." + +#: skins/default/templates/faq_static.html:15 +msgid "Who moderates this community?" +msgstr "" + +#: skins/default/templates/faq_static.html:16 +msgid "The short answer is: <strong>you</strong>." +msgstr "" + +#: skins/default/templates/faq_static.html:17 +msgid "This website is moderated by the users." +msgstr "" + +#: skins/default/templates/faq_static.html:18 +msgid "" +"The reputation system allows users earn the authorization to perform a " +"variety of moderation tasks." +msgstr "" +"Karma system allows users to earn rights to perform a variety of moderation " +"tasks" + +#: skins/default/templates/faq_static.html:20 +msgid "How does reputation system work?" +msgstr "How does karma system work?" + +#: skins/default/templates/faq_static.html:21 +msgid "Rep system summary" +msgstr "" +"When a question or answer is upvoted, the user who posted them will gain " +"some points, which are called \"karma points\". These points serve as a " +"rough measure of the community trust to him/her. Various moderation tasks " +"are gradually assigned to the users based on those points." + +#: skins/default/templates/faq_static.html:22 +#, python-format +msgid "" +"For example, if you ask an interesting question or give a helpful answer, " +"your input will be upvoted. On the other hand if the answer is misleading - " +"it will be downvoted. Each vote in favor will generate <strong>%" +"(REP_GAIN_FOR_RECEIVING_UPVOTE)s</strong> points, each vote against will " +"subtract <strong>%(REP_LOSS_FOR_RECEIVING_DOWNVOTE)s</strong> points. There " +"is a limit of <strong>%(MAX_REP_GAIN_PER_USER_PER_DAY)s</strong> points that " +"can be accumulated for a question or answer per day. The table below " +"explains reputation point requirements for each type of moderation task." +msgstr "" + +#: skins/default/templates/faq_static.html:32 +#: skins/default/templates/user_profile/user_votes.html:13 +msgid "upvote" +msgstr "" + +#: skins/default/templates/faq_static.html:37 +#, fuzzy +msgid "use tags" +msgstr "Tags" + +#: skins/default/templates/faq_static.html:42 +#, fuzzy +msgid "add comments" +msgstr "post a comment" + +#: skins/default/templates/faq_static.html:46 +#: skins/default/templates/user_profile/user_votes.html:15 +msgid "downvote" +msgstr "" + +#: skins/default/templates/faq_static.html:49 +#, fuzzy +msgid " accept own answer to own questions" +msgstr "" +"<span class='big strong'>Please try to give a substantial answer</span>. If " +"you wanted to comment on the question or answer, just <strong>use the " +"commenting tool</strong>. Please remember that you can always <strong>revise " +"your answers</strong> - no need to answer the same question twice. Also, " +"please <strong>don't forget to vote</strong> - it really helps to select the " +"best questions and answers!" + +#: skins/default/templates/faq_static.html:53 +#, fuzzy +msgid "open and close own questions" +msgstr "Post Your Answer" + +#: skins/default/templates/faq_static.html:57 +#, fuzzy +msgid "retag other's questions" +msgstr "Post Your Answer" + +#: skins/default/templates/faq_static.html:62 +msgid "edit community wiki questions" +msgstr "" + +#: skins/default/templates/faq_static.html:67 +#, fuzzy +msgid "\"edit any answer" +msgstr "answers" + +#: skins/default/templates/faq_static.html:71 +#, fuzzy +msgid "\"delete any comment" +msgstr "post a comment" + +#: skins/default/templates/faq_static.html:74 +msgid "what is gravatar" +msgstr "How to change my picture (gravatar) and what is gravatar?" + +#: skins/default/templates/faq_static.html:75 +msgid "gravatar faq info" +msgstr "" +"<p>The picture that appears on the users profiles is called " +"<strong>gravatar</strong> (which means <strong>g</strong>lobally <strong>r</" +"strong>ecognized <strong>avatar</strong>).</p><p>Here is how it works: a " +"<strong>cryptographic key</strong> (unbreakable code) is calculated from " +"your email address. You upload your picture (or your favorite alter ego " +"image) the website <a href='http://gravatar.com'><strong>gravatar.com</" +"strong></a> from where we later retreive your image using the key.</" +"p><p>This way all the websites you trust can show your image next to your " +"posts and your email address remains private.</p><p>Please " +"<strong>personalize your account</strong> with an image - just register at " +"<a href='http://gravatar.com'><strong>gravatar.com</strong></a> (just please " +"be sure to use the same email address that you used to register with us). " +"Default image that looks like a kitchen tile is generated automatically.</p>" + +#: skins/default/templates/faq_static.html:76 +msgid "To register, do I need to create new password?" +msgstr "" + +#: skins/default/templates/faq_static.html:77 +msgid "" +"No, you don't have to. You can login through any service that supports " +"OpenID, e.g. Google, Yahoo, AOL, etc.\"" +msgstr "" + +#: skins/default/templates/faq_static.html:78 +#, fuzzy +msgid "\"Login now!\"" +msgstr "Logout Now" + +#: skins/default/templates/faq_static.html:80 +msgid "Why other people can edit my questions/answers?" +msgstr "" + +#: skins/default/templates/faq_static.html:81 +msgid "Goal of this site is..." +msgstr "" + +#: skins/default/templates/faq_static.html:81 +msgid "" +"So questions and answers can be edited like wiki pages by experienced users " +"of this site and this improves the overall quality of the knowledge base " +"content." +msgstr "" + +#: skins/default/templates/faq_static.html:82 +msgid "If this approach is not for you, we respect your choice." +msgstr "" + +#: skins/default/templates/faq_static.html:84 +#, fuzzy +msgid "Still have questions?" +msgstr "Post Your Answer" + +#: skins/default/templates/faq_static.html:85 +#, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "" +"Please <a href='%(ask_question_url)s'>ask</a> your question, help make our " +"community better!" + +#: skins/default/templates/feedback.html:3 +msgid "Feedback" +msgstr "" + +#: skins/default/templates/feedback.html:5 +msgid "Give us your feedback!" +msgstr "" + +#: skins/default/templates/feedback.html:9 +#, python-format +msgid "" +"\n" +" <span class='big strong'>Dear %(user_name)s</span>, we look forward " +"to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: skins/default/templates/feedback.html:16 +msgid "" +"\n" +" <span class='big strong'>Dear visitor</span>, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: skins/default/templates/feedback.html:25 +#, fuzzy +msgid "(please enter a valid email)" +msgstr "provide enough details" + +#: skins/default/templates/feedback.html:33 +msgid "(this field is required)" +msgstr "" + +#: skins/default/templates/feedback.html:41 +msgid "Send Feedback" +msgstr "" + +#: skins/default/templates/feedback_email.txt:2 +#, python-format +msgid "" +"\n" +"Hello, this is a %(site_title)s forum feedback message.\n" +msgstr "" + +#: skins/default/templates/import_data.html:2 +#: skins/default/templates/import_data.html:4 +msgid "Import StackExchange data" +msgstr "" + +#: skins/default/templates/import_data.html:13 +msgid "" +"<em>Warning:</em> if your database is not empty, please back it up\n" +" before attempting this operation." +msgstr "" + +#: skins/default/templates/import_data.html:16 +msgid "" +"Upload your stackexchange dump .zip file, then wait until\n" +" the data import completes. This process may take several minutes.\n" +" Please note that feedback will be printed in plain text.\n" +" " +msgstr "" + +#: skins/default/templates/import_data.html:25 +msgid "Import data" +msgstr "" + +#: skins/default/templates/import_data.html:27 +msgid "" +"In the case you experience any difficulties in using this import tool,\n" +" please try importing your data via command line: <code>python manage." +"py load_stackexchange path/to/your-data.zip</code>" +msgstr "" + +#: skins/default/templates/instant_notification.html:1 +#, python-format +msgid "<p>Dear %(receiving_user_name)s,</p>" +msgstr "" + +#: skins/default/templates/instant_notification.html:3 +#, python-format +msgid "" +"\n" +"<p>%(update_author_name)s left a <a href=\"%(post_url)s\">new comment</a>:</" +"p>\n" +msgstr "" + +#: skins/default/templates/instant_notification.html:8 +#, python-format +msgid "" +"\n" +"<p>%(update_author_name)s left a <a href=\"%(post_url)s\">new comment</a></" +"p>\n" +msgstr "" + +#: skins/default/templates/instant_notification.html:13 +#, python-format +msgid "" +"\n" +"<p>%(update_author_name)s answered a question \n" +"<a href=\"%(post_url)s\">%(origin_post_title)s</a></p>\n" +msgstr "" + +#: skins/default/templates/instant_notification.html:19 +#, python-format +msgid "" +"\n" +"<p>%(update_author_name)s posted a new question \n" +"<a href=\"%(post_url)s\">%(origin_post_title)s</a></p>\n" +msgstr "" + +#: skins/default/templates/instant_notification.html:25 +#, python-format +msgid "" +"\n" +"<p>%(update_author_name)s updated an answer to the question\n" +"<a href=\"%(post_url)s\">%(origin_post_title)s</a></p>\n" +msgstr "" + +#: skins/default/templates/instant_notification.html:31 +#, python-format +msgid "" +"\n" +"<p>%(update_author_name)s updated a question \n" +"<a href=\"%(post_url)s\">%(origin_post_title)s</a></p>\n" +msgstr "" + +#: skins/default/templates/instant_notification.html:37 +#, python-format +msgid "" +"\n" +"<div>%(content_preview)s</div>\n" +"<p>Please note - you can easily <a href=\"%(user_subscriptions_url)s" +"\">change</a>\n" +"how often you receive these notifications or unsubscribe. Thank you for your " +"interest in our forum!</p>\n" +msgstr "" + +#: skins/default/templates/instant_notification.html:42 +#, fuzzy +msgid "<p>Sincerely,<br/>Forum Administrator</p>" +msgstr "" +"Sincerely,\n" +"Q&A Forum Administrator" + +#: skins/default/templates/macros.html:25 +#, python-format +msgid "Share this question on %(site)s" +msgstr "" + +#: skins/default/templates/macros.html:36 +#, python-format +msgid "follow %(alias)s" +msgstr "" + +#: skins/default/templates/macros.html:39 +#, python-format +msgid "unfollow %(alias)s" +msgstr "" + +#: skins/default/templates/macros.html:40 +#, python-format +msgid "following %(alias)s" +msgstr "" + +#: skins/default/templates/macros.html:63 +msgid "karma:" +msgstr "" + +#: skins/default/templates/macros.html:67 +msgid "badges:" +msgstr "" + +#: skins/default/templates/macros.html:143 +#: skins/default/templates/macros.html:144 +msgid "previous" +msgstr "" + +#: skins/default/templates/macros.html:155 +msgid "current page" +msgstr "" + +#: skins/default/templates/macros.html:157 +#: skins/default/templates/macros.html:164 +#, python-format +msgid "page number %(num)s" +msgstr "page %(num)s" + +#: skins/default/templates/macros.html:168 +msgid "next page" +msgstr "" + +#: skins/default/templates/macros.html:179 +msgid "posts per page" +msgstr "" + +#: skins/default/templates/macros.html:211 templatetags/extra_tags.py:43 +#, python-format +msgid "%(username)s gravatar image" +msgstr "" + +#: skins/default/templates/macros.html:220 +#, python-format +msgid "%(username)s's website is %(url)s" +msgstr "" + +#: skins/default/templates/macros.html:232 +#, fuzzy +msgid "anonymous user" +msgstr "Sorry, anonymous users cannot vote" + +#: skins/default/templates/macros.html:260 +msgid "this post is marked as community wiki" +msgstr "" + +#: skins/default/templates/macros.html:263 +#, python-format +msgid "" +"This post is a wiki.\n" +" Anyone with karma >%(wiki_min_rep)s is welcome to improve it." +msgstr "" + +#: skins/default/templates/macros.html:269 +msgid "asked" +msgstr "" + +#: skins/default/templates/macros.html:271 +#, fuzzy +msgid "answered" +msgstr "answers" + +#: skins/default/templates/macros.html:273 +msgid "posted" +msgstr "" + +#: skins/default/templates/macros.html:303 +#, fuzzy +msgid "updated" +msgstr "Last updated" + +#: skins/default/templates/macros.html:379 +#, fuzzy, python-format +msgid "see questions tagged '%(tag)s'" +msgstr "Asked" + +#: skins/default/templates/macros.html:424 views/readers.py:238 +msgid "view" +msgid_plural "views" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/macros.html:441 views/readers.py:235 +msgid "answer" +msgid_plural "answers" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/macros.html:452 views/readers.py:232 +msgid "vote" +msgid_plural "votes" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/macros.html:491 +#, fuzzy +msgid "delete this comment" +msgstr "post a comment" + +#: skins/default/templates/macros.html:502 +#: skins/default/templates/question.html:79 +#: skins/default/templates/question.html:235 +#: skins/default/templates/revisions.html:37 +msgid "edit" +msgstr "" + +#: skins/default/templates/macros.html:520 +#: skins/default/templates/macros.html:528 +#: skins/default/templates/question.html:511 +msgid "add comment" +msgstr "post a comment" + +#: skins/default/templates/macros.html:521 +#, python-format +msgid "see <strong>%(counter)s</strong> more" +msgid_plural "see <strong>%(counter)s</strong> more" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/macros.html:523 +#, python-format +msgid "see <strong>%(counter)s</strong> more comment" +msgid_plural "" +"see <strong>%(counter)s</strong> more comments\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/macros.html:661 +msgid "one of these is required" +msgstr "" + +#: skins/default/templates/macros.html:673 +msgid "(required)" +msgstr "" + +#: skins/default/templates/macros.html:696 +msgid "Toggle the real time Markdown editor preview" +msgstr "" + +#: skins/default/templates/macros.html:708 +#, fuzzy, python-format +msgid "responses for %(username)s" +msgstr "Choose screen name" + +#: skins/default/templates/macros.html:711 +#, python-format +msgid "you have a new response" +msgid_plural "you have %(response_count)s new responses" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/macros.html:714 +msgid "no new responses yet" +msgstr "" + +#: skins/default/templates/macros.html:729 +#: skins/default/templates/macros.html:730 +#, python-format +msgid "%(new)s new flagged posts and %(seen)s previous" +msgstr "" + +#: skins/default/templates/macros.html:732 +#: skins/default/templates/macros.html:733 +#, python-format +msgid "%(new)s new flagged posts" +msgstr "" + +#: skins/default/templates/macros.html:738 +#: skins/default/templates/macros.html:739 +#, python-format +msgid "%(seen)s flagged posts" +msgstr "" + +#: skins/default/templates/main_page.html:11 +#, fuzzy +msgid "Questions" +msgstr "Tags" + +#: skins/default/templates/privacy.html:3 +#: skins/default/templates/privacy.html:5 +msgid "Privacy policy" +msgstr "" + +#: skins/default/templates/question.html:26 +#: skins/default/templates/question.html:27 +#: skins/default/templates/question.html:42 +#: skins/default/templates/question.html:44 +msgid "i like this post (click again to cancel)" +msgstr "" + +#: skins/default/templates/question.html:29 +#: skins/default/templates/question.html:46 +#: skins/default/templates/question.html:186 +msgid "current number of votes" +msgstr "" + +#: skins/default/templates/question.html:38 +#: skins/default/templates/question.html:39 +#: skins/default/templates/question.html:51 +#: skins/default/templates/question.html:52 +msgid "i dont like this post (click again to cancel)" +msgstr "" + +#: skins/default/templates/question.html:82 +msgid "retag" +msgstr "" + +#: skins/default/templates/question.html:89 +#, fuzzy +msgid "reopen" +msgstr "You can safely re-use the same login for all OpenID-enabled websites." + +#: skins/default/templates/question.html:93 +msgid "close" +msgstr "" + +#: skins/default/templates/question.html:98 +#: skins/default/templates/question.html:239 +msgid "" +"report as offensive (i.e containing spam, advertising, malicious text, etc.)" +msgstr "" + +#: skins/default/templates/question.html:99 +#: skins/default/templates/question.html:240 +msgid "flag offensive" +msgstr "" + +#: skins/default/templates/question.html:106 +#: skins/default/templates/question.html:250 +msgid "undelete" +msgstr "" + +#: skins/default/templates/question.html:106 +#: skins/default/templates/question.html:250 +#: skins/default/templates/authopenid/signin.html:166 +msgid "delete" +msgstr "" + +#: skins/default/templates/question.html:143 +#, python-format +msgid "" +"The question has been closed for the following reason \"%(close_reason)s\" by" +msgstr "" + +#: skins/default/templates/question.html:145 +#, python-format +msgid "close date %(closed_at)s" +msgstr "" + +#: skins/default/templates/question.html:151 +#, python-format +msgid "" +"\n" +" %(counter)s Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/question.html:159 +msgid "oldest answers will be shown first" +msgstr "" + +#: skins/default/templates/question.html:160 +msgid "oldest answers" +msgstr "oldest" + +#: skins/default/templates/question.html:162 +msgid "newest answers will be shown first" +msgstr "" + +#: skins/default/templates/question.html:163 +msgid "newest answers" +msgstr "newest" + +#: skins/default/templates/question.html:165 +msgid "most voted answers will be shown first" +msgstr "" + +#: skins/default/templates/question.html:166 +msgid "popular answers" +msgstr "most voted" + +#: skins/default/templates/question.html:184 +#: skins/default/templates/question.html:185 +msgid "i like this answer (click again to cancel)" +msgstr "" + +#: skins/default/templates/question.html:195 +#: skins/default/templates/question.html:196 +msgid "i dont like this answer (click again to cancel)" +msgstr "" + +#: skins/default/templates/question.html:204 +#: skins/default/templates/question.html:205 +msgid "mark this answer as favorite (click again to undo)" +msgstr "" + +#: skins/default/templates/question.html:214 +#: skins/default/templates/question.html:215 +#, python-format +msgid "%(question_author)s has selected this answer as correct" +msgstr "" + +#: skins/default/templates/question.html:230 +msgid "answer permanent link" +msgstr "permanent link" + +#: skins/default/templates/question.html:231 +msgid "permanent link" +msgstr "link" + +#: skins/default/templates/question.html:256 +#, fuzzy +msgid "swap with question" +msgstr "Post Your Answer" + +#: skins/default/templates/question.html:297 +#, python-format +msgid "" +"Know someone who can answer? Share a <a href=\"%(question_url)s\">link</a> " +"to this question via" +msgstr "" + +#: skins/default/templates/question.html:303 +msgid " or" +msgstr "" + +#: skins/default/templates/question.html:305 +msgid "email" +msgstr "" + +#: skins/default/templates/question.html:320 +#: skins/default/templates/question.html:322 +msgid "Notify me once a day when there are any new answers" +msgstr "" +"<strong>Notify me</strong> once a day by email when there are any new " +"answers or updates" + +#: skins/default/templates/question.html:324 +msgid "Notify me weekly when there are any new answers" +msgstr "" +"<strong>Notify me</strong> weekly when there are any new answers or updates" + +#: skins/default/templates/question.html:326 +msgid "Notify me immediately when there are any new answers" +msgstr "" +"<strong>Notify me</strong> immediately when there are any new answers or " +"updates" + +#: skins/default/templates/question.html:329 +#, python-format +msgid "" +"You can always adjust frequency of email updates from your %(profile_url)s" +msgstr "" +"(note: you can always <strong><a href='%(profile_url)s?" +"sort=email_subscriptions'>change</a></strong> how often you receive updates)" + +#: skins/default/templates/question.html:334 +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "" +"<span class='strong'>Here</span> (once you log in) you will be able to sign " +"up for the periodic email updates about this question." + +#: skins/default/templates/question.html:344 +#, fuzzy +msgid "Login/Signup to Answer" +msgstr "Login/Signup to Post" + +#: skins/default/templates/question.html:352 +#, fuzzy +msgid "Your answer" +msgstr "oldest" + +#: skins/default/templates/question.html:354 +#, fuzzy +msgid "Be the first one to answer this question!" +msgstr "" +"<span class='big strong'>Please try to give a substantial answer</span>. If " +"you wanted to comment on the question or answer, just <strong>use the " +"commenting tool</strong>. Please remember that you can always <strong>revise " +"your answers</strong> - no need to answer the same question twice. Also, " +"please <strong>don't forget to vote</strong> - it really helps to select the " +"best questions and answers!" + +#: skins/default/templates/question.html:360 +msgid "you can answer anonymously and then login" +msgstr "" +"<span class='strong big'>Please start posting your answer anonymously</span> " +"- your answer will be saved within the current session and published after " +"you log in or create a new account. Please try to give a <strong>substantial " +"answer</strong>, for discussions, <strong>please use comments</strong> and " +"<strong>please do remember to vote</strong> (after you log in)!" + +#: skins/default/templates/question.html:364 +msgid "answer your own question only to give an answer" +msgstr "" +"<span class='big strong'>You are welcome to answer your own question</span>, " +"but please make sure to give an <strong>answer</strong>. Remember that you " +"can always <strong>revise your original question</strong>. Please " +"<strong>use comments for discussions</strong> and <strong>please don't " +"forget to vote :)</strong> for the answers that you liked (or perhaps did " +"not like)! " + +#: skins/default/templates/question.html:366 +msgid "please only give an answer, no discussions" +msgstr "" +"<span class='big strong'>Please try to give a substantial answer</span>. If " +"you wanted to comment on the question or answer, just <strong>use the " +"commenting tool</strong>. Please remember that you can always <strong>revise " +"your answers</strong> - no need to answer the same question twice. Also, " +"please <strong>don't forget to vote</strong> - it really helps to select the " +"best questions and answers!" + +#: skins/default/templates/question.html:373 +msgid "Login/Signup to Post Your Answer" +msgstr "Login/Signup to Post" + +#: skins/default/templates/question.html:376 +#: skins/default/templates/question.html:389 +#, fuzzy +msgid "Answer Your Own Question" +msgstr "Post Your Answer" + +#: skins/default/templates/question.html:378 +msgid "Answer the question" +msgstr "Post Your Answer" + +#: skins/default/templates/question.html:397 +#, fuzzy +msgid "Question tools" +msgstr "Tags" + +#: skins/default/templates/question.html:400 +#, fuzzy +msgid "click to unfollow this question" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: skins/default/templates/question.html:401 +msgid "Following" +msgstr "" + +#: skins/default/templates/question.html:402 +msgid "Unfollow" +msgstr "" + +#: skins/default/templates/question.html:406 +#, fuzzy +msgid "click to follow this question" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: skins/default/templates/question.html:407 +msgid "Follow" +msgstr "" + +#: skins/default/templates/question.html:414 +#, python-format +msgid "%(count)s follower" +msgid_plural "%(count)s followers" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/question.html:420 +#, fuzzy +msgid "email the updates" +msgstr "Last updated" + +#: skins/default/templates/question.html:423 +msgid "" +"<strong>Here</strong> (once you log in) you will be able to sign up for the " +"periodic email updates about this question." +msgstr "" + +#: skins/default/templates/question.html:428 +msgid "subscribe to this question rss feed" +msgstr "" + +#: skins/default/templates/question.html:429 +msgid "subsribe to rss feed" +msgstr "" + +#: skins/default/templates/question.html:438 +msgid "Question tags" +msgstr "Tags" + +#: skins/default/templates/question.html:460 +msgid "Stats:" +msgstr "" + +#: skins/default/templates/question.html:462 +msgid "question asked" +msgstr "Asked" + +#: skins/default/templates/question.html:465 +msgid "question was seen" +msgstr "Seen" + +#: skins/default/templates/question.html:465 +msgid "times" +msgstr "" + +#: skins/default/templates/question.html:468 +msgid "last updated" +msgstr "Last updated" + +#: skins/default/templates/question.html:477 +#, fuzzy +msgid "Related questions" +msgstr "Tags" + +#: skins/default/templates/question_edit.html:4 +#: skins/default/templates/question_edit.html:9 +#, fuzzy +msgid "Edit question" +msgstr "Post Your Answer" + +#: skins/default/templates/question_retag.html:3 +#: skins/default/templates/question_retag.html:5 +msgid "Change tags" +msgstr "Retag question" + +#: skins/default/templates/question_retag.html:21 +msgid "Retag" +msgstr "" + +#: skins/default/templates/question_retag.html:28 +msgid "Why use and modify tags?" +msgstr "" + +#: skins/default/templates/question_retag.html:30 +msgid "Tags help to keep the content better organized and searchable" +msgstr "" + +#: skins/default/templates/question_retag.html:32 +msgid "tag editors receive special awards from the community" +msgstr "" + +#: skins/default/templates/question_retag.html:59 +msgid "up to 5 tags, less than 20 characters each" +msgstr "" + +#: skins/default/templates/reopen.html:3 skins/default/templates/reopen.html:5 +#, fuzzy +msgid "Reopen question" +msgstr "Post Your Answer" + +#: skins/default/templates/reopen.html:6 +msgid "Title" +msgstr "" + +#: skins/default/templates/reopen.html:11 +#, python-format +msgid "" +"This question has been closed by \n" +" <a href=\"%(closed_by_profile_url)s\">%(closed_by_username)s</a>\n" +msgstr "" + +#: skins/default/templates/reopen.html:16 +msgid "Close reason:" +msgstr "" + +#: skins/default/templates/reopen.html:19 +msgid "When:" +msgstr "" + +#: skins/default/templates/reopen.html:22 +#, fuzzy +msgid "Reopen this question?" +msgstr "Post Your Answer" + +#: skins/default/templates/reopen.html:26 +#, fuzzy +msgid "Reopen this question" +msgstr "Post Your Answer" + +#: skins/default/templates/revisions.html:4 +#: skins/default/templates/revisions.html:7 +#, fuzzy +msgid "Revision history" +msgstr "karma" + +#: skins/default/templates/revisions.html:23 +#, fuzzy +msgid "click to hide/show revision" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: skins/default/templates/revisions.html:29 +#, python-format +msgid "revision %(number)s" +msgstr "" + +#: skins/default/templates/subscribe_for_tags.html:3 +#: skins/default/templates/subscribe_for_tags.html:5 +msgid "Subscribe for tags" +msgstr "" + +#: skins/default/templates/subscribe_for_tags.html:6 +msgid "Please, subscribe for the following tags:" +msgstr "" + +#: skins/default/templates/subscribe_for_tags.html:15 +msgid "Subscribe" +msgstr "" + +#: skins/default/templates/tags.html:4 skins/default/templates/tags.html:11 +msgid "Tag list" +msgstr "Tags" + +#: skins/default/templates/tags.html:9 +#, python-format +msgid "Tags, matching \"%(stag)s\"" +msgstr "" + +#: skins/default/templates/tags.html:19 +msgid "sorted alphabetically" +msgstr "" + +#: skins/default/templates/tags.html:20 +#, fuzzy +msgid "by name" +msgstr "date" + +#: skins/default/templates/tags.html:25 +msgid "sorted by frequency of tag use" +msgstr "" + +#: skins/default/templates/tags.html:26 +#, fuzzy +msgid "by popularity" +msgstr "most voted" + +#: skins/default/templates/tags.html:31 skins/default/templates/tags.html:56 +msgid "Nothing found" +msgstr "" + +#: skins/default/templates/users.html:4 skins/default/templates/users.html:7 +msgid "Users" +msgstr "People" + +#: skins/default/templates/users.html:13 +msgid "see people with the highest reputation" +msgstr "" + +#: skins/default/templates/users.html:14 +#: skins/default/templates/user_profile/user_info.html:25 +msgid "reputation" +msgstr "karma" + +#: skins/default/templates/users.html:19 +msgid "see people who joined most recently" +msgstr "" + +#: skins/default/templates/users.html:20 +msgid "recent" +msgstr "" + +#: skins/default/templates/users.html:25 +msgid "see people who joined the site first" +msgstr "" + +#: skins/default/templates/users.html:31 +msgid "see people sorted by name" +msgstr "" + +#: skins/default/templates/users.html:32 +#, fuzzy +msgid "by username" +msgstr "Choose screen name" + +#: skins/default/templates/users.html:37 +#, python-format +msgid "users matching query %(suser)s:" +msgstr "" + +#: skins/default/templates/users.html:40 +msgid "Nothing found." +msgstr "" + +#: skins/default/templates/authopenid/changeemail.html:2 +#: skins/default/templates/authopenid/changeemail.html:8 +#: skins/default/templates/authopenid/changeemail.html:36 +msgid "Change email" +msgstr "Change Email" + +#: skins/default/templates/authopenid/changeemail.html:10 +#, fuzzy +msgid "Save your email address" +msgstr "Your email <i>(never shared)</i>" + +#: skins/default/templates/authopenid/changeemail.html:15 +#, python-format +msgid "change %(email)s info" +msgstr "" +"<span class=\"strong big\">Enter your new email into the box below</span> if " +"you'd like to use another email for <strong>update subscriptions</strong>." +"<br>Currently you are using <strong>%(email)s</strong>" + +#: skins/default/templates/authopenid/changeemail.html:17 +#, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "" +"<span class='strong big'>Please enter your email address in the box below.</" +"span> Valid email address is required on this Q&A forum. If you like, " +"you can <strong>receive updates</strong> on interesting questions or entire " +"forum via email. Also, your email is used to create a unique <a href='%" +"(gravatar_faq_url)s'><strong>gravatar</strong></a> image for your account. " +"Email addresses are never shown or otherwise shared with anybody else." + +#: skins/default/templates/authopenid/changeemail.html:29 +msgid "Your new Email" +msgstr "" +"<strong>Your new Email:</strong> (will <strong>not</strong> be shown to " +"anyone, must be valid)" + +#: skins/default/templates/authopenid/changeemail.html:29 +msgid "Your Email" +msgstr "" +"<strong>Your Email</strong> (<i>must be valid, never shown to others</i>)" + +#: skins/default/templates/authopenid/changeemail.html:36 +#, fuzzy +msgid "Save Email" +msgstr "Change Email" + +#: skins/default/templates/authopenid/changeemail.html:45 +#, fuzzy +msgid "Validate email" +msgstr "How to validate email and why?" + +#: skins/default/templates/authopenid/changeemail.html:48 +#, python-format +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "" +"<span class=\"strong big\">An email with a validation link has been sent to %" +"(email)s.</span> Please <strong>follow the emailed link</strong> with your " +"web browser. Email validation is necessary to help insure the proper use of " +"email on <span class=\"orange\">Q&A</span>. If you would like to use " +"<strong>another email</strong>, please <a href='%(change_email_url)" +"s'><strong>change it again</strong></a>." + +#: skins/default/templates/authopenid/changeemail.html:52 +msgid "Email not changed" +msgstr "" + +#: skins/default/templates/authopenid/changeemail.html:55 +#, python-format +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" +"<span class=\"strong big\">Your email address %(email)s has not been changed." +"</span> If you decide to change it later - you can always do it by editing " +"it in your user profile or by using the <a href='%(change_email_url)" +"s'><strong>previous form</strong></a> again." + +#: skins/default/templates/authopenid/changeemail.html:59 +msgid "Email changed" +msgstr "" + +#: skins/default/templates/authopenid/changeemail.html:62 +#, python-format +msgid "your current %(email)s can be used for this" +msgstr "" +"<span class='big strong'>Your email address is now set to %(email)s.</span> " +"Updates on the questions that you like most will be sent to this address. " +"Email notifications are sent once a day or less frequently - only when there " +"are any news." + +#: skins/default/templates/authopenid/changeemail.html:66 +msgid "Email verified" +msgstr "" + +#: skins/default/templates/authopenid/changeemail.html:69 +msgid "thanks for verifying email" +msgstr "" +"<span class=\"big strong\">Thank you for verifying your email!</span> Now " +"you can <strong>ask</strong> and <strong>answer</strong> questions. Also if " +"you find a very interesting question you can <strong>subscribe for the " +"updates</strong> - then will be notified about changes <strong>once a day</" +"strong> or less frequently." + +#: skins/default/templates/authopenid/changeemail.html:73 +msgid "email key not sent" +msgstr "Validation email not sent" + +#: skins/default/templates/authopenid/changeemail.html:76 +#, python-format +msgid "email key not sent %(email)s change email here %(change_link)s" +msgstr "" +"<span class='big strong'>Your current email address %(email)s has been " +"validated before</span> so the new key was not sent. You can <a href='%" +"(change_link)s'>change</a> email used for update subscriptions if necessary." + +#: skins/default/templates/authopenid/complete.html:21 +#: skins/default/templates/authopenid/complete.html:23 +#, fuzzy +msgid "Registration" +msgstr "karma" + +#: skins/default/templates/authopenid/complete.html:27 +#, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"<p><span class=\"big strong\">You are here for the first time with your %" +"(provider)s login.</span> Please create your <strong>screen name</strong> " +"and save your <strong>email</strong> address. Saved email address will let " +"you <strong>subscribe for the updates</strong> on the most interesting " +"questions and will be used to create and retrieve your unique avatar image - " +"<a href='%(gravatar_faq_url)s'><strong>gravatar</strong></a>.</p>" + +#: skins/default/templates/authopenid/complete.html:30 +#, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" +"<p><span class='strong big'>Oops... looks like screen name %(username)s is " +"already used in another account.</span></p><p>Please choose another screen " +"name to use with your %(provider)s login. Also, a valid email address is " +"required on the <span class='orange'>Q&A</span> forum. Your email is " +"used to create a unique <a href='%(gravatar_faq_url)s'><strong>gravatar</" +"strong></a> image for your account. If you like, you can <strong>receive " +"updates</strong> on the interesting questions or entire forum by email. " +"Email addresses are never shown or otherwise shared with anybody else.</p>" + +#: skins/default/templates/authopenid/complete.html:34 +#, python-format +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"<p><span class=\"big strong\">You are here for the first time with your %" +"(provider)s login.</span></p><p>You can either keep your <strong>screen " +"name</strong> the same as your %(provider)s login name or choose some other " +"nickname.</p><p>Also, please save a valid <strong>email</strong> address. " +"With the email you can <strong>subscribe for the updates</strong> on the " +"most interesting questions. Email address is also used to create and " +"retrieve your unique avatar image - <a href='%(gravatar_faq_url)" +"s'><strong>gravatar</strong></a>.</p>" + +#: skins/default/templates/authopenid/complete.html:37 +#, python-format +msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" +msgstr "" +"<p><span class=\"big strong\">You are here for the first time with your " +"Facebook login.</span> Please create your <strong>screen name</strong> and " +"save your <strong>email</strong> address. Saved email address will let you " +"<strong>subscribe for the updates</strong> on the most interesting questions " +"and will be used to create and retrieve your unique avatar image - <a href='%" +"(gravatar_faq_url)s'><strong>gravatar</strong></a>.</p>" + +#: skins/default/templates/authopenid/complete.html:40 +msgid "This account already exists, please use another." +msgstr "" + +#: skins/default/templates/authopenid/complete.html:59 +msgid "Screen name label" +msgstr "<strong>Screen Name</strong> (<i>will be shown to others</i>)" + +#: skins/default/templates/authopenid/complete.html:66 +msgid "Email address label" +msgstr "" +"<strong>Email Address</strong> (<i>will <strong>not</strong> be shared with " +"anyone, must be valid</i>)" + +#: skins/default/templates/authopenid/complete.html:72 +#: skins/default/templates/authopenid/signup_with_password.html:36 +msgid "receive updates motivational blurb" +msgstr "" +"<strong>Receive forum updates by email</strong> - this will help our " +"community grow and become more useful.<br/>By default <span " +"class='orange'>Q&A</span> forum sends up to <strong>one email digest per " +"week</strong> - only when there is anything new.<br/>If you like, please " +"adjust this now or any time later from your user account." + +#: skins/default/templates/authopenid/complete.html:76 +#: skins/default/templates/authopenid/signup_with_password.html:40 +msgid "please select one of the options above" +msgstr "" + +#: skins/default/templates/authopenid/complete.html:79 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" + +#: skins/default/templates/authopenid/complete.html:80 +msgid "create account" +msgstr "Signup" + +#: skins/default/templates/authopenid/confirm_email.txt:1 +msgid "Thank you for registering at our Q&A forum!" +msgstr "" + +#: skins/default/templates/authopenid/confirm_email.txt:3 +msgid "Your account details are:" +msgstr "" + +#: skins/default/templates/authopenid/confirm_email.txt:5 +#, fuzzy +msgid "Username:" +msgstr "Choose screen name" + +#: skins/default/templates/authopenid/confirm_email.txt:6 +#, fuzzy +msgid "Password:" +msgstr "Password" + +#: skins/default/templates/authopenid/confirm_email.txt:8 +msgid "Please sign in here:" +msgstr "" + +#: skins/default/templates/authopenid/confirm_email.txt:11 +#: skins/default/templates/authopenid/email_validation.txt:13 +#, fuzzy +msgid "" +"Sincerely,\n" +"Forum Administrator" +msgstr "" +"Sincerely,\n" +"Q&A Forum Administrator" + +#: skins/default/templates/authopenid/email_validation.txt:1 +msgid "Greetings from the Q&A forum" +msgstr "" + +#: skins/default/templates/authopenid/email_validation.txt:3 +msgid "To make use of the Forum, please follow the link below:" +msgstr "" + +#: skins/default/templates/authopenid/email_validation.txt:7 +msgid "Following the link above will help us verify your email address." +msgstr "" + +#: skins/default/templates/authopenid/email_validation.txt:9 +msgid "" +"If you beleive that this message was sent in mistake - \n" +"no further action is needed. Just ingore this email, we apologize\n" +"for any inconvenience" +msgstr "" + +#: skins/default/templates/authopenid/logout.html:3 +msgid "Logout" +msgstr "Sign out" + +#: skins/default/templates/authopenid/logout.html:5 +msgid "You have successfully logged out" +msgstr "" + +#: skins/default/templates/authopenid/logout.html:7 +msgid "" +"However, you still may be logged in to your OpenID provider. Please logout " +"of your provider if you wish to do so." +msgstr "" + +#: skins/default/templates/authopenid/macros.html:53 +msgid "Please enter your <span>user name</span>, then sign in" +msgstr "" + +#: skins/default/templates/authopenid/macros.html:54 +#: skins/default/templates/authopenid/signin.html:90 +msgid "(or select another login method above)" +msgstr "" + +#: skins/default/templates/authopenid/macros.html:56 +msgid "Sign in" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:4 +msgid "User login" +msgstr "User login" + +#: skins/default/templates/authopenid/signin.html:14 +#, python-format +msgid "" +"\n" +" Your answer to %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" +"\n" +"<span class=\"strong big\">Your answer to </span> <i>\"<strong>%(title)s</" +"strong> %(summary)s...\"</i> <span class=\"strong big\">is saved and will be " +"posted once you log in.</span>" + +#: skins/default/templates/authopenid/signin.html:21 +#, python-format +msgid "" +"Your question \n" +" %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" +"<span class=\"strong big\">Your question</span> <i>\"<strong>%(title)s</" +"strong> %(summary)s...\"</i> <span class=\"strong big\">is saved and will be " +"posted once you log in.</span>" + +#: skins/default/templates/authopenid/signin.html:28 +msgid "" +"Take a pick of your favorite service below to sign in using secure OpenID or " +"similar technology. Your external service password always stays confidential " +"and you don't have to rememeber or create another one." +msgstr "" + +#: skins/default/templates/authopenid/signin.html:31 +msgid "" +"It's a good idea to make sure that your existing login methods still work, " +"or add a new one. Please click any of the icons below to check/change or add " +"new login methods." +msgstr "" + +#: skins/default/templates/authopenid/signin.html:33 +msgid "" +"Please add a more permanent login method by clicking one of the icons below, " +"to avoid logging in via email each time." +msgstr "" + +#: skins/default/templates/authopenid/signin.html:37 +msgid "" +"Click on one of the icons below to add a new login method or re-validate an " +"existing one." +msgstr "" + +#: skins/default/templates/authopenid/signin.html:39 +msgid "" +"You don't have a method to log in right now, please add one or more by " +"clicking any of the icons below." +msgstr "" + +#: skins/default/templates/authopenid/signin.html:42 +msgid "" +"Please check your email and visit the enclosed link to re-connect to your " +"account" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:87 +msgid "Please enter your <span>user name and password</span>, then sign in" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:93 +msgid "Login failed, please try again" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:97 +msgid "Login or email" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:101 +#, fuzzy +msgid "Password" +msgstr "Password" + +#: skins/default/templates/authopenid/signin.html:106 +msgid "Login" +msgstr "Sign in" + +#: skins/default/templates/authopenid/signin.html:113 +msgid "To change your password - please enter the new one twice, then submit" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:117 +#, fuzzy +msgid "New password" +msgstr "Password" + +#: skins/default/templates/authopenid/signin.html:124 +msgid "Please, retype" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:146 +msgid "Here are your current login methods" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:150 +msgid "provider" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:151 +#, fuzzy +msgid "last used" +msgstr "Last updated" + +#: skins/default/templates/authopenid/signin.html:152 +msgid "delete, if you like" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:168 +#, fuzzy +msgid "cannot be deleted" +msgstr "sorry, but older votes cannot be revoked" + +#: skins/default/templates/authopenid/signin.html:181 +msgid "Still have trouble signing in?" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:186 +msgid "Please, enter your email address below and obtain a new key" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:188 +msgid "Please, enter your email address below to recover your account" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:191 +msgid "recover your account via email" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:202 +msgid "Send a new recovery key" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:204 +msgid "Recover your account via email" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:216 +msgid "Why use OpenID?" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:219 +msgid "with openid it is easier" +msgstr "With the OpenID you don't need to create new username and password." + +#: skins/default/templates/authopenid/signin.html:222 +msgid "reuse openid" +msgstr "You can safely re-use the same login for all OpenID-enabled websites." + +#: skins/default/templates/authopenid/signin.html:225 +msgid "openid is widely adopted" +msgstr "" +"There are > 160,000,000 OpenID account in use. Over 10,000 sites are OpenID-" +"enabled." + +#: skins/default/templates/authopenid/signin.html:228 +msgid "openid is supported open standard" +msgstr "OpenID is based on an open standard, supported by many organizations." + +#: skins/default/templates/authopenid/signin.html:232 +msgid "Find out more" +msgstr "" + +#: skins/default/templates/authopenid/signin.html:233 +msgid "Get OpenID" +msgstr "" + +#: skins/default/templates/authopenid/signup_with_password.html:4 +msgid "Signup" +msgstr "" + +#: skins/default/templates/authopenid/signup_with_password.html:10 +msgid "Please register by clicking on any of the icons below" +msgstr "" + +#: skins/default/templates/authopenid/signup_with_password.html:23 +msgid "or create a new user name and password here" +msgstr "" + +#: skins/default/templates/authopenid/signup_with_password.html:25 +msgid "Create login name and password" +msgstr "" + +#: skins/default/templates/authopenid/signup_with_password.html:26 +msgid "Traditional signup info" +msgstr "" +"<span class='strong big'>If you prefer, create your forum login name and " +"password here. However</span>, please keep in mind that we also support " +"<strong>OpenID</strong> login method. With <strong>OpenID</strong> you can " +"simply reuse your external login (e.g. Gmail or AOL) without ever sharing " +"your login details with anyone and having to remember yet another password." + +#: skins/default/templates/authopenid/signup_with_password.html:44 +msgid "" +"Please read and type in the two words below to help us prevent automated " +"account creation." +msgstr "" + +#: skins/default/templates/authopenid/signup_with_password.html:47 +#, fuzzy +msgid "Create Account" +msgstr "Signup" + +#: skins/default/templates/authopenid/signup_with_password.html:49 +msgid "or" +msgstr "" + +#: skins/default/templates/authopenid/signup_with_password.html:50 +msgid "return to OpenID login" +msgstr "" + +#: skins/default/templates/avatar/add.html:3 +#, fuzzy +msgid "add avatar" +msgstr "How to change my picture (gravatar) and what is gravatar?" + +#: skins/default/templates/avatar/add.html:5 +#, fuzzy +msgid "Change avatar" +msgstr "Retag question" + +#: skins/default/templates/avatar/add.html:6 +#: skins/default/templates/avatar/change.html:7 +msgid "Your current avatar: " +msgstr "" + +#: skins/default/templates/avatar/add.html:9 +#: skins/default/templates/avatar/change.html:11 +msgid "You haven't uploaded an avatar yet. Please upload one now." +msgstr "" + +#: skins/default/templates/avatar/add.html:13 +msgid "Upload New Image" +msgstr "" + +#: skins/default/templates/avatar/change.html:4 +#, fuzzy +msgid "change avatar" +msgstr "Retag question" + +#: skins/default/templates/avatar/change.html:17 +msgid "Choose new Default" +msgstr "" + +#: skins/default/templates/avatar/change.html:22 +msgid "Upload" +msgstr "" + +#: skins/default/templates/avatar/confirm_delete.html:3 +#, fuzzy +msgid "delete avatar" +msgstr "How to change my picture (gravatar) and what is gravatar?" + +#: skins/default/templates/avatar/confirm_delete.html:5 +msgid "Please select the avatars that you would like to delete." +msgstr "" + +#: skins/default/templates/avatar/confirm_delete.html:7 +#, python-format +msgid "" +"You have no avatars to delete. Please <a href=\"%(avatar_change_url)s" +"\">upload one</a> now." +msgstr "" + +#: skins/default/templates/avatar/confirm_delete.html:13 +msgid "Delete These" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:3 +msgid "answer tips" +msgstr "Tips" + +#: skins/default/templates/blocks/answer_edit_tips.html:6 +msgid "please make your answer relevant to this community" +msgstr "ask a question interesting to this community" + +#: skins/default/templates/blocks/answer_edit_tips.html:9 +#, fuzzy +msgid "try to give an answer, rather than engage into a discussion" +msgstr "" +"<span class='big strong'>Please try to give a substantial answer</span>. If " +"you wanted to comment on the question or answer, just <strong>use the " +"commenting tool</strong>. Please remember that you can always <strong>revise " +"your answers</strong> - no need to answer the same question twice. Also, " +"please <strong>don't forget to vote</strong> - it really helps to select the " +"best questions and answers!" + +#: skins/default/templates/blocks/answer_edit_tips.html:12 +msgid "please try to provide details" +msgstr "provide enough details" + +#: skins/default/templates/blocks/answer_edit_tips.html:15 +#: skins/default/templates/blocks/question_edit_tips.html:11 +msgid "be clear and concise" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:19 +#: skins/default/templates/blocks/question_edit_tips.html:15 +#, fuzzy +msgid "see frequently asked questions" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: skins/default/templates/blocks/answer_edit_tips.html:25 +#: skins/default/templates/blocks/question_edit_tips.html:20 +msgid "Markdown tips" +msgstr "Markdown basics" + +#: skins/default/templates/blocks/answer_edit_tips.html:29 +#: skins/default/templates/blocks/question_edit_tips.html:24 +msgid "*italic*" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:32 +#: skins/default/templates/blocks/question_edit_tips.html:27 +msgid "**bold**" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:36 +#: skins/default/templates/blocks/question_edit_tips.html:31 +msgid "*italic* or _italic_" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:39 +#: skins/default/templates/blocks/question_edit_tips.html:34 +msgid "**bold** or __bold__" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:43 +#: skins/default/templates/blocks/question_edit_tips.html:38 +#, fuzzy +msgid "link" +msgstr "Hi, there! Please sign in" + +#: skins/default/templates/blocks/answer_edit_tips.html:43 +#: skins/default/templates/blocks/answer_edit_tips.html:47 +#: skins/default/templates/blocks/question_edit_tips.html:38 +#: skins/default/templates/blocks/question_edit_tips.html:43 +msgid "text" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:47 +#: skins/default/templates/blocks/question_edit_tips.html:43 +msgid "image" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:51 +#: skins/default/templates/blocks/question_edit_tips.html:47 +msgid "numbered list:" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:56 +#: skins/default/templates/blocks/question_edit_tips.html:52 +msgid "basic HTML tags are also supported" +msgstr "" + +#: skins/default/templates/blocks/answer_edit_tips.html:60 +#: skins/default/templates/blocks/question_edit_tips.html:56 +msgid "learn more about Markdown" +msgstr "" + +#: skins/default/templates/blocks/ask_form.html:6 +msgid "login to post question info" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: skins/default/templates/blocks/ask_form.html:10 +#, fuzzy, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"<span class='strong big'>Looks like your email address, %(email)s has not " +"yet been validated.</span> To post messages you must verify your email, " +"please see <a href='%(email_validation_faq_url)s'>more details here</a>." +"<br>You can submit your question now and validate email after that. Your " +"question will saved as pending meanwhile. " + +#: skins/default/templates/blocks/ask_form.html:34 +msgid "Login/signup to post your question" +msgstr "Login/Signup to Post" + +#: skins/default/templates/blocks/ask_form.html:36 +msgid "Ask your question" +msgstr "Ask Your Question" + +#: skins/default/templates/blocks/bottom_scripts.html:7 +#, python-format +msgid "" +"Please note: %(app_name)s requires javascript to work properly, please " +"enable javascript in your browser, <a href=\"%(noscript_url)s\">here is how</" +"a>" +msgstr "" + +#: skins/default/templates/blocks/editor_data.html:5 +#, python-format +msgid "each tag must be shorter that %(max_chars)s character" +msgid_plural "each tag must be shorter than %(max_chars)s characters" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/blocks/editor_data.html:7 +#, python-format +msgid "please use %(tag_count)s tag" +msgid_plural "please use %(tag_count)s tags or less" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/blocks/editor_data.html:8 +#, python-format +msgid "" +"please use up to %(tag_count)s tags, less than %(max_chars)s characters each" +msgstr "" + +#: skins/default/templates/blocks/footer.html:4 +#: skins/default/templates/blocks/header_meta_links.html:12 +msgid "about" +msgstr "" + +#: skins/default/templates/blocks/footer.html:6 +msgid "privacy policy" +msgstr "" + +#: skins/default/templates/blocks/footer.html:15 +msgid "give feedback" +msgstr "" + +#: skins/default/templates/blocks/footer.html:41 +#, python-format +msgid "Content on this site is licensed under a %(license)s" +msgstr "" + +#: skins/default/templates/blocks/header.html:8 +msgid "back to home page" +msgstr "" + +#: skins/default/templates/blocks/header.html:9 +#, python-format +msgid "%(site)s logo" +msgstr "" + +#: skins/default/templates/blocks/header.html:20 +#, fuzzy +msgid "questions" +msgstr "Consells" + +#: skins/default/templates/blocks/header.html:30 +msgid "users" +msgstr "gent" + +#: skins/default/templates/blocks/header.html:35 +msgid "badges" +msgstr "insígnies" + +#: skins/default/templates/blocks/header.html:40 +#, fuzzy +msgid "ask a question" +msgstr "La Teva Pregunta" + +#: skins/default/templates/blocks/header_meta_links.html:8 +msgid "logout" +msgstr "sortir" + +#: skins/default/templates/blocks/header_meta_links.html:10 +msgid "login" +msgstr "Registrar-se" + +#: skins/default/templates/blocks/header_meta_links.html:15 +msgid "settings" +msgstr "User login" + +#: skins/default/templates/blocks/input_bar.html:34 +msgid "search" +msgstr "cerca" + +#: skins/default/templates/blocks/question_edit_tips.html:3 +msgid "question tips" +msgstr "Consells" + +#: skins/default/templates/blocks/question_edit_tips.html:5 +msgid "please ask a relevant question" +msgstr "fes una pregunta interessant per a la comunitat" + +#: skins/default/templates/blocks/question_edit_tips.html:8 +msgid "please try provide enough details" +msgstr "dóna detalls suficients" + +#: skins/default/templates/blocks/tag_selector.html:4 +msgid "Interesting tags" +msgstr "Etiquetes interessants" + +#: skins/default/templates/blocks/tag_selector.html:18 +#: skins/default/templates/blocks/tag_selector.html:34 +#: skins/default/templates/user_profile/user_moderate.html:40 +msgid "Add" +msgstr "Afegir" + +#: skins/default/templates/blocks/tag_selector.html:20 +#, fuzzy +msgid "Ignored tags" +msgstr "Retag question" + +#: skins/default/templates/blocks/tag_selector.html:36 +msgid "Display tag filter" +msgstr "Filtre per etiquetes" + +#: skins/default/templates/main_page/content.html:13 +msgid "Did not find what you were looking for?" +msgstr "" + +#: skins/default/templates/main_page/content.html:14 +msgid "Please, post your question!" +msgstr "Fes la teva pregunta" + +#: skins/default/templates/main_page/headline.html:7 +msgid "subscribe to the questions feed" +msgstr "Post Your Answer" + +#: skins/default/templates/main_page/headline.html:8 +msgid "rss feed" +msgstr "" + +#: skins/default/templates/main_page/headline.html:12 views/readers.py:131 +#, fuzzy, python-format +msgid "%(q_num)s question, tagged" +msgid_plural "%(q_num)s questions, tagged" +msgstr[0] "Asked" +msgstr[1] "Asked" + +#: skins/default/templates/main_page/headline.html:14 views/readers.py:139 +#, python-format +msgid "%(q_num)s question" +msgid_plural "%(q_num)s questions" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/main_page/headline.html:17 +#, python-format +msgid "with %(author_name)s's contributions" +msgstr "" + +#: skins/default/templates/main_page/headline.html:28 +#, fuzzy +msgid "Search tips:" +msgstr "Tips" + +#: skins/default/templates/main_page/headline.html:31 +msgid "reset author" +msgstr "" + +#: skins/default/templates/main_page/headline.html:33 +#: skins/default/templates/main_page/headline.html:36 +#: skins/default/templates/main_page/nothing_found.html:18 +#: skins/default/templates/main_page/nothing_found.html:21 +msgid " or " +msgstr "" + +#: skins/default/templates/main_page/headline.html:34 +#, fuzzy +msgid "reset tags" +msgstr "Tags" + +#: skins/default/templates/main_page/headline.html:37 +#: skins/default/templates/main_page/headline.html:40 +msgid "start over" +msgstr "" + +#: skins/default/templates/main_page/headline.html:42 +msgid " - to expand, or dig in by adding more tags and revising the query." +msgstr "" + +#: skins/default/templates/main_page/headline.html:45 +msgid "Search tip:" +msgstr "" + +#: skins/default/templates/main_page/headline.html:45 +msgid "add tags and a query to focus your search" +msgstr "" + +#: skins/default/templates/main_page/nothing_found.html:4 +#, fuzzy +msgid "There are no unanswered questions here" +msgstr "" +"<span class='big strong'>Please try to give a substantial answer</span>. If " +"you wanted to comment on the question or answer, just <strong>use the " +"commenting tool</strong>. Please remember that you can always <strong>revise " +"your answers</strong> - no need to answer the same question twice. Also, " +"please <strong>don't forget to vote</strong> - it really helps to select the " +"best questions and answers!" + +#: skins/default/templates/main_page/nothing_found.html:7 +#, fuzzy +msgid "No questions here. " +msgstr "answered question" + +#: skins/default/templates/main_page/nothing_found.html:8 +msgid "Please star (bookmark) some questions or follow some users." +msgstr "" + +#: skins/default/templates/main_page/nothing_found.html:13 +msgid "You can expand your search by " +msgstr "" + +#: skins/default/templates/main_page/nothing_found.html:16 +msgid "resetting author" +msgstr "" + +#: skins/default/templates/main_page/nothing_found.html:19 +#, fuzzy +msgid "resetting tags" +msgstr "Tags" + +#: skins/default/templates/main_page/nothing_found.html:22 +#: skins/default/templates/main_page/nothing_found.html:25 +msgid "starting over" +msgstr "" + +#: skins/default/templates/main_page/nothing_found.html:30 +#, fuzzy +msgid "Please always feel free to ask your question!" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: skins/default/templates/main_page/sidebar.html:8 +msgid "Contributors" +msgstr "" + +#: skins/default/templates/main_page/sidebar.html:25 +msgid "Related tags" +msgstr "Tags" + +#: skins/default/templates/main_page/tab_bar.html:5 +msgid "In:" +msgstr "" + +#: skins/default/templates/main_page/tab_bar.html:14 +#, fuzzy +msgid "see unanswered questions" +msgstr "Ask Your Question" + +#: skins/default/templates/main_page/tab_bar.html:20 +#, fuzzy +msgid "see your followed questions" +msgstr "Ask Your Question" + +#: skins/default/templates/main_page/tab_bar.html:21 +msgid "followed" +msgstr "" + +#: skins/default/templates/main_page/tab_bar.html:25 +msgid "Sort by:" +msgstr "" + +#: skins/default/templates/user_profile/user.html:13 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: skins/default/templates/user_profile/user_edit.html:4 +msgid "Edit user profile" +msgstr "" + +#: skins/default/templates/user_profile/user_edit.html:7 +msgid "edit profile" +msgstr "" + +#: skins/default/templates/user_profile/user_edit.html:17 +#: skins/default/templates/user_profile/user_info.html:15 +#, fuzzy +msgid "change picture" +msgstr "Retag question" + +#: skins/default/templates/user_profile/user_edit.html:20 +msgid "Registered user" +msgstr "" + +#: skins/default/templates/user_profile/user_edit.html:27 +#, fuzzy +msgid "Screen Name" +msgstr "<strong>Screen Name</strong> (<i>will be shown to others</i>)" + +#: skins/default/templates/user_profile/user_edit.html:83 +#: skins/default/templates/user_profile/user_email_subscriptions.html:21 +#, fuzzy +msgid "Update" +msgstr "date" + +#: skins/default/templates/user_profile/user_email_subscriptions.html:4 +#: skins/default/templates/user_profile/user_tabs.html:42 +msgid "subscriptions" +msgstr "" + +#: skins/default/templates/user_profile/user_email_subscriptions.html:7 +#, fuzzy +msgid "Email subscription settings" +msgstr "" +"<span class='big strong'>Adjust frequency of email updates.</span> Receive " +"updates on interesting questions by email, <strong><br/>help the community</" +"strong> by answering questions of your colleagues. If you do not wish to " +"receive emails - select 'no email' on all items below.<br/>Updates are only " +"sent when there is any new activity on selected items." + +#: skins/default/templates/user_profile/user_email_subscriptions.html:8 +msgid "email subscription settings info" +msgstr "" +"<span class='big strong'>Adjust frequency of email updates.</span> Receive " +"updates on interesting questions by email, <strong><br/>help the community</" +"strong> by answering questions of your colleagues. If you do not wish to " +"receive emails - select 'no email' on all items below.<br/>Updates are only " +"sent when there is any new activity on selected items." + +#: skins/default/templates/user_profile/user_email_subscriptions.html:22 +msgid "Stop sending email" +msgstr "Stop Email" + +#: skins/default/templates/user_profile/user_favorites.html:4 +#: skins/default/templates/user_profile/user_tabs.html:27 +#, fuzzy +msgid "followed questions" +msgstr "Ask Your Question" + +#: skins/default/templates/user_profile/user_inbox.html:18 +#: skins/default/templates/user_profile/user_tabs.html:12 +msgid "inbox" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:34 +msgid "Sections:" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:38 +#, python-format +msgid "forum responses (%(re_count)s)" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:43 +#, python-format +msgid "flagged items (%(flag_count)s)" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:49 +msgid "select:" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:51 +msgid "seen" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:52 +msgid "new" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:53 +msgid "none" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:54 +msgid "mark as seen" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:55 +msgid "mark as new" +msgstr "" + +#: skins/default/templates/user_profile/user_inbox.html:56 +msgid "dismiss" +msgstr "" + +#: skins/default/templates/user_profile/user_info.html:19 +msgid "remove" +msgstr "" + +#: skins/default/templates/user_profile/user_info.html:36 +msgid "update profile" +msgstr "" + +#: skins/default/templates/user_profile/user_info.html:40 +msgid "manage login methods" +msgstr "" + +#: skins/default/templates/user_profile/user_info.html:53 +msgid "real name" +msgstr "" + +#: skins/default/templates/user_profile/user_info.html:58 +msgid "member for" +msgstr "member since" + +#: skins/default/templates/user_profile/user_info.html:63 +msgid "last seen" +msgstr "" + +#: skins/default/templates/user_profile/user_info.html:69 +msgid "user website" +msgstr "website" + +#: skins/default/templates/user_profile/user_info.html:75 +#, fuzzy +msgid "location" +msgstr "Hi, there! Please sign in" + +#: skins/default/templates/user_profile/user_info.html:82 +msgid "age" +msgstr "" + +#: skins/default/templates/user_profile/user_info.html:83 +msgid "age unit" +msgstr "years old" + +#: skins/default/templates/user_profile/user_info.html:88 +#, fuzzy +msgid "todays unused votes" +msgstr "votes" + +#: skins/default/templates/user_profile/user_info.html:89 +msgid "votes left" +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:4 +#: skins/default/templates/user_profile/user_tabs.html:48 +#, fuzzy +msgid "moderation" +msgstr "karma" + +#: skins/default/templates/user_profile/user_moderate.html:8 +#, python-format +msgid "%(username)s's current status is \"%(status)s\"" +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:11 +#, fuzzy +msgid "User status changed" +msgstr "User login" + +#: skins/default/templates/user_profile/user_moderate.html:20 +msgid "Save" +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:26 +#, python-format +msgid "Your current reputation is %(reputation)s points" +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:28 +#, python-format +msgid "User's current reputation is %(reputation)s points" +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:32 +#, fuzzy +msgid "User reputation changed" +msgstr "user karma" + +#: skins/default/templates/user_profile/user_moderate.html:39 +msgid "Subtract" +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:44 +#, python-format +msgid "Send message to %(username)s" +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:45 +msgid "" +"An email will be sent to the user with 'reply-to' field set to your email " +"address. Please make sure that your address is entered correctly." +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:47 +#, fuzzy +msgid "Message sent" +msgstr "years old" + +#: skins/default/templates/user_profile/user_moderate.html:65 +msgid "Send message" +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:75 +msgid "" +"Administrators have privileges of normal users, but in addition they can " +"assign/revoke any status to any user, and are exempt from the reputation " +"limits." +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:78 +msgid "" +"Moderators have the same privileges as administrators, but cannot add or " +"remove user status of 'moderator' or 'administrator'." +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:81 +msgid "'Approved' status means the same as regular user." +msgstr "" + +#: skins/default/templates/user_profile/user_moderate.html:84 +#, fuzzy +msgid "Suspended users can only edit or delete their own posts." +msgstr "" +"Sorry, your account appears to be suspended and you cannot make new posts " +"until this issue is resolved. You can, however edit your existing posts. " +"Please contact the forum administrator to reach a resolution." + +#: skins/default/templates/user_profile/user_moderate.html:87 +msgid "" +"Blocked users can only login and send feedback to the site administrators." +msgstr "" + +#: skins/default/templates/user_profile/user_network.html:5 +#: skins/default/templates/user_profile/user_tabs.html:18 +msgid "network" +msgstr "" + +#: skins/default/templates/user_profile/user_network.html:10 +#, python-format +msgid "Followed by %(count)s person" +msgid_plural "Followed by %(count)s people" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/user_profile/user_network.html:14 +#, python-format +msgid "Following %(count)s person" +msgid_plural "Following %(count)s people" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/user_profile/user_network.html:19 +msgid "" +"Your network is empty. Would you like to follow someone? - Just visit their " +"profiles and click \"follow\"" +msgstr "" + +#: skins/default/templates/user_profile/user_network.html:21 +#, python-format +msgid "%(username)s's network is empty" +msgstr "" + +#: skins/default/templates/user_profile/user_recent.html:4 +#: skins/default/templates/user_profile/user_tabs.html:31 +#, fuzzy +msgid "activity" +msgstr "activity" + +#: skins/default/templates/user_profile/user_recent.html:21 +#: skins/default/templates/user_profile/user_recent.html:28 +msgid "source" +msgstr "" + +#: skins/default/templates/user_profile/user_reputation.html:4 +msgid "karma" +msgstr "" + +#: skins/default/templates/user_profile/user_reputation.html:11 +msgid "Your karma change log." +msgstr "" + +#: skins/default/templates/user_profile/user_reputation.html:13 +#, python-format +msgid "%(user_name)s's karma change log" +msgstr "" + +#: skins/default/templates/user_profile/user_stats.html:5 +#: skins/default/templates/user_profile/user_tabs.html:7 +msgid "overview" +msgstr "" + +#: skins/default/templates/user_profile/user_stats.html:11 +#, python-format +msgid "<span class=\"count\">%(counter)s</span> Question" +msgid_plural "<span class=\"count\">%(counter)s</span> Questions" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/user_profile/user_stats.html:16 +#, python-format +msgid "<span class=\"count\">%(counter)s</span> Answer" +msgid_plural "<span class=\"count\">%(counter)s</span> Answers" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/user_profile/user_stats.html:24 +#, python-format +msgid "the answer has been voted for %(answer_score)s times" +msgstr "" + +#: skins/default/templates/user_profile/user_stats.html:24 +msgid "this answer has been selected as correct" +msgstr "" + +#: skins/default/templates/user_profile/user_stats.html:34 +#, python-format +msgid "(%(comment_count)s comment)" +msgid_plural "the answer has been commented %(comment_count)s times" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/user_profile/user_stats.html:44 +#, python-format +msgid "<span class=\"count\">%(cnt)s</span> Vote" +msgid_plural "<span class=\"count\">%(cnt)s</span> Votes " +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/user_profile/user_stats.html:50 +msgid "thumb up" +msgstr "" + +#: skins/default/templates/user_profile/user_stats.html:51 +msgid "user has voted up this many times" +msgstr "" + +#: skins/default/templates/user_profile/user_stats.html:54 +msgid "thumb down" +msgstr "" + +#: skins/default/templates/user_profile/user_stats.html:55 +msgid "user voted down this many times" +msgstr "" + +#: skins/default/templates/user_profile/user_stats.html:63 +#, python-format +msgid "<span class=\"count\">%(counter)s</span> Tag" +msgid_plural "<span class=\"count\">%(counter)s</span> Tags" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/user_profile/user_stats.html:99 +#, python-format +msgid "<span class=\"count\">%(counter)s</span> Badge" +msgid_plural "<span class=\"count\">%(counter)s</span> Badges" +msgstr[0] "" +msgstr[1] "" + +#: skins/default/templates/user_profile/user_stats.html:122 +#, fuzzy +msgid "Answer to:" +msgstr "Tips" + +#: skins/default/templates/user_profile/user_tabs.html:5 +#, fuzzy +msgid "User profile" +msgstr "User login" + +#: skins/default/templates/user_profile/user_tabs.html:10 views/users.py:772 +msgid "comments and answers to others questions" +msgstr "" + +#: skins/default/templates/user_profile/user_tabs.html:16 +msgid "followers and followed users" +msgstr "" + +#: skins/default/templates/user_profile/user_tabs.html:21 +msgid "graph of user reputation" +msgstr "Graph of user karma" + +#: skins/default/templates/user_profile/user_tabs.html:23 +msgid "reputation history" +msgstr "karma" + +#: skins/default/templates/user_profile/user_tabs.html:25 +msgid "questions that user is following" +msgstr "" + +#: skins/default/templates/user_profile/user_tabs.html:29 +#, fuzzy +msgid "recent activity" +msgstr "activity" + +#: skins/default/templates/user_profile/user_tabs.html:34 views/users.py:847 +msgid "user vote record" +msgstr "" + +#: skins/default/templates/user_profile/user_tabs.html:36 +msgid "casted votes" +msgstr "votes" + +#: skins/default/templates/user_profile/user_tabs.html:40 views/users.py:960 +msgid "email subscription settings" +msgstr "" + +#: skins/default/templates/user_profile/user_tabs.html:46 views/users.py:224 +msgid "moderate this user" +msgstr "" + +#: skins/default/templates/user_profile/user_votes.html:4 +#, fuzzy +msgid "votes" +msgstr "votes" + +#: templatetags/extra_filters.py:145 templatetags/extra_filters_jinja.py:240 +msgid "no items in counter" +msgstr "no" + +#: utils/decorators.py:90 views/commands.py:112 views/commands.py:132 +msgid "Oops, apologies - there was some error" +msgstr "" + +#: utils/decorators.py:109 +msgid "Please login to post" +msgstr "" + +#: utils/decorators.py:205 +msgid "Spam was detected on your post, sorry for if this is a mistake" +msgstr "" + +#: utils/forms.py:32 +msgid "this field is required" +msgstr "" + +#: utils/forms.py:46 +msgid "choose a username" +msgstr "Choose screen name" + +#: utils/forms.py:52 +msgid "user name is required" +msgstr "" + +#: utils/forms.py:53 +msgid "sorry, this name is taken, please choose another" +msgstr "" + +#: utils/forms.py:54 +msgid "sorry, this name is not allowed, please choose another" +msgstr "" + +#: utils/forms.py:55 +msgid "sorry, there is no user with this name" +msgstr "" + +#: utils/forms.py:56 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" + +#: utils/forms.py:57 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "" + +#: utils/forms.py:118 +msgid "your email address" +msgstr "Your email <i>(never shared)</i>" + +#: utils/forms.py:119 +msgid "email address is required" +msgstr "" + +#: utils/forms.py:120 +msgid "please enter a valid email address" +msgstr "" + +#: utils/forms.py:121 +msgid "this email is already used by someone else, please choose another" +msgstr "" + +#: utils/forms.py:149 +msgid "choose password" +msgstr "Password" + +#: utils/forms.py:150 +msgid "password is required" +msgstr "" + +#: utils/forms.py:153 +msgid "retype password" +msgstr "Password <i>(please retype)</i>" + +#: utils/forms.py:154 +msgid "please, retype your password" +msgstr "" + +#: utils/forms.py:155 +msgid "sorry, entered passwords did not match, please try again" +msgstr "" + +#: utils/functions.py:74 +msgid "2 days ago" +msgstr "" + +#: utils/functions.py:76 +msgid "yesterday" +msgstr "" + +#: utils/functions.py:79 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "" +msgstr[1] "" + +#: utils/functions.py:85 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "" +msgstr[1] "" + +#: views/avatar_views.py:99 +msgid "Successfully uploaded a new avatar." +msgstr "" + +#: views/avatar_views.py:140 +msgid "Successfully updated your avatar." +msgstr "" + +#: views/avatar_views.py:180 +msgid "Successfully deleted the requested avatars." +msgstr "" + +#: views/commands.py:39 +msgid "anonymous users cannot vote" +msgstr "Sorry, anonymous users cannot vote" + +#: views/commands.py:59 +msgid "Sorry you ran out of votes for today" +msgstr "" + +#: views/commands.py:65 +#, python-format +msgid "You have %(votes_left)s votes left for today" +msgstr "" + +#: views/commands.py:122 +msgid "Sorry, but anonymous users cannot access the inbox" +msgstr "" + +#: views/commands.py:192 +msgid "Sorry, something is not right here..." +msgstr "" + +#: views/commands.py:207 +msgid "Sorry, but anonymous users cannot accept answers" +msgstr "" + +#: views/commands.py:288 +#, python-format +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "" +"Your subscription is saved, but email address %(email)s needs to be " +"validated, please see <a href='%(details_url)s'>more details here</a>" + +#: views/commands.py:295 +msgid "email update frequency has been set to daily" +msgstr "" + +#: views/commands.py:400 +#, python-format +msgid "Tag subscription was canceled (<a href=\"%(url)s\">undo</a>)." +msgstr "" + +#: views/commands.py:409 +#, python-format +msgid "Please sign in to subscribe for: %(tags)s" +msgstr "" + +#: views/commands.py:542 +msgid "Please sign in to vote" +msgstr "" + +#: views/meta.py:83 +msgid "Q&A forum feedback" +msgstr "" + +#: views/meta.py:84 +msgid "Thanks for the feedback!" +msgstr "" + +#: views/meta.py:92 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "" + +#: views/readers.py:177 +#, python-format +msgid "%(badge_count)d %(badge_level)s badge" +msgid_plural "%(badge_count)d %(badge_level)s badges" +msgstr[0] "" +msgstr[1] "" + +#: views/readers.py:440 +msgid "" +"Sorry, the comment you are looking for has been deleted and is no longer " +"accessible" +msgstr "" + +#: views/users.py:225 +msgid "moderate user" +msgstr "" + +#: views/users.py:380 +msgid "user profile" +msgstr "" + +#: views/users.py:381 +msgid "user profile overview" +msgstr "" + +#: views/users.py:685 +msgid "recent user activity" +msgstr "" + +#: views/users.py:686 +msgid "profile - recent activity" +msgstr "" + +#: views/users.py:773 +msgid "profile - responses" +msgstr "" + +#: views/users.py:848 +msgid "profile - votes" +msgstr "" + +#: views/users.py:883 +msgid "user reputation in the community" +msgstr "user karma" + +#: views/users.py:884 +msgid "profile - user reputation" +msgstr "Profile - User's Karma" + +#: views/users.py:911 +msgid "users favorite questions" +msgstr "" + +#: views/users.py:912 +msgid "profile - favorite questions" +msgstr "" + +#: views/users.py:932 views/users.py:936 +msgid "changes saved" +msgstr "" + +#: views/users.py:942 +msgid "email updates canceled" +msgstr "" + +#: views/users.py:961 +msgid "profile - email subscriptions" +msgstr "" + +#: views/writers.py:58 +msgid "Sorry, anonymous users cannot upload files" +msgstr "" + +#: views/writers.py:68 +#, python-format +msgid "allowed file types are '%(file_types)s'" +msgstr "" + +#: views/writers.py:91 +#, python-format +msgid "maximum upload file size is %(file_size)sK" +msgstr "" + +#: views/writers.py:99 +msgid "Error uploading file. Please contact the site administrator. Thank you." +msgstr "" + +#: views/writers.py:191 +#, fuzzy +msgid "Please log in to ask questions" +msgstr "" +"<span class=\"strong big\">You are welcome to start submitting your question " +"anonymously</span>. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: views/writers.py:492 +#, fuzzy +msgid "Please log in to answer questions" +msgstr "" +"<span class='big strong'>Please try to give a substantial answer</span>. If " +"you wanted to comment on the question or answer, just <strong>use the " +"commenting tool</strong>. Please remember that you can always <strong>revise " +"your answers</strong> - no need to answer the same question twice. Also, " +"please <strong>don't forget to vote</strong> - it really helps to select the " +"best questions and answers!" + +#: views/writers.py:598 +#, python-format +msgid "" +"Sorry, you appear to be logged out and cannot post comments. Please <a href=" +"\"%(sign_in_url)s\">sign in</a>." +msgstr "" + +#: views/writers.py:646 +msgid "Sorry, anonymous users cannot edit comments" +msgstr "" + +#: views/writers.py:654 +#, python-format +msgid "" +"Sorry, you appear to be logged out and cannot delete comments. Please <a " +"href=\"%(sign_in_url)s\">sign in</a>." +msgstr "" + +#: views/writers.py:675 +msgid "sorry, we seem to have some technical difficulties" +msgstr "" + +#~ msgid "" +#~ "As a registered user you can login with your OpenID, log out of the site " +#~ "or permanently remove your account." +#~ msgstr "" +#~ "Clicking <strong>Logout</strong> will log you out from the forum but will " +#~ "not sign you off from your OpenID provider.</p><p>If you wish to sign off " +#~ "completely - please make sure to log out from your OpenID provider as " +#~ "well." + +#~ msgid "Email verification subject line" +#~ msgstr "Verification Email from Q&A forum" + +#~ msgid "" +#~ "how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)" +#~ "s" +#~ msgstr "" +#~ "<form style='margin:0;padding:0;' action='%(send_email_key_url)" +#~ "s'><p><span class=\"bigger strong\">How?</span> If you have just set or " +#~ "changed your email address - <strong>check your email and click the " +#~ "included link</strong>.<br>The link contains a key generated specifically " +#~ "for you. You can also <button style='display:inline' " +#~ "type='submit'><strong>get a new key</strong></button> and check your " +#~ "email again.</p></form><span class=\"bigger strong\">Why?</span> Email " +#~ "validation is required to make sure that <strong>only you can post " +#~ "messages</strong> on your behalf and to <strong>minimize spam</strong> " +#~ "posts.<br>With email you can <strong>subscribe for updates</strong> on " +#~ "the most interesting questions. Also, when you sign up for the first time " +#~ "- create a unique <a href='%(gravatar_faq_url)s'><strong>gravatar</" +#~ "strong></a> personal image.</p>" + +#~ msgid "reputation points" +#~ msgstr "karma" diff --git a/askbot/locale/ca/LC_MESSAGES/djangojs.mo b/askbot/locale/ca/LC_MESSAGES/djangojs.mo Binary files differnew file mode 100644 index 00000000..8173f0d9 --- /dev/null +++ b/askbot/locale/ca/LC_MESSAGES/djangojs.mo diff --git a/askbot/locale/ca/LC_MESSAGES/djangojs.po b/askbot/locale/ca/LC_MESSAGES/djangojs.po new file mode 100644 index 00000000..ffda3b54 --- /dev/null +++ b/askbot/locale/ca/LC_MESSAGES/djangojs.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.7\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-10-08 02:25-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: skins/default/media/js/post.js:532 +msgid "Follow" +msgstr "" + +#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 +#, perl-format +msgid "%s follower" +msgid_plural "%s followers" +msgstr[0] "%s seguidor" +msgstr[1] "%s seguidors" + +#: skins/default/media/js/post.js:546 +msgid "<div>Following</div><div class=\"unfollow\">Unfollow</div>" +msgstr "<div>Seguint</div><div class=\"unfollow\">Deixar de seguir</div>" + +#: skins/default/media/js/post.js:1613 +msgid "Please enter question title (>10 characters)" +msgstr "Títol de la pregunta (més de 10 caràcters)" + +#: skins/default/media/js/tag_selector.js:15 +msgid "Tag \"<span></span>\" matches:" +msgstr "Coincidències de la etiqueta:" + +#: skins/default/media/js/tag_selector.js:84 +#, perl-format +msgid "and %s more, not shown..." +msgstr "i %s més què no es mostren ..." + +#: skins/default/media/js/user.js:129 +msgid "Please <a href=\"%(signin_url)s\">signin</a> to follow %(username)s" +msgstr "<a href=\"%(signin_url)s\">Entrar</a> per seguir a %(username)s" + +#: skins/default/media/js/user.js:161 +#, perl-format +msgid "unfollow %s" +msgstr "deixar de seguir a %s" + +#: skins/default/media/js/user.js:164 +#, perl-format +msgid "following %s" +msgstr "seguint a %s" + +#: skins/default/media/js/user.js:170 +#, perl-format +msgid "follow %s" +msgstr "seguir a %s" diff --git a/askbot/locale/de/LC_MESSAGES/django.mo b/askbot/locale/de/LC_MESSAGES/django.mo Binary files differindex 668a17c4..e54c459f 100644 --- a/askbot/locale/de/LC_MESSAGES/django.mo +++ b/askbot/locale/de/LC_MESSAGES/django.mo diff --git a/askbot/locale/de/LC_MESSAGES/django.po b/askbot/locale/de/LC_MESSAGES/django.po index c072aa70..abeee17f 100644 --- a/askbot/locale/de/LC_MESSAGES/django.po +++ b/askbot/locale/de/LC_MESSAGES/django.po @@ -2344,7 +2344,7 @@ msgstr "registrieren/" #: deps/django_authopenid/urls.py:21 msgid "signup/" -msgstr "registrieren/" +msgstr "" #: deps/django_authopenid/urls.py:25 msgid "logout/" diff --git a/askbot/locale/en/LC_MESSAGES/django.mo b/askbot/locale/en/LC_MESSAGES/django.mo Binary files differindex 1f065123..e1f4a2e9 100644 --- a/askbot/locale/en/LC_MESSAGES/django.mo +++ b/askbot/locale/en/LC_MESSAGES/django.mo diff --git a/askbot/locale/en/LC_MESSAGES/djangojs.mo b/askbot/locale/en/LC_MESSAGES/djangojs.mo Binary files differdeleted file mode 100644 index 9a8ed36a..00000000 --- a/askbot/locale/en/LC_MESSAGES/djangojs.mo +++ /dev/null diff --git a/askbot/locale/en/LC_MESSAGES/djangojs.po b/askbot/locale/en/LC_MESSAGES/djangojs.po index eeb7f787..c71a38da 100644 --- a/askbot/locale/en/LC_MESSAGES/djangojs.po +++ b/askbot/locale/en/LC_MESSAGES/djangojs.po @@ -161,7 +161,7 @@ msgstr[1] "" #: skins/common/media/js/post.js:551 skins/old/media/js/post.js:549 msgid "<div>Following</div><div class=\"unfollow\">Unfollow</div>" -msgstr "<b>Following</b><b class=\"unfollow\">Unfollow</b>" +msgstr "<div>Following</div><div class=\"unfollow\">Unfollow</div>" #: skins/common/media/js/post.js:613 msgid "undelete" diff --git a/askbot/locale/fi/LC_MESSAGES/django.mo b/askbot/locale/fi/LC_MESSAGES/django.mo Binary files differindex cbd57018..e4142187 100644 --- a/askbot/locale/fi/LC_MESSAGES/django.mo +++ b/askbot/locale/fi/LC_MESSAGES/django.mo diff --git a/askbot/locale/fr/LC_MESSAGES/django.mo b/askbot/locale/fr/LC_MESSAGES/django.mo Binary files differindex 1fe00ef0..709cd9e9 100644 --- a/askbot/locale/fr/LC_MESSAGES/django.mo +++ b/askbot/locale/fr/LC_MESSAGES/django.mo diff --git a/askbot/locale/it/LC_MESSAGES/django.mo b/askbot/locale/it/LC_MESSAGES/django.mo Binary files differindex 6cbc8fac..41294308 100644 --- a/askbot/locale/it/LC_MESSAGES/django.mo +++ b/askbot/locale/it/LC_MESSAGES/django.mo diff --git a/askbot/locale/it/LC_MESSAGES/django.po b/askbot/locale/it/LC_MESSAGES/django.po index 8b647103..29ae14a1 100644 --- a/askbot/locale/it/LC_MESSAGES/django.po +++ b/askbot/locale/it/LC_MESSAGES/django.po @@ -7,48 +7,44 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-18 00:12+0200\n" -"PO-Revision-Date: 2010-08-25 06:29\n" -"Last-Translator: <fph@ngi.it>\n" +"POT-Creation-Date: 2011-11-18 19:14+0100\n" +"PO-Revision-Date: 2011-11-19 11:27\n" +"Last-Translator: <tapion@pdp.linux.it>\n" "Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" "X-Translated-Using: django-rosetta 0.5.6\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: exceptions.py:13 -#, fuzzy msgid "Sorry, but anonymous visitors cannot access this function" -msgstr "mi spiace, devi essere registrato per accettare una risposta" +msgstr "Mi spiace, ma devi essere registrato per usare questa funzionalità" #: feed.py:26 feed.py:100 msgid " - " -msgstr "-" +msgstr " - " #: feed.py:26 -#, fuzzy msgid "Individual question feed" -msgstr "Domande selezionate individualmente" +msgstr "Feed di un'unica domanda" #: feed.py:100 msgid "latest questions" msgstr "domande recenti" #: forms.py:74 -#, fuzzy msgid "select country" -msgstr "Cancella il tuo utente" +msgstr "scegli lo Stato" #: forms.py:83 msgid "Country" -msgstr "" +msgstr "Paese" #: forms.py:91 -#, fuzzy msgid "Country field is required" -msgstr "campo obbligatorio" +msgstr "Il campo Stato è obbligatorio" #: forms.py:104 msgid "title" @@ -95,7 +91,7 @@ msgstr[1] "per favore usa un numero uguale o inferiore a %(tag_count)d tags" #: forms.py:181 #, python-format msgid "At least one of the following tags is required : %(tags)s" -msgstr "" +msgstr "Devi inserire almeno uno di questi tag: %(tags)s" #: forms.py:190 #, python-format @@ -110,7 +106,7 @@ msgstr "usa-questi-caratteri-nei-tag" #: forms.py:233 msgid "community wiki (karma is not awarded & many others can edit wiki post)" -msgstr "" +msgstr "wiki della comunità (il karma non è ricompensato & molti altri possono modificare le pagine del wiki)" #: forms.py:234 msgid "" @@ -134,30 +130,29 @@ msgstr "" #: forms.py:327 msgid "Enter number of points to add or subtract" -msgstr "inserisci un numero di punti da aggiungere o rimuovere" +msgstr "Inserisci un numero di punti da aggiungere o rimuovere" -#: forms.py:341 const/__init__.py:245 +#: forms.py:341 const/__init__.py:250 msgid "approved" msgstr "approvato" -#: forms.py:342 const/__init__.py:246 +#: forms.py:342 const/__init__.py:251 msgid "watched" msgstr "osservato" -#: forms.py:343 const/__init__.py:247 +#: forms.py:343 const/__init__.py:252 msgid "suspended" msgstr "sospeso" -#: forms.py:344 const/__init__.py:248 +#: forms.py:344 const/__init__.py:253 msgid "blocked" msgstr "bloccato" #: forms.py:346 -#, fuzzy msgid "administrator" -msgstr "Amministratore del sito" +msgstr "Amministratore" -#: forms.py:347 const/__init__.py:244 +#: forms.py:347 const/__init__.py:249 msgid "moderator" msgstr "moderatore" @@ -182,16 +177,15 @@ msgid "Cannot change status of another moderator" msgstr "Non è possibile cambiare lo stato di un altro moderatore" #: forms.py:434 -#, fuzzy msgid "Cannot change status to admin" -msgstr "Non è possibile cambiare il proprio stato" +msgstr "Non è possibile cambiare il proprio stato ad amministratore" #: forms.py:440 -#, fuzzy, python-format +#, python-format msgid "" "If you wish to change %(username)s's status, please make a meaningful " "selection." -msgstr "Se desideri cambiare lo stato di %(username)s, " +msgstr "Se desideri cambiare lo stato di %(username)s, per piacere fai una selezione sensata." #: forms.py:449 msgid "Subject line" @@ -214,41 +208,43 @@ msgid "Your message:" msgstr "Il tuo messaggio:" #: forms.py:581 -#, fuzzy msgid "ask anonymously" -msgstr "utente non registrato" +msgstr "chiedi come utente anonimo" #: forms.py:583 msgid "Check if you do not want to reveal your name when asking this question" -msgstr "" +msgstr "Controlla se non vuoi rivelare il tuo nome quando fai questa domanda" #: forms.py:743 msgid "" "You have asked this question anonymously, if you decide to reveal your " "identity, please check this box." -msgstr "" +msgstr "Hai posto questa domanda in modo anonimo. se decidi di rivelare la tua " +"identità, per favore seleziona questo campo." #: forms.py:747 msgid "reveal identity" -msgstr "" +msgstr "rivela l'identità" #: forms.py:805 msgid "" "Sorry, only owner of the anonymous question can reveal his or her identity, " "please uncheck the box" -msgstr "" +msgstr "Spiacenti, solo il proprietario della domanda anonima può rivelare la sua identità, " +"per favore togli la spunta dal campo" #: forms.py:818 msgid "" "Sorry, apparently rules have just changed - it is no longer possible to ask " "anonymously. Please either check the \"reveal identity\" box or reload this " "page and try editing the question again." -msgstr "" +msgstr "Spiacenti, sembra che le regole siano cambiate e che non è più possibile " +"porre domande anonime. Controlla il box \"rivela identità\" oppure ricarica questa " +"pagina e prova a modificare la domanda ancora" #: forms.py:856 -#, fuzzy msgid "this email will be linked to gravatar" -msgstr "questa email non deve essere linkata al gravatar" +msgstr "questa email verrà linkata a gravatar" #: forms.py:863 msgid "Real name" @@ -260,11 +256,11 @@ msgstr "Sito web" #: forms.py:877 msgid "City" -msgstr "" +msgstr "Città" #: forms.py:886 msgid "Show country" -msgstr "" +msgstr "Mostra paese" #: forms.py:891 msgid "Date of birth" @@ -323,410 +319,421 @@ msgstr "no askbot email please, thanks" msgid "please choose one of the options above" msgstr "per favore scegli una delle opzioni soprariportate" -#: urls.py:53 +#: urls.py:57 msgid "about/" msgstr "about/" -#: urls.py:54 +#: urls.py:58 msgid "faq/" msgstr "faq/" -#: urls.py:55 +#: urls.py:59 msgid "privacy/" msgstr "privacy/" -#: urls.py:57 urls.py:62 +#: urls.py:61 urls.py:66 msgid "answers/" msgstr "risposte/" -#: urls.py:57 urls.py:83 urls.py:203 +#: urls.py:61 urls.py:87 urls.py:207 msgid "edit/" msgstr "modifica/" -#: urls.py:62 urls.py:113 +#: urls.py:66 urls.py:117 msgid "revisions/" msgstr "revisioni/" -#: urls.py:68 urls.py:78 urls.py:83 urls.py:88 urls.py:93 urls.py:98 -#: urls.py:103 urls.py:108 urls.py:113 urls.py:290 +#: urls.py:72 urls.py:82 urls.py:87 urls.py:92 urls.py:97 urls.py:102 +#: urls.py:107 urls.py:112 urls.py:117 urls.py:294 msgid "questions/" msgstr "domande/" -#: urls.py:78 +#: urls.py:82 msgid "ask/" msgstr "chiedi/" -#: urls.py:88 +#: urls.py:92 msgid "retag/" msgstr "retag/" -#: urls.py:93 +#: urls.py:97 msgid "close/" msgstr "chiudi/" -#: urls.py:98 +#: urls.py:102 msgid "reopen/" msgstr "riapri/" -#: urls.py:103 +#: urls.py:107 msgid "answer/" msgstr "rispondi/" -#: urls.py:108 +#: urls.py:112 msgid "vote/" msgstr "vota/" -#: urls.py:149 +#: urls.py:153 msgid "tags/" msgstr "tag/" -#: urls.py:192 +#: urls.py:196 msgid "subscribe-for-tags/" -msgstr "" +msgstr "iscrivi-per-tag/" -#: urls.py:197 urls.py:203 urls.py:209 urls.py:217 +#: urls.py:201 urls.py:207 urls.py:213 urls.py:221 msgid "users/" msgstr "utenti/" -#: urls.py:210 -#, fuzzy +#: urls.py:214 msgid "subscriptions/" -msgstr "notifiche" +msgstr "iscrizioni/" -#: urls.py:222 +#: urls.py:226 msgid "users/update_has_custom_avatar/" -msgstr "" +msgstr "utenti/aggiornamenti_ha_avatar_personalizzzato" -#: urls.py:227 urls.py:232 +#: urls.py:231 urls.py:236 msgid "badges/" msgstr "badges/" -#: urls.py:237 +#: urls.py:241 msgid "messages/" msgstr "messaggi/" -#: urls.py:237 +#: urls.py:241 msgid "markread/" msgstr "segnacomeletto/" -#: urls.py:253 +#: urls.py:257 msgid "upload/" msgstr "upload/" -#: urls.py:254 +#: urls.py:258 msgid "feedback/" msgstr "contatti/" -#: urls.py:296 +#: urls.py:300 msgid "question/" msgstr "domanda/" -#: urls.py:303 setup_templates/settings.py:203 +#: urls.py:307 setup_templates/settings.py:205 msgid "account/" msgstr "account/" -#: conf/badges.py:12 -#, fuzzy +#: conf/badges.py:13 msgid "Badge settings" -msgstr "Impostazioni base" +msgstr "Impostazioni del badge" -#: conf/badges.py:21 +#: conf/badges.py:23 msgid "Disciplined: minimum upvotes for deleted post" -msgstr "" +msgstr "Moderato: voti positivi minimi per il post cancellato" -#: conf/badges.py:30 +#: conf/badges.py:32 msgid "Peer Pressure: minimum downvotes for deleted post" -msgstr "" +msgstr "Pressione tra pari: voti negativi minimi per i contenuti cancellati" -#: conf/badges.py:39 +#: conf/badges.py:41 msgid "Teacher: minimum upvotes for the answer" -msgstr "" +msgstr "Insegnante: voti positivi minimi per la risposta" -#: conf/badges.py:48 +#: conf/badges.py:50 msgid "Nice Answer: minimum upvotes for the answer" -msgstr "" +msgstr "Bella risposta: minimi voti positivi per la risposta" -#: conf/badges.py:57 +#: conf/badges.py:59 msgid "Good Answer: minimum upvotes for the answer" -msgstr "" +msgstr "Buona Risposta: voti positivi minimi per la risposta" -#: conf/badges.py:66 +#: conf/badges.py:68 msgid "Great Answer: minimum upvotes for the answer" -msgstr "" +msgstr "Ottima Risposta: voti positivi minimi per la risposta" -#: conf/badges.py:75 +#: conf/badges.py:77 msgid "Nice Question: minimum upvotes for the question" -msgstr "" +msgstr "Bella Domanda: voti positivi minimi per la domanda" -#: conf/badges.py:84 +#: conf/badges.py:86 msgid "Good Question: minimum upvotes for the question" -msgstr "" +msgstr "Buona Domanda: messaggi positivi minimi per la domanda" -#: conf/badges.py:93 +#: conf/badges.py:95 msgid "Great Question: minimum upvotes for the question" -msgstr "" +msgstr "Grande Domanda: voti positivi minimi per la domanda" -#: conf/badges.py:102 -#, fuzzy +#: conf/badges.py:104 msgid "Popular Question: minimum views" -msgstr "Domanda gettonata" +msgstr "Domanda Gettonata: visualizzazioni minime" -#: conf/badges.py:111 -#, fuzzy +#: conf/badges.py:113 msgid "Notable Question: minimum views" -msgstr "Domanda notevole" +msgstr "Domanda notevole: visualizzazioni minime" -#: conf/badges.py:120 -#, fuzzy +#: conf/badges.py:122 msgid "Famous Question: minimum views" -msgstr "Domanda famosa" +msgstr "Domanda famosa: visualizzazioni minime" -#: conf/badges.py:129 +#: conf/badges.py:131 msgid "Self-Learner: minimum answer upvotes" -msgstr "" +msgstr "Autodidatta: votazioni positive minime alle risposte" -#: conf/badges.py:138 +#: conf/badges.py:140 msgid "Civic Duty: minimum votes" -msgstr "" +msgstr "Senso Civico: votazioni minime" -#: conf/badges.py:147 +#: conf/badges.py:149 msgid "Enlightened Duty: minimum upvotes" -msgstr "" +msgstr "Dovere Illuminato: votazioni positive minime" -#: conf/badges.py:156 +#: conf/badges.py:158 msgid "Guru: minimum upvotes" -msgstr "" +msgstr "Guru: votazioni positive minime" -#: conf/badges.py:165 +#: conf/badges.py:167 msgid "Necromancer: minimum upvotes" -msgstr "" +msgstr "Negromante" -#: conf/badges.py:174 +#: conf/badges.py:176 msgid "Necromancer: minimum delay in days" -msgstr "" +msgstr "Necromante: ritardo minimo in giorni" -#: conf/badges.py:183 +#: conf/badges.py:185 msgid "Associate Editor: minimum number of edits" -msgstr "" +msgstr "Editore Assiciato: numero minimo di modifiche" -#: conf/badges.py:192 -#, fuzzy +#: conf/badges.py:194 msgid "Favorite Question: minimum stars" -msgstr "Domanda apprezzata" +msgstr "Domanda apprezzata: numero minimo di stellette" -#: conf/badges.py:201 -#, fuzzy +#: conf/badges.py:203 msgid "Stellar Question: minimum stars" -msgstr "Domanda stellare" +msgstr "Domanda stellare: numero minimo di stellette" -#: conf/badges.py:210 +#: conf/badges.py:212 msgid "Commentator: minimum comments" -msgstr "" +msgstr "Commentatore: numero minimo di commenti" -#: conf/badges.py:219 +#: conf/badges.py:221 msgid "Taxonomist: minimum tag use count" -msgstr "" +msgstr "Tassonomista: numero minimo di tag" -#: conf/badges.py:228 +#: conf/badges.py:230 msgid "Enthusiast: minimum days" -msgstr "" +msgstr "Entusiasta: numero minimo di giorni" -#: conf/email.py:14 +#: conf/email.py:15 msgid "Email and email alert settings" msgstr "Configurazione email ed avvisi tramite mail" -#: conf/email.py:22 -#, fuzzy +#: conf/email.py:24 msgid "Prefix for the email subject line" -msgstr "Benvenuto!" +msgstr "Prefisso per l'oggetto delle email" -#: conf/email.py:24 +#: conf/email.py:26 msgid "" "This setting takes default from the django settingEMAIL_SUBJECT_PREFIX. A " -"value entered here will overridethe default." -msgstr "" +"value entered here will override the default." +msgstr "Questa impostazione vengono prese dalle impostazioni predefinite di django EMAIL_SUBJECT_PREFIX. A" +"il valore inserito quà sovrascriverà il predefinito." -#: conf/email.py:36 +#: conf/email.py:38 msgid "Maximum number of news entries in an email alert" msgstr "Massimo numero di news in un avviso tramite mail" -#: conf/email.py:64 -#, fuzzy +#: conf/email.py:48 msgid "Default notification frequency all questions" msgstr "Frequenza di notifica news predefinita" -#: conf/email.py:66 +#: conf/email.py:50 msgid "Option to define frequency of emailed updates for: all questions." -msgstr "" +msgstr "Opzione per determinare la frequenza di email autovalutate" -#: conf/email.py:78 -#, fuzzy +#: conf/email.py:62 msgid "Default notification frequency questions asked by the user" -msgstr "Frequenza di notifica news predefinita" +msgstr "Frequenza predefinita della notifica delle domande fatte dagli utenti" -#: conf/email.py:80 +#: conf/email.py:64 msgid "" "Option to define frequency of emailed updates for: Question asked by the " "user." -msgstr "" +msgstr "Opzione per definire la frequenza degli aggiornamenti per email per: Domande chieste dall'" +"utente" -#: conf/email.py:92 -#, fuzzy +#: conf/email.py:76 msgid "Default notification frequency questions answered by the user" -msgstr "Frequenza di notifica news predefinita" +msgstr "Frequenza predefinita di invio delle notifiche per risposte date dall'utente" -#: conf/email.py:94 +#: conf/email.py:78 msgid "" "Option to define frequency of emailed updates for: Question answered by the " "user." -msgstr "" +msgstr "Opzione per definire la frequenza degli aggiornamenti email per: Domande risposte da " +"utente." -#: conf/email.py:106 +#: conf/email.py:90 msgid "" "Default notification frequency questions individually " "selected by the user" -msgstr "" +msgstr "Frequenza predefinita di aggiornamento per le domande selezionate individualmente dall'utente" -#: conf/email.py:109 +#: conf/email.py:93 msgid "" "Option to define frequency of emailed updates for: Question individually " "selected by the user." -msgstr "" +msgstr "Opzione per definire la frequenza di aggiornamenti email per: Domande individuali, selezionati dall'utente." -#: conf/email.py:121 +#: conf/email.py:105 msgid "" "Default notification frequency for mentions and " "comments" -msgstr "" +msgstr "Frequenza predefinita per le notifiche per menzionare e" +"commenti" -#: conf/email.py:124 +#: conf/email.py:108 msgid "" "Option to define frequency of emailed updates for: Mentions and comments." -msgstr "" +msgstr "Opzione per definire la frequenza degli aggiornamenti email per: Menzionati e commenti." -#: conf/email.py:135 -#, fuzzy +#: conf/email.py:119 msgid "Send periodic reminders about unanswered questions" msgstr "Non ci sono domande senza risposte" -#: conf/email.py:137 +#: conf/email.py:121 msgid "" "NOTE: in order to use this feature, it is necessary to run the management " "command \"send_unanswered_question_reminders\" (for example, via a cron job " -"- with an appropriate frequency) and an IMAP server with a dedicated inbox " -"must be configured " +"- with an appropriate frequency) " msgstr "" -#: conf/email.py:151 -#, fuzzy +#: conf/email.py:134 msgid "Days before starting to send reminders about unanswered questions" -msgstr "Non ci sono domande senza risposte" +msgstr "Giorni trascorsi prima di inviare promemoria riguardo domande non risposte" -#: conf/email.py:162 +#: conf/email.py:145 msgid "" "How often to send unanswered question reminders (in days between the " "reminders sent)." -msgstr "" +msgstr "Quanto spesso inviare i promemoria riguardo alle domande senza risposta" -#: conf/email.py:174 +#: conf/email.py:157 msgid "Max. number of reminders to send about unanswered questions" +msgstr "Numero massimo di promemoria da inviare riguardo alle domande non risposte" + +#: conf/email.py:168 +msgid "Send periodic reminders to accept the best answer" +msgstr "Manda promemoria periodici per accettare la risposta migliore" + +#: conf/email.py:170 +msgid "" +"NOTE: in order to use this feature, it is necessary to run the management " +"command \"send_accept_answer_reminders\" (for example, via a cron job - with " +"an appropriate frequency) " msgstr "" -#: conf/email.py:186 +#: conf/email.py:183 +msgid "Days before starting to send reminders to accept an answer" +msgstr "Giorni trascorsi prima di inviare un promemoria per accettare una risposta" + +#: conf/email.py:194 +msgid "" +"How often to send accept answer reminders (in days between the reminders " +"sent)." +msgstr "Quanto spesso " + +#: conf/email.py:206 +msgid "Max. number of reminders to send to accept the best answer" +msgstr "Numero massimo di promemoria da inviare per accettare la miglior risposta" + +#: conf/email.py:218 msgid "Require email verification before allowing to post" msgstr "" "Richiede la verifica dell'indirizzo email prima di consentire la " "pubblicazione di post" -#: conf/email.py:187 +#: conf/email.py:219 msgid "" "Active email verification is done by sending a verification key in email" msgstr "La verifica dell'email è effettuata inviando una chiave all'indirizzo " -#: conf/email.py:196 +#: conf/email.py:228 msgid "Allow only one account per email address" msgstr "Consenti solo un account per indirizzo email" -#: conf/email.py:205 +#: conf/email.py:237 msgid "Fake email for anonymous user" msgstr "Email fasulla per gli utenti non registrati" -#: conf/email.py:206 +#: conf/email.py:238 msgid "Use this setting to control gravatar for email-less user" msgstr "" "Utilizza questi settaggi per controllare il gravatar per utenti senza email" -#: conf/email.py:215 -#, fuzzy +#: conf/email.py:247 msgid "Allow posting questions by email" -msgstr "" -"<span class=\"strong big\">Puoi cominciare ora a scrivere la tua domanda " -"come utente non registrato</span>. Quando avrai finito, sarai reindirizzato " -"alla pagina di accesso/registrazione. La tua domanda sarà salvata e " -"pubblicata non appena ti sarai registrato. Accedere al proprio account " -"richiede circa 30 secondi, registrarne uno nuovo meno di un minuto." +msgstr "Consenti di inviare domande per email" -#: conf/email.py:217 +#: conf/email.py:249 msgid "" "Before enabling this setting - please fill out IMAP settings in the settings." "py file" -msgstr "" +msgstr "Prima di abilitare questa opzione, prima compila le impostazioni IMAP nelle impostazioni." +"file py" -#: conf/email.py:228 +#: conf/email.py:260 msgid "Replace space in emailed tags with dash" -msgstr "" +msgstr "Sostituisci lo spazio nei tag delle email con un trattino" -#: conf/email.py:230 +#: conf/email.py:262 msgid "" "This setting applies to tags written in the subject line of questions asked " "by email" -msgstr "" +msgstr "Queste impostazioni si applicano ai tag scritti nel campo oggetto della domanda risolta" +"per email" -#: conf/external_keys.py:10 -msgid "Keys to connect the site with external services like Facebook, etc." -msgstr "Chiavi per connettere il sito con servizi esterni come Facebook, ecc." +#: conf/external_keys.py:11 +msgid "Keys for external services" +msgstr "Chiave per servizi esterni" -#: conf/external_keys.py:18 +#: conf/external_keys.py:19 msgid "Google site verification key" msgstr "Site verification key di Google" -#: conf/external_keys.py:20 -#, fuzzy, python-format +#: conf/external_keys.py:21 +#, python-format msgid "" "This key helps google index your site please obtain is at <a href=\"%(url)s?" "hl=%(lang)s\">google webmasters tools site</a>" msgstr "" "Questa chiave aiuta google ad indicizzare il tuo sito. Per favore ottienila " -"presso gli <a href=\"%(google_webmasters_tools_url)s\">strumenti per i " +"presso gli <a href=\"%(url)s hl=%(lang)s\">strumenti per i " "webmaster di Google</a>" -#: conf/external_keys.py:35 +#: conf/external_keys.py:36 msgid "Google Analytics key" msgstr "Chiave Google Analytics" -#: conf/external_keys.py:37 -#, fuzzy, python-format +#: conf/external_keys.py:38 +#, python-format msgid "" "Obtain is at <a href=\"%(url)s\">Google Analytics</a> site, if you wish to " "use Google Analytics to monitor your site" msgstr "" -"Ottieni un account <a href=\"%(ga_site)s\">Google Analytics</a>, se vuoi " +"Ottieni un account <a href=\"%(url)s\">Google Analytics</a>, se vuoi " "utilizzare Google Analytics per monitorare il tuo sito web" -#: conf/external_keys.py:50 +#: conf/external_keys.py:51 msgid "Enable recaptcha (keys below are required)" -msgstr "" +msgstr "Abilita il recaptcha (le chiavi quà sotto sono necessarie)" -#: conf/external_keys.py:59 +#: conf/external_keys.py:60 msgid "Recaptcha public key" msgstr "Chiave pubblica Recaptcha" -#: conf/external_keys.py:67 +#: conf/external_keys.py:68 msgid "Recaptcha private key" msgstr "Chiave privata Recaptcha" -#: conf/external_keys.py:69 -#, fuzzy, python-format +#: conf/external_keys.py:70 +#, python-format msgid "" "Recaptcha is a tool that helps distinguish real people from annoying spam " "robots. Please get this and a public key at the <a href=\"%(url)s\">%(url)s</" @@ -734,14 +741,14 @@ msgid "" msgstr "" "Recaptcha è un tool che aiuta a distinguere persone reali da fastidisosi " "spam robots. Per favore ottieni questa ed una chiave pubblica all'indirizzo " -"<a href=\"http://recaptcha.net\">recaptcha.net</a>" +"<a href=\"%(url)s\">recaptcha.net</a>" -#: conf/external_keys.py:81 +#: conf/external_keys.py:82 msgid "Facebook public API key" msgstr "Facebook API key" -#: conf/external_keys.py:83 -#, fuzzy, python-format +#: conf/external_keys.py:84 +#, python-format msgid "" "Facebook API key and Facebook secret allow to use Facebook Connect login " "method at your site. Please obtain these keys at <a href=\"%(url)s" @@ -749,83 +756,84 @@ msgid "" msgstr "" "La Facebook API key ed il Facebook secret ti permettono di usare Facebook " "Connect per i login al tuo sito. Per favore ottieni queste chiavi presso la " -"pagina <a href=\"http://www.facebook.com/developers/createapp.php\">facebook " +"pagina <a href=\"%(url)s\">facebook " "create app</a>" -#: conf/external_keys.py:96 +#: conf/external_keys.py:97 msgid "Facebook secret key" msgstr "Facebook secret key" -#: conf/external_keys.py:104 +#: conf/external_keys.py:105 msgid "Twitter consumer key" -msgstr "" +msgstr "Il codice utente di Twitter" -#: conf/external_keys.py:106 +#: conf/external_keys.py:107 #, python-format msgid "" "Please register your forum at <a href=\"%(url)s\">twitter applications site</" "a>" -msgstr "" +msgstr "Per favore registra il tuo form a <a href=\"%(url)s\">sito dell'applicazione twitter</a>" -#: conf/external_keys.py:117 +#: conf/external_keys.py:118 msgid "Twitter consumer secret" -msgstr "" +msgstr "Il codice segreto dell'utente di Twitter" -#: conf/external_keys.py:125 +#: conf/external_keys.py:126 msgid "LinkedIn consumer key" -msgstr "" +msgstr "Il codice utente di LinkedIn" -#: conf/external_keys.py:127 +#: conf/external_keys.py:128 #, python-format msgid "" "Please register your forum at <a href=\"%(url)s\">LinkedIn developer site</a>" msgstr "" +"Per favore, registra il tuo form a <a href=\"%(url)s\">sito di sviluppo di LinkedIn" -#: conf/external_keys.py:138 +#: conf/external_keys.py:139 msgid "LinkedIn consumer secret" -msgstr "" +msgstr "Codice segreto di LinkedIn" -#: conf/external_keys.py:146 +#: conf/external_keys.py:147 msgid "ident.ca consumer key" -msgstr "" +msgstr "codice utente di ident.ca" -#: conf/external_keys.py:148 +#: conf/external_keys.py:149 #, python-format msgid "" "Please register your forum at <a href=\"%(url)s\">Identi.ca applications " "site</a>" msgstr "" +"Per favore registra il tuo forum a <a href\"%(url)s\">Identi.ca" -#: conf/external_keys.py:159 +#: conf/external_keys.py:160 msgid "ident.ca consumer secret" -msgstr "" +msgstr "codice utente di identi.ca" -#: conf/external_keys.py:167 +#: conf/external_keys.py:168 msgid "Use LDAP authentication for the password login" -msgstr "" +msgstr "Usa l'autenticazione LDAP per le passwird " -#: conf/external_keys.py:176 +#: conf/external_keys.py:177 msgid "LDAP service provider name" -msgstr "" +msgstr "Nome utente del provider LDAP" -#: conf/external_keys.py:184 +#: conf/external_keys.py:185 msgid "URL for the LDAP service" -msgstr "" +msgstr "URL del servizio LDAP" -#: conf/external_keys.py:192 -#, fuzzy +#: conf/external_keys.py:193 msgid "Explain how to change LDAP password" -msgstr "Cambia password" +msgstr "Spiega come modificare la password LDAP" -#: conf/flatpages.py:10 +#: conf/flatpages.py:11 msgid "Flatpages - about, privacy policy, etc." msgstr "Pagine statiche - about, privacy policy, etc." -#: conf/flatpages.py:17 +#: conf/flatpages.py:19 msgid "Text of the Q&A forum About page (html format)" msgstr "Testo della pagina About del Q&A forum (formato html)" -#: conf/flatpages.py:20 +#: conf/flatpages.py:22 msgid "" "Save, then <a href=\"http://validator.w3.org/\">use HTML validator</a> on " "the \"about\" page to check your input." @@ -833,13 +841,11 @@ msgstr "" "Salva, poi <a href=\"http://validator.w3.org/\">utilizza il validatore " "HTML<a> sulla pagina \"about\" per controllare il tuo input." -#: conf/flatpages.py:30 -#, fuzzy +#: conf/flatpages.py:32 msgid "Text of the Q&A forum FAQ page (html format)" msgstr "Testo della pagina About del Q&A forum (formato html)" -#: conf/flatpages.py:33 -#, fuzzy +#: conf/flatpages.py:35 msgid "" "Save, then <a href=\"http://validator.w3.org/\">use HTML validator</a> on " "the \"faq\" page to check your input." @@ -847,11 +853,11 @@ msgstr "" "Salva, poi <a href=\"http://validator.w3.org/\">utilizza il validatore " "HTML<a> sulla pagina \"about\" per controllare il tuo input." -#: conf/flatpages.py:44 +#: conf/flatpages.py:46 msgid "Text of the Q&A forum Privacy Policy (html format)" msgstr "Testo della pagina Privacy Policy del Q&A forum (formato html)" -#: conf/flatpages.py:47 +#: conf/flatpages.py:49 msgid "" "Save, then <a href=\"http://validator.w3.org/\">use HTML validator</a> on " "the \"privacy\" page to check your input." @@ -859,264 +865,284 @@ msgstr "" "Salva, poi <a href=\"http://validator.w3.org/\">utilizza il validatore " "HTML<a> sulla pagina \"about\" per controllare il tuo input." -#: conf/forum_data_rules.py:11 -#, fuzzy -msgid "Data entry and display" +#: conf/forum_data_rules.py:12 +msgid "Data entry and display rules" msgstr "Impostazioni per la visualizzazione dei dati di Askbot" -#: conf/forum_data_rules.py:20 +#: conf/forum_data_rules.py:22 #, python-format msgid "" "Enable embedding videos. <em>Note: please read <a href=\"%(url)s>read this</" "a> first.</em>" msgstr "" +"Abilita l'inserimento di video. <em>Nota: per favore leggi <a href=\"%(url)s>leggi questo</" +"a> prima </em>" -#: conf/forum_data_rules.py:31 +#: conf/forum_data_rules.py:33 msgid "Check to enable community wiki feature" msgstr "Spunta per impostare come 'domanda comunitaria'" -#: conf/forum_data_rules.py:40 +#: conf/forum_data_rules.py:42 msgid "Allow asking questions anonymously" -msgstr "" +msgstr "Permetti di rispondere alle domande anonimamente" -#: conf/forum_data_rules.py:42 +#: conf/forum_data_rules.py:44 msgid "" "Users do not accrue reputation for anonymous questions and their identity is " "not revealed until they change their mind" msgstr "" -#: conf/forum_data_rules.py:54 +#: conf/forum_data_rules.py:56 msgid "Allow posting before logging in" -msgstr "" +msgstr "Permetti di postare prima del login" -#: conf/forum_data_rules.py:56 +#: conf/forum_data_rules.py:58 msgid "" "Check if you want to allow users start posting questions or answers before " "logging in. Enabling this may require adjustments in the user login system " "to check for pending posts every time the user logs in. The builtin Askbot " "login system supports this feature." msgstr "" +"Seleziona se vuoi permettere agli utenti di inserire domande o risposte prima " +"di fare login. Questa impostazione richiede una modifica nel sistema dei login " +"per verificare se ci sono inserimenti in attesa ogni volta che un utente accede." +"Il sistema di login integrato in Askbot supporta questa funzionalità." -#: conf/forum_data_rules.py:71 -#, fuzzy +#: conf/forum_data_rules.py:73 msgid "Allow swapping answer with question" -msgstr "Rispondi alla domanda" +msgstr "Consenti di scambiare la domanda con la risposta" -#: conf/forum_data_rules.py:73 +#: conf/forum_data_rules.py:75 msgid "" "This setting will help import data from other forums such as zendesk, when " "automatic data import fails to detect the original question correctly." msgstr "" +"Questa impostazione aiuterà ad importare i dati da altri forum come zendesk, quando " +"l'importazione automatica dei dati non riesce ad identificare correttamente la domanda originale." -#: conf/forum_data_rules.py:85 +#: conf/forum_data_rules.py:87 msgid "Maximum length of tag (number of characters)" msgstr "Massima lunghezza di un tag (numero di caratteri)" -#: conf/forum_data_rules.py:93 -#, fuzzy +#: conf/forum_data_rules.py:95 msgid "Mandatory tags" -msgstr "ha aggiornato i tag" +msgstr "Tag obbligatori" -#: conf/forum_data_rules.py:96 +#: conf/forum_data_rules.py:98 msgid "" "At least one of these tags will be required for any new or newly edited " "question. A mandatory tag may be wildcard, if the wildcard tags are active." msgstr "" +"Almeno uno di questi tag sarà richiesto per ogni domanda creata o modificata." +"Il tag obbligatorio può essere anche un wildcard, se i tag wilcard sono attivi." -#: conf/forum_data_rules.py:108 +#: conf/forum_data_rules.py:110 msgid "Force lowercase the tags" -msgstr "" +msgstr "Forza tag con lettere minuscole" -#: conf/forum_data_rules.py:110 +#: conf/forum_data_rules.py:112 msgid "" "Attention: after checking this, please back up the database, and run a " "management command: <code>python manage.py fix_question_tags</code> to " "globally rename the tags" msgstr "" +"Attenzione: dopo aver selezionato questa impostazione fai un backup del database " +"ed esegui il comando <code>python manage.py fix_question_tags</code> per " +"aggiornare i tag globalmente" -#: conf/forum_data_rules.py:124 +#: conf/forum_data_rules.py:126 msgid "Format of tag list" -msgstr "" +msgstr "Formato della lista dei tag" -#: conf/forum_data_rules.py:126 +#: conf/forum_data_rules.py:128 msgid "" "Select the format to show tags in, either as a simple list, or as a tag cloud" msgstr "" +"Seleziona il formato con cui mostrare i tag: lista semplice o come una nuvola di tag" -#: conf/forum_data_rules.py:138 -#, fuzzy +#: conf/forum_data_rules.py:140 msgid "Use wildcard tags" -msgstr "Tag" +msgstr "Usa tag multipli" -#: conf/forum_data_rules.py:140 +#: conf/forum_data_rules.py:142 msgid "" "Wildcard tags can be used to follow or ignore many tags at once, a valid " "wildcard tag has a single wildcard at the very end" msgstr "" +"I tag wildcards possono essere usati per selezionare o ignorare più tag insieme, un " +"tag wildcard valido ha una wildcard singola alla fine" -#: conf/forum_data_rules.py:153 +#: conf/forum_data_rules.py:155 msgid "Default max number of comments to display under posts" -msgstr "" +msgstr "Numero massimo di commenti da mostrare sotto il post" -#: conf/forum_data_rules.py:164 +#: conf/forum_data_rules.py:166 #, python-format msgid "Maximum comment length, must be < %(max_len)s" -msgstr "" +msgstr "La lunghezza massima del commento deve essere < %(max_len)s" -#: conf/forum_data_rules.py:174 +#: conf/forum_data_rules.py:176 msgid "Limit time to edit comments" -msgstr "" +msgstr "Limita il tempo per modificare i commenti" -#: conf/forum_data_rules.py:176 +#: conf/forum_data_rules.py:178 msgid "If unchecked, there will be no time limit to edit the comments" -msgstr "" +msgstr "Se non selezionato, non ci sarà un limite di tempo per modificare i commenti" -#: conf/forum_data_rules.py:187 +#: conf/forum_data_rules.py:189 msgid "Minutes allowed to edit a comment" -msgstr "" +msgstr "Minuti concessi per modificare un commento" -#: conf/forum_data_rules.py:188 +#: conf/forum_data_rules.py:190 msgid "To enable this setting, check the previous one" -msgstr "" +msgstr "Per abilitare questa impostazione devi selezionare la precedente" -#: conf/forum_data_rules.py:197 +#: conf/forum_data_rules.py:199 msgid "Save comment by pressing <Enter> key" -msgstr "" +msgstr "Salva i commenti premendo <Enter>" -#: conf/forum_data_rules.py:206 +#: conf/forum_data_rules.py:208 msgid "Minimum length of search term for Ajax search" -msgstr "" +msgstr "Lunghezza minima dei termini di ricerca per la ricerca Ajax" -#: conf/forum_data_rules.py:207 +#: conf/forum_data_rules.py:209 msgid "Must match the corresponding database backend setting" -msgstr "" +msgstr "Deve corrispondere all'analoga impostazione backend del database" -#: conf/forum_data_rules.py:216 +#: conf/forum_data_rules.py:218 msgid "Do not make text query sticky in search" -msgstr "" +msgstr "Non rendere il campo di ricerca adesivo" -#: conf/forum_data_rules.py:218 +#: conf/forum_data_rules.py:220 msgid "" "Check to disable the \"sticky\" behavior of the search query. This may be " "useful if you want to move the search bar away from the default position or " "do not like the default sticky behavior of the text search query." msgstr "" +"Seleziona per disabilitare il comportamento \"adesivo\" della barra di ricerca. Questo può " +"essere utile se vuoi spostare la barra di ricerca dalla sua posizione predefinita o " +"non ti piace il comportamento adesivo predefinito della barra di ricerca." -#: conf/forum_data_rules.py:231 +#: conf/forum_data_rules.py:233 msgid "Maximum number of tags per question" msgstr "Massimo numero di tag per domanda" -#: conf/forum_data_rules.py:243 +#: conf/forum_data_rules.py:245 msgid "Number of questions to list by default" msgstr "Numero di domande da mostrare di default" -#: conf/forum_data_rules.py:253 +#: conf/forum_data_rules.py:255 msgid "What should \"unanswered question\" mean?" msgstr "Cosa dovrebbe significare \"domande senza risposta\"?" -#: conf/license.py:12 -#, fuzzy -msgid "License settings" -msgstr "Impostazioni base" +#: conf/license.py:13 +msgid "Content LicensContent License" +msgstr "Contenuto LicensaContenuto Licensa" -#: conf/license.py:19 +#: conf/license.py:21 msgid "Show license clause in the site footer" -msgstr "" +msgstr "Mostra le clausole di licenza nel footer del sito" -#: conf/license.py:28 +#: conf/license.py:30 msgid "Short name for the license" -msgstr "" +msgstr "Nome breve per la licenza" -#: conf/license.py:37 +#: conf/license.py:39 msgid "Full name of the license" -msgstr "" +msgstr "Nome completo della licenza" -#: conf/license.py:38 +#: conf/license.py:40 msgid "Creative Commons Attribution Share Alike 3.0" -msgstr "" +msgstr "Creative Commons Attribuzione Condividi allo stesso modo 3.0" -#: conf/license.py:46 +#: conf/license.py:48 msgid "Add link to the license page" -msgstr "" +msgstr "Aggiungi link alla pagina della licenza" -#: conf/license.py:55 -#, fuzzy +#: conf/license.py:57 msgid "License homepage" -msgstr "torna alla home page" +msgstr "Home page della licenza" -#: conf/license.py:57 +#: conf/license.py:59 msgid "URL of the official page with all the license legal clauses" -msgstr "" +msgstr "URL della pagina ufficiale del testo della licenza" -#: conf/license.py:67 -#, fuzzy +#: conf/license.py:69 msgid "Use license logo" -msgstr "Logo del forum Q&A" +msgstr "Usa il logo della licenza" -#: conf/license.py:76 +#: conf/license.py:78 msgid "License logo image" -msgstr "" +msgstr "Immagine di logo della licenza" -#: conf/login_providers.py:12 +#: conf/login_providers.py:13 msgid "Login provider setings" -msgstr "" +msgstr "Impostazioni del login" -#: conf/login_providers.py:20 +#: conf/login_providers.py:22 msgid "" "Show alternative login provider buttons on the password \"Sign Up\" page" msgstr "" +"Mostra un bottone alternativo per il login nella pagina \"Iscriviti\"" -#: conf/login_providers.py:29 +#: conf/login_providers.py:31 msgid "Always display local login form and hide \"Askbot\" button." -msgstr "" +msgstr "Mostra sempre il campo per il login e nascondi il bottone \"Askbot\"" -#: conf/login_providers.py:38 +#: conf/login_providers.py:40 msgid "Activate to allow login with self-hosted wordpress site" -msgstr "" +msgstr "Attiva per permettere il login nel sito wordpress ospitato" -#: conf/login_providers.py:39 +#: conf/login_providers.py:41 msgid "" "to activate this feature you must fill out the wordpress xml-rpc setting " "bellow" msgstr "" +"per attivare questa funzione devi compilare le impostazioni xml-rpc di wordpress " +"quà sotto" -#: conf/login_providers.py:48 +#: conf/login_providers.py:50 msgid "" "Fill it with the wordpress url to the xml-rpc, normally http://mysite.com/" "xmlrpc.php" msgstr "" +"Inserisci l'url dell'xml-rpc di wordpress, di solito questo è http://miosito.com/xmlrpc.php" -#: conf/login_providers.py:49 +#: conf/login_providers.py:51 msgid "" "To enable, go to Settings->Writing->Remote Publishing and check the box for " "XML-RPC" msgstr "" +"Per abilitarlo, vai in Impostazioni->Scrittura->Pubblicazione Remota e seleziona la casella per " +"XML-RPC" -#: conf/login_providers.py:60 +#: conf/login_providers.py:62 msgid "Upload your icon" -msgstr "" +msgstr "Carica la tua icona" -#: conf/login_providers.py:90 +#: conf/login_providers.py:92 #, python-format msgid "Activate %(provider)s login" -msgstr "" +msgstr "Attiva il login per %(provider)s" -#: conf/login_providers.py:95 +#: conf/login_providers.py:97 #, python-format msgid "" "Note: to really enable %(provider)s login some additional parameters will " "need to be set in the \"External keys\" section" msgstr "" +"Nota: per abilitare veramente il login per %(provider)s devi aggiungere dei paramentri " +"nella sezione \"Chiavi esterne\"" -#: conf/markup.py:14 -msgid "Markup formatting" -msgstr "" +#: conf/markup.py:15 +msgid "Markup in posts" +msgstr "Markup nei post" -#: conf/markup.py:39 +#: conf/markup.py:41 msgid "Enable code-friendly Markdown" -msgstr "" +msgstr "Abilita Markdown che supporta il codice" -#: conf/markup.py:41 +#: conf/markup.py:43 msgid "" "If checked, underscore characters will not trigger italic or bold formatting " "- bold and italic text can still be marked up with asterisks. Note that " @@ -1124,43 +1150,43 @@ msgid "" "are heavily used in LaTeX input." msgstr "" -#: conf/markup.py:56 +#: conf/markup.py:58 msgid "Mathjax support (rendering of LaTeX)" msgstr "" -#: conf/markup.py:58 +#: conf/markup.py:60 #, python-format msgid "" "If you enable this feature, <a href=\"%(url)s\">mathjax</a> must be " "installed on your server in its own directory." msgstr "" -#: conf/markup.py:72 +#: conf/markup.py:74 msgid "Base url of MathJax deployment" msgstr "" -#: conf/markup.py:74 +#: conf/markup.py:76 msgid "" "Note - <strong>MathJax is not included with askbot</strong> - you should " "deploy it yourself, preferably at a separate domain and enter url pointing " "to the \"mathjax\" directory (for example: http://mysite.com/mathjax)" msgstr "" -#: conf/markup.py:89 +#: conf/markup.py:91 msgid "Enable autolinking with specific patterns" msgstr "" -#: conf/markup.py:91 +#: conf/markup.py:93 msgid "" "If you enable this feature, the application will be able to detect patterns " "and auto link to URLs" msgstr "" -#: conf/markup.py:104 +#: conf/markup.py:106 msgid "Regexes to detect the link patterns" msgstr "" -#: conf/markup.py:106 +#: conf/markup.py:108 msgid "" "Enter valid regular expressions for the patters, one per line. For example " "to detect a bug pattern like #bug123, use the following regex: #bug(\\d+). " @@ -1169,11 +1195,11 @@ msgid "" "expressions elsewhere." msgstr "" -#: conf/markup.py:125 +#: conf/markup.py:127 msgid "URLs for autolinking" msgstr "" -#: conf/markup.py:127 +#: conf/markup.py:129 msgid "" "Here, please enter url templates for the patterns entered in the previous " "setting, also one entry per line. <strong>Make sure that number of lines in " @@ -1183,172 +1209,169 @@ msgid "" "in the redhat bug tracker." msgstr "" -#: conf/minimum_reputation.py:11 -msgid "Minimum reputation required to perform actions" -msgstr "Reputazione minima per eseguire operazioni" +#: conf/minimum_reputation.py:12 +msgid "Karma thresholds" +msgstr "" -#: conf/minimum_reputation.py:20 +#: conf/minimum_reputation.py:22 msgid "Upvote" msgstr "Dare un voto positivo" -#: conf/minimum_reputation.py:29 +#: conf/minimum_reputation.py:31 msgid "Downvote" msgstr "Dare un voto negativo" -#: conf/minimum_reputation.py:38 -#, fuzzy +#: conf/minimum_reputation.py:40 msgid "Answer own question immediately" -msgstr "Rispondi alla tua domanda" +msgstr "Rispondi alla tua domanda subito" -#: conf/minimum_reputation.py:47 -#, fuzzy +#: conf/minimum_reputation.py:49 msgid "Accept own answer" -msgstr "modificare ogni risposta" +msgstr "Accetta la tua riposta" -#: conf/minimum_reputation.py:56 +#: conf/minimum_reputation.py:58 msgid "Flag offensive" msgstr "Segnalare come inappropriato" -#: conf/minimum_reputation.py:65 +#: conf/minimum_reputation.py:67 msgid "Leave comments" msgstr "Lasciare commenti" -#: conf/minimum_reputation.py:74 +#: conf/minimum_reputation.py:76 msgid "Delete comments posted by others" msgstr "Cancellare commenti inviati da altri" -#: conf/minimum_reputation.py:83 +#: conf/minimum_reputation.py:85 msgid "Delete questions and answers posted by others" msgstr "Cancellare domande e risposte inviate da altri" -#: conf/minimum_reputation.py:92 +#: conf/minimum_reputation.py:94 msgid "Upload files" msgstr "Caricare files" -#: conf/minimum_reputation.py:101 +#: conf/minimum_reputation.py:103 msgid "Close own questions" msgstr "Chiudere le proprie domande" -#: conf/minimum_reputation.py:110 +#: conf/minimum_reputation.py:112 msgid "Retag questions posted by other people" msgstr "Ritaggare domande inviate da altri utenti" -#: conf/minimum_reputation.py:119 +#: conf/minimum_reputation.py:121 msgid "Reopen own questions" msgstr "Riaprire le proprie domande" -#: conf/minimum_reputation.py:128 +#: conf/minimum_reputation.py:130 msgid "Edit community wiki posts" msgstr "Modificare le domande comunitarie" -#: conf/minimum_reputation.py:137 +#: conf/minimum_reputation.py:139 msgid "Edit posts authored by other people" msgstr "Modificare i post scritti da altri utenti" -#: conf/minimum_reputation.py:146 +#: conf/minimum_reputation.py:148 msgid "View offensive flags" msgstr "Visualizzare i flag inappropriati" -#: conf/minimum_reputation.py:155 +#: conf/minimum_reputation.py:157 msgid "Close questions asked by others" msgstr "Chiudere domande poste da altri" -#: conf/minimum_reputation.py:164 +#: conf/minimum_reputation.py:166 msgid "Lock posts" msgstr "Bloccare posts" -#: conf/minimum_reputation.py:173 +#: conf/minimum_reputation.py:175 msgid "Remove rel=nofollow from own homepage" msgstr "" -#: conf/minimum_reputation.py:175 +#: conf/minimum_reputation.py:177 msgid "" "When a search engine crawler will see a rel=nofollow attribute on a link - " "the link will not count towards the rank of the users personal site." msgstr "" -#: conf/reputation_changes.py:12 -#, fuzzy -msgid "Reputation loss and gain rules" +#: conf/reputation_changes.py:13 +msgid "Karma loss and gain rules" msgstr "Regole relative all'ottenimento e cessione di punti reputazione" -#: conf/reputation_changes.py:21 +#: conf/reputation_changes.py:23 msgid "Maximum daily reputation gain per user" msgstr "Massima reputazione ottenibile da un utente giornamente" -#: conf/reputation_changes.py:30 +#: conf/reputation_changes.py:32 msgid "Gain for receiving an upvote" msgstr "Guadagno per aver ricevuto un voto positivo" -#: conf/reputation_changes.py:39 +#: conf/reputation_changes.py:41 msgid "Gain for the author of accepted answer" msgstr "Guadagno per l'autore di una risposta accettata" -#: conf/reputation_changes.py:48 +#: conf/reputation_changes.py:50 msgid "Gain for accepting best answer" msgstr "Guadagno per aver accettato una migliore risposta" -#: conf/reputation_changes.py:57 +#: conf/reputation_changes.py:59 msgid "Gain for post owner on canceled downvote" msgstr "" "Guadagno per il proprietario del post in caso di annullamento di un voto " "negativo" -#: conf/reputation_changes.py:66 +#: conf/reputation_changes.py:68 msgid "Gain for voter on canceling downvote" msgstr "" "Guadagno per un votante in caso di annullamento del proprio voto negativo" -#: conf/reputation_changes.py:76 +#: conf/reputation_changes.py:78 msgid "Loss for voter for canceling of answer acceptance" msgstr "" "Perdita per un votante in caso di cancellazione di una risposta accettata" -#: conf/reputation_changes.py:86 +#: conf/reputation_changes.py:88 msgid "Loss for author whose answer was \"un-accepted\"" msgstr "" "Perdita per l'autore nel caso una risposta passi da accettata a non " "accettata " -#: conf/reputation_changes.py:96 +#: conf/reputation_changes.py:98 msgid "Loss for giving a downvote" msgstr "Perdita in caso di assegnamento di un voto negativo" -#: conf/reputation_changes.py:106 +#: conf/reputation_changes.py:108 msgid "Loss for owner of post that was flagged offensive" msgstr "Perdita per l'autore di un post in caso di flag inappropriato" -#: conf/reputation_changes.py:116 +#: conf/reputation_changes.py:118 msgid "Loss for owner of post that was downvoted" msgstr "Perdita per l'autore nel caso il post venga votato negativamente" -#: conf/reputation_changes.py:126 +#: conf/reputation_changes.py:128 msgid "Loss for owner of post that was flagged 3 times per same revision" msgstr "" "Perdita per l'autore nel caso il post venga flaggato 3 volte per la stessa " "revisione" -#: conf/reputation_changes.py:136 +#: conf/reputation_changes.py:138 msgid "Loss for owner of post that was flagged 5 times per same revision" msgstr "" "Perdita per l'autore nel caso il post venga flaggato 5 volte per la stessa " "revisione" -#: conf/reputation_changes.py:146 +#: conf/reputation_changes.py:148 msgid "Loss for post owner when upvote is canceled" msgstr "Perdita per l'autore nel caso un voto positivo venga annullato" -#: conf/sidebar_main.py:11 -msgid "Sidebar widget settings - main page" +#: conf/sidebar_main.py:12 +msgid "Main page sidebar" msgstr "" -#: conf/sidebar_main.py:18 conf/sidebar_profile.py:18 -#: conf/sidebar_question.py:18 +#: conf/sidebar_main.py:20 conf/sidebar_profile.py:20 +#: conf/sidebar_question.py:19 msgid "Custom sidebar header" msgstr "" -#: conf/sidebar_main.py:21 conf/sidebar_profile.py:21 -#: conf/sidebar_question.py:21 +#: conf/sidebar_main.py:23 conf/sidebar_profile.py:23 +#: conf/sidebar_question.py:22 msgid "" "Use this area to enter content at the TOP of the sidebarin HTML format. " "When using this option (as well as the sidebar footer), please use the HTML " @@ -1356,44 +1379,44 @@ msgid "" "all browsers." msgstr "" -#: conf/sidebar_main.py:34 +#: conf/sidebar_main.py:36 msgid "Show avatar block in sidebar" msgstr "" -#: conf/sidebar_main.py:36 +#: conf/sidebar_main.py:38 msgid "Uncheck this if you want to hide the avatar block from the sidebar " msgstr "" -#: conf/sidebar_main.py:47 +#: conf/sidebar_main.py:49 msgid "Limit how many avatars will be displayed on the sidebar" msgstr "" -#: conf/sidebar_main.py:57 +#: conf/sidebar_main.py:59 msgid "Show tag selector in sidebar" msgstr "" -#: conf/sidebar_main.py:59 +#: conf/sidebar_main.py:61 msgid "" "Uncheck this if you want to hide the options for choosing interesting and " "ignored tags " msgstr "" -#: conf/sidebar_main.py:70 +#: conf/sidebar_main.py:72 msgid "Show tag list/cloud in sidebar" msgstr "" -#: conf/sidebar_main.py:72 +#: conf/sidebar_main.py:74 msgid "" "Uncheck this if you want to hide the tag cloud or tag list from the sidebar " msgstr "" -#: conf/sidebar_main.py:83 conf/sidebar_profile.py:34 -#: conf/sidebar_question.py:74 +#: conf/sidebar_main.py:85 conf/sidebar_profile.py:36 +#: conf/sidebar_question.py:75 msgid "Custom sidebar footer" msgstr "" -#: conf/sidebar_main.py:86 conf/sidebar_profile.py:37 -#: conf/sidebar_question.py:77 +#: conf/sidebar_main.py:88 conf/sidebar_profile.py:39 +#: conf/sidebar_question.py:78 msgid "" "Use this area to enter content at the BOTTOM of the sidebarin HTML format. " "When using this option (as well as the sidebar header), please use the HTML " @@ -1401,52 +1424,49 @@ msgid "" "all browsers." msgstr "" -#: conf/sidebar_profile.py:11 -msgid "Sidebar widget settings - profile page" -msgstr "" +#: conf/sidebar_profile.py:12 +msgid "User profile sidebar" +msgstr "Profilo utente" #: conf/sidebar_question.py:11 -msgid "Sidebar widget settings - question page" -msgstr "" +msgid "Question page sidebar" +msgstr "Pagina delle domande nella barra laterale" -#: conf/sidebar_question.py:34 +#: conf/sidebar_question.py:35 msgid "Show tag list in sidebar" msgstr "" -#: conf/sidebar_question.py:36 +#: conf/sidebar_question.py:37 msgid "Uncheck this if you want to hide the tag list from the sidebar " msgstr "" -#: conf/sidebar_question.py:47 +#: conf/sidebar_question.py:48 msgid "Show meta information in sidebar" msgstr "" -#: conf/sidebar_question.py:49 +#: conf/sidebar_question.py:50 msgid "" "Uncheck this if you want to hide the meta information about the question " "(post date, views, last updated). " msgstr "" -#: conf/sidebar_question.py:61 -#, fuzzy +#: conf/sidebar_question.py:62 msgid "Show related questions in sidebar" -msgstr "Domande simili" +msgstr "Mostra domande simili nella barra laterale" -#: conf/sidebar_question.py:63 -#, fuzzy +#: conf/sidebar_question.py:64 msgid "Uncheck this if you want to hide the list of related questions. " -msgstr "clicca qui per vedere le domande modificate meno recentemente" +msgstr "Non selezionare questa impostazione se vuoi nascondere la lista di domande collegate." -#: conf/site_modes.py:63 -#, fuzzy -msgid "Site modes" -msgstr "Siti" +#: conf/site_modes.py:64 +msgid "Bootstrap mode" +msgstr "" -#: conf/site_modes.py:72 +#: conf/site_modes.py:74 msgid "Activate a \"Bootstrap\" mode" msgstr "" -#: conf/site_modes.py:74 +#: conf/site_modes.py:76 msgid "" "Bootstrap mode lowers reputation and certain badge thresholds, to values, " "more suitable for the smaller communities, <strong>WARNING:</strong> your " @@ -1454,53 +1474,51 @@ msgid "" "changed after you modify this setting." msgstr "" -#: conf/site_settings.py:11 -msgid "Q&A forum website parameters and urls" -msgstr "Parametri ed url per il Q&A forum" +#: conf/site_settings.py:12 +msgid "URLS, keywords & greetings" +msgstr "" -#: conf/site_settings.py:19 +#: conf/site_settings.py:21 msgid "Site title for the Q&A forum" msgstr "Titolo del sito per il Q&A forum" -#: conf/site_settings.py:28 +#: conf/site_settings.py:30 msgid "Comma separated list of Q&A site keywords" msgstr "Lista di parole chiave per il Q&A forum, separate da virgole" -#: conf/site_settings.py:37 +#: conf/site_settings.py:39 msgid "Copyright message to show in the footer" msgstr "Messaggio di Copyright da mostrare in fondo alla pagina" -#: conf/site_settings.py:47 +#: conf/site_settings.py:49 msgid "Site description for the search engines" msgstr "Descrizione del sito per i motori di ricerca" -#: conf/site_settings.py:56 +#: conf/site_settings.py:58 msgid "Short name for your Q&A forum" msgstr "Nome breve per il tuo forum Q&A" -#: conf/site_settings.py:66 +#: conf/site_settings.py:68 msgid "Base URL for your Q&A forum, must start with http or https" msgstr "URL base per il tuo forum Q&A (deve cominciare con http o https)" -#: conf/site_settings.py:77 -#, fuzzy +#: conf/site_settings.py:79 msgid "Check to enable greeting for anonymous user" -msgstr "Email fasulla per gli utenti non registrati" +msgstr "Seleziona per abilitare i saluti agli utenti anonimi" -#: conf/site_settings.py:88 -#, fuzzy +#: conf/site_settings.py:90 msgid "Text shown in the greeting message shown to the anonymous user" -msgstr "Link mostrato agli utenti non registrati nel messaggio di benvenuto" +msgstr "Testo mostrato nel benvenuto agli utenti anonimi" -#: conf/site_settings.py:92 +#: conf/site_settings.py:94 msgid "Use HTML to format the message " -msgstr "" +msgstr "Usa l'HTML per formattare il messaggio" -#: conf/site_settings.py:101 +#: conf/site_settings.py:103 msgid "Feedback site URL" msgstr "URL di un sito esterno per i contatti" -#: conf/site_settings.py:103 +#: conf/site_settings.py:105 msgid "If left empty, a simple internal feedback form will be used instead" msgstr "Se lasciato vuoto, verrà usata una pagina interna per i contatti" @@ -1526,9 +1544,8 @@ msgstr "colore di sfondo quando non ci sono voti" #: conf/skin_counter_settings.py:206 conf/skin_counter_settings.py:216 #: conf/skin_counter_settings.py:228 conf/skin_counter_settings.py:239 #: conf/skin_counter_settings.py:252 conf/skin_counter_settings.py:262 -#, fuzzy msgid "HTML color name or hex value" -msgstr "Nome di colore HTML o valore esadecimale" +msgstr "Nome del colore HTML o valore esadecimale" #: conf/skin_counter_settings.py:40 msgid "Foreground color for votes = 0" @@ -1614,34 +1631,34 @@ msgstr "Colore di sfondo per le domande con una <risposta accettata" msgid "Foreground color for accepted answer" msgstr "Colore del testo per le domande con una <risposta accettata" -#: conf/skin_general_settings.py:14 -msgid "Skin and User Interface settings" -msgstr "Impostazioni della skin e dell'interfaccia utente" +#: conf/skin_general_settings.py:15 +msgid "Logos and HTML <head> parts" +msgstr "" -#: conf/skin_general_settings.py:21 +#: conf/skin_general_settings.py:23 msgid "Q&A site logo" msgstr "Logo del forum Q&A" -#: conf/skin_general_settings.py:23 +#: conf/skin_general_settings.py:25 msgid "To change the logo, select new file, then submit this whole form." msgstr "" "Per cambiare il logo, seleziona il nuovo file, poi salva le impostazioni" -#: conf/skin_general_settings.py:37 +#: conf/skin_general_settings.py:39 msgid "Show logo" msgstr "" -#: conf/skin_general_settings.py:39 +#: conf/skin_general_settings.py:41 msgid "" "Check if you want to show logo in the forum header or uncheck in the case " "you do not want the logo to appear in the default location" msgstr "" -#: conf/skin_general_settings.py:51 +#: conf/skin_general_settings.py:53 msgid "Site favicon" msgstr "" -#: conf/skin_general_settings.py:53 +#: conf/skin_general_settings.py:55 #, python-format msgid "" "A small 16x16 or 32x32 pixel icon image used to distinguish your site in the " @@ -1649,21 +1666,21 @@ msgid "" "href=\"%(favicon_info_url)s\">this page</a>." msgstr "" -#: conf/skin_general_settings.py:71 +#: conf/skin_general_settings.py:73 msgid "Password login button" msgstr "" -#: conf/skin_general_settings.py:73 +#: conf/skin_general_settings.py:75 msgid "" "An 88x38 pixel image that is used on the login screen for the password login " "button." msgstr "" -#: conf/skin_general_settings.py:88 +#: conf/skin_general_settings.py:90 msgid "Show all UI functions to all users" msgstr "Mostra tutte le funzionalità a tutti gli utenti" -#: conf/skin_general_settings.py:90 +#: conf/skin_general_settings.py:92 msgid "" "If checked, all forum functions will be shown to users, regardless of their " "reputation. However to use those functions, moderation rules, reputation and " @@ -1673,19 +1690,19 @@ msgstr "" "utenti, anche se non hanno reputazione sufficiente per utilizzarle. In ogni " "caso, i vincoli di reputazione necessari per utilizzarle rimangono validi." -#: conf/skin_general_settings.py:105 +#: conf/skin_general_settings.py:107 msgid "Select skin" msgstr "Scegli skin" -#: conf/skin_general_settings.py:116 +#: conf/skin_general_settings.py:118 msgid "Customize HTML <HEAD>" msgstr "" -#: conf/skin_general_settings.py:125 +#: conf/skin_general_settings.py:127 msgid "Custom portion of the HTML <HEAD>" msgstr "" -#: conf/skin_general_settings.py:127 +#: conf/skin_general_settings.py:129 msgid "" "<strong>To use this option</strong>, check \"Customize HTML <HEAD>\" " "above. Contents of this box will be inserted into the <HEAD> portion " @@ -1697,11 +1714,11 @@ msgid "" "please test the site with the W3C HTML validator service." msgstr "" -#: conf/skin_general_settings.py:149 +#: conf/skin_general_settings.py:151 msgid "Custom header additions" msgstr "" -#: conf/skin_general_settings.py:151 +#: conf/skin_general_settings.py:153 msgid "" "Header is the bar at the top of the content that contains user info and site " "links, and is common to all pages. Use this area to enter contents of the " @@ -1710,21 +1727,21 @@ msgid "" "sure that your input is valid and works well in all browsers." msgstr "" -#: conf/skin_general_settings.py:166 +#: conf/skin_general_settings.py:168 msgid "Site footer mode" msgstr "" -#: conf/skin_general_settings.py:168 +#: conf/skin_general_settings.py:170 msgid "" "Footer is the bottom portion of the content, which is common to all pages. " "You can disable, customize, or use the default footer." msgstr "" -#: conf/skin_general_settings.py:185 +#: conf/skin_general_settings.py:187 msgid "Custom footer (HTML format)" msgstr "" -#: conf/skin_general_settings.py:187 +#: conf/skin_general_settings.py:189 msgid "" "<strong>To enable this function</strong>, please select option 'customize' " "in the \"Site footer mode\" above. Use this area to enter contents of the " @@ -1733,21 +1750,21 @@ msgid "" "that your input is valid and works well in all browsers." msgstr "" -#: conf/skin_general_settings.py:202 +#: conf/skin_general_settings.py:204 msgid "Apply custom style sheet (CSS)" msgstr "" -#: conf/skin_general_settings.py:204 +#: conf/skin_general_settings.py:206 msgid "" "Check if you want to change appearance of your form by adding custom style " "sheet rules (please see the next item)" msgstr "" -#: conf/skin_general_settings.py:216 +#: conf/skin_general_settings.py:218 msgid "Custom style sheet (CSS)" msgstr "" -#: conf/skin_general_settings.py:218 +#: conf/skin_general_settings.py:220 msgid "" "<strong>To use this function</strong>, check \"Apply custom style sheet\" " "option above. The CSS rules added in this window will be applied after the " @@ -1756,19 +1773,19 @@ msgid "" "depends (default is empty string) on the url configuration in your urls.py." msgstr "" -#: conf/skin_general_settings.py:234 +#: conf/skin_general_settings.py:236 msgid "Add custom javascript" msgstr "" -#: conf/skin_general_settings.py:237 +#: conf/skin_general_settings.py:239 msgid "Check to enable javascript that you can enter in the next field" msgstr "" -#: conf/skin_general_settings.py:247 +#: conf/skin_general_settings.py:249 msgid "Custom javascript" msgstr "" -#: conf/skin_general_settings.py:249 +#: conf/skin_general_settings.py:251 msgid "" "Type or paste plain javascript that you would like to run on your site. Link " "to the script will be inserted at the bottom of the HTML output and will be " @@ -1779,141 +1796,162 @@ msgid "" "above)." msgstr "" -#: conf/skin_general_settings.py:267 +#: conf/skin_general_settings.py:269 msgid "Skin media revision number" msgstr "Numero di revisione dei media della skin" -#: conf/skin_general_settings.py:269 +#: conf/skin_general_settings.py:271 msgid "Will be set automatically but you can modify it if necessary." msgstr "" -#: conf/skin_general_settings.py:280 +#: conf/skin_general_settings.py:282 msgid "Hash to update the media revision number automatically." msgstr "" -#: conf/skin_general_settings.py:284 +#: conf/skin_general_settings.py:286 msgid "Will be set automatically, it is not necesary to modify manually." msgstr "" -#: conf/social_sharing.py:10 +#: conf/social_sharing.py:11 msgid "Sharing content on social networks" msgstr "" -#: conf/social_sharing.py:18 -#, fuzzy +#: conf/social_sharing.py:20 msgid "Check to enable sharing of questions on Twitter" -msgstr "Riapri questa domanda" +msgstr "Seleziona per abilitare la condivisione delle domande su Twitter" -#: conf/social_sharing.py:27 +#: conf/social_sharing.py:29 msgid "Check to enable sharing of questions on Facebook" msgstr "" -#: conf/social_sharing.py:36 +#: conf/social_sharing.py:38 msgid "Check to enable sharing of questions on LinkedIn" msgstr "" -#: conf/social_sharing.py:45 +#: conf/social_sharing.py:47 msgid "Check to enable sharing of questions on Identi.ca" msgstr "" -#: conf/social_sharing.py:54 +#: conf/social_sharing.py:56 msgid "Check to enable sharing of questions on Google+" msgstr "" -#: conf/spam_and_moderation.py:9 -msgid "Spam control and content moderation" +#: conf/spam_and_moderation.py:10 +msgid "Akismet spam protection" msgstr "" -#: conf/spam_and_moderation.py:16 +#: conf/spam_and_moderation.py:18 msgid "Enable Akismet spam detection(keys below are required)" msgstr "" -#: conf/spam_and_moderation.py:19 +#: conf/spam_and_moderation.py:21 #, python-format msgid "To get an Akismet key please visit <a href=\"%(url)s\">Akismet site</a>" msgstr "" -#: conf/spam_and_moderation.py:29 +#: conf/spam_and_moderation.py:31 msgid "Akismet key for spam detection" msgstr "" -#: conf/user_settings.py:11 -#, fuzzy +#: conf/super_groups.py:5 +msgid "Reputation, Badges, Votes & Flags" +msgstr "" + +#: conf/super_groups.py:6 +msgid "Static Content, URLS & UI" +msgstr "" + +#: conf/super_groups.py:7 +msgid "Data rules & Formatting" +msgstr "" + +#: conf/super_groups.py:8 +msgid "External Services" +msgstr "" + +#: conf/super_groups.py:9 +msgid "Login, Users & Communication" +msgstr "" + +#: conf/user_settings.py:12 msgid "User settings" -msgstr "Impostazioni dei diritti degli utenti" +msgstr "Impostazioni degli utenti" -#: conf/user_settings.py:19 +#: conf/user_settings.py:21 msgid "Allow editing user screen name" msgstr "Permetti di modificare il nome utente visualizzato" -#: conf/user_settings.py:28 -#, fuzzy +#: conf/user_settings.py:30 msgid "Allow account recovery by email" -msgstr "Consenti solo un account per indirizzo email" +msgstr "Consenti il recupero dell'account per email" -#: conf/user_settings.py:37 +#: conf/user_settings.py:39 msgid "Allow adding and removing login methods" msgstr "" -#: conf/user_settings.py:47 +#: conf/user_settings.py:49 msgid "Minimum allowed length for screen name" msgstr "Lunghezza minima per il nome utente visualizzato" -#: conf/user_settings.py:57 +#: conf/user_settings.py:59 msgid "Default Gravatar icon type" msgstr "" -#: conf/user_settings.py:59 +#: conf/user_settings.py:61 msgid "" "This option allows you to set the default avatar type for email addresses " "without associated gravatar images. For more information, please visit <a " "href=\"http://en.gravatar.com/site/implement/images/\">this page</a>." msgstr "" -#: conf/user_settings.py:69 -#, fuzzy +#: conf/user_settings.py:71 msgid "Name for the Anonymous user" -msgstr "Email fasulla per gli utenti non registrati" +msgstr "Nome per gli utenti anonimi" -#: conf/vote_rules.py:13 -msgid "Limits applicable to votes and moderation flags" -msgstr "Limiti riguardanti i voti e i post segnati come inappropriati" +#: conf/vote_rules.py:14 +msgid "Vote and flag limits" +msgstr "" -#: conf/vote_rules.py:22 +#: conf/vote_rules.py:24 msgid "Number of votes a user can cast per day" msgstr "Massimo numero di voti che un utente può dare ogni giorno" -#: conf/vote_rules.py:31 +#: conf/vote_rules.py:33 msgid "Maximum number of flags per user per day" msgstr "" "Massimo numero di post che un utente può segnare come inappropriati ogni " "giorno" -#: conf/vote_rules.py:40 +#: conf/vote_rules.py:42 msgid "Threshold for warning about remaining daily votes" msgstr "Soglia per avvertire del numero di voti rimanenti" -#: conf/vote_rules.py:49 +#: conf/vote_rules.py:51 msgid "Number of days to allow canceling votes" msgstr "Numero di giorni per consentire di cancellare voti" -#: conf/vote_rules.py:58 -#, fuzzy +#: conf/vote_rules.py:60 msgid "Number of days required before answering own question" -msgstr "Numero di giorni per consentire di cancellare voti" +msgstr "Numero di giorni richiesti per rispondere alla propria domanda" -#: conf/vote_rules.py:67 +#: conf/vote_rules.py:69 msgid "Number of flags required to automatically hide posts" msgstr "" "Numero di segnalazioni come inappropriato dopo il quale il post viene " "nascosto automaticamente" -#: conf/vote_rules.py:76 +#: conf/vote_rules.py:78 msgid "Number of flags required to automatically delete posts" msgstr "" "Numero di segnalazioni come inappropriato dopo il quale il post viene " "cancellato automaticamente" +#: conf/vote_rules.py:87 +msgid "" +"Minimum days to accept an answer, if it has not been accepted by the " +"question poster" +msgstr "" + #: const/__init__.py:10 msgid "duplicate question" msgstr "la domanda è già stata posta" @@ -2000,9 +2038,8 @@ msgid "favorite" msgstr "preferite" #: const/__init__.py:64 -#, fuzzy msgid "list" -msgstr "Lista dei tag" +msgstr "lista" #: const/__init__.py:65 msgid "cloud" @@ -2016,219 +2053,213 @@ msgstr "La domanda non ha risposte" msgid "Question has no accepted answers" msgstr "La domanda non ha risposte accettate" -#: const/__init__.py:121 +#: const/__init__.py:122 msgid "asked a question" msgstr "ha posto una domanda" -#: const/__init__.py:122 +#: const/__init__.py:123 msgid "answered a question" msgstr "ha risposto a una domanda" -#: const/__init__.py:123 +#: const/__init__.py:124 msgid "commented question" msgstr "ha commentato una domanda" -#: const/__init__.py:124 +#: const/__init__.py:125 msgid "commented answer" msgstr "ha commentato una risposta" -#: const/__init__.py:125 +#: const/__init__.py:126 msgid "edited question" msgstr "ha modificato una domanda" -#: const/__init__.py:126 +#: const/__init__.py:127 msgid "edited answer" msgstr "ha modificato una risposta" -#: const/__init__.py:127 +#: const/__init__.py:128 msgid "received award" msgstr "ha ricevuto una medaglia" -#: const/__init__.py:128 +#: const/__init__.py:129 msgid "marked best answer" msgstr "ha accettato una risposta" -#: const/__init__.py:129 +#: const/__init__.py:130 msgid "upvoted" msgstr "ha dato un voto positivo" -#: const/__init__.py:130 +#: const/__init__.py:131 msgid "downvoted" msgstr "ha dato un voto positivo" -#: const/__init__.py:131 +#: const/__init__.py:132 msgid "canceled vote" msgstr "ha annullato un voto" -#: const/__init__.py:132 +#: const/__init__.py:133 msgid "deleted question" msgstr "ha cancellato una domanda" -#: const/__init__.py:133 +#: const/__init__.py:134 msgid "deleted answer" msgstr "ha cancellato una risposta" -#: const/__init__.py:134 +#: const/__init__.py:135 msgid "marked offensive" msgstr "ha segnalato come inappropriata" -#: const/__init__.py:135 +#: const/__init__.py:136 msgid "updated tags" msgstr "ha aggiornato i tag" -#: const/__init__.py:136 +#: const/__init__.py:137 msgid "selected favorite" msgstr "ha scelto un tag preferito" -#: const/__init__.py:137 +#: const/__init__.py:138 msgid "completed user profile" msgstr "ha completato il suo profilo utente" -#: const/__init__.py:138 +#: const/__init__.py:139 msgid "email update sent to user" msgstr "aggiornamento via mail inviato all'utente" -#: const/__init__.py:141 -#, fuzzy +#: const/__init__.py:142 msgid "reminder about unanswered questions sent" -msgstr "vedi domande senza risposta" +msgstr "notifica le domande inviate che non hanno avuto risposta" -#: const/__init__.py:143 +#: const/__init__.py:146 +msgid "reminder about accepting the best answer sent" +msgstr "notifica quando la risposta viene considerata la migliore" + +#: const/__init__.py:148 msgid "mentioned in the post" msgstr "menzionato nel post" -#: const/__init__.py:194 +#: const/__init__.py:199 msgid "question_answered" msgstr "risposta_a_una_domanda" -#: const/__init__.py:195 +#: const/__init__.py:200 msgid "question_commented" msgstr "commento_a_una_domanda" -#: const/__init__.py:196 +#: const/__init__.py:201 msgid "answer_commented" msgstr "risposta_commentata" -#: const/__init__.py:197 +#: const/__init__.py:202 msgid "answer_accepted" msgstr "risposta_accettata" -#: const/__init__.py:201 +#: const/__init__.py:206 msgid "[closed]" msgstr "[chiusa]" -#: const/__init__.py:202 +#: const/__init__.py:207 msgid "[deleted]" msgstr "[cancellata]" -#: const/__init__.py:203 views/readers.py:613 +#: const/__init__.py:208 views/readers.py:578 msgid "initial version" msgstr "versione iniziale" -#: const/__init__.py:204 +#: const/__init__.py:209 msgid "retagged" msgstr "ritaggata" -#: const/__init__.py:212 +#: const/__init__.py:217 msgid "off" msgstr "" -#: const/__init__.py:213 -#, fuzzy +#: const/__init__.py:218 msgid "exclude ignored" -msgstr "escludi tag ignorati" +msgstr "escludi gli ignorati" -#: const/__init__.py:214 -#, fuzzy +#: const/__init__.py:219 msgid "only selected" -msgstr "Selezionato individualmente" +msgstr "unico selezionato" -#: const/__init__.py:218 +#: const/__init__.py:223 msgid "instantly" msgstr "immediatamente" -#: const/__init__.py:219 +#: const/__init__.py:224 msgid "daily" msgstr "ogni giorno" -#: const/__init__.py:220 +#: const/__init__.py:225 msgid "weekly" msgstr "ogni settimana" -#: const/__init__.py:221 +#: const/__init__.py:226 msgid "no email" msgstr "mai" -#: const/__init__.py:228 +#: const/__init__.py:233 msgid "identicon" msgstr "" -#: const/__init__.py:229 -#, fuzzy +#: const/__init__.py:234 msgid "mystery-man" -msgstr "ieri" +msgstr "mystery-man" -#: const/__init__.py:230 +#: const/__init__.py:235 msgid "monsterid" msgstr "" -#: const/__init__.py:231 -#, fuzzy +#: const/__init__.py:236 msgid "wavatar" -msgstr "" -"Come cambio la mia immagine personale (gravatar)? Che cos'è il gravatar?" +msgstr "wavatar" -#: const/__init__.py:232 +#: const/__init__.py:237 msgid "retro" msgstr "" -#: const/__init__.py:279 +#: const/__init__.py:284 msgid "gold" msgstr "oro" -#: const/__init__.py:280 +#: const/__init__.py:285 msgid "silver" msgstr "argento" -#: const/__init__.py:281 +#: const/__init__.py:286 msgid "bronze" msgstr "bronzo" -#: const/__init__.py:293 +#: const/__init__.py:298 msgid "None" msgstr "" -#: const/__init__.py:294 +#: const/__init__.py:299 msgid "Gravatar" msgstr "" -#: const/__init__.py:295 +#: const/__init__.py:300 msgid "Uploaded Avatar" msgstr "" #: const/message_keys.py:15 -#, fuzzy msgid "most relevant questions" -msgstr "poni una domanda interessante per gli altri" +msgstr "la domanda più rilevante" #: const/message_keys.py:16 -#, fuzzy msgid "click to see most relevant questions" -msgstr "clicca qui per vedere le domande più votate" +msgstr "clicca qui se vuoi vedere le domande più rilevanti" #: const/message_keys.py:17 -#, fuzzy msgid "by relevance" -msgstr "rilevanza" +msgstr "per rilevanza" #: const/message_keys.py:18 msgid "click to see the oldest questions" msgstr "clicca qui per vedere le domande più vecchie" #: const/message_keys.py:19 -#, fuzzy msgid "by date" -msgstr "Conferma" +msgstr "per data" #: const/message_keys.py:20 msgid "click to see the newest questions" @@ -2239,37 +2270,32 @@ msgid "click to see the least recently updated questions" msgstr "clicca qui per vedere le domande modificate meno recentemente" #: const/message_keys.py:22 -#, fuzzy msgid "by activity" -msgstr "attività" +msgstr "per attività" #: const/message_keys.py:23 msgid "click to see the most recently updated questions" msgstr "clicca qui per vedere le domande modificate più di recente" #: const/message_keys.py:24 -#, fuzzy msgid "click to see the least answered questions" -msgstr "clicca qui per vedere le domande più vecchie" +msgstr "clicca qui per vedere l'ultima domanda risposta" #: const/message_keys.py:25 -#, fuzzy msgid "by answers" -msgstr "risposte" +msgstr "per risposte" #: const/message_keys.py:26 -#, fuzzy msgid "click to see the most answered questions" -msgstr "clicca qui per vedere le domande più votate" +msgstr "clicca qui per vedere le domande più risposte" #: const/message_keys.py:27 msgid "click to see least voted questions" msgstr "clicca per vedere le domande meno votate" #: const/message_keys.py:28 -#, fuzzy msgid "by votes" -msgstr "voti" +msgstr "per voti" #: const/message_keys.py:29 msgid "click to see most voted questions" @@ -2286,28 +2312,24 @@ msgid "i-names are not supported" msgstr "i-names non sono supportati" #: deps/django_authopenid/forms.py:233 -#, fuzzy, python-format msgid "Please enter your %(username_token)s" -msgstr "Per favore inserisci il tuo username" +msgstr "Per favore inserisci il tuo %(username_token)s" #: deps/django_authopenid/forms.py:259 -#, fuzzy msgid "Please, enter your user name" msgstr "Per favore inserisci il tuo username" #: deps/django_authopenid/forms.py:263 -#, fuzzy msgid "Please, enter your password" msgstr "Per favore inserisci la tua password" #: deps/django_authopenid/forms.py:270 deps/django_authopenid/forms.py:274 -#, fuzzy msgid "Please, enter your new password" -msgstr "Per favore inserisci la tua password" +msgstr "Per favore inserisci la tua nuova password" #: deps/django_authopenid/forms.py:285 msgid "Passwords did not match" -msgstr "" +msgstr "Le password non corrispondono" #: deps/django_authopenid/forms.py:297 #, python-format @@ -2339,7 +2361,7 @@ msgid "Incorrect username." msgstr "Mi spiace, questo username non esiste" #: deps/django_authopenid/urls.py:9 deps/django_authopenid/urls.py:12 -#: deps/django_authopenid/urls.py:15 setup_templates/settings.py:203 +#: deps/django_authopenid/urls.py:15 setup_templates/settings.py:205 msgid "signin/" msgstr "signin/" @@ -2352,9 +2374,8 @@ msgid "complete/" msgstr "complete/" #: deps/django_authopenid/urls.py:15 -#, fuzzy msgid "complete-oauth/" -msgstr "complete/" +msgstr "complete-oauth/" #: deps/django_authopenid/urls.py:19 msgid "register/" @@ -2369,21 +2390,18 @@ msgid "logout/" msgstr "logout/" #: deps/django_authopenid/urls.py:30 -#, fuzzy msgid "recover/" -msgstr "riapri/" +msgstr "recupera/" #: deps/django_authopenid/util.py:378 -#, fuzzy, python-format msgid "%(site)s user name and password" -msgstr "Per favore inserisci username e password" +msgstr "Per favore inserisci username e password di %(site)s" #: deps/django_authopenid/util.py:384 msgid "Create a password-protected account" msgstr "" #: deps/django_authopenid/util.py:385 -#, fuzzy msgid "Change your password" msgstr "Cambia password" @@ -2392,24 +2410,20 @@ msgid "Sign in with Yahoo" msgstr "" #: deps/django_authopenid/util.py:480 -#, fuzzy msgid "AOL screen name" msgstr "Nome utente" #: deps/django_authopenid/util.py:488 -#, fuzzy msgid "OpenID url" msgstr "url OpenID:" #: deps/django_authopenid/util.py:517 -#, fuzzy msgid "Flickr user name" -msgstr "nome utente" +msgstr "nome utente Flickr" #: deps/django_authopenid/util.py:525 -#, fuzzy msgid "Technorati user name" -msgstr "Scegli un nome utente" +msgstr "nome utente di Technorati" #: deps/django_authopenid/util.py:533 msgid "WordPress blog name" @@ -2424,24 +2438,20 @@ msgid "LiveJournal blog name" msgstr "" #: deps/django_authopenid/util.py:557 -#, fuzzy msgid "ClaimID user name" -msgstr "nome utente" +msgstr "nome utente di ClaimID" #: deps/django_authopenid/util.py:565 -#, fuzzy msgid "Vidoop user name" -msgstr "nome utente" +msgstr "nome utente di Vidoop" #: deps/django_authopenid/util.py:573 -#, fuzzy msgid "Verisign user name" -msgstr "nome utente" +msgstr "nome utente Verisign" #: deps/django_authopenid/util.py:608 -#, fuzzy, python-format msgid "Change your %(provider)s password" -msgstr "Cambia password" +msgstr "Cambia password di %(provider)s" #: deps/django_authopenid/util.py:612 #, python-format @@ -2454,12 +2464,10 @@ msgid "Create password for %(provider)s" msgstr "" #: deps/django_authopenid/util.py:625 -#, fuzzy, python-format msgid "Connect your %(provider)s account to %(site_name)s" -msgstr "Utilizza OpenID per accedere a questo sito" +msgstr "Collega il tuo account %(provider)s per %(site_name)s" #: deps/django_authopenid/util.py:634 -#, fuzzy, python-format msgid "Signin with %(provider)s user name and password" msgstr "Per favore inserisci username e password" @@ -2482,9 +2490,8 @@ msgid "" msgstr "" #: deps/django_authopenid/views.py:365 -#, fuzzy msgid "Your new password saved" -msgstr "New password created" +msgstr "Nuova password salvata" #: deps/django_authopenid/views.py:469 msgid "The login password combination was not correct" @@ -2520,9 +2527,8 @@ msgid "Login method %(provider_name)s does not exist" msgstr "" #: deps/django_authopenid/views.py:663 -#, fuzzy msgid "Oops, sorry - there was some error - please try again" -msgstr "le due password non coincidono, riprova" +msgstr "Oops! C'è stato un errore, per favore riprova" #: deps/django_authopenid/views.py:754 #, python-format @@ -2536,9 +2542,8 @@ msgstr "" "Il tuo indirizzo e-mail dev'essere verificato — vedi %(details_url)s" #: deps/django_authopenid/views.py:1092 -#, fuzzy, python-format msgid "Recover your %(site)s account" -msgstr "Scegli una nuova password" +msgstr "Recupera la password su %(site)s" #: deps/django_authopenid/views.py:1162 msgid "Please check your email and visit the enclosed link." @@ -2548,24 +2553,28 @@ msgstr "" msgid "Site" msgstr "Sito" -#: deps/livesettings/values.py:106 +#: deps/livesettings/values.py:68 +msgid "Main" +msgstr "" + +#: deps/livesettings/values.py:127 msgid "Base Settings" msgstr "Impostazioni base" -#: deps/livesettings/values.py:213 +#: deps/livesettings/values.py:234 msgid "Default value: \"\"" msgstr "Valore predefinito: \"\"" -#: deps/livesettings/values.py:220 +#: deps/livesettings/values.py:241 msgid "Default value: " msgstr "Valore predefinito:" -#: deps/livesettings/values.py:223 +#: deps/livesettings/values.py:244 #, python-format msgid "Default value: %s" msgstr "Valore predefinito: %s" -#: deps/livesettings/values.py:601 +#: deps/livesettings/values.py:622 #, python-format msgid "Allowed image file types are %(types)s" msgstr "I tipi di file immagine consentiti sono %(types)s" @@ -2615,10 +2624,6 @@ msgstr "Impostazioni incluse in %(name)s." msgid "You don't have permission to edit values." msgstr "Non hai i permessi per modificare i valori." -#: deps/livesettings/templates/livesettings/group_settings.html:68 -msgid "Setting groups" -msgstr "Gruppi di impostazioni" - #: deps/livesettings/templates/livesettings/site_settings.html:27 msgid "Edit Site Settings" msgstr "Modifica impostazioni del sito" @@ -2669,15 +2674,15 @@ msgstr "" #: management/commands/post_emailed_questions.py:55 #, python-format msgid "" -"<p>Sorry, there was an error posting your question please contact the %(site)" -"s administrator</p>" +"<p>Sorry, there was an error posting your question please contact the " +"%(site)s administrator</p>" msgstr "" #: management/commands/post_emailed_questions.py:61 #, python-format msgid "" -"<p>Sorry, in order to post questions on %(site)s by email, please <a href=\"%" -"(url)s\">register first</a></p>" +"<p>Sorry, in order to post questions on %(site)s by email, please <a href=" +"\"%(url)s\">register first</a></p>" msgstr "" #: management/commands/post_emailed_questions.py:69 @@ -2686,6 +2691,19 @@ msgid "" "of your user account</p>" msgstr "" +#: management/commands/send_accept_answer_reminders.py:57 +#, python-format +msgid "Accept the best answer for %(question_count)d of your questions" +msgstr "" + +#: management/commands/send_accept_answer_reminders.py:62 +msgid "Please accept the best answer for this question:" +msgstr "Per favore accetta la migliore risposta per questa domanda:" + +#: management/commands/send_accept_answer_reminders.py:64 +msgid "Please accept the best answer for these questions:" +msgstr "Per favore accetta la migliore risposta per queste domande:" + #: management/commands/send_email_alerts.py:411 #, python-format msgid "%(question_count)d updated question about %(topics)s" @@ -2701,8 +2719,8 @@ msgstr[0] "" "<p>Caro %(name)s,</p></p>ci sono degli aggiornamenti riguardanti questa " "domanda sul forum Q&A:</p>" msgstr[1] "" -"<p>Caro %(name)s,</p><p>ci sono degli aggiornamenti riguardanti queste %" -"(num) domande sul forum Q&A:</p>" +"<p>Caro %(name)s,</p><p>ci sono degli aggiornamenti riguardanti queste " +"%(num) domande sul forum Q&A:</p>" #: management/commands/send_email_alerts.py:438 msgid "new question" @@ -2748,8 +2766,8 @@ msgstr "" #: management/commands/send_email_alerts.py:490 #, python-format msgid "" -"go to %(email_settings_link)s to change frequency of email updates or %" -"(admin_email)s administrator" +"go to %(email_settings_link)s to change frequency of email updates or " +"%(admin_email)s administrator" msgstr "" "<p>Ricorda che puoi <a href='%(email_settings_link)s'>modificare</a> la " "frequenza degli aggiornamenti via e-mail o disabilitarli completamente.<br/" @@ -2758,75 +2776,78 @@ msgstr "" "l'amministratore del forum all'indirizzo %(admin_email)s.</p><p>Cordialmente," "</p><p>Il tuo amico server del forum Q&A</p>" -#: management/commands/send_unanswered_question_reminders.py:80 +#: management/commands/send_unanswered_question_reminders.py:56 #, python-format msgid "%(question_count)d unanswered question about %(topics)s" msgid_plural "%(question_count)d unanswered questions about %(topics)s" msgstr[0] "" msgstr[1] "" -#: models/__init__.py:316 +#: models/__init__.py:317 msgid "" "Sorry, you cannot accept or unaccept best answers because your account is " "blocked" msgstr "" "Mi spiace, non puoi accettare risposte perché il tuo account è stato bloccato" -#: models/__init__.py:320 +#: models/__init__.py:321 msgid "" "Sorry, you cannot accept or unaccept best answers because your account is " "suspended" msgstr "Mi spiace, non puoi accettare risposte perché il tuo account è sospeso" -#: models/__init__.py:333 -#, fuzzy, python-format +#: models/__init__.py:334 msgid "" ">%(points)s points required to accept or unaccept your own answer to your " "own question" -msgstr "Mi spiace, non puoi accettare una tua risposta a una tua domanda" +msgstr "Ti servono più di %(points)s punti per accettare o negare la risposta alla tua stessa domanda" + +#: models/__init__.py:353 +#, python-format +msgid "" +"Sorry, you will be able to accept this answer only after %(will_be_able_at)s" +msgstr "" -#: models/__init__.py:347 -#, fuzzy, python-format +#: models/__init__.py:361 msgid "" -"Sorry, only original author of the question - %(username)s - can accept or " -"unaccept the best answer" +"Sorry, only moderators or original author of the question - %(username)s - " +"can accept or unaccept the best answer" msgstr "" -"Mi spiace, solo l'autore della domanda, %(username)s, può accettare una " -"risposta" +"Mi spiace, solo il moderatore o l'autore della domanda, %(username)s, può accettare la risposta migliore" -#: models/__init__.py:375 +#: models/__init__.py:389 msgid "cannot vote for own posts" msgstr "Mi spiace, non puoi votare per i tuoi post" -#: models/__init__.py:378 +#: models/__init__.py:392 msgid "Sorry your account appears to be blocked " msgstr "Mi spiace, il tuo account è stato bloccato" -#: models/__init__.py:383 +#: models/__init__.py:397 msgid "Sorry your account appears to be suspended " msgstr "Mi spiace, il tuo account è stato sospeso" -#: models/__init__.py:393 +#: models/__init__.py:407 #, python-format msgid ">%(points)s points required to upvote" msgstr "" "Serve avere più di %(points)s punti reputazione per poter votare a favore" -#: models/__init__.py:399 +#: models/__init__.py:413 #, python-format msgid ">%(points)s points required to downvote" msgstr "" "Serve avere più di %(points)s punti reputazione per poter votare contro" -#: models/__init__.py:414 +#: models/__init__.py:428 msgid "Sorry, blocked users cannot upload files" msgstr "Mi spiace, gli utenti bloccati non possono caricare files" -#: models/__init__.py:415 +#: models/__init__.py:429 msgid "Sorry, suspended users cannot upload files" msgstr "Mi spiace, gli utenti sospesi non possono caricare files" -#: models/__init__.py:417 +#: models/__init__.py:431 #, python-format msgid "" "uploading images is limited to users with >%(min_rep)s reputation points" @@ -2834,21 +2855,21 @@ msgstr "" "Mi spiace, serve avere più di %(min_rep)s punti reputazione per caricare " "immagini" -#: models/__init__.py:436 models/__init__.py:503 models/__init__.py:918 +#: models/__init__.py:450 models/__init__.py:517 models/__init__.py:932 msgid "blocked users cannot post" msgstr "" "Mi spiace, il tuo account è stato bloccato; non puoi fare nuovi post finché " "la questione non verrà risolta. Contatta l'amministratore del forum per " "trovare una soluzione." -#: models/__init__.py:437 models/__init__.py:921 +#: models/__init__.py:451 models/__init__.py:935 msgid "suspended users cannot post" msgstr "" "Mi spiace, il tuo account è stato sospeso; non puoi fare nuovi post finché " "la questione non verrà risolta. Puoi però modificare i tuoi vecchi post. " "Contatta l'amministratore del forum per trovare una soluzione." -#: models/__init__.py:464 +#: models/__init__.py:478 #, python-format msgid "" "Sorry, comments (except the last one) are editable only within %(minutes)s " @@ -2859,21 +2880,20 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: models/__init__.py:476 -#, fuzzy +#: models/__init__.py:490 msgid "Sorry, but only post owners or moderators can edit comments" msgstr "" "Mi spiace, solo gli autori, i moderatori e gli amministratori possono " -"cambiare i tag di una domanda cancellata" +"modificare i commenti" -#: models/__init__.py:489 +#: models/__init__.py:503 msgid "" "Sorry, since your account is suspended you can comment only your own posts" msgstr "" "Mi spiace, visto che il tuo account è sospeso puoi commentare solo i tuoi " "post" -#: models/__init__.py:493 +#: models/__init__.py:507 #, python-format msgid "" "Sorry, to comment any post a minimum reputation of %(min_rep)s points is " @@ -2883,8 +2903,7 @@ msgstr "" "Per commentare gli altri post serve avere almeno %(min_rep)s punti " "reputazione. " -#: models/__init__.py:521 -#, fuzzy +#: models/__init__.py:535 msgid "" "This post has been deleted and can be seen only by post owners, site " "administrators and moderators" @@ -2892,7 +2911,7 @@ msgstr "" "Questo post è stato cancellato e può essere consultato solo dall'autore, dai " "moderatori e dagli amministratori" -#: models/__init__.py:538 +#: models/__init__.py:552 msgid "" "Sorry, only moderators, site administrators and post owners can edit deleted " "posts" @@ -2900,27 +2919,25 @@ msgstr "" "Mi spiace, solo l'autore, i moderatori e gli amministratori possono " "modificare un post cancellato." -#: models/__init__.py:553 +#: models/__init__.py:567 msgid "Sorry, since your account is blocked you cannot edit posts" msgstr "" "Mi spiace, non puoi modificare alcun post perché il tuo account è stato " "bloccato" -#: models/__init__.py:557 +#: models/__init__.py:571 msgid "Sorry, since your account is suspended you can edit only your own posts" msgstr "" "Mi spiace, puoi modificare solo i tuoi post perché il tuo account è sospeso" -#: models/__init__.py:562 -#, fuzzy, python-format +#: models/__init__.py:576 msgid "" "Sorry, to edit wiki posts, a minimum reputation of %(min_rep)s is required" msgstr "" -"Mi spiace, per modificare i post appartenenti allo wiki servono almeno %" -"(min_rep)s punti reputazione" +"Mi spiace, per modificare i post appartenenti allo wiki servono almeno " +"%(min_rep)s punti reputazione" -#: models/__init__.py:569 -#, fuzzy, python-format +#: models/__init__.py:583 msgid "" "Sorry, to edit other people's posts, a minimum reputation of %(min_rep)s is " "required" @@ -2928,7 +2945,7 @@ msgstr "" "Mi spiace, per modificare i post altrui servono almeno %(min_rep)s punti " "reputazione" -#: models/__init__.py:632 +#: models/__init__.py:646 msgid "" "Sorry, cannot delete your question since it has an upvoted answer posted by " "someone else" @@ -2942,17 +2959,17 @@ msgstr[1] "" "Mi spiace, non puoi cancellare la tua domanda perché qualcun altro ha " "fornito delle risposte con voti a favore" -#: models/__init__.py:647 +#: models/__init__.py:661 msgid "Sorry, since your account is blocked you cannot delete posts" msgstr "Mi spiace, non puoi cancellare post perché il tuo account è blocato" -#: models/__init__.py:651 +#: models/__init__.py:665 msgid "" "Sorry, since your account is suspended you can delete only your own posts" msgstr "" "Mi spiace, puoi cancellare solo i tuoi post perché il tuo account è sospeso" -#: models/__init__.py:655 +#: models/__init__.py:669 #, python-format msgid "" "Sorry, to deleted other people' posts, a minimum reputation of %(min_rep)s " @@ -2961,16 +2978,16 @@ msgstr "" "Mi spiace, per cancellare i post altrui servono almeno %(min_rep)s punti " "reputazione" -#: models/__init__.py:675 +#: models/__init__.py:689 msgid "Sorry, since your account is blocked you cannot close questions" msgstr "" "Mi spiace, non puoi chiudere domande perché il tuo account è stato bloccato" -#: models/__init__.py:679 +#: models/__init__.py:693 msgid "Sorry, since your account is suspended you cannot close questions" msgstr "Mi spiace, non puoi chiudere domande perché il tuo account è sospeso" -#: models/__init__.py:683 +#: models/__init__.py:697 #, python-format msgid "" "Sorry, to close other people' posts, a minimum reputation of %(min_rep)s is " @@ -2979,7 +2996,7 @@ msgstr "" "Mi spiace, per chiudere post altrui servono almeno %(min_rep)s punti " "reputazione." -#: models/__init__.py:692 +#: models/__init__.py:706 #, python-format msgid "" "Sorry, to close own question a minimum reputation of %(min_rep)s is required" @@ -2987,16 +3004,16 @@ msgstr "" "Mi spiace, per chiudere una tua domanda servono almeno %(min_rep)s punti " "reputazione." -#: models/__init__.py:716 +#: models/__init__.py:730 #, python-format msgid "" -"Sorry, only administrators, moderators or post owners with reputation > %" -"(min_rep)s can reopen questions." +"Sorry, only administrators, moderators or post owners with reputation > " +"%(min_rep)s can reopen questions." msgstr "" "Mi spiace, solo amministratori, moderatori e autori con più di %(min_rep)s " "punti reputazione possono riaprire domande." -#: models/__init__.py:722 +#: models/__init__.py:736 #, python-format msgid "" "Sorry, to reopen own question a minimum reputation of %(min_rep)s is required" @@ -3004,39 +3021,39 @@ msgstr "" "Mi spiace, per riaprire una tua domanda devi avere almeno %(min_rep)s punti " "reputazione." -#: models/__init__.py:742 +#: models/__init__.py:756 msgid "cannot flag message as offensive twice" msgstr "" "Hai già segnalato questo messaggio come inappropriato, non puoi farlo una " "seconda volta." -#: models/__init__.py:747 +#: models/__init__.py:761 msgid "blocked users cannot flag posts" msgstr "" "Non puoi segnalare questo messaggio come inappropriato perché il tuo account " "è stato bloccato." -#: models/__init__.py:749 +#: models/__init__.py:763 msgid "suspended users cannot flag posts" msgstr "" "Non puoi segnalare questo messaggio come inappropriato perché il tuo account " "è sospeso." -#: models/__init__.py:751 +#: models/__init__.py:765 #, python-format msgid "need > %(min_rep)s points to flag spam" msgstr "" "Mi spiace, servono più di %(min_rep)s punti reputazione per segnalare un " "post come inappropriato." -#: models/__init__.py:770 +#: models/__init__.py:784 #, python-format msgid "%(max_flags_per_day)s exceeded" msgstr "" "Mi spiace, hai già segnalato %(max_flags_per_day)s post come offensivi oggi, " "hai superato il massimo giornaliero." -#: models/__init__.py:785 +#: models/__init__.py:799 msgid "" "Sorry, only question owners, site administrators and moderators can retag " "deleted questions" @@ -3044,19 +3061,19 @@ msgstr "" "Mi spiace, solo gli autori, i moderatori e gli amministratori possono " "cambiare i tag di una domanda cancellata" -#: models/__init__.py:792 +#: models/__init__.py:806 msgid "Sorry, since your account is blocked you cannot retag questions" msgstr "" "Mi spiace, non puoi cambiare i tag perché il tuo account è stato bloccato." -#: models/__init__.py:796 +#: models/__init__.py:810 msgid "" "Sorry, since your account is suspended you can retag only your own questions" msgstr "" "Mi spiace, puoi cambiare i tag solo alle tue domande perché il tuo account è " "sospeso." -#: models/__init__.py:800 +#: models/__init__.py:814 #, python-format msgid "" "Sorry, to retag questions a minimum reputation of %(min_rep)s is required" @@ -3064,160 +3081,148 @@ msgstr "" "Mi spiace, servono almeno %(min_rep)s punti reputazione per cambiare i tag " "di una domanda" -#: models/__init__.py:819 +#: models/__init__.py:833 msgid "Sorry, since your account is blocked you cannot delete comment" msgstr "" "Mi spiace, non puoi cancellare commenti perché il tuo account è stato " "bloccato." -#: models/__init__.py:823 +#: models/__init__.py:837 msgid "" "Sorry, since your account is suspended you can delete only your own comments" msgstr "" "Mi spiace, puoi cancellare solo i tuoi commenti perché il tuo account è " "sospeso." -#: models/__init__.py:827 +#: models/__init__.py:841 #, python-format msgid "Sorry, to delete comments reputation of %(min_rep)s is required" msgstr "" "Mi spiace, servono almeno %(min_rep)s punti reputazione per cancellare " "commenti." -#: models/__init__.py:850 +#: models/__init__.py:864 msgid "cannot revoke old vote" msgstr "Mi spiace, non è possibile annullare voti." -#: models/__init__.py:1325 utils/functions.py:70 +#: models/__init__.py:1339 utils/functions.py:70 #, python-format msgid "on %(date)s" msgstr "il %(date)s" -#: models/__init__.py:1327 +#: models/__init__.py:1341 msgid "in two days" msgstr "" -#: models/__init__.py:1329 +#: models/__init__.py:1343 msgid "tomorrow" msgstr "" -#: models/__init__.py:1331 -#, fuzzy, python-format +#: models/__init__.py:1345 msgid "in %(hr)d hour" msgid_plural "in %(hr)d hours" msgstr[0] "%(hr)d ora fa" msgstr[1] "%(hr)d ore fa" -#: models/__init__.py:1333 -#, fuzzy, python-format +#: models/__init__.py:1347 msgid "in %(min)d min" msgid_plural "in %(min)d mins" msgstr[0] "%(min)d minuto fa" msgstr[1] "%(min)d minuti fa" -#: models/__init__.py:1334 +#: models/__init__.py:1348 #, python-format msgid "%(days)d day" msgid_plural "%(days)d days" msgstr[0] "" msgstr[1] "" -#: models/__init__.py:1336 +#: models/__init__.py:1350 #, python-format msgid "" "New users must wait %(days)s before answering their own question. You can " "post an answer %(left)s" msgstr "" -#: models/__init__.py:1502 -#, fuzzy +#: models/__init__.py:1516 msgid "Anonymous" msgstr "utente non registrato" -#: models/__init__.py:1598 views/users.py:365 +#: models/__init__.py:1612 views/users.py:368 msgid "Site Adminstrator" msgstr "Amministratore del sito" -#: models/__init__.py:1600 views/users.py:367 +#: models/__init__.py:1614 views/users.py:370 msgid "Forum Moderator" msgstr "Moderatore del forum" -#: models/__init__.py:1602 views/users.py:369 +#: models/__init__.py:1616 views/users.py:372 msgid "Suspended User" msgstr "Utente sospeso" -#: models/__init__.py:1604 views/users.py:371 +#: models/__init__.py:1618 views/users.py:374 msgid "Blocked User" msgstr "Utente bloccato" -#: models/__init__.py:1606 views/users.py:373 +#: models/__init__.py:1620 views/users.py:376 msgid "Registered User" msgstr "Utente registrato" -#: models/__init__.py:1608 +#: models/__init__.py:1622 msgid "Watched User" msgstr "Utente in prova" -#: models/__init__.py:1610 +#: models/__init__.py:1624 msgid "Approved User" msgstr "Utente approvato" -#: models/__init__.py:1719 -#, fuzzy, python-format +#: models/__init__.py:1733 msgid "%(username)s karma is %(reputation)s" -msgstr "hai %(reputation)s punti reputazione" +msgstr "%(username)s ha %(reputation)s punti reputazione" -#: models/__init__.py:1729 +#: models/__init__.py:1743 #, python-format msgid "one gold badge" msgid_plural "%(count)d gold badges" msgstr[0] "" msgstr[1] "" -#: models/__init__.py:1736 -#, fuzzy, python-format +#: models/__init__.py:1750 +#, python-format msgid "one silver badge" msgid_plural "%(count)d silver badges" -msgstr[0] "" -"Per ottenere le medaglie d'argento ci vuole del tempo. Se ne hai ottenuta " -"una, vuol dire che hai dato un grande contributo alla comunità." -msgstr[1] "" -"Per ottenere le medaglie d'argento ci vuole del tempo. Se ne hai ottenuta " -"una, vuol dire che hai dato un grande contributo alla comunità." +msgstr[0] "una medaglia d'argento" +msgstr[1] "%(count)d medaglie d'argento" -#: models/__init__.py:1743 -#, fuzzy, python-format +#: models/__init__.py:1757 +#, python-format msgid "one bronze badge" msgid_plural "%(count)d bronze badges" -msgstr[0] "" -"Se partecipi regolarmente a questa comunità, verrai sicuramente premiato con " -"delle medaglie di bronzo." -msgstr[1] "" -"Se partecipi regolarmente a questa comunità, verrai sicuramente premiato con " -"delle medaglie di bronzo." +msgstr[0] "una medaglia di bronzo" +msgstr[1] "%(count)d medaglie di bronzo" -#: models/__init__.py:1754 +#: models/__init__.py:1768 #, python-format msgid "%(item1)s and %(item2)s" msgstr "" -#: models/__init__.py:1758 +#: models/__init__.py:1772 #, python-format msgid "%(user)s has %(badges)s" msgstr "" -#: models/__init__.py:2165 models/__init__.py:2171 models/__init__.py:2176 -#: models/__init__.py:2181 -#, fuzzy, python-format +#: models/__init__.py:2179 models/__init__.py:2185 models/__init__.py:2190 +#: models/__init__.py:2195 +#, python-format msgid "Re: \"%(title)s\"" -msgstr "nuova domanda" +msgstr "Re:\"%(title)s\"" -#: models/__init__.py:2186 models/__init__.py:2191 -#, fuzzy, python-format +#: models/__init__.py:2200 models/__init__.py:2205 +#, python-format msgid "Question: \"%(title)s\"" -msgstr "nuova domanda" +msgstr "Domanda: \"%(title)s\"" -#: models/__init__.py:2372 +#: models/__init__.py:2386 #, python-format msgid "" "Congratulations, you have received a badge '%(badge_name)s'. Check out <a " @@ -3226,7 +3231,7 @@ msgstr "" "Congratulazioni, hai ricevuto la medaglia %(badge_name)s. Controlla il <a " "href=\"%(user_profile)s\">tuo profilo</a>." -#: models/__init__.py:2551 views/commands.py:396 +#: models/__init__.py:2565 views/commands.py:396 msgid "Your tag subscription was saved, thanks!" msgstr "" @@ -3237,23 +3242,22 @@ msgid "" msgstr "" #: models/answer.py:112 -#, fuzzy msgid "Sorry, this answer has been removed and is no longer accessible" msgstr "Mi spiace, questa domanda è stata cancellata e non è più accessibile" #: models/badges.py:129 -#, fuzzy, python-format +#, python-format msgid "Deleted own post with %(votes)s or more upvotes" -msgstr "Ha cancellato un proprio post con un punteggio di -3 o meno" +msgstr "Ha cancellato un proprio post con un punteggio di %(votes)s o più" #: models/badges.py:133 msgid "Disciplined" msgstr "Ordinato" #: models/badges.py:151 -#, fuzzy, python-format +#, python-format msgid "Deleted own post with %(votes)s or more downvotes" -msgstr "Ha cancellato un proprio post con un punteggio di -3 o meno" +msgstr "Ha cancellato un proprio post con un punteggio di %(votes)s o più" #: models/badges.py:155 msgid "Peer Pressure" @@ -3273,7 +3277,6 @@ msgid "Supporter" msgstr "Sostenitore" #: models/badges.py:219 -#, fuzzy msgid "First upvote" msgstr "Primo voto positivo" @@ -3282,38 +3285,35 @@ msgid "Critic" msgstr "Critico" #: models/badges.py:228 -#, fuzzy msgid "First downvote" msgstr "Primo voto negativo" #: models/badges.py:237 -#, fuzzy msgid "Civic Duty" msgstr "Senso civico" #: models/badges.py:238 -#, fuzzy, python-format +#, python-format msgid "Voted %(num)s times" -msgstr "Ha votato almeno 300 volte" +msgstr "Votata almeno %(num)s volte" #: models/badges.py:252 -#, fuzzy, python-format +#, python-format msgid "Answered own question with at least %(num)s up votes" -msgstr "Ha risposto da solo a una sua domanda con almeno 3 voti" +msgstr "Ha risposto da solo ad una sua domanda con almeno %(num)s voti" #: models/badges.py:256 msgid "Self-Learner" msgstr "Autodidatta" #: models/badges.py:304 -#, fuzzy msgid "Nice Answer" msgstr "Buona risposta" #: models/badges.py:309 models/badges.py:321 models/badges.py:333 -#, fuzzy, python-format +#, python-format msgid "Answer voted up %(num)s times" -msgstr "Risposta votata 10 volte" +msgstr "Risposta votata %(num)s volte" #: models/badges.py:316 msgid "Good Answer" @@ -3328,9 +3328,9 @@ msgid "Nice Question" msgstr "Buona domanda" #: models/badges.py:345 models/badges.py:357 models/badges.py:369 -#, fuzzy, python-format +#, python-format msgid "Question voted up %(num)s times" -msgstr "Domanda votata 10 volte" +msgstr "Domanda votata %(num)s volte" #: models/badges.py:352 msgid "Good Question" @@ -3353,23 +3353,21 @@ msgid "Popular Question" msgstr "Domanda gettonata" #: models/badges.py:418 models/badges.py:429 models/badges.py:441 -#, fuzzy, python-format +#, python-format msgid "Asked a question with %(views)s views" -msgstr "Ha posto una domanda con più di 1000 consultazioni" +msgstr "Ha posto una domanda con %(views)s consultazioni" #: models/badges.py:425 msgid "Notable Question" msgstr "Domanda notevole" #: models/badges.py:436 -#, fuzzy msgid "Famous Question" -msgstr "Domanda famosa" +msgstr "Domande famose" #: models/badges.py:450 -#, fuzzy msgid "Asked a question and accepted an answer" -msgstr "La domanda non ha risposte accettate" +msgstr "Domanda inserita e risposta accettata" #: models/badges.py:453 msgid "Scholar" @@ -3380,33 +3378,32 @@ msgid "Enlightened" msgstr "Illuminato" #: models/badges.py:499 -#, fuzzy, python-format +#, python-format msgid "First answer was accepted with %(num)s or more votes" -msgstr "La sua prima risposta è stata accettata con almeno 10 voti" +msgstr "La sua prima risposta è stata accettata con almeno %(num)s voti" #: models/badges.py:507 msgid "Guru" msgstr "Guru" #: models/badges.py:510 -#, fuzzy, python-format +#, python-format msgid "Answer accepted with %(num)s or more votes" -msgstr "La sua prima risposta è stata accettata con almeno 10 voti" +msgstr "La sua prima risposta è stata accettata con almeno %(num)s voti" #: models/badges.py:518 -#, fuzzy, python-format +#, python-format msgid "" "Answered a question more than %(days)s days later with at least %(votes)s " "votes" msgstr "" -"Ha risposto a una domanda vecchia di almeno 60 giorni ottenendo almeno 5 voti" +"Ha risposto a una domanda vecchia di almeno %(days)s giorni ottenendo almeno %(votes)s voti" #: models/badges.py:525 msgid "Necromancer" msgstr "Negromante" #: models/badges.py:548 -#, fuzzy msgid "Citizen Patrol" msgstr "Sempre in guardia" @@ -3443,7 +3440,6 @@ msgid "Associate Editor" msgstr "" #: models/badges.py:627 -#, fuzzy, python-format msgid "Edited %(num)s entries" msgstr "Ha fatto almeno 100 revisioni" @@ -3464,7 +3460,6 @@ msgid "Completed all user profile fields" msgstr "Ha completato tutti i campi del suo profilo utente" #: models/badges.py:663 -#, fuzzy, python-format msgid "Question favorited by %(num)s users" msgstr "Domanda inserita tra le \"preferite\" da almeno 25 utenti" @@ -3486,21 +3481,18 @@ msgid "Visited site every day for %(num)s days in a row" msgstr "" #: models/badges.py:732 -#, fuzzy msgid "Commentator" -msgstr "Documentazione" +msgstr "Commentatore" #: models/badges.py:736 -#, fuzzy, python-format msgid "Posted %(num_comments)s comments" -msgstr "(%(comment_count)s commento)" +msgstr "Inseriti (%(comment_count)s commenti" #: models/badges.py:752 msgid "Taxonomist" msgstr "Tassonomista" #: models/badges.py:756 -#, fuzzy, python-format msgid "Created a tag used by %(num)s questions" msgstr "Ha creato un tag usato da almeno 50 domande" @@ -3512,53 +3504,52 @@ msgstr "Esperto" msgid "Very active in one tag" msgstr "Molto attivo in domande con lo stesso tag" -#: models/meta.py:112 +#: models/meta.py:116 msgid "" "Sorry, the comment you are looking for is no longer accessible, because the " "parent question has been removed" msgstr "" -#: models/meta.py:119 +#: models/meta.py:123 msgid "" "Sorry, the comment you are looking for is no longer accessible, because the " "parent answer has been removed" msgstr "" -#: models/question.py:72 +#: models/question.py:70 #, python-format msgid "\" and \"%s\"" msgstr "" -#: models/question.py:75 -#, fuzzy +#: models/question.py:73 msgid "\" and more" -msgstr "Scopri di più" +msgstr "\" ed altro ancora" -#: models/question.py:452 +#: models/question.py:492 msgid "Sorry, this question has been deleted and is no longer accessible" msgstr "Mi spiace, questa domanda è stata cancellata e non è più accessibile" -#: models/question.py:908 +#: models/question.py:948 #, python-format msgid "%(author)s modified the question" msgstr "%(author)s ha modificato la sua domanda" -#: models/question.py:912 +#: models/question.py:952 #, python-format msgid "%(people)s posted %(new_answer_count)s new answers" msgstr "%(people)s ha/hanno scritto %(new_answer_count)s nuova/e risposta/e" -#: models/question.py:917 +#: models/question.py:957 #, python-format msgid "%(people)s commented the question" msgstr "%(people)s ha/hanno commentato la domanda" -#: models/question.py:922 +#: models/question.py:962 #, python-format msgid "%(people)s commented answers" msgstr "%(people)s ha/hanno commentato alcune risposte" -#: models/question.py:924 +#: models/question.py:964 #, python-format msgid "%(people)s commented an answer" msgstr "%(people)s ha/hanno commentato una risposta" @@ -3571,8 +3562,8 @@ msgstr "<em>Modificato da un moderatore. Motivo:</em> %(reason)s" #: models/repute.py:153 #, python-format msgid "" -"%(points)s points were added for %(username)s's contribution to question %" -"(question_title)s" +"%(points)s points were added for %(username)s's contribution to question " +"%(question_title)s" msgstr "" " %(username)s ha guadagnato %(points)s punti reputazione per i suoi " "contributi alla domanda %(question_title)s" @@ -3630,6 +3621,14 @@ msgstr "Ogni settimana" msgid "No email" msgstr "Mai" +#: skins/old/templates/user_profile/user_info.html:90 +msgid "todays unused votes" +msgstr "voti rimanenti per oggi" + +#: skins/old/templates/user_profile/user_info.html:91 +msgid "votes left" +msgstr "voti rimanenti" + #: templatetags/extra_filters.py:145 templatetags/extra_filters_jinja.py:240 msgid "no items in counter" msgstr "no" @@ -3644,9 +3643,8 @@ msgid "Oops, apologies - there was some error" msgstr "" #: utils/decorators.py:109 -#, fuzzy msgid "Please login to post" -msgstr "Accedi o registrati" +msgstr "Accedi o registrati per inserire domande" #: utils/decorators.py:205 msgid "Spam was detected on your post, sorry for if this is a mistake" @@ -3770,9 +3768,8 @@ msgid "You have %(votes_left)s votes left for today" msgstr "Puoi votare ancora %(votes_left)s volte oggi" #: views/commands.py:122 -#, fuzzy msgid "Sorry, but anonymous users cannot access the inbox" -msgstr "mi spiace, devi essere registrato per accettare una risposta" +msgstr "Spiacenti, gli utenti anonimi non possono accedere ai messaggi in arrivo" #: views/commands.py:192 msgid "Sorry, something is not right here..." @@ -3801,14 +3798,12 @@ msgid "Tag subscription was canceled (<a href=\"%(url)s\">undo</a>)." msgstr "" #: views/commands.py:409 -#, fuzzy, python-format msgid "Please sign in to subscribe for: %(tags)s" -msgstr "Accedi o registrati" +msgstr "Accedi per sottoscrivere i tag: %(tags)s" #: views/commands.py:542 -#, fuzzy msgid "Please sign in to vote" -msgstr "Puoi accedere al tuo account da qui:" +msgstr "Accedi per votare" #: views/meta.py:83 msgid "Q&A forum feedback" @@ -3823,122 +3818,101 @@ msgid "We look forward to hearing your feedback! Please, give it next time :)" msgstr "" "Siamo curiosi di sentire la tua opinione! Sarà per la prossima volta :)" -#: views/readers.py:131 -#, fuzzy, python-format +#: views/readers.py:151 msgid "%(q_num)s question, tagged" msgid_plural "%(q_num)s questions, tagged" -msgstr[0] "%(q_num)s domanda" -msgstr[1] "%(q_num)s domande" +msgstr[0] "%(q_num)s domanda, taggata" +msgstr[1] "%(q_num)s domande, taggate" -#: views/readers.py:139 +#: views/readers.py:159 #, python-format msgid "%(q_num)s question" msgid_plural "%(q_num)s questions" msgstr[0] "%(q_num)s domanda" msgstr[1] "%(q_num)s domande" -#: views/readers.py:177 +#: views/readers.py:199 #, python-format msgid "%(badge_count)d %(badge_level)s badge" msgid_plural "%(badge_count)d %(badge_level)s badges" msgstr[0] "%(badge_count)d%(badge_level)s medaglia" msgstr[1] "%(badge_count)d%(badge_level)s medaglie" -#: views/readers.py:232 -msgid "vote" -msgid_plural "votes" -msgstr[0] "voto" -msgstr[1] "voti" - -#: views/readers.py:235 -#, fuzzy -msgid "answer" -msgid_plural "answers" -msgstr[0] "risposta" -msgstr[1] "risposta" - -#: views/readers.py:238 -msgid "view" -msgid_plural "views" -msgstr[0] "consultazione" -msgstr[1] "consultazioni" - -#: views/readers.py:440 -#, fuzzy +#: views/readers.py:407 msgid "" "Sorry, the comment you are looking for has been deleted and is no longer " "accessible" -msgstr "Mi spiace, questa domanda è stata cancellata e non è più accessibile" +msgstr "Mi spiace, questo commento è stata cancellato e non è più accessibile" -#: views/users.py:224 +#: views/users.py:227 msgid "moderate this user" msgstr "modera questo utente" -#: views/users.py:225 +#: views/users.py:228 msgid "moderate user" msgstr "modera utente" -#: views/users.py:380 +#: views/users.py:383 msgid "user profile" msgstr "profilo utente" -#: views/users.py:381 +#: views/users.py:384 msgid "user profile overview" msgstr "profilo" -#: views/users.py:685 +#: views/users.py:694 msgid "recent user activity" msgstr "attività recente" -#: views/users.py:686 +#: views/users.py:695 msgid "profile - recent activity" msgstr "profilo utente — attività recente" -#: views/users.py:772 +#: views/users.py:781 msgid "comments and answers to others questions" msgstr "commenti e risposte a domande" -#: views/users.py:773 +#: views/users.py:782 msgid "profile - responses" msgstr "profilo utente — risposte" -#: views/users.py:847 +#: views/users.py:856 msgid "user vote record" msgstr "elenco dei voti dati" -#: views/users.py:848 +#: views/users.py:857 msgid "profile - votes" msgstr "profilo utente — voti" -#: views/users.py:883 +#: views/users.py:892 msgid "user reputation in the community" msgstr "punti reputazione" -#: views/users.py:884 +#: views/users.py:893 msgid "profile - user reputation" msgstr "profilo utente — reputazione" -#: views/users.py:911 +#: views/users.py:920 msgid "users favorite questions" msgstr "domande preferite" -#: views/users.py:912 +#: views/users.py:921 msgid "profile - favorite questions" msgstr "profilo utente — domande preferite" -#: views/users.py:932 views/users.py:936 +#: views/users.py:941 views/users.py:945 msgid "changes saved" msgstr "i cambiamenti sono stati salvati" -#: views/users.py:942 +#: views/users.py:951 msgid "email updates canceled" msgstr "notifiche via e-mail cancellate" -#: views/users.py:960 +#: views/users.py:969 msgid "email subscription settings" msgstr "impostazioni notifiche via e-mail" -#: views/users.py:961 +#: views/users.py:970 msgid "profile - email subscriptions" msgstr "profilo utente — notifiche via e-mail" @@ -3961,14 +3935,12 @@ msgid "Error uploading file. Please contact the site administrator. Thank you." msgstr "Errore nel caricamento del file. Contatta un amministratore." #: views/writers.py:191 -#, fuzzy msgid "Please log in to ask questions" -msgstr "Ricorda, puoi sempre porre tu stesso una domanda!" +msgstr "Accedi per fare una domanda" #: views/writers.py:492 -#, fuzzy msgid "Please log in to answer questions" -msgstr "vedi domande senza risposta" +msgstr "Accedi per rispondere alle domande" #: views/writers.py:598 #, python-format @@ -3976,13 +3948,12 @@ msgid "" "Sorry, you appear to be logged out and cannot post comments. Please <a href=" "\"%(sign_in_url)s\">sign in</a>." msgstr "" -"Gli utenti non registrati non possono lasciare commenti. <a href=\"%" -"(sign_in_url)s\">Accedi o registrati</a>." +"Gli utenti non registrati non possono lasciare commenti. <a href=" +"\"%(sign_in_url)s\">Accedi o registrati</a>." #: views/writers.py:646 -#, fuzzy msgid "Sorry, anonymous users cannot edit comments" -msgstr "Mi spiace, gli utenti non registrati non possono caricare file." +msgstr "Mi spiace, gli utenti non registrati non possono modificare i commenti." #: views/writers.py:654 #, python-format @@ -3990,13 +3961,56 @@ msgid "" "Sorry, you appear to be logged out and cannot delete comments. Please <a " "href=\"%(sign_in_url)s\">sign in</a>." msgstr "" -"Gli utenti non registrati non possono cancellare commenti. <a href=\"%" -"(sign_in_url)s\">Accedi o registrati</a>." +"Gli utenti non registrati non possono cancellare commenti. <a href=" +"\"%(sign_in_url)s\">Accedi o registrati</a>." #: views/writers.py:675 msgid "sorry, we seem to have some technical difficulties" msgstr "Mi spiace, ci sono dei problemi tecnici" +#~ msgid "Keys to connect the site with external services like Facebook, etc." +#~ msgstr "" +#~ "Chiavi per connettere il sito con servizi esterni come Facebook, ecc." + +#, fuzzy +#~ msgid "License settings" +#~ msgstr "Impostazioni base" + +#~ msgid "Minimum reputation required to perform actions" +#~ msgstr "Reputazione minima per eseguire operazioni" + +#, fuzzy +#~ msgid "Site modes" +#~ msgstr "Siti" + +#~ msgid "Q&A forum website parameters and urls" +#~ msgstr "Parametri ed url per il Q&A forum" + +#~ msgid "Skin and User Interface settings" +#~ msgstr "Impostazioni della skin e dell'interfaccia utente" + +#~ msgid "Limits applicable to votes and moderation flags" +#~ msgstr "Limiti riguardanti i voti e i post segnati come inappropriati" + +#~ msgid "Setting groups" +#~ msgstr "Gruppi di impostazioni" + +#~ msgid "vote" +#~ msgid_plural "votes" +#~ msgstr[0] "voto" +#~ msgstr[1] "voti" + +#, fuzzy +#~ msgid "answer" +#~ msgid_plural "answers" +#~ msgstr[0] "risposta" +#~ msgstr[1] "risposta" + +#~ msgid "view" +#~ msgid_plural "views" +#~ msgstr[0] "consultazione" +#~ msgstr[1] "consultazioni" + #~ msgid "" #~ "This option currently defines default frequency of emailed updates in the " #~ "following five categories: questions asked by user, answered by user, " @@ -4121,8 +4135,8 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #, fuzzy #~ msgid "" #~ "Below is the list of available badges and number \n" -#~ "of times each type of badge has been awarded. Give us feedback at %" -#~ "(feedback_faq_url)s.\n" +#~ "of times each type of badge has been awarded. Give us feedback at " +#~ "%(feedback_faq_url)s.\n" #~ msgstr "" #~ "Qui sotto trovi una lista delle medaglie disponibili, con indicato il " #~ "numero di persone che le hanno ottenute. Hai qualche idea per delle nuove " @@ -4233,8 +4247,8 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ msgid "" #~ "For example, if you ask an interesting question or give a helpful answer, " #~ "your input will be upvoted. On the other hand if the answer is misleading " -#~ "- it will be downvoted. Each vote in favor will generate <strong>%" -#~ "(REP_GAIN_FOR_RECEIVING_UPVOTE)s</strong> points, each vote against will " +#~ "- it will be downvoted. Each vote in favor will generate <strong>" +#~ "%(REP_GAIN_FOR_RECEIVING_UPVOTE)s</strong> points, each vote against will " #~ "subtract <strong>%(REP_LOSS_FOR_RECEIVING_DOWNVOTE)s</strong> points. " #~ "There is a limit of <strong>%(MAX_REP_GAIN_PER_USER_PER_DAY)s</strong> " #~ "points that can be accumulated for a question or answer per day. The " @@ -4245,8 +4259,8 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ "gli utenti ti daranno dei voti positivi. D'altro canto, se la risposta è " #~ "sbagliata, gli utenti ti daranno dei voti negativi. Ogni voto a tuo " #~ "favore ti procura <strong>%(REP_GAIN_FOR_RECEIVING_UPVOTE)s</strong> " -#~ "punti reputazione; ogni voto contro di te ti fa perdere <strong>%" -#~ "(REP_LOSS_FOR_RECEIVING_DOWNVOTE)s</strong> punti reputazione. Puoi " +#~ "punti reputazione; ogni voto contro di te ti fa perdere <strong>" +#~ "%(REP_LOSS_FOR_RECEIVING_DOWNVOTE)s</strong> punti reputazione. Puoi " #~ "guadagnare un massimo di <strong>%(MAX_REP_GAIN_PER_USER_PER_DAY)s</" #~ "strong> punti al giorno per ogni tua domanda o risposta. Nella tabella " #~ "qui sotto trovi quanti punti reputazione sono necessari per ogni tipo di " @@ -4728,9 +4742,6 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ msgid "Your answer" #~ msgstr "La tua risposta" -#~ msgid "Be the first one to answer this question!" -#~ msgstr "Rispondi per primo!" - #~ msgid "you can answer anonymously and then login" #~ msgstr "" #~ "<span class='strong big'>Comincia pure a rispondere </span> - la tua " @@ -4789,9 +4800,6 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ msgid "subsribe to rss feed" #~ msgstr "sottoscrivi al feed delle domande" -#~ msgid "Question tags" -#~ msgstr "Tag" - #~ msgid "question asked" #~ msgstr "Chiesta il" @@ -4942,8 +4950,8 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ msgid "validate %(email)s info or go to %(change_email_url)s" #~ msgstr "" -#~ "<span class=\"strong big\">Un'e-mail di verifica è stata spedita a %" -#~ "(email)s.</span> <strong>Clicca sul link contenuto nell'e-mail</strong> " +#~ "<span class=\"strong big\">Un'e-mail di verifica è stata spedita a " +#~ "%(email)s.</span> <strong>Clicca sul link contenuto nell'e-mail</strong> " #~ "per verificare il tuo indirizzo. La verifica dell'e-mail è necessaria " #~ "per l'utilizzo del forum. Se preferisci usare <strong>un altro indirizzo</" #~ "strong>, puoi <a href='%(change_email_url)s'><strong>cambiarlo di nuovo</" @@ -5007,8 +5015,8 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ msgid "" #~ "%(username)s already exists, choose another name for \n" -#~ " %(provider)s. Email is required too, see %" -#~ "(gravatar_faq_url)s\n" +#~ " %(provider)s. Email is required too, see " +#~ "%(gravatar_faq_url)s\n" #~ " " #~ msgstr "" #~ "<p><span class='strong big'>Oops... l'utente %(username)s esiste già.</" @@ -5633,12 +5641,6 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ msgid "age unit" #~ msgstr "anni" -#~ msgid "todays unused votes" -#~ msgstr "voti rimanenti per oggi" - -#~ msgid "votes left" -#~ msgstr "voti rimanenti" - #~ msgid "moderation" #~ msgstr "modera" @@ -5754,9 +5756,6 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ msgid "Answer to:" #~ msgstr "consigli per le risposte" -#~ msgid "User profile" -#~ msgstr "Profilo utente" - #~ msgid "graph of user reputation" #~ msgstr "registro dei punti reputazione" @@ -6580,8 +6579,8 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ msgstr "Login attraverso un sito esterno" #~ msgid "" -#~ "how to login with password through external login website or use %" -#~ "(feedback_url)s" +#~ "how to login with password through external login website or use " +#~ "%(feedback_url)s" #~ msgstr "" #~ "Inserisci qui le informazioni per il login attraverso un sito esterno o " #~ "utilizza %(feedback_url)s" @@ -6608,8 +6607,8 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ "Someone has requested to reset your password on %(site_url)s.\n" #~ "If it were not you, it is safe to ignore this email." #~ msgstr "" -#~ "Qualcuno sta cercando di recuperare la tua password per il sito %" -#~ "(site_url)s.\n" +#~ "Qualcuno sta cercando di recuperare la tua password per il sito " +#~ "%(site_url)s.\n" #~ "Se non si tratta di te, puoi ignorare questo messaggio." #~ msgid "" @@ -6711,8 +6710,8 @@ msgstr "Mi spiace, ci sono dei problemi tecnici" #~ msgstr "subscriptions" #~ msgid "" -#~ "go to %(email_settings_url)s to change frequency of email updates or %" -#~ "(admin_email)s administrator" +#~ "go to %(email_settings_url)s to change frequency of email updates or " +#~ "%(admin_email)s administrator" #~ msgstr "" #~ "<p>Please remember that you can always <a href='%(link)s'>adjust</a> " #~ "frequency of the email updates or turn them off entirely.<br/>If you " diff --git a/askbot/locale/it/LC_MESSAGES/djangojs.mo b/askbot/locale/it/LC_MESSAGES/djangojs.mo Binary files differdeleted file mode 100644 index 8db0bfa4..00000000 --- a/askbot/locale/it/LC_MESSAGES/djangojs.mo +++ /dev/null diff --git a/askbot/locale/it/LC_MESSAGES/djangojs.po b/askbot/locale/it/LC_MESSAGES/djangojs.po index e681e807..654c82a6 100644 --- a/askbot/locale/it/LC_MESSAGES/djangojs.po +++ b/askbot/locale/it/LC_MESSAGES/djangojs.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-11-22 12:17-0400\n" -"PO-Revision-Date: 2011-09-28 08:20-0800\n" -"Last-Translator: Rosandra Cuello <rosandra.cuello@gmail.com>\n" +"POT-Creation-Date: 2011-10-08 02:27-0500\n" +"PO-Revision-Date: 2011-11-19 06:41+0100\n" +"Last-Translator: Luca Ferroni <luca@befair.it>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "Language: \n" "MIME-Version: 1.0\n" @@ -151,19 +151,19 @@ msgstr "Post eliminato" #: skins/common/media/js/post.js:537 skins/old/media/js/post.js:535 msgid "Follow" -msgstr "" +msgstr "Segui" #: skins/common/media/js/post.js:546 skins/common/media/js/post.js.c:555 #: skins/old/media/js/post.js:544 skins/old/media/js/post.js.c:553 #, c-format msgid "%s follower" msgid_plural "%s followers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "seguito da %s persona" +msgstr[1] "seguito da %s persone" #: skins/common/media/js/post.js:551 skins/old/media/js/post.js:549 msgid "<div>Following</div><div class=\"unfollow\">Unfollow</div>" -msgstr "" +msgstr "<div>Segui</div><div class=\"unfollow\">Non seguire</div>" #: skins/common/media/js/post.js:613 msgid "undelete" @@ -209,18 +209,18 @@ msgstr "Vuoi davvero cancellare il commento?" #: skins/common/media/js/post.js:1624 skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" -msgstr "" +msgstr "Per piacere inserisce un titolo per la tua domanda (>10 caratteri)" #: skins/common/media/js/tag_selector.js:15 #: skins/old/media/js/tag_selector.js:15 msgid "Tag \"<span></span>\" matches:" -msgstr "" +msgstr "Il tag \"<span></span>\" corrisponde a:" #: skins/common/media/js/tag_selector.js:84 #: skins/old/media/js/tag_selector.js:84 #, c-format msgid "and %s more, not shown..." -msgstr "" +msgstr "e altre %s non mostrate..." #: skins/common/media/js/user.js:14 msgid "Please select at least one item" @@ -234,22 +234,22 @@ msgstr[1] "" #: skins/common/media/js/user.js:125 skins/old/media/js/user.js:129 msgid "Please <a href=\"%(signin_url)s\">signin</a> to follow %(username)s" -msgstr "" +msgstr "<a href=\"%(signin_url)s\">Entra</a> per seguire %(username)s" #: skins/common/media/js/user.js:157 skins/old/media/js/user.js:161 #, c-format msgid "unfollow %s" -msgstr "" +msgstr "non seguire %s" #: skins/common/media/js/user.js:160 skins/old/media/js/user.js:164 #, c-format msgid "following %s" -msgstr "" +msgstr "stai seguendo %s" #: skins/common/media/js/user.js:166 skins/old/media/js/user.js:170 #, c-format msgid "follow %s" -msgstr "" +msgstr "segui %s" #: skins/common/media/js/utils.js:43 msgid "click to close" diff --git a/askbot/locale/ja/LC_MESSAGES/django.mo b/askbot/locale/ja/LC_MESSAGES/django.mo Binary files differindex efb75cc8..7f98e565 100644 --- a/askbot/locale/ja/LC_MESSAGES/django.mo +++ b/askbot/locale/ja/LC_MESSAGES/django.mo diff --git a/askbot/locale/ko/LC_MESSAGES/django.mo b/askbot/locale/ko/LC_MESSAGES/django.mo Binary files differindex 5f175980..c117d238 100644 --- a/askbot/locale/ko/LC_MESSAGES/django.mo +++ b/askbot/locale/ko/LC_MESSAGES/django.mo diff --git a/askbot/locale/pt_BR/LC_MESSAGES/django.mo b/askbot/locale/pt_BR/LC_MESSAGES/django.mo Binary files differindex 172807a7..2e17a8ef 100644 --- a/askbot/locale/pt_BR/LC_MESSAGES/django.mo +++ b/askbot/locale/pt_BR/LC_MESSAGES/django.mo diff --git a/askbot/locale/ro/LC_MESSAGES/django.mo b/askbot/locale/ro/LC_MESSAGES/django.mo Binary files differindex 7b66727a..33ff42f7 100644 --- a/askbot/locale/ro/LC_MESSAGES/django.mo +++ b/askbot/locale/ro/LC_MESSAGES/django.mo diff --git a/askbot/locale/ru/LC_MESSAGES/django.mo b/askbot/locale/ru/LC_MESSAGES/django.mo Binary files differindex c41a06bf..4d01e193 100644 --- a/askbot/locale/ru/LC_MESSAGES/django.mo +++ b/askbot/locale/ru/LC_MESSAGES/django.mo diff --git a/askbot/locale/sr/LC_MESSAGES/django.mo b/askbot/locale/sr/LC_MESSAGES/django.mo Binary files differindex 00cab4f5..3e3ca237 100644 --- a/askbot/locale/sr/LC_MESSAGES/django.mo +++ b/askbot/locale/sr/LC_MESSAGES/django.mo diff --git a/askbot/locale/tr/LC_MESSAGES/django.mo b/askbot/locale/tr/LC_MESSAGES/django.mo Binary files differindex 5e511994..5f3f7a79 100644 --- a/askbot/locale/tr/LC_MESSAGES/django.mo +++ b/askbot/locale/tr/LC_MESSAGES/django.mo diff --git a/askbot/locale/vi/LC_MESSAGES/django.mo b/askbot/locale/vi/LC_MESSAGES/django.mo Binary files differindex 4f175ad6..cb82d178 100644 --- a/askbot/locale/vi/LC_MESSAGES/django.mo +++ b/askbot/locale/vi/LC_MESSAGES/django.mo diff --git a/askbot/locale/zh-tw/LC_MESSAGES/django.mo b/askbot/locale/zh-tw/LC_MESSAGES/django.mo Binary files differindex 9e398bb2..3a914dd3 100644 --- a/askbot/locale/zh-tw/LC_MESSAGES/django.mo +++ b/askbot/locale/zh-tw/LC_MESSAGES/django.mo diff --git a/askbot/locale/zh_CN/LC_MESSAGES/django.mo b/askbot/locale/zh_CN/LC_MESSAGES/django.mo Binary files differindex 59fb0403..e0c7877e 100644 --- a/askbot/locale/zh_CN/LC_MESSAGES/django.mo +++ b/askbot/locale/zh_CN/LC_MESSAGES/django.mo diff --git a/askbot/management/commands/merge_users.py b/askbot/management/commands/merge_users.py new file mode 100644 index 00000000..4691c4b3 --- /dev/null +++ b/askbot/management/commands/merge_users.py @@ -0,0 +1,60 @@ +from django.core.management.base import CommandError, BaseCommand +from askbot.models import User + + +class Command(BaseCommand): + args = '<from_user_id> <to_user_id>' + help = 'Merge an account and all information from a <user_id> to a <user_id>, deleting the <from_user>' + + def parse_arguments(self, *arguments): + if len(arguments) != 2: + raise CommandError('Arguments are <from_user_id> to <to_user_id>') + self.from_user = User.objects.get(id = arguments[0]) + self.to_user = User.objects.get(id = arguments[1]) + + def handle(self, *arguments, **options): + self.parse_arguments(*arguments) + + for rel in User._meta.get_all_related_objects(): + try: + self.process_field(rel.model, rel.field.name) + except Exception, error: + self.stdout.write(u'Warning: %s\n' % error) + + for rel in User._meta.get_all_related_many_to_many_objects(): + try: + self.process_m2m_field(rel.model, rel.field.name) + except Exception, error: + self.stdout.write(u'Warning: %s\n' % error) + + self.to_user.reputation += self.from_user.reputation - 1 + self.to_user.gold += self.from_user.gold + self.to_user.silver += self.from_user.silver + self.to_user.bronze += self.from_user.bronze + + if self.from_user.last_seen > self.to_user.last_seen: + self.to_user.last_seen = self.from_user.last_seen + + if self.from_user.date_joined < self.to_user.date_joined: + self.to_user.date_joined = self.from_user.date_joined + + self.to_user.save() + + self.from_user.delete() + + def process_field(self, model, field_name): + """reassigns the related object to the new user""" + filter_condition = {field_name: self.from_user} + related_objects_qs = model.objects.filter(**filter_condition) + update_condition = {field_name: self.to_user} + related_objects_qs.update(**update_condition) + + def process_m2m_field(self, model, field_name): + """removes the old user from the M2M relation + and adds the new user""" + filter_condition = {field_name: self.from_user} + related_objects_qs = model.objects.filter(**filter_condition) + for obj in related_objects_qs: + m2m_field = getattr(obj, field_name) + m2m_field.remove(self.from_user) + m2m_field.add(self.to_user) diff --git a/askbot/management/commands/send_accept_answer_reminders.py b/askbot/management/commands/send_accept_answer_reminders.py new file mode 100644 index 00000000..58b07b45 --- /dev/null +++ b/askbot/management/commands/send_accept_answer_reminders.py @@ -0,0 +1,84 @@ +import datetime +from django.core.management.base import NoArgsCommand +from django.conf import settings as django_settings +from askbot import models +from askbot import const +from askbot.conf import settings as askbot_settings +from django.utils.translation import ugettext as _ +from django.utils.translation import ungettext +from askbot.utils import mail +from askbot.utils.classes import ReminderSchedule + +DEBUG_THIS_COMMAND = False + +class Command(NoArgsCommand): + def handle_noargs(self, **options): + if askbot_settings.ENABLE_ACCEPT_ANSWER_REMINDERS == False: + return + #get questions without answers, excluding closed and deleted + #order it by descending added_at date + + schedule = ReminderSchedule( + askbot_settings.DAYS_BEFORE_SENDING_ACCEPT_ANSWER_REMINDER, + askbot_settings.ACCEPT_ANSWER_REMINDER_FREQUENCY, + askbot_settings.MAX_ACCEPT_ANSWER_REMINDERS + ) + + questions = models.Question.objects.exclude( + deleted = True + ).added_between( + start = schedule.start_cutoff_date, + end = schedule.end_cutoff_date + ).filter( + answer_count__gt = 0 + ).filter( + answer_accepted = False + ).order_by('-added_at') + #for all users, excluding blocked + #for each user, select a tag filtered subset + #format the email reminder and send it + for user in models.User.objects.exclude(status = 'b'): + user_questions = questions.filter(author = user) + + final_question_list = user_questions.get_questions_needing_reminder( + activity_type = const.TYPE_ACTIVITY_ACCEPT_ANSWER_REMINDER_SENT, + user = user, + recurrence_delay = schedule.recurrence_delay + ) + #todo: rewrite using query set filter + #may be a lot more efficient + + question_count = len(final_question_list) + if question_count == 0: + continue + + #tag_summary = get_tag_summary_from_questions(final_question_list) + subject_line = _( + 'Accept the best answer for %(question_count)d of your questions' + ) % {'question_count': question_count} + + #todo - make a template for these + if question_count == 1: + reminder_phrase = _('Please accept the best answer for this question:') + else: + reminder_phrase = _('Please accept the best answer for these questions:') + body_text = '<p>' + reminder_phrase + '</p>' + body_text += '<ul>' + for question in final_question_list: + body_text += '<li><a href="%s%s?sort=latest">%s</a></li>' \ + % ( + askbot_settings.APP_URL, + question.get_absolute_url(), + question.title + ) + body_text += '</ul>' + + if DEBUG_THIS_COMMAND: + print "User: %s<br>\nSubject:%s<br>\nText: %s<br>\n" % \ + (user.email, subject_line, body_text) + else: + mail.send_mail( + subject_line = subject_line, + body_text = body_text, + recipient_list = (user.email,) + ) diff --git a/askbot/management/commands/send_email.py b/askbot/management/commands/send_email.py new file mode 100644 index 00000000..2493c51b --- /dev/null +++ b/askbot/management/commands/send_email.py @@ -0,0 +1,24 @@ +from askbot.utils.mail import send_mail +from django.core.exceptions import ValidationError +from django.core.management.base import BaseCommand, CommandError +from django.core.validators import validate_email + +class Command(BaseCommand): + args = '<recipients email>' + help = 'Sends a test email to the specified email address' + + def handle(self, *args, **options): + + if len(args) != 1: + raise CommandError('Recipients email address required') + + try: + validate_email(args[0]) + except ValidationError: + raise CommandError('%s is not a valid email address' % (args[0])) + + send_mail( + subject_line = 'Askbot Mail Test', + body_text = 'Askbot Mail Test', + recipient_list = [args[0]], + ) diff --git a/askbot/management/commands/send_email_alerts.py b/askbot/management/commands/send_email_alerts.py index 330e1cc9..c904cdde 100644 --- a/askbot/management/commands/send_email_alerts.py +++ b/askbot/management/commands/send_email_alerts.py @@ -3,8 +3,8 @@ from django.core.management.base import NoArgsCommand from django.core.urlresolvers import reverse from django.db import connection from django.db.models import Q, F -from askbot.models import User, Question, Answer, Tag, QuestionRevision -from askbot.models import AnswerRevision, Activity, EmailFeedSetting +from askbot.models import User, Question, Answer, Tag, PostRevision +from askbot.models import Activity, EmailFeedSetting from askbot.models import Comment from askbot.models.question import get_tag_summary_from_questions from django.utils.translation import ugettext as _ @@ -336,7 +336,7 @@ class Command(NoArgsCommand): #collect info on all sorts of news that happened after #the most recent emailing to the user about this question - q_rev = QuestionRevision.objects.filter( + q_rev = PostRevision.objects.question_revisions().filter( question=q, revised_at__gt=emailed_at ) @@ -359,7 +359,7 @@ class Command(NoArgsCommand): new_ans = new_ans.exclude(author=user) meta_data['new_ans'] = len(new_ans) - ans_rev = AnswerRevision.objects.filter( + ans_rev = PostRevision.objects.answer_revisions().filter( answer__question = q, answer__deleted = False, revised_at__gt = emailed_at diff --git a/askbot/management/commands/send_unanswered_question_reminders.py b/askbot/management/commands/send_unanswered_question_reminders.py index 41fa8569..778a8575 100644 --- a/askbot/management/commands/send_unanswered_question_reminders.py +++ b/askbot/management/commands/send_unanswered_question_reminders.py @@ -1,41 +1,36 @@ -import datetime from django.core.management.base import NoArgsCommand -from django.conf import settings as django_settings from askbot import models from askbot import const from askbot.conf import settings as askbot_settings -from django.utils.translation import ugettext as _ from django.utils.translation import ungettext from askbot.utils import mail +from askbot.utils.classes import ReminderSchedule from askbot.models.question import get_tag_summary_from_questions DEBUG_THIS_COMMAND = False class Command(NoArgsCommand): + """management command that sends reminders + about unanswered questions to all users + """ def handle_noargs(self, **options): if askbot_settings.ENABLE_UNANSWERED_REMINDERS == False: return #get questions without answers, excluding closed and deleted #order it by descending added_at date - wait_period = datetime.timedelta( - askbot_settings.DAYS_BEFORE_SENDING_UNANSWERED_REMINDER + schedule = ReminderSchedule( + askbot_settings.DAYS_BEFORE_SENDING_UNANSWERED_REMINDER, + askbot_settings.UNANSWERED_REMINDER_FREQUENCY, + max_reminders = askbot_settings.MAX_UNANSWERED_REMINDERS ) - start_cutoff_date = datetime.datetime.now() - wait_period - - recurrence_delay = datetime.timedelta( - askbot_settings.UNANSWERED_REMINDER_FREQUENCY - ) - max_emails = askbot_settings.MAX_UNANSWERED_REMINDERS - end_cutoff_date = start_cutoff_date - (max_emails - 1)*recurrence_delay questions = models.Question.objects.exclude( closed = True ).exclude( deleted = True - ).filter( - added_at__lt = start_cutoff_date - ).exclude( - added_at__lt = end_cutoff_date + ).added_between( + start = schedule.start_cutoff_date, + end = schedule.end_cutoff_date ).filter( answer_count = 0 ).order_by('-added_at') @@ -46,30 +41,11 @@ class Command(NoArgsCommand): user_questions = questions.exclude(author = user) user_questions = user.get_tag_filtered_questions(user_questions) - final_question_list = list() - #todo: rewrite using query set filter - #may be a lot more efficient - for question in user_questions: - activity_type = const.TYPE_ACTIVITY_UNANSWERED_REMINDER_SENT - try: - activity = models.Activity.objects.get( - user = user, - question = question, - activity_type = activity_type - ) - now = datetime.datetime.now() - if now < activity.active_at + recurrence_delay: - continue - except models.Activity.DoesNotExist: - activity = models.Activity( - user = user, - question = question, - activity_type = activity_type, - content_object = question, - ) - activity.active_at = datetime.datetime.now() - activity.save() - final_question_list.append(question) + final_question_list = user_questions.get_questions_needing_reminder( + user = user, + activity_type = const.TYPE_ACTIVITY_UNANSWERED_REMINDER_SENT, + recurrence_delay = schedule.recurrence_delay + ) question_count = len(final_question_list) if question_count == 0: diff --git a/askbot/middleware/anon_user.py b/askbot/middleware/anon_user.py index adaf6fd2..7cd9279d 100644 --- a/askbot/middleware/anon_user.py +++ b/askbot/middleware/anon_user.py @@ -63,7 +63,8 @@ class ConnectToSessionMessagesMiddleware(object): """Adds the ``'askbot_visitor'``key to cookie if user ever authenticates so that the anonymous user message won't be shown after the user logs out""" - if request.user.is_authenticated() and \ + if hasattr(request, 'user') and \ + request.user.is_authenticated() and \ 'askbot_visitor' not in request.COOKIES : #import datetime #max_age = 365*24*60*60 diff --git a/askbot/middleware/forum_mode.py b/askbot/middleware/forum_mode.py new file mode 100644 index 00000000..874b5559 --- /dev/null +++ b/askbot/middleware/forum_mode.py @@ -0,0 +1,35 @@ +from django.http import HttpResponseRedirect +from django.utils.translation import ugettext as _ +from django.conf import settings +from django.core.urlresolvers import resolve + +from askbot.conf import settings as askbot_settings + +PROTECTED_URLS = [ + 'about', + 'feeds', + 'privacy', + 'tags', + 'badges', + 'questions', + 'question', + 'question_revisions', + 'users', + 'edit_user', + 'faq', + 'user_profile', + 'answer_revisions', + 'user_subscriptions'] + + +class ForumModeMiddleware(object): + + def process_request(self, request): + if (askbot_settings.ASKBOT_CLOSED_FORUM_MODE + and request.user.is_anonymous() + and resolve(request.path).url_name in PROTECTED_URLS): + request.user.message_set.create(_('Please log in to use %s') % \ + askbot_settings.APP_SHORT_NAME) + return HttpResponseRedirect(settings.LOGIN_URL) + else: + return None diff --git a/askbot/migrations/0046_add_uniques_to_email_feed_settings.py b/askbot/migrations/0046_add_uniques_to_email_feed_settings.py new file mode 100644 index 00000000..bab16266 --- /dev/null +++ b/askbot/migrations/0046_add_uniques_to_email_feed_settings.py @@ -0,0 +1,306 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + db.create_unique(u'askbot_emailfeedsetting', ('feed_type', 'subscriber_id')) + + def backwards(self, orm): + db.add_unique(u'askbot_emailfeedsetting', ('feed_type', 'subscriber_id')) + + models = { + 'askbot.activity': { + 'Meta': {'object_name': 'Activity', 'db_table': "u'activity'"}, + 'active_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'activity_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_auditted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True'}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'recipients': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'incoming_activity'", 'symmetrical': 'False', 'through': "orm['askbot.ActivityAuditStatus']", 'to': "orm['auth.User']"}), + 'summary': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.activityauditstatus': { + 'Meta': {'unique_together': "(('user', 'activity'),)", 'object_name': 'ActivityAuditStatus'}, + 'activity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Activity']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.anonymousanswer': { + 'Meta': {'object_name': 'AnonymousAnswer'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'anonymous_answers'", 'to': "orm['askbot.Question']"}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.anonymousquestion': { + 'Meta': {'object_name': 'AnonymousQuestion'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'accepted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['askbot.Question']"}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'ordering': "('-revision',)", 'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Answer']"}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answerrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'askbot.award': { + 'Meta': {'object_name': 'Award', 'db_table': "u'award'"}, + 'awarded_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'badge': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_badge'", 'to': "orm['askbot.BadgeData']"}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badgedata': { + 'Meta': {'ordering': "('slug',)", 'object_name': 'BadgeData'}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "orm['askbot.Award']", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}) + }, + 'askbot.comment': { + 'Meta': {'ordering': "('-added_at',)", 'object_name': 'Comment', 'db_table': "u'comment'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '2048'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'html': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'offensive_flag_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'askbot.emailfeedsetting': { + 'Meta': {'object_name': 'EmailFeedSetting', 'unique_together': "(('feed_type', 'subscriber'),)"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'feed_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'frequency': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '8'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reported_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), + 'subscriber': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notification_subscriptions'", 'to': "orm['auth.User']"}) + }, + 'askbot.favoritequestion': { + 'Meta': {'object_name': 'FavoriteQuestion', 'db_table': "u'favorite_question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'askbot.markedtag': { + 'Meta': {'object_name': 'MarkedTag'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reason': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_selections'", 'to': "orm['askbot.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'askbot.question': { + 'Meta': {'object_name': 'Question', 'db_table': "u'question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'answer_accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'answer_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questions'", 'to': "orm['auth.User']"}), + 'close_reason': ('django.db.models.fields.SmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'closed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'closed_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'closed_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'favorited_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'favorite_questions'", 'symmetrical': 'False', 'through': "orm['askbot.FavoriteQuestion']", 'to': "orm['auth.User']"}), + 'favourite_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'followed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'followed_questions'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_activity_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_activity_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'last_active_in_questions'", 'to': "orm['auth.User']"}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'questions'", 'symmetrical': 'False', 'to': "orm['askbot.Tag']"}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'ordering': "('-revision',)", 'object_name': 'QuestionRevision', 'db_table': "u'question_revision'"}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questionrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Question']"}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}) + }, + 'askbot.questionview': { + 'Meta': {'object_name': 'QuestionView'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'viewed'", 'to': "orm['askbot.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'askbot.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'negative': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'positive': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'reputation_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'reputed_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.tag': { + 'Meta': {'ordering': "('-used_count', 'name')", 'object_name': 'Tag', 'db_table': "u'tag'"}, + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'created_tags'", 'to': "orm['auth.User']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_tags'", 'null': 'True', 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'used_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'askbot.vote': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'Vote', 'db_table': "u'vote'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'votes'", 'to': "orm['auth.User']"}), + 'vote': ('django.db.models.fields.SmallIntegerField', [], {}), + 'voted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '1'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'consecutive_days_visit_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'blank': 'True'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'display_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + 'email_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'has_custom_avatar': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ignored_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'interesting_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'new_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}), + 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'seen_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'show_country': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0047_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py b/askbot/migrations/0047_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py new file mode 100644 index 00000000..61ae0ee7 --- /dev/null +++ b/askbot/migrations/0047_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py @@ -0,0 +1,352 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding field 'AnswerRevision.revision_type' + db.add_column(u'answer_revision', 'revision_type', self.gf('django.db.models.fields.SmallIntegerField')(default=0), keep_default=False) + + # Adding field 'AnswerRevision.title' + db.add_column(u'answer_revision', 'title', self.gf('django.db.models.fields.CharField')(default='', max_length=300, blank=True), keep_default=False) + + # Adding field 'AnswerRevision.tagnames' + db.add_column(u'answer_revision', 'tagnames', self.gf('django.db.models.fields.CharField')(default='', max_length=125, blank=True), keep_default=False) + + # Adding field 'AnswerRevision.is_anonymous' + db.add_column(u'answer_revision', 'is_anonymous', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False) + + # Adding unique constraint on 'AnswerRevision', fields ['answer', 'revision'] + db.create_unique(u'answer_revision', ['answer_id', 'revision']) + + # Adding field 'QuestionRevision.revision_type' + db.add_column(u'question_revision', 'revision_type', self.gf('django.db.models.fields.SmallIntegerField')(default=0), keep_default=False) + + # Adding unique constraint on 'QuestionRevision', fields ['question', 'revision'] + db.create_unique(u'question_revision', ['question_id', 'revision']) + + + def backwards(self, orm): + + # Removing unique constraint on 'QuestionRevision', fields ['question', 'revision'] + db.delete_unique(u'question_revision', ['question_id', 'revision']) + + # Removing unique constraint on 'AnswerRevision', fields ['answer', 'revision'] + db.delete_unique(u'answer_revision', ['answer_id', 'revision']) + + # Deleting field 'AnswerRevision.revision_type' + db.delete_column(u'answer_revision', 'revision_type') + + # Deleting field 'AnswerRevision.title' + db.delete_column(u'answer_revision', 'title') + + # Deleting field 'AnswerRevision.tagnames' + db.delete_column(u'answer_revision', 'tagnames') + + # Deleting field 'AnswerRevision.is_anonymous' + db.delete_column(u'answer_revision', 'is_anonymous') + + # Deleting field 'QuestionRevision.revision_type' + db.delete_column(u'question_revision', 'revision_type') + + + models = { + 'askbot.activity': { + 'Meta': {'object_name': 'Activity', 'db_table': "u'activity'"}, + 'active_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'activity_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_auditted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True'}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'recipients': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'incoming_activity'", 'symmetrical': 'False', 'through': "orm['askbot.ActivityAuditStatus']", 'to': "orm['auth.User']"}), + 'summary': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.activityauditstatus': { + 'Meta': {'unique_together': "(('user', 'activity'),)", 'object_name': 'ActivityAuditStatus'}, + 'activity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Activity']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.anonymousanswer': { + 'Meta': {'object_name': 'AnonymousAnswer'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'anonymous_answers'", 'to': "orm['askbot.Question']"}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.anonymousquestion': { + 'Meta': {'object_name': 'AnonymousQuestion'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'accepted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['askbot.Question']"}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('answer', 'revision'),)", 'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Answer']"}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answerrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.award': { + 'Meta': {'object_name': 'Award', 'db_table': "u'award'"}, + 'awarded_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'badge': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_badge'", 'to': "orm['askbot.BadgeData']"}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badgedata': { + 'Meta': {'ordering': "('slug',)", 'object_name': 'BadgeData'}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "orm['askbot.Award']", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}) + }, + 'askbot.comment': { + 'Meta': {'ordering': "('-added_at',)", 'object_name': 'Comment', 'db_table': "u'comment'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '2048'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'html': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'offensive_flag_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'askbot.emailfeedsetting': { + 'Meta': {'object_name': 'EmailFeedSetting'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'feed_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'frequency': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '8'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reported_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), + 'subscriber': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notification_subscriptions'", 'to': "orm['auth.User']"}) + }, + 'askbot.favoritequestion': { + 'Meta': {'object_name': 'FavoriteQuestion', 'db_table': "u'favorite_question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'askbot.markedtag': { + 'Meta': {'object_name': 'MarkedTag'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reason': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_selections'", 'to': "orm['askbot.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'askbot.question': { + 'Meta': {'object_name': 'Question', 'db_table': "u'question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'answer_accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'answer_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questions'", 'to': "orm['auth.User']"}), + 'close_reason': ('django.db.models.fields.SmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'closed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'closed_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'closed_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'favorited_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'favorite_questions'", 'symmetrical': 'False', 'through': "orm['askbot.FavoriteQuestion']", 'to': "orm['auth.User']"}), + 'favourite_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'followed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'followed_questions'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_activity_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_activity_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'last_active_in_questions'", 'to': "orm['auth.User']"}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'questions'", 'symmetrical': 'False', 'to': "orm['askbot.Tag']"}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('question', 'revision'),)", 'object_name': 'QuestionRevision', 'db_table': "u'question_revision'"}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questionrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Question']"}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.questionview': { + 'Meta': {'object_name': 'QuestionView'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'viewed'", 'to': "orm['askbot.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'askbot.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'negative': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'positive': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'reputation_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'reputed_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.tag': { + 'Meta': {'ordering': "('-used_count', 'name')", 'object_name': 'Tag', 'db_table': "u'tag'"}, + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'created_tags'", 'to': "orm['auth.User']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_tags'", 'null': 'True', 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'used_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'askbot.vote': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'Vote', 'db_table': "u'vote'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'votes'", 'to': "orm['auth.User']"}), + 'vote': ('django.db.models.fields.SmallIntegerField', [], {}), + 'voted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '1'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'consecutive_days_visit_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'blank': 'True'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'display_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + 'email_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ignored_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'interesting_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'new_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}), + 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'seen_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'show_country': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0048_set_proper_revision_types.py b/askbot/migrations/0048_set_proper_revision_types.py new file mode 100644 index 00000000..3b55462e --- /dev/null +++ b/askbot/migrations/0048_set_proper_revision_types.py @@ -0,0 +1,313 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + orm.QuestionRevision.objects.update(revision_type=1) + orm.AnswerRevision.objects.update(revision_type=2) + + + def backwards(self, orm): + "Write your backwards methods here." + + + models = { + 'askbot.activity': { + 'Meta': {'object_name': 'Activity', 'db_table': "u'activity'"}, + 'active_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'activity_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_auditted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True'}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'recipients': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'incoming_activity'", 'symmetrical': 'False', 'through': "orm['askbot.ActivityAuditStatus']", 'to': "orm['auth.User']"}), + 'summary': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.activityauditstatus': { + 'Meta': {'unique_together': "(('user', 'activity'),)", 'object_name': 'ActivityAuditStatus'}, + 'activity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Activity']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.anonymousanswer': { + 'Meta': {'object_name': 'AnonymousAnswer'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'anonymous_answers'", 'to': "orm['askbot.Question']"}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.anonymousquestion': { + 'Meta': {'object_name': 'AnonymousQuestion'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'accepted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['askbot.Question']"}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('answer', 'revision'),)", 'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Answer']"}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answerrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.award': { + 'Meta': {'object_name': 'Award', 'db_table': "u'award'"}, + 'awarded_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'badge': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_badge'", 'to': "orm['askbot.BadgeData']"}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badgedata': { + 'Meta': {'ordering': "('slug',)", 'object_name': 'BadgeData'}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "orm['askbot.Award']", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}) + }, + 'askbot.comment': { + 'Meta': {'ordering': "('-added_at',)", 'object_name': 'Comment', 'db_table': "u'comment'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '2048'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'html': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'offensive_flag_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'askbot.emailfeedsetting': { + 'Meta': {'object_name': 'EmailFeedSetting'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'feed_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'frequency': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '8'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reported_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), + 'subscriber': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notification_subscriptions'", 'to': "orm['auth.User']"}) + }, + 'askbot.favoritequestion': { + 'Meta': {'object_name': 'FavoriteQuestion', 'db_table': "u'favorite_question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'askbot.markedtag': { + 'Meta': {'object_name': 'MarkedTag'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reason': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_selections'", 'to': "orm['askbot.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'askbot.question': { + 'Meta': {'object_name': 'Question', 'db_table': "u'question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'answer_accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'answer_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questions'", 'to': "orm['auth.User']"}), + 'close_reason': ('django.db.models.fields.SmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'closed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'closed_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'closed_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'favorited_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'favorite_questions'", 'symmetrical': 'False', 'through': "orm['askbot.FavoriteQuestion']", 'to': "orm['auth.User']"}), + 'favourite_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'followed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'followed_questions'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_activity_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_activity_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'last_active_in_questions'", 'to': "orm['auth.User']"}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'questions'", 'symmetrical': 'False', 'to': "orm['askbot.Tag']"}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('question', 'revision'),)", 'object_name': 'QuestionRevision', 'db_table': "u'question_revision'"}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questionrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Question']"}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.questionview': { + 'Meta': {'object_name': 'QuestionView'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'viewed'", 'to': "orm['askbot.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'askbot.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'negative': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'positive': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'reputation_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'reputed_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.tag': { + 'Meta': {'ordering': "('-used_count', 'name')", 'object_name': 'Tag', 'db_table': "u'tag'"}, + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'created_tags'", 'to': "orm['auth.User']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_tags'", 'null': 'True', 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'used_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'askbot.vote': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'Vote', 'db_table': "u'vote'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'votes'", 'to': "orm['auth.User']"}), + 'vote': ('django.db.models.fields.SmallIntegerField', [], {}), + 'voted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '1'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'consecutive_days_visit_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'blank': 'True'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'display_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + 'email_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ignored_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'interesting_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'new_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}), + 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'seen_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'show_country': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0049_add_postrevision_model.py b/askbot/migrations/0049_add_postrevision_model.py new file mode 100644 index 00000000..af2816aa --- /dev/null +++ b/askbot/migrations/0049_add_postrevision_model.py @@ -0,0 +1,357 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'PostRevision' + db.create_table('askbot_postrevision', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('revision_type', self.gf('django.db.models.fields.SmallIntegerField')()), + ('revision', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='postrevisions', to=orm['auth.User'])), + ('revised_at', self.gf('django.db.models.fields.DateTimeField')()), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=300, blank=True)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('title', self.gf('django.db.models.fields.CharField')(default='', max_length=300, blank=True)), + ('tagnames', self.gf('django.db.models.fields.CharField')(default='', max_length=125, blank=True)), + ('is_anonymous', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('answer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['askbot.Answer'], null=True, blank=True)), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['askbot.Question'], null=True, blank=True)), + )) + db.send_create_signal('askbot', ['PostRevision']) + + # Adding unique constraint on 'PostRevision', fields ['answer', 'revision'] + db.create_unique('askbot_postrevision', ['answer_id', 'revision']) + + # Adding unique constraint on 'PostRevision', fields ['question', 'revision'] + db.create_unique('askbot_postrevision', ['question_id', 'revision']) + + + def backwards(self, orm): + + # Removing unique constraint on 'PostRevision', fields ['question', 'revision'] + db.delete_unique('askbot_postrevision', ['question_id', 'revision']) + + # Removing unique constraint on 'PostRevision', fields ['answer', 'revision'] + db.delete_unique('askbot_postrevision', ['answer_id', 'revision']) + + # Deleting model 'PostRevision' + db.delete_table('askbot_postrevision') + + + models = { + 'askbot.activity': { + 'Meta': {'object_name': 'Activity', 'db_table': "u'activity'"}, + 'active_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'activity_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_auditted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True'}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'recipients': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'incoming_activity'", 'symmetrical': 'False', 'through': "orm['askbot.ActivityAuditStatus']", 'to': "orm['auth.User']"}), + 'summary': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.activityauditstatus': { + 'Meta': {'unique_together': "(('user', 'activity'),)", 'object_name': 'ActivityAuditStatus'}, + 'activity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Activity']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.anonymousanswer': { + 'Meta': {'object_name': 'AnonymousAnswer'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'anonymous_answers'", 'to': "orm['askbot.Question']"}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.anonymousquestion': { + 'Meta': {'object_name': 'AnonymousQuestion'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'accepted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['askbot.Question']"}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('answer', 'revision'),)", 'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Answer']"}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answerrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.award': { + 'Meta': {'object_name': 'Award', 'db_table': "u'award'"}, + 'awarded_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'badge': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_badge'", 'to': "orm['askbot.BadgeData']"}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badgedata': { + 'Meta': {'ordering': "('slug',)", 'object_name': 'BadgeData'}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "orm['askbot.Award']", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}) + }, + 'askbot.comment': { + 'Meta': {'ordering': "('-added_at',)", 'object_name': 'Comment', 'db_table': "u'comment'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '2048'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'html': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'offensive_flag_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'askbot.emailfeedsetting': { + 'Meta': {'object_name': 'EmailFeedSetting'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'feed_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'frequency': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '8'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reported_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), + 'subscriber': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notification_subscriptions'", 'to': "orm['auth.User']"}) + }, + 'askbot.favoritequestion': { + 'Meta': {'object_name': 'FavoriteQuestion', 'db_table': "u'favorite_question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'askbot.markedtag': { + 'Meta': {'object_name': 'MarkedTag'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reason': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_selections'", 'to': "orm['askbot.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'askbot.postrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('answer', 'revision'), ('question', 'revision'))", 'object_name': 'PostRevision'}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Answer']", 'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'postrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.question': { + 'Meta': {'object_name': 'Question', 'db_table': "u'question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'answer_accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'answer_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questions'", 'to': "orm['auth.User']"}), + 'close_reason': ('django.db.models.fields.SmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'closed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'closed_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'closed_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'favorited_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'favorite_questions'", 'symmetrical': 'False', 'through': "orm['askbot.FavoriteQuestion']", 'to': "orm['auth.User']"}), + 'favourite_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'followed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'followed_questions'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_activity_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_activity_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'last_active_in_questions'", 'to': "orm['auth.User']"}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'questions'", 'symmetrical': 'False', 'to': "orm['askbot.Tag']"}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('question', 'revision'),)", 'object_name': 'QuestionRevision', 'db_table': "u'question_revision'"}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questionrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Question']"}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.questionview': { + 'Meta': {'object_name': 'QuestionView'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'viewed'", 'to': "orm['askbot.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'askbot.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'negative': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'positive': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'reputation_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'reputed_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.tag': { + 'Meta': {'ordering': "('-used_count', 'name')", 'object_name': 'Tag', 'db_table': "u'tag'"}, + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'created_tags'", 'to': "orm['auth.User']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_tags'", 'null': 'True', 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'used_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'askbot.vote': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'Vote', 'db_table': "u'vote'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'votes'", 'to': "orm['auth.User']"}), + 'vote': ('django.db.models.fields.SmallIntegerField', [], {}), + 'voted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '1'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'consecutive_days_visit_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'blank': 'True'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'display_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + 'email_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ignored_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'interesting_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'new_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}), + 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'seen_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'show_country': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0050_move_qa_revisions_to_postrevision.py b/askbot/migrations/0050_move_qa_revisions_to_postrevision.py new file mode 100644 index 00000000..36c46551 --- /dev/null +++ b/askbot/migrations/0050_move_qa_revisions_to_postrevision.py @@ -0,0 +1,366 @@ +# encoding: utf-8 +import datetime + +from django.db import models + +from south.db import db +from south.v2 import DataMigration + +class Migration(DataMigration): + + def copy_revision(self, orm, source_revision): + question = getattr(source_revision, 'question', None) + answer = getattr(source_revision, 'answer', None) + + if bool(question) == bool(answer): # one and only one has to be set (!xor) + raise ValueError('Strange source revision! Check this manually') + + if (question and source_revision.revision_type != 1) or (answer and source_revision.revision_type != 2): + raise ValueError('Data problem! Check this manually') + + orm.PostRevision.objects.create( + question=question, + answer=answer, + + revision_type=source_revision.revision_type, + + revision=source_revision.revision, + author=source_revision.author, + revised_at=source_revision.revised_at, + summary=source_revision.summary, + text=source_revision.text, + + title=source_revision.title, + tagnames=source_revision.tagnames, + is_anonymous=source_revision.is_anonymous + ) + + # INFO: There's no need to migrate also the related Activity instances + # - it's because `revision edited` Activities point to Question&Answer instances + # ans not to their relevant revisions. (BTW this might be considered a bug) + + + def forwards(self, orm): + # Process revisions + for qr in orm.QuestionRevision.objects.all(): + self.copy_revision(orm=orm, source_revision=qr) + + for ar in orm.AnswerRevision.objects.all(): + self.copy_revision(orm=orm, source_revision=ar) + + + def backwards(self, orm): + "Write your backwards methods here." + + + models = { + 'askbot.activity': { + 'Meta': {'object_name': 'Activity', 'db_table': "u'activity'"}, + 'active_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'activity_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_auditted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True'}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'recipients': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'incoming_activity'", 'symmetrical': 'False', 'through': "orm['askbot.ActivityAuditStatus']", 'to': "orm['auth.User']"}), + 'summary': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.activityauditstatus': { + 'Meta': {'unique_together': "(('user', 'activity'),)", 'object_name': 'ActivityAuditStatus'}, + 'activity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Activity']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.anonymousanswer': { + 'Meta': {'object_name': 'AnonymousAnswer'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'anonymous_answers'", 'to': "orm['askbot.Question']"}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.anonymousquestion': { + 'Meta': {'object_name': 'AnonymousQuestion'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'accepted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['askbot.Question']"}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('answer', 'revision'),)", 'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Answer']"}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answerrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.award': { + 'Meta': {'object_name': 'Award', 'db_table': "u'award'"}, + 'awarded_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'badge': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_badge'", 'to': "orm['askbot.BadgeData']"}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badgedata': { + 'Meta': {'ordering': "('slug',)", 'object_name': 'BadgeData'}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "orm['askbot.Award']", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}) + }, + 'askbot.comment': { + 'Meta': {'ordering': "('-added_at',)", 'object_name': 'Comment', 'db_table': "u'comment'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '2048'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'html': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'offensive_flag_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'askbot.emailfeedsetting': { + 'Meta': {'object_name': 'EmailFeedSetting'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'feed_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'frequency': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '8'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reported_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), + 'subscriber': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notification_subscriptions'", 'to': "orm['auth.User']"}) + }, + 'askbot.favoritequestion': { + 'Meta': {'object_name': 'FavoriteQuestion', 'db_table': "u'favorite_question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'askbot.markedtag': { + 'Meta': {'object_name': 'MarkedTag'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reason': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_selections'", 'to': "orm['askbot.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'askbot.postrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('answer', 'revision'), ('question', 'revision'))", 'object_name': 'PostRevision'}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Answer']", 'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'postrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.question': { + 'Meta': {'object_name': 'Question', 'db_table': "u'question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'answer_accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'answer_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questions'", 'to': "orm['auth.User']"}), + 'close_reason': ('django.db.models.fields.SmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'closed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'closed_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'closed_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'favorited_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'favorite_questions'", 'symmetrical': 'False', 'through': "orm['askbot.FavoriteQuestion']", 'to': "orm['auth.User']"}), + 'favourite_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'followed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'followed_questions'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_activity_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_activity_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'last_active_in_questions'", 'to': "orm['auth.User']"}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'questions'", 'symmetrical': 'False', 'to': "orm['askbot.Tag']"}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('question', 'revision'),)", 'object_name': 'QuestionRevision', 'db_table': "u'question_revision'"}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questionrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['askbot.Question']"}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.questionview': { + 'Meta': {'object_name': 'QuestionView'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'viewed'", 'to': "orm['askbot.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'askbot.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'negative': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'positive': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'reputation_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'reputed_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.tag': { + 'Meta': {'ordering': "('-used_count', 'name')", 'object_name': 'Tag', 'db_table': "u'tag'"}, + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'created_tags'", 'to': "orm['auth.User']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_tags'", 'null': 'True', 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'used_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'askbot.vote': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'Vote', 'db_table': "u'vote'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'votes'", 'to': "orm['auth.User']"}), + 'vote': ('django.db.models.fields.SmallIntegerField', [], {}), + 'voted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '1'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'consecutive_days_visit_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'blank': 'True'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'display_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + 'email_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ignored_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'interesting_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'new_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}), + 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'seen_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'show_country': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0051_proxify_qa_rev_models.py b/askbot/migrations/0051_proxify_qa_rev_models.py new file mode 100644 index 00000000..c4e37593 --- /dev/null +++ b/askbot/migrations/0051_proxify_qa_rev_models.py @@ -0,0 +1,347 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Removing unique constraint on 'QuestionRevision', fields ['question', 'revision'] + db.delete_unique(u'question_revision', ['question_id', 'revision']) + + # Removing unique constraint on 'AnswerRevision', fields ['answer', 'revision'] + db.delete_unique(u'answer_revision', ['answer_id', 'revision']) + + # Deleting model 'AnswerRevision' + db.delete_table(u'answer_revision') + + # Deleting model 'QuestionRevision' + db.delete_table(u'question_revision') + + + def backwards(self, orm): + + # Adding model 'AnswerRevision' + db.create_table(u'answer_revision', ( + ('text', self.gf('django.db.models.fields.TextField')()), + ('revised_at', self.gf('django.db.models.fields.DateTimeField')()), + ('revision_type', self.gf('django.db.models.fields.SmallIntegerField')()), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('is_anonymous', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='answerrevisions', to=orm['auth.User'])), + ('tagnames', self.gf('django.db.models.fields.CharField')(default='', max_length=125, blank=True)), + ('title', self.gf('django.db.models.fields.CharField')(default='', max_length=300, blank=True)), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=300, blank=True)), + ('answer', self.gf('django.db.models.fields.related.ForeignKey')(related_name='revisions', to=orm['askbot.Answer'])), + ('revision', self.gf('django.db.models.fields.PositiveIntegerField')()), + )) + db.send_create_signal('askbot', ['AnswerRevision']) + + # Adding unique constraint on 'AnswerRevision', fields ['answer', 'revision'] + db.create_unique(u'answer_revision', ['answer_id', 'revision']) + + # Adding model 'QuestionRevision' + db.create_table(u'question_revision', ( + ('text', self.gf('django.db.models.fields.TextField')()), + ('revised_at', self.gf('django.db.models.fields.DateTimeField')()), + ('revision_type', self.gf('django.db.models.fields.SmallIntegerField')()), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('is_anonymous', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='questionrevisions', to=orm['auth.User'])), + ('tagnames', self.gf('django.db.models.fields.CharField')(default='', max_length=125, blank=True)), + ('title', self.gf('django.db.models.fields.CharField')(default='', max_length=300, blank=True)), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='revisions', to=orm['askbot.Question'])), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=300, blank=True)), + ('revision', self.gf('django.db.models.fields.PositiveIntegerField')()), + )) + db.send_create_signal('askbot', ['QuestionRevision']) + + # Adding unique constraint on 'QuestionRevision', fields ['question', 'revision'] + db.create_unique(u'question_revision', ['question_id', 'revision']) + + + models = { + 'askbot.activity': { + 'Meta': {'object_name': 'Activity', 'db_table': "u'activity'"}, + 'active_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'activity_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_auditted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True'}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'recipients': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'incoming_activity'", 'symmetrical': 'False', 'through': "orm['askbot.ActivityAuditStatus']", 'to': "orm['auth.User']"}), + 'summary': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.activityauditstatus': { + 'Meta': {'unique_together': "(('user', 'activity'),)", 'object_name': 'ActivityAuditStatus'}, + 'activity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Activity']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.anonymousanswer': { + 'Meta': {'object_name': 'AnonymousAnswer'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'anonymous_answers'", 'to': "orm['askbot.Question']"}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.anonymousquestion': { + 'Meta': {'object_name': 'AnonymousQuestion'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip_addr': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'accepted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_answers'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': "orm['askbot.Question']"}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.award': { + 'Meta': {'object_name': 'Award', 'db_table': "u'award'"}, + 'awarded_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'badge': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_badge'", 'to': "orm['askbot.BadgeData']"}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badgedata': { + 'Meta': {'ordering': "('slug',)", 'object_name': 'BadgeData'}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "orm['askbot.Award']", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}) + }, + 'askbot.comment': { + 'Meta': {'ordering': "('-added_at',)", 'object_name': 'Comment', 'db_table': "u'comment'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '2048'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'html': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2048'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'offensive_flag_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'askbot.emailfeedsetting': { + 'Meta': {'object_name': 'EmailFeedSetting'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'feed_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'frequency': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '8'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reported_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), + 'subscriber': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notification_subscriptions'", 'to': "orm['auth.User']"}) + }, + 'askbot.favoritequestion': { + 'Meta': {'object_name': 'FavoriteQuestion', 'db_table': "u'favorite_question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'askbot.markedtag': { + 'Meta': {'object_name': 'MarkedTag'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'reason': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_selections'", 'to': "orm['askbot.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'askbot.postrevision': { + 'Meta': {'ordering': "('-revision',)", 'unique_together': "(('answer', 'revision'), ('question', 'revision'))", 'object_name': 'PostRevision'}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Answer']", 'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'postrevisions'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}), + 'revised_at': ('django.db.models.fields.DateTimeField', [], {}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'revision_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '300', 'blank': 'True'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '125', 'blank': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '300', 'blank': 'True'}) + }, + 'askbot.question': { + 'Meta': {'object_name': 'Question', 'db_table': "u'question'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'answer_accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'answer_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questions'", 'to': "orm['auth.User']"}), + 'close_reason': ('django.db.models.fields.SmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'closed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'closed_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'closed_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'favorited_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'favorite_questions'", 'symmetrical': 'False', 'through': "orm['askbot.FavoriteQuestion']", 'to': "orm['auth.User']"}), + 'favourite_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'followed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'followed_questions'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_activity_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_activity_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'last_active_in_questions'", 'to': "orm['auth.User']"}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'last_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_edited_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'locked_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'locked_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locked_questions'", 'null': 'True', 'to': "orm['auth.User']"}), + 'offensive_flag_count': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '180'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'questions'", 'symmetrical': 'False', 'to': "orm['askbot.Tag']"}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'vote_down_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'vote_up_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'wiki': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionview': { + 'Meta': {'object_name': 'QuestionView'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'viewed'", 'to': "orm['askbot.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'askbot.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'negative': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'positive': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Question']", 'null': 'True', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'reputation_type': ('django.db.models.fields.SmallIntegerField', [], {}), + 'reputed_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.tag': { + 'Meta': {'ordering': "('-used_count', 'name')", 'object_name': 'Tag', 'db_table': "u'tag'"}, + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'created_tags'", 'to': "orm['auth.User']"}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'deleted_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'deleted_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'deleted_tags'", 'null': 'True', 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'used_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + 'askbot.vote': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'Vote', 'db_table': "u'vote'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'votes'", 'to': "orm['auth.User']"}), + 'vote': ('django.db.models.fields.SmallIntegerField', [], {}), + 'voted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '1'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'consecutive_days_visit_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'blank': 'True'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'display_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + 'email_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ignored_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'interesting_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'new_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}), + 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'seen_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'show_country': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py index 5d1cd95d..6a609923 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -19,13 +19,14 @@ import askbot from askbot import exceptions as askbot_exceptions from askbot import const from askbot.conf import settings as askbot_settings -from askbot.models.question import Question, QuestionRevision +from askbot.models.question import Question from askbot.models.question import QuestionView, AnonymousQuestion from askbot.models.question import FavoriteQuestion -from askbot.models.answer import Answer, AnonymousAnswer, AnswerRevision +from askbot.models.answer import Answer, AnonymousAnswer from askbot.models.tag import Tag, MarkedTag from askbot.models.meta import Vote, Comment from askbot.models.user import EmailFeedSetting, ActivityAuditStatus, Activity +from askbot.models.post import PostRevision from askbot.models import signals from askbot.models.badges import award_badges_signal, get_badge, init_badges #from user import AuthKeyUserAssociation @@ -2656,15 +2657,15 @@ __all__ = [ 'signals', 'Question', - 'QuestionRevision', 'QuestionView', 'FavoriteQuestion', 'AnonymousQuestion', 'Answer', - 'AnswerRevision', 'AnonymousAnswer', + 'PostRevision', + 'Tag', 'Comment', 'Vote', diff --git a/askbot/models/answer.py b/askbot/models/answer.py index b9b28f89..cd9699ec 100644 --- a/askbot/models/answer.py +++ b/askbot/models/answer.py @@ -7,7 +7,7 @@ from django.core import exceptions as django_exceptions from django.conf import settings from askbot import exceptions from askbot.models.base import AnonymousContent, DeletableContent -from askbot.models.base import ContentRevision +from askbot.models.post import PostRevision from askbot.models.base import parse_post_text, parse_and_save_post from askbot.models import content from askbot import const @@ -217,7 +217,7 @@ class Answer(content.Content, DeletableContent): comment = const.POST_STATUS['default_version'] else: comment = 'No.%s Revision' % rev_no - return AnswerRevision.objects.create( + return PostRevision.objects.create_answer_revision( answer=self, author=author, revised_at=revised_at, @@ -300,32 +300,6 @@ class Answer(content.Content, DeletableContent): return self.html -class AnswerRevision(ContentRevision): - """A revision of an Answer.""" - answer = models.ForeignKey('Answer', related_name='revisions') - - def get_absolute_url(self): - return reverse('answer_revisions', kwargs={'id':self.answer.id}) - - def get_question_title(self): - return self.answer.question.title - - def as_html(self, **kwargs): - markdowner = markup.get_parser() - return sanitize_html(markdowner.convert(self.text)) - - class Meta(ContentRevision.Meta): - db_table = u'answer_revision' - ordering = ('-revision',) - - def save(self, **kwargs): - """Looks up the next available revision number if not set.""" - if not self.revision: - self.revision = AnswerRevision.objects.filter( - answer=self.answer).values_list('revision', - flat=True)[0] + 1 - super(AnswerRevision, self).save(**kwargs) - class AnonymousAnswer(AnonymousContent): question = models.ForeignKey('Question', related_name='anonymous_answers') diff --git a/askbot/models/base.py b/askbot/models/base.py index b456bca8..5ac2ac7a 100644 --- a/askbot/models/base.py +++ b/askbot/models/base.py @@ -1,17 +1,20 @@ import datetime import cgi +import logging + from django.db import models from django.utils.html import strip_tags from django.contrib.auth.models import User from django.contrib.contenttypes import generic from django.contrib.contenttypes.models import ContentType from django.contrib.sitemaps import ping_google + #todo: maybe merge askbot.utils.markup and forum.utils.html from askbot.utils import markup from askbot.utils.diff import textDiff as htmldiff from askbot.utils.html import sanitize_html from django.utils import html -import logging + #todo: following methods belong to a future common post class def parse_post_text(post): @@ -215,30 +218,6 @@ class DeletableContent(models.Model): app_label = 'askbot' -class ContentRevision(models.Model): - """ - Base class for QuestionRevision and AnswerRevision - """ - revision = models.PositiveIntegerField() - author = models.ForeignKey(User, related_name='%(class)ss') - revised_at = models.DateTimeField() - summary = models.CharField(max_length=300, blank=True) - text = models.TextField() - - class Meta: - abstract = True - app_label = 'askbot' - - def as_html(self, **kwargs): - """should return html representation of - the revision - """ - raise NotImplementedError() - - def get_snipet(self): - pass - - class AnonymousContent(models.Model): """ Base class for AnonymousQuestion and AnonymousAnswer diff --git a/askbot/models/post.py b/askbot/models/post.py new file mode 100644 index 00000000..16352228 --- /dev/null +++ b/askbot/models/post.py @@ -0,0 +1,130 @@ +from django.db import models +from django.core.exceptions import ValidationError + +from askbot.utils import markup +from askbot.utils.html import sanitize_html + +#class Post(models.Model): +# pass + +class PostRevisionManager(models.Manager): + # TODO: Make sure this manager /with the "blocked" .create() method/ is used also as a `related` manager: + # - https://docs.djangoproject.com/en/1.3/topics/db/managers/#controlling-automatic-manager-types + # - use_for_related_fields + def create(self, *kargs, **kwargs): + raise NotImplementedError # Prevent accidental creation of PostRevision instance without `revision_type` set + + + def create_question_revision(self, *kargs, **kwargs): + kwargs['revision_type'] = self.model.QUESTION_REVISION + return super(PostRevisionManager, self).create(*kargs, **kwargs) + + def create_answer_revision(self, *kargs, **kwargs): + kwargs['revision_type'] = self.model.ANSWER_REVISION + return super(PostRevisionManager, self).create(*kargs, **kwargs) + + def question_revisions(self): + return self.filter(revision_type=self.model.QUESTION_REVISION) + + def answer_revisions(self): + return self.filter(revision_type=self.model.ANSWER_REVISION) + + +class PostRevision(models.Model): + QUESTION_REVISION_TEMPLATE_NO_TAGS = ( + '<h3>%(title)s</h3>\n' + '<div class="text">%(html)s</div>\n' + ) + + QUESTION_REVISION = 1 + ANSWER_REVISION = 2 + REVISION_TYPE_CHOICES = ( + (QUESTION_REVISION, 'question'), + (ANSWER_REVISION, 'answer'), + ) + REVISION_TYPE_CHOICES_DICT = dict(REVISION_TYPE_CHOICES) + + answer = models.ForeignKey('askbot.Answer', related_name='revisions', null=True, blank=True) + question = models.ForeignKey('askbot.Question', related_name='revisions', null=True, blank=True) + + revision_type = models.SmallIntegerField(choices=REVISION_TYPE_CHOICES) + + revision = models.PositiveIntegerField() + author = models.ForeignKey('auth.User', related_name='%(class)ss') + revised_at = models.DateTimeField() + summary = models.CharField(max_length=300, blank=True) + text = models.TextField() + + # Question-specific fields + title = models.CharField(max_length=300, blank=True, default='') + tagnames = models.CharField(max_length=125, blank=True, default='') + is_anonymous = models.BooleanField(default=False) + + objects = PostRevisionManager() + + class Meta: + # INFO: This `unique_together` constraint might be problematic for databases in which + # 2+ NULLs cannot be stored in an UNIQUE column. + # As far as I know MySQL, PostgreSQL and SQLite allow that so we're on the safe side. + unique_together = (('answer', 'revision'), ('question', 'revision')) + ordering = ('-revision',) + app_label = 'askbot' + + def revision_type_str(self): + return self.REVISION_TYPE_CHOICES_DICT[self.revision_type] + + def __unicode__(self): + return u'%s - revision %s of %s' % (self.revision_type_str(), self.revision, self.title) + + def parent(self): + if self.is_question_revision(): + return self.question + elif self.is_answer_revision(): + return self.answer + + def clean(self): + "Internal cleaning method, called from self.save() by self.full_clean()" + if bool(self.question) == bool(self.answer): # one and only one has to be set (!xor) + raise ValidationError('One (and only one) of question/answer fields has to be set.') + if (self.question and not self.is_question_revision()) or (self.answer and not self.is_answer_revision()): + raise ValidationError('Revision_type doesn`t match values in question/answer fields.') + + def save(self, **kwargs): + # Determine the revision number, if not set + if not self.revision: + # TODO: Maybe use Max() aggregation? Or `revisions.count() + 1` + self.revision = self.parent().revisions.values_list('revision', flat=True)[0] + 1 + + # Make sure that everything is ok, in particular that `revision_type` and `revision` are set to valid values + self.full_clean() + + super(PostRevision, self).save(**kwargs) + + def is_question_revision(self): + return self.revision_type == self.QUESTION_REVISION + + def is_answer_revision(self): + return self.revision_type == self.ANSWER_REVISION + + @models.permalink + def get_absolute_url(self): + if self.is_question_revision(): + return 'question_revisions', (self.question.id,), {} + elif self.is_answer_revision(): + return 'answer_revisions', (), {'id':self.answer.id} + + def get_question_title(self): + #INFO: ack-grepping shows that it's only used for Questions, so there's no code for Answers + return self.question.title + + def as_html(self, **kwargs): + markdowner = markup.get_parser() + sanitized_html = sanitize_html(markdowner.convert(self.text)) + + if self.is_question_revision(): + return self.QUESTION_REVISION_TEMPLATE_NO_TAGS % { + 'title': self.title, + 'html': sanitized_html + } + elif self.is_answer_revision(): + return sanitized_html diff --git a/askbot/models/question.py b/askbot/models/question.py index 0ddb5b08..c2d4be11 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -15,7 +15,7 @@ from askbot import exceptions from askbot.models.tag import Tag from askbot.models.base import AnonymousContent from askbot.models.base import DeletableContent -from askbot.models.base import ContentRevision +from askbot.models.post import PostRevision from askbot.models.base import BaseQuerySetManager from askbot.models.base import parse_post_text from askbot.models.base import parse_and_save_post @@ -24,8 +24,6 @@ from askbot.models import signals from askbot import const from askbot.utils.lists import LazyList from askbot.utils.slug import slugify -from askbot.utils import markup -from askbot.utils.html import sanitize_html from askbot.utils import mysql #todo: too bad keys are duplicated see const sort methods @@ -141,12 +139,12 @@ class QuestionQuerySet(models.query.QuerySet): | models.Q(answers__text__search = search_query) ) elif 'postgresql_psycopg2' in askbot.get_database_engine_name(): - rank_clause = "ts_rank(question.text_search_vector, to_tsquery(%s))"; + rank_clause = "ts_rank(question.text_search_vector, plainto_tsquery(%s))"; search_query = '&'.join(search_query.split()) extra_params = (search_query,) extra_kwargs = { 'select': {'relevance': rank_clause}, - 'where': ['text_search_vector @@ to_tsquery(%s)'], + 'where': ['text_search_vector @@ plainto_tsquery(%s)'], 'params': extra_params, 'select_params': extra_params, } @@ -360,6 +358,48 @@ class QuestionQuerySet(models.query.QuerySet): meta_data['ignored_tag_names'].extend(tagnames.split()) return qs, meta_data, related_tags + def added_between(self, start, end): + """questions added between ``start`` and ``end`` timestamps""" + return self.filter( + added_at__gt = start + ).exclude( + added_at__gt = end + ) + + def get_questions_needing_reminder(self, + user = None, + activity_type = None, + recurrence_delay = None): + """returns list of questions that need a reminder, + corresponding the given ``activity_type`` + ``user`` - is the user receiving the reminder + ``recurrence_delay`` - interval between sending the + reminders about the same question + """ + from askbot.models import Activity#avoid circular import + question_list = list() + for question in self: + try: + activity = Activity.objects.get( + user = user, + question = question, + activity_type = activity_type + ) + now = datetime.datetime.now() + if now < activity.active_at + recurrence_delay: + continue + except Activity.DoesNotExist: + activity = Activity( + user = user, + question = question, + activity_type = activity_type, + content_object = question, + ) + activity.active_at = datetime.datetime.now() + activity.save() + question_list.append(question) + return question_list + #todo: this function is similar to get_response_receivers #profile this function against the other one #todo: maybe this must be a query set method, not manager method @@ -718,7 +758,7 @@ class Question(content.Content, DeletableContent): # Create a new revision latest_revision = self.get_latest_revision() - QuestionRevision.objects.create( + PostRevision.objects.create_question_revision( question = self, title = latest_revision.title, author = retagged_by, @@ -796,7 +836,7 @@ class Question(content.Content, DeletableContent): else: comment = 'No.%s Revision' % rev_no - return QuestionRevision.objects.create( + return PostRevision.objects.create_question_revision( question = self, revision = rev_no, title = self.title, @@ -965,54 +1005,6 @@ class FavoriteQuestion(models.Model): def __unicode__(self): return '[%s] favorited at %s' %(self.user, self.added_at) -QUESTION_REVISION_TEMPLATE = ('<h3>%(title)s</h3>\n' - '<div class="text">%(html)s</div>\n' - '<div class="tags">%(tags)s</div>') -QUESTION_REVISION_TEMPLATE_NO_TAGS = ('<h3>%(title)s</h3>\n' - '<div class="text">%(html)s</div>\n') -class QuestionRevision(ContentRevision): - """A revision of a Question.""" - question = models.ForeignKey(Question, related_name='revisions') - title = models.CharField(max_length=300) - tagnames = models.CharField(max_length=125) - is_anonymous = models.BooleanField(default=False) - - class Meta(ContentRevision.Meta): - db_table = u'question_revision' - ordering = ('-revision',) - - def get_question_title(self): - return self.question.title - - def get_absolute_url(self): - #print 'in QuestionRevision.get_absolute_url()' - return reverse('question_revisions', args=[self.question.id]) - - def as_html(self, include_tags=True): - markdowner = markup.get_parser() - if include_tags: - return QUESTION_REVISION_TEMPLATE % { - 'title': self.title, - 'html': sanitize_html(markdowner.convert(self.text)), - 'tags': ' '.join(['<a class="post-tag">%s</a>' % tag - for tag in self.tagnames.split(' ')]), - } - else: - return QUESTION_REVISION_TEMPLATE_NO_TAGS % { - 'title': self.title, - 'html': sanitize_html(markdowner.convert(self.text)) - } - - def save(self, **kwargs): - """Looks up the next available revision number.""" - if not self.revision: - self.revision = QuestionRevision.objects.filter( - question=self.question).values_list('revision', - flat=True)[0] + 1 - super(QuestionRevision, self).save(**kwargs) - - def __unicode__(self): - return u'revision %s of %s' % (self.revision, self.title) class AnonymousQuestion(AnonymousContent): """question that was asked before logging in diff --git a/askbot/models/user.py b/askbot/models/user.py index ab5b43fb..6a0e3d4d 100644 --- a/askbot/models/user.py +++ b/askbot/models/user.py @@ -286,6 +286,10 @@ class EmailFeedSetting(models.Model): reported_at = models.DateTimeField(null=True) objects = EmailFeedSettingManager() + class Meta: + #added to make account merges work properly + unique_together = ('subscriber', 'feed_type') + def __str__(self): if self.reported_at is None: reported_at = "'not yet'" diff --git a/askbot/search/sphinx/sphinx.conf b/askbot/search/sphinx/sphinx.conf index 7ff44604..cdf0f004 100644 --- a/askbot/search/sphinx/sphinx.conf +++ b/askbot/search/sphinx/sphinx.conf @@ -25,12 +25,13 @@ source src_askbot INNER JOIN \ ( \ SELECT MAX(id) as id, question_id \ - FROM question_revision \ + FROM askbot_postrevision \ + WHERE revision_type = 1 \ GROUP BY question_id \ ) \ AS mqr \ ON q.id=mqr.question_id \ - INNER JOIN question_revision AS qr ON qr.id=mqr.id \ + INNER JOIN askbot_postrevision AS qr ON qr.id=mqr.id \ LEFT JOIN \ ( \ SELECT GROUP_CONCAT(answer_current.text SEPARATOR '. ') AS text, \ @@ -42,12 +43,13 @@ source src_askbot INNER JOIN \ ( \ SELECT MAX(id) as id, answer_id \ - FROM answer_revision \ + FROM askbot_postrevision \ + WHERE revision_type = 2 \ GROUP BY answer_id \ ) \ AS mar \ ON mar.answer_id = a.id \ - INNER JOIN answer_revision AS ar ON ar.id=mar.id \ + INNER JOIN askbot_postrevision AS ar ON ar.id=mar.id \ WHERE a.deleted=0 \ ) \ AS answer_current \ diff --git a/askbot/setup_templates/settings.py b/askbot/setup_templates/settings.py index 3aead40f..a6d257ae 100644 --- a/askbot/setup_templates/settings.py +++ b/askbot/setup_templates/settings.py @@ -40,7 +40,7 @@ EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #go to the site's live settings and enable the feature #"Email settings" -> "allow asking by email" # -# WARNING: command post_emailed_questions DELETES all +# WARNING: command post_emailed_questions DELETES all # emails from the mailbox each time # do not use your personal mail box here!!! # @@ -78,7 +78,7 @@ PROJECT_ROOT = os.path.dirname(__file__) ADMIN_MEDIA_PREFIX = '/admin/media/' # Make up some unique string, and don't share it with anybody. -SECRET_KEY = 'sdljdfjkldsflsdjkhsjkldgjlsdgfs s ' +SECRET_KEY = 'sdljdfjkldsflsdjkhsjkldgjlsdgfs s ' # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( @@ -102,6 +102,7 @@ MIDDLEWARE_CLASSES = ( #below is askbot stuff for this tuple 'askbot.middleware.anon_user.ConnectToSessionMessagesMiddleware', + 'askbot.middleware.forum_mode.ForumModeMiddleware', 'askbot.middleware.pagesize.QuestionsPageSizeMiddleware', 'askbot.middleware.cancel.CancelActionMiddleware', 'django.middleware.transaction.TransactionMiddleware', @@ -116,7 +117,7 @@ ROOT_URLCONF = os.path.basename(os.path.dirname(__file__)) + '.urls' #UPLOAD SETTINGS FILE_UPLOAD_TEMP_DIR = os.path.join( - os.path.dirname(__file__), + os.path.dirname(__file__), 'tmp' ).replace('\\','/') @@ -200,8 +201,10 @@ logging.basicConfig( # ASKBOT_URL = 'forum/' # ASKBOT_URL = '' #no leading slash, default = '' empty string +ASKBOT_TRANSLATE_URL = True #translate specific URLs _ = lambda v:v #fake translation function for the login url LOGIN_URL = '/%s%s%s' % (ASKBOT_URL,_('account/'),_('signin/')) +LOGIN_REDIRECT_URL = ASKBOT_URL #adjust if needed #note - it is important that upload dir url is NOT translated!!! #also, this url must not have the leading slash ASKBOT_UPLOADED_FILES_URL = '%s%s' % (ASKBOT_URL, 'upfiles/') @@ -209,11 +212,11 @@ ALLOW_UNICODE_SLUGS = False ASKBOT_USE_STACKEXCHANGE_URLS = False #mimic url scheme of stackexchange #Celery Settings -BROKER_BACKEND = "djkombu.transport.DatabaseTransport" +BROKER_TRANSPORT = "djkombu.transport.DatabaseTransport" CELERY_ALWAYS_EAGER = True import djcelery djcelery.setup_loader() -CSRF_COOKIE_NAME = 'askbot_scrf' +CSRF_COOKIE_NAME = 'askbot_csrf' CSRF_COOKIE_DOMAIN = ''#enter domain name here - e.g. example.com diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache new file mode 100644 index 00000000..e177c649 --- /dev/null +++ b/askbot/setup_templates/settings.py.mustache @@ -0,0 +1,222 @@ +## Django settings for ASKBOT enabled project. +import os.path +import logging +import sys +import askbot + +#this line is added so that we can import pre-packaged askbot dependencies +sys.path.append(os.path.join(os.path.dirname(askbot.__file__), 'deps')) + +DEBUG = False#set to True to enable debugging +TEMPLATE_DEBUG = False#keep false when debugging jinja2 templates +INTERNAL_IPS = ('127.0.0.1',) + +ADMINS = ( + ('Your Name', 'your_email@domain.com'), +) + +MANAGERS = ADMINS + +DATABASE_ENGINE = 'postgresql_psycopg2' # only postgres (>8.3) and mysql are supported so far others have not been tested yet +DATABASE_NAME = '{{database_name}}' # Or path to database file if using sqlite3. +DATABASE_USER = '{{database_user}}' # Not used with sqlite3. +DATABASE_PASSWORD = '{{database_password}}' # Not used with sqlite3. +DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. +DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. + +#outgoing mail server settings +SERVER_EMAIL = '' +DEFAULT_FROM_EMAIL = '' +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' +EMAIL_SUBJECT_PREFIX = '' +EMAIL_HOST='' +EMAIL_PORT='' +EMAIL_USE_TLS=False +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + +#incoming mail settings +#after filling out these settings - please +#go to the site's live settings and enable the feature +#"Email settings" -> "allow asking by email" +# +# WARNING: command post_emailed_questions DELETES all +# emails from the mailbox each time +# do not use your personal mail box here!!! +# +IMAP_HOST = '' +IMAP_HOST_USER = '' +IMAP_HOST_PASSWORD = '' +IMAP_PORT = '' +IMAP_USE_TLS = False + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# On Unix systems, a value of None will cause Django to use the same +# timezone as the operating system. +# If running in a Windows environment this must be set to the same as your +# system time zone. +TIME_ZONE = 'America/Chicago' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True +LANGUAGE_CODE = 'en' + +# Absolute path to the directory that holds media. +# Example: "/home/media/media.lawrence.com/" +ASKBOT_FILE_UPLOAD_DIR = os.path.join(os.path.dirname(__file__), 'askbot', 'upfiles') + +PROJECT_ROOT = os.path.dirname(__file__) + +# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a +# trailing slash. +# Examples: "http://foo.com/media/", "/media/". +ADMIN_MEDIA_PREFIX = '/admin/media/' + +# Make up some unique string, and don't share it with anybody. +SECRET_KEY = 'sdljdfjkldsflsdjkhsjkldgjlsdgfs s ' + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.load_template_source', + 'django.template.loaders.app_directories.load_template_source', + #below is askbot stuff for this tuple + 'askbot.skins.loaders.filesystem_load_template_source', + #'django.template.loaders.eggs.load_template_source', +) + + +MIDDLEWARE_CLASSES = ( + #'django.middleware.gzip.GZipMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + #'django.middleware.cache.UpdateCacheMiddleware', + 'django.middleware.common.CommonMiddleware', + #'django.middleware.cache.FetchFromCacheMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + #'django.middleware.sqlprint.SqlPrintingMiddleware', + + #below is askbot stuff for this tuple + 'askbot.middleware.anon_user.ConnectToSessionMessagesMiddleware', + 'askbot.middleware.forum_mode.ForumModeMiddleware', + 'askbot.middleware.pagesize.QuestionsPageSizeMiddleware', + 'askbot.middleware.cancel.CancelActionMiddleware', + 'django.middleware.transaction.TransactionMiddleware', + #'debug_toolbar.middleware.DebugToolbarMiddleware', + 'askbot.middleware.view_log.ViewLogMiddleware', + 'askbot.middleware.spaceless.SpacelessMiddleware', +) + + +ROOT_URLCONF = os.path.basename(os.path.dirname(__file__)) + '.urls' + + +#UPLOAD SETTINGS +FILE_UPLOAD_TEMP_DIR = os.path.join( + os.path.dirname(__file__), + 'tmp' + ).replace('\\','/') + +FILE_UPLOAD_HANDLERS = ( + 'django.core.files.uploadhandler.MemoryFileUploadHandler', + 'django.core.files.uploadhandler.TemporaryFileUploadHandler', +) +ASKBOT_ALLOWED_UPLOAD_FILE_TYPES = ('.jpg', '.jpeg', '.gif', '.bmp', '.png', '.tiff') +ASKBOT_MAX_UPLOAD_FILE_SIZE = 1024 * 1024 #result in bytes +DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' + + +#TEMPLATE_DIRS = (,) #template have no effect in askbot, use the variable below +#ASKBOT_EXTRA_SKIN_DIR = #path to your private skin collection +#take a look here http://askbot.org/en/question/207/ + +TEMPLATE_CONTEXT_PROCESSORS = ( + 'django.core.context_processors.request', + 'askbot.context.application_settings', + #'django.core.context_processors.i18n', + 'askbot.user_messages.context_processors.user_messages',#must be before auth + 'django.core.context_processors.auth', #this is required for admin + 'django.core.context_processors.csrf', #necessary for csrf protection +) + + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + + #all of these are needed for the askbot + 'django.contrib.admin', + 'django.contrib.humanize', + 'django.contrib.sitemaps', + #'debug_toolbar', + 'askbot', + 'askbot.deps.django_authopenid', + #'askbot.importers.stackexchange', #se loader + 'south', + 'askbot.deps.livesettings', + 'keyedcache', + 'robots', + 'django_countries', + 'djcelery', + 'djkombu', + 'followit', + #'avatar',#experimental use git clone git://github.com/ericflo/django-avatar.git$ + #requires setting of MEDIA_ROOT and MEDIA_URL +) + + +#setup memcached for production use! +#see http://docs.djangoproject.com/en/1.1/topics/cache/ for details +CACHE_BACKEND = 'locmem://' +#needed for django-keyedcache +CACHE_TIMEOUT = 6000 +CACHE_PREFIX = 'askbot' #make this unique +CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True +#If you use memcache you may want to uncomment the following line to enable memcached based sessions +#SESSION_ENGINE = 'django.contrib.sessions.backends.cache_db' + +AUTHENTICATION_BACKENDS = ( + 'django.contrib.auth.backends.ModelBackend', + 'askbot.deps.django_authopenid.backends.AuthBackend', +) + +#logging settings +LOG_FILENAME = 'askbot.log' +logging.basicConfig( + filename=os.path.join(os.path.dirname(__file__), 'log', LOG_FILENAME), + level=logging.CRITICAL, + format='%(pathname)s TIME: %(asctime)s MSG: %(filename)s:%(funcName)s:%(lineno)d %(message)s', +) + +########################### +# +# this will allow running your forum with url like http://site.com/forum +# +# ASKBOT_URL = 'forum/' +# +ASKBOT_URL = '' #no leading slash, default = '' empty string +ASKBOT_TRANSLATE_URL = True #translate specific URLs +_ = lambda v:v #fake translation function for the login url +LOGIN_URL = '/%s%s%s' % (ASKBOT_URL,_('account/'),_('signin/')) +LOGIN_REDIRECT_URL = ASKBOT_URL #adjust, if needed +#note - it is important that upload dir url is NOT translated!!! +#also, this url must not have the leading slash +ASKBOT_UPLOADED_FILES_URL = '%s%s' % (ASKBOT_URL, 'upfiles/') +ALLOW_UNICODE_SLUGS = False +ASKBOT_USE_STACKEXCHANGE_URLS = False #mimic url scheme of stackexchange + +#Celery Settings +BROKER_TRANSPORT = "djkombu.transport.DatabaseTransport" +CELERY_ALWAYS_EAGER = True + +import djcelery +djcelery.setup_loader() +DOMAIN_NAME = '{{domain_name}}' + +CSRF_COOKIE_NAME = '{{domain_name}}_csrf' +CSRF_COOKIE_DOMAIN = DOMAIN_NAME diff --git a/askbot/skins/common/media/js/live_search.js b/askbot/skins/common/media/js/live_search.js index a02060f8..73e1453a 100644 --- a/askbot/skins/common/media/js/live_search.js +++ b/askbot/skins/common/media/js/live_search.js @@ -338,6 +338,12 @@ var liveSearch = function(){ } }; + var change_rss_url = function(feed_url){ + if(feed_url){ + $("#ContentLeft a.rss:first").attr("href", feed_url); + } + } + var remove_search_tag = function(tag_name){ $.ajax({ url: askbot['urls']['questions'], @@ -414,6 +420,7 @@ var liveSearch = function(){ render_faces(data['faces']); render_related_tags(data['related_tags']); render_relevance_sort_tab(); + change_rss_url(data['feed_url']); set_active_sort_tab(sortMethod); query.focus(); diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js index f4574cb3..5dc49080 100644 --- a/askbot/skins/common/media/js/post.js +++ b/askbot/skins/common/media/js/post.js @@ -323,27 +323,27 @@ var Vote = function(){ return $(favoriteNumber); }; var getQuestionVoteUpButton = function(){ - var questionVoteUpButton = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixQuestionVoteup +']'; + var questionVoteUpButton = 'div.'+ voteContainerId +' div[id^='+ imgIdPrefixQuestionVoteup +']'; return $(questionVoteUpButton); }; var getQuestionVoteDownButton = function(){ - var questionVoteDownButton = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixQuestionVotedown +']'; + var questionVoteDownButton = 'div.'+ voteContainerId +' div[id^='+ imgIdPrefixQuestionVotedown +']'; return $(questionVoteDownButton); }; var getAnswerVoteUpButtons = function(){ - var answerVoteUpButton = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAnswerVoteup +']'; + var answerVoteUpButton = 'div.'+ voteContainerId +' div[id^='+ imgIdPrefixAnswerVoteup +']'; return $(answerVoteUpButton); }; var getAnswerVoteDownButtons = function(){ - var answerVoteDownButton = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAnswerVotedown +']'; + var answerVoteDownButton = 'div.'+ voteContainerId +' div[id^='+ imgIdPrefixAnswerVotedown +']'; return $(answerVoteDownButton); }; var getAnswerVoteUpButton = function(id){ - var answerVoteUpButton = 'div.'+ voteContainerId +' img[id='+ imgIdPrefixAnswerVoteup + id + ']'; + var answerVoteUpButton = 'div.'+ voteContainerId +' div[id='+ imgIdPrefixAnswerVoteup + id + ']'; return $(answerVoteUpButton); }; var getAnswerVoteDownButton = function(id){ - var answerVoteDownButton = 'div.'+ voteContainerId +' img[id='+ imgIdPrefixAnswerVotedown + id + ']'; + var answerVoteDownButton = 'div.'+ voteContainerId +' div[id='+ imgIdPrefixAnswerVotedown + id + ']'; return $(answerVoteDownButton); }; @@ -376,19 +376,21 @@ var Vote = function(){ }; var setVoteImage = function(voteType, undo, object){ - var flag = undo ? "" : "-on"; - var arrow = (voteType == VoteType.questionUpVote || voteType == VoteType.answerUpVote) ? "up" : "down"; - object.attr("src", mediaUrl("media/images/vote-arrow-"+ arrow + flag +".png")); + var flag = undo ? false : true; + if (object.hasClass("on")) { + object.removeClass("on"); + }else{ + object.addClass("on"); + } - // if undo voting, then undo the pair of arrows. if(undo){ if(voteType == VoteType.questionUpVote || voteType == VoteType.questionDownVote){ - $(getQuestionVoteUpButton()).attr("src", mediaUrl("media/images/vote-arrow-up.png")); - $(getQuestionVoteDownButton()).attr("src", mediaUrl("media/images/vote-arrow-down.png")); + $(getQuestionVoteUpButton()).removeClass("on"); + $(getQuestionVoteDownButton()).removeClass("on"); } else{ - $(getAnswerVoteUpButton(postId)).attr("src", mediaUrl("media/images/vote-arrow-up.png")); - $(getAnswerVoteDownButton(postId)).attr("src", mediaUrl("media/images/vote-arrow-down.png")); + $(getAnswerVoteUpButton(postId)).removeClass("on"); + $(getAnswerVoteDownButton(postId)).removeClass("on"); } } }; @@ -977,6 +979,8 @@ EditCommentForm.prototype.getCounterUpdater = function(){ length2 = Math.round(0.9*maxCommentLength); } + //todo: + //1) use class instead of color - move color def to css var color = 'maroon'; var chars = 10; if (length === 0){ @@ -1573,7 +1577,7 @@ var socialSharing = function(){ url = url.replace('{TEXT}', TEXT); var params = SERVICE_DATA[service_name]['params']; if(!window.open(url, "sharing", params)){ - window.location.href=share_url; + window.location.href=url; } } }); diff --git a/askbot/skins/common/media/js/wmd/wmd.css b/askbot/skins/common/media/js/wmd/wmd.css index 15182541..3ad615e7 100644 --- a/askbot/skins/common/media/js/wmd/wmd.css +++ b/askbot/skins/common/media/js/wmd/wmd.css @@ -15,7 +15,7 @@ border-top:#cce6ec 3px solid; border-right:#cce6ec 3px solid; float:left; - width:100%; + width:730px; } #wmd-input diff --git a/askbot/skins/common/media/js/wmd/wmd.js b/askbot/skins/common/media/js/wmd/wmd.js index 85e3ccd6..1d524361 100644 --- a/askbot/skins/common/media/js/wmd/wmd.js +++ b/askbot/skins/common/media/js/wmd/wmd.js @@ -244,7 +244,7 @@ util.prompt = function(text, defaultInputText, makeLinkMarkdown, dialogType){ text = text.replace('http://https://', 'https://'); text = text.replace('http://ftp://', 'ftp://'); - if (text.indexOf('http://') === -1 && text.indexOf('ftp://') === -1) { + if (text.indexOf('http://') === -1 && text.indexOf('ftp://') === -1 && text.indexOf('https://') === -1) { if (dialogType == 'link'){ //add http only to urls text = 'http://' + text; diff --git a/askbot/skins/common/templates/question/answer_vote_buttons.html b/askbot/skins/common/templates/question/answer_vote_buttons.html index 2744e37d..0ff57e4b 100644 --- a/askbot/skins/common/templates/question/answer_vote_buttons.html +++ b/askbot/skins/common/templates/question/answer_vote_buttons.html @@ -3,15 +3,15 @@ visitor_vote = user_answer_votes[answer.id] ) }} -{% if request.user == question.author or request.user.is_authenticated() and (request.user.is_moderator() or request.user.is_superuser()) %} +{% if request.user == question.author or (request.user.is_authenticated() and (request.user.is_moderator() or request.user.is_administrator())) %} <img id="answer-img-accept-{{ answer.id }}" class="answer-img-accept" {% if answer.accepted %} src="{{'/images/vote-accepted-on.png'|media}}" {% else %} src="{{'/images/vote-accepted.png'|media}}" {% endif %} - alt="{% trans %}mark this answer as favorite (click again to undo){% endtrans %}" - title="{% trans %}mark this answer as favorite (click again to undo){% endtrans %}" /> + alt="{% trans %}mark this answer as correct (click again to undo){% endtrans %}" + title="{% trans %}mark this answer as correct (click again to undo){% endtrans %}" /> {% else %} {% if answer.accepted %} <img id="answer-img-accept-{{ answer.id }}" class="answer-img-accept" @@ -22,5 +22,6 @@ {% endif %} alt="{% trans question_author=question.author.username %}{{question_author}} has selected this answer as correct{% endtrans %}" title="{% trans questsion_author=question.author.username%}{{question_author}} has selected this answer as correct{% endtrans %}" + /> {% endif %} {% endif %} diff --git a/askbot/skins/common/templates/widgets/search_bar.html b/askbot/skins/common/templates/widgets/search_bar.html index 5efe3860..d5a7859b 100644 --- a/askbot/skins/common/templates/widgets/search_bar.html +++ b/askbot/skins/common/templates/widgets/search_bar.html @@ -21,8 +21,12 @@ {% endif %} {# class was searchInput #} <input - {% if query %} + {% if query and request.user.is_authenticated() %} + class="searchInputCancelableAuth" + {% elif query %} class="searchInputCancelable" + {% elif request.user.is_authenticated() %} + class="searchInputAuth" {% else %} class="searchInput" {% endif %} diff --git a/askbot/skins/default/media/images/logo.gif b/askbot/skins/default/media/images/logo.gif Binary files differindex ac4ceda6..810b0bcf 100644 --- a/askbot/skins/default/media/images/logo.gif +++ b/askbot/skins/default/media/images/logo.gif diff --git a/askbot/skins/default/media/style/lib_style.less b/askbot/skins/default/media/style/lib_style.less index e6d554b1..4f2bad79 100644 --- a/askbot/skins/default/media/style/lib_style.less +++ b/askbot/skins/default/media/style/lib_style.less @@ -8,7 +8,7 @@ @button-label:#4a757f; @section-title:#7ea9b3; @info-text:#707070; -@info-text-dark:#6b6b6b; +@info-text-dark:#525252; /* Variables for fonts*/ diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index d2eeb364..ba5875ad 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1,2503 +1,2487 @@ @import url(jquery.autocomplete.css); -@import "lib_style.less"; /* Library of predifined less functions styles */ - +/* General Predifined classes, read more in lesscss.org */ +/* Variables for Colors*/ +/* Variables for fonts*/ +/* "Trebuchet MS", sans-serif;*/ +/* Receive exactly positions for background Sprite */ +/* CSS3 Elements */ +/* Library of predifined less functions styles */ /* ----- General HTML Styles----- */ - body { - background: #FFF; - font-size: 14px; - line-height: 150%; - margin: 0; - padding: 0; - color: #000; - font-family: @main-font; + background: #FFF; + font-size: 14px; + line-height: 150%; + margin: 0; + padding: 0; + color: #000; + font-family: Arial; } - div { - margin: 0 auto; - padding: 0; -} - -h1, h2, h3, h4, h5, h6, ul, li, dl, dt, dd, form, img, p { - margin: 0; - padding: 0; - border: none; + margin: 0 auto; + padding: 0; +} +h1, +h2, +h3, +h4, +h5, +h6, +ul, +li, +dl, +dt, +dd, +form, +img, +p { + margin: 0; + padding: 0; + border: none; } - label { - vertical-align: middle; + vertical-align: middle; } - hr { - border: none; - border-top: 1px dashed #ccccce; + border: none; + border-top: 1px dashed #ccccce; } - input, select { - vertical-align: middle; - font-family: Trebuchet MS, "segoe ui", Helvetica, Tahoma, Verdana, MingLiu, PMingLiu, Arial, sans-serif; + vertical-align: middle; + font-family: Trebuchet MS, "segoe ui", Helvetica, Tahoma, Verdana, MingLiu, PMingLiu, Arial, sans-serif; + margin-left: 0px; } - p { - font-size: 14px; - line-height: 140%; - margin-bottom: 6px; - padding-left: 5px; + font-size: 14px; + line-height: 140%; + margin-bottom: 6px; } - a { - color:@link; - text-decoration: none; - cursor: pointer; + color: #1b79bd; + text-decoration: none; + cursor: pointer; } - h2 { - font-size: 140%; - padding: 3px 0 3px 5px; + font-size: 21px; + padding: 3px 0 3px 5px; } - h3 { - font-size: 120%; - padding: 3px 0 3px 5px; + font-size: 19px; + padding: 3px 0 3px 5px; } - ul { - list-style: disc; - margin-left: 20px; - padding-left: 0px; - margin-bottom: 1em; + list-style: disc; + margin-left: 20px; + padding-left: 0px; + margin-bottom: 1em; } - ol { - list-style: decimal; - margin-left: 30px; - margin-bottom: 1em; - padding-left: 0px; + list-style: decimal; + margin-left: 30px; + margin-bottom: 1em; + padding-left: 0px; } - td ul { - vertical-align: middle; + vertical-align: middle; } - li input { - margin: 3px 3px 4px 3px; + margin: 3px 3px 4px 3px; } - pre { - font-family: Consolas, Monaco, Liberation Mono, Lucida Console, Monospace; - font-size: 100%; - margin-bottom: 10px; - /*overflow: auto;*/ - background-color: #F5F5F5; - padding-left: 5px; - padding-top: 5px; - /*width: 671px;*/ - padding-bottom: 20px ! ie7; -} + font-family: Consolas, Monaco, Liberation Mono, Lucida Console, Monospace; + font-size: 100%; + margin-bottom: 10px; + /*overflow: auto;*/ -code { - font-family: Consolas, Monaco, Liberation Mono, Lucida Console, Monospace; - font-size: 100%; + background-color: #F5F5F5; + padding-left: 5px; + padding-top: 5px; + /*width: 671px;*/ + padding-bottom: 20px ! ie7; +} +code { + font-family: Consolas, Monaco, Liberation Mono, Lucida Console, Monospace; + font-size: 100%; } - blockquote { - margin-bottom: 10px; - margin-right: 15px; - padding: 10px 0px 1px 10px; - background-color: #F5F5F5; + margin-bottom: 10px; + margin-right: 15px; + padding: 10px 0px 1px 10px; + background-color: #F5F5F5; } - /* http://pathfindersoftware.com/2007/09/developers-note-2/ */ -* html .clearfix, -* html .paginator { - height: 1; - overflow: visible; -} -+ html .clearfix, -+ html .paginator { - min-height: 1%; -} -.clearfix:after, -.paginator:after { - clear: both; - content:"."; - display:block; - height: 0; - visibility: hidden; +* html .clearfix, * html .paginator { + height: 1; + overflow: visible; +} ++ html .clearfix, + html .paginator { + min-height: 1%; +} +.clearfix:after, .paginator:after { + clear: both; + content: "."; + display: block; + height: 0; + visibility: hidden; +} +body.user-messages { + margin-top: 2.4em; } - .badges a { - color: #763333; - text-decoration: underline; + color: #763333; + text-decoration: underline; } - a:hover { - text-decoration: underline; + text-decoration: underline; } - .badge-context-toggle.active { - cursor: pointer; - text-decoration: underline; + cursor: pointer; + text-decoration: underline; } - h1 { - font-size: 160%; - padding: 10px 0 5px 0px; + font-size: 24px; + padding: 10px 0 5px 0px; } - /* ----- Custom positions ----- */ - -.left{float:left} -.right{float:right} -.clean{clear:both} -.center{ - margin: 0 auto; - padding: 0; +.left { + float: left; +} +.right { + float: right; +} +.clean { + clear: both; +} +.center { + margin: 0 auto; + padding: 0; } - - /* ----- Notify message bar , check blocks/system_messages.html ----- */ - .notify { - position: fixed; - top: 0px; - left: 0px; - width: 100%; - z-index: 100; - padding: 0; - text-align: center; - background-color: #f5dd69; - border-top:#fff 1px solid; - - p { - margin-top: 6px; - margin-bottom: 6px; - font-size: 16px; - color:#424242 - } + position: fixed; + top: 0px; + left: 0px; + width: 100%; + z-index: 100; + padding: 0; + text-align: center; + background-color: #f5dd69; + border-top: #fff 1px solid; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.notify p.notification { + margin-top: 6px; + margin-bottom: 6px; + font-size: 16px; + color: #424242; } - #closeNotify { - position: absolute; - right: 5px; - top: 7px; - color: #735005; - text-decoration: none; - line-height: 18px; - .sprites(-6px,-5px); - cursor: pointer; - width:20px; - height:20px; + position: absolute; + right: 5px; + top: 7px; + color: #735005; + text-decoration: none; + line-height: 18px; + background: -6px -5px url(../images/sprites.png) no-repeat; + cursor: pointer; + width: 20px; + height: 20px; } - #closeNotify:hover { - .sprites(-26px,-5px); + background: -26px -5px url(../images/sprites.png) no-repeat; } - /* ----- Header, check blocks/header.html ----- */ - #header { - margin-top: 0px; - background: @header-color; -} - -.content-wrapper {/* wrapper positioning class */ - width: 960px; - margin: auto; - position:relative; -} - -#logo img{ - padding: 5px 0px 5px 0px; -} - -#userToolsNav {/* Navigation bar containing login link or user information, check widgets/user_navigation.html*/ - height: 20px; - position:absolute; - bottom: 0; - right:0px; - padding-bottom:5px; - - a { - height: 35px; - text-align: right; - margin-left: 20px; - text-decoration: underline; - color:#d0e296; - font-size:16px; - } - - a:first-child { - margin-left: 0; - } - - a#ab-responses { - margin-left: 3px; - } - - .user-info,.user-micro-info{ - color:#b5b593; - } - - a img { - vertical-align:middle; - margin-bottom:2px; - } - - .user-info a { - margin: 0; - text-decoration: none; - } + margin-top: 0px; + background: #16160f; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.content-wrapper { + /* wrapper positioning class */ + + width: 960px; + margin: auto; + position: relative; +} +#logo img { + padding: 5px 0px 5px 0px; + height: 75px; + width: auto; + float: left; +} +#userToolsNav { + /* Navigation bar containing login link or user information, check widgets/user_navigation.html*/ + + height: 20px; + position: absolute; + bottom: 0; + right: 0px; + padding-bottom: 5px; +} +#userToolsNav a { + height: 35px; + text-align: right; + margin-left: 20px; + text-decoration: underline; + color: #d0e296; + font-size: 16px; +} +#userToolsNav a:first-child { + margin-left: 0; +} +#userToolsNav a#ab-responses { + margin-left: 3px; +} +#userToolsNav .user-info, #userToolsNav .user-micro-info { + color: #b5b593; +} +#userToolsNav a img { + vertical-align: middle; + margin-bottom: 2px; +} +#userToolsNav .user-info a { + margin: 0; + text-decoration: none; +} +#metaNav { + /* Top Navigation bar containing links for tags, people and badges, check widgets/header.html */ + + float: right; +} +#metaNav a { + color: #e2e2ae; + padding: 0px 0px 0px 35px; + height: 25px; + line-height: 30px; + margin: 5px 0px 0px 10px; + font-size: 18px; + font-weight: 100; + text-decoration: none; + display: block; + float: left; +} +#metaNav a:hover { + text-decoration: underline; +} +#metaNav a.on { + font-weight: bold; + color: #FFF; + text-decoration: none; +} +#metaNav a.special { + font-size: 18px; + color: #B02B2C; + font-weight: bold; + text-decoration: none; +} +#metaNav a.special:hover { + text-decoration: underline; +} +#metaNav #navTags { + background: -50px -5px url(../images/sprites.png) no-repeat; +} +#metaNav #navUsers { + background: -125px -5px url(../images/sprites.png) no-repeat; +} +#metaNav #navBadges { + background: -210px -5px url(../images/sprites.png) no-repeat; +} +#secondaryHeader { + /* Div containing Home button, scope navigation, search form and ask button, check blocks/secondary_header.html */ + + height: 55px; + background: #e9e9e1; + border-bottom: #d3d3c2 1px solid; + border-top: #fcfcfc 1px solid; + margin-bottom: 10px; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +#secondaryHeader #homeButton { + border-right: #afaf9e 1px solid; + background: -6px -36px url(../images/sprites.png) no-repeat; + height: 55px; + width: 43px; + display: block; + float: left; +} +#secondaryHeader #homeButton:hover { + background: -51px -36px url(../images/sprites.png) no-repeat; +} +#secondaryHeader #scopeWrapper { + width: 688px; + float: left; +} +#secondaryHeader #scopeWrapper a { + display: block; + float: left; +} +#secondaryHeader #scopeWrapper .scope-selector { + font-size: 21px; + color: #5a5a4b; + height: 55px; + line-height: 55px; + margin-left: 24px; +} +#secondaryHeader #scopeWrapper .on { + background: url(../images/scopearrow.png) no-repeat center bottom; +} +#secondaryHeader #scopeWrapper .ask-message { + font-size: 24px; +} +#searchBar { + /* Main search form , check widgets/search_bar.html */ + + display: inline-block; + background-color: #fff; + width: 412px; + border: 1px solid #c9c9b5; + float: right; + height: 42px; + margin: 6px 0px 0px 15px; +} +#searchBar .searchInput, +#searchBar .searchInputCancelable, +#searchBar .searchInputAuth, +#searchBar .searchInputCancelableAuth { + font-size: 30px; + height: 40px; + font-weight: 300; + background: #FFF; + border: 0px; + color: #484848; + padding-left: 10px; + font-family: Arial; + vertical-align: middle; +} +#searchBar .searchInput, #searchBar .searchInputCancelable { + width: 352px; +} +#searchBar .searchInputCancelable { + width: 317px; +} +#searchBar .searchInputAuth { + width: 340px; +} +#searchBar .searchInputCancelableAuth { + width: 310px; + /*FIXME byron */ + +} +#searchBar .logoutsearch { + width: 337px; +} +#searchBar .searchBtn { + font-size: 10px; + color: #666; + background-color: #eee; + height: 42px; + border: #FFF 1px solid; + line-height: 22px; + text-align: center; + float: right; + margin: 0px; + width: 48px; + background: -98px -36px url(../images/sprites.png) no-repeat; + cursor: pointer; +} +#searchBar .searchBtn:hover { + background: -146px -36px url(../images/sprites.png) no-repeat; +} +#searchBar .cancelSearchBtn { + font-size: 30px; + color: #ce8888; + background: #fff; + height: 42px; + border: 0px; + border-left: #deded0 1px solid; + text-align: center; + width: 35px; + cursor: pointer; +} +#searchBar .cancelSearchBtn:hover { + color: #d84040; +} +#askButton { + /* check blocks/secondary_header.html and widgets/ask_button.html*/ + + background: url(../images/bigbutton.png) repeat-x bottom; + line-height: 44px; + text-align: center; + width: 200px; + height: 42px; + font-size: 23px; + color: #4a757f; + margin-top: 7px; + float: right; + text-transform: uppercase; + border-radius: 5px; + -ms-border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -khtml-border-radius: 5px; + -webkit-box-shadow: 1px 1px 2px #636363; + -moz-box-shadow: 1px 1px 2px #636363; + box-shadow: 1px 1px 2px #636363; +} +#askButton:hover { + text-decoration: none; + background: url(../images/bigbutton.png) repeat-x top; + text-shadow: 0px 1px 0px #c6d9dd; + -moz-text-shadow: 0px 1px 0px #c6d9dd; + -webkit-text-shadow: 0px 1px 0px #c6d9dd; } - -#metaNav {/* Top Navigation bar containing links for tags, people and badges, check widgets/header.html */ - float:right; - - a { - color: #e2e2ae; - padding: 0px 0px 0px 35px; - height: 25px; - line-height: 30px; - margin:5px 0px 0px 10px; - font-size: 18px; - font-weight: 100; - text-decoration: none; - display: block; - float: left; - } - - a:hover { - text-decoration: underline; - } - - a.on { - font-weight:bold; - color: #FFF; - text-decoration: none; - } - - a.special { - font-size: 18px; - color: #B02B2C; - font-weight: bold; - text-decoration: none; - } - - a.special:hover { - text-decoration: underline; - } - - #navTags{ - .sprites(-50px,-5px) - } - - #navUsers{ - .sprites(-125px,-5px) - } - - #navBadges{ - .sprites(-210px,-5px) - } -} - -#secondaryHeader{ /* Div containing Home button, scope navigation, search form and ask button, check blocks/secondary_header.html */ - height:55px; - background:#e9e9e1; - border-bottom:#d3d3c2 1px solid; - border-top:#fcfcfc 1px solid; - margin-bottom:10px; - - #homeButton{ - border-right:#afaf9e 1px solid; - .sprites(-6px,-36px); - height:55px; - width:43px; - display:block; - float:left; - } - - #homeButton:hover{ - .sprites(-6px-45,-36px); - } - - #scopeWrapper{ - width:688px; - float:left; - - a{ - display:block; - float:left; - } - - .scope-selector{ - font-size:21px; - color:#5a5a4b; - height:55px; - line-height:55px; - margin-left:24px - } - .on{ - background:url(../images/scopearrow.png) no-repeat center bottom; - } - - .ask-message{ - font-size:24px; - } - } -} - -#searchBar { /* Main search form , check widgets/search_bar.html */ - display:inline-block; - background-color: #fff; - width:412px; - border: 1px solid #c9c9b5; - float:right; - height:42px; - margin:6px 0px 0px 15px; - - .searchInput, .searchInputCancelable { - font-size: 30px; - height: 40px; - font-weight:300; - background:#FFF; - border:0px; - color:#484848; - padding-left:10px; - font-family:@body-font; - vertical-align: middle; - } - - .searchInput, .searchInputCancelable { - width: 352px; - } - - .searchInputCancelable { - width: 317px; - } - .logoutsearch { - width: 337px; - } - - .searchBtn { - font-size: 10px; - color: #666; - background-color: #eee; - height: 42px; - border:#FFF 1px solid; - line-height: 22px; - text-align: center; - float:right; - margin: 0px; - width:48px; - .sprites(-98px,-36px); - cursor:pointer; - } - - .searchBtn:hover { - .sprites(-98px-48,-36px); - } - - .cancelSearchBtn { - font-size: 30px; - color: #ce8888; - background:#fff; - height: 42px; - border:0px; - border-left:#deded0 1px solid; - text-align: center; - width: 35px; - cursor:pointer; - } - - .cancelSearchBtn:hover { - color: #d84040; - } -} - -#askButton{ /* check blocks/secondary_header.html and widgets/ask_button.html*/ - background: url(../images/bigbutton.png) repeat-x bottom; - line-height:44px; - text-align:center; - width:200px; - height:42px; - font-size:23px; - color:@button-label; - margin-top:7px; - float:right; - text-transform:uppercase; - .rounded-corners(5px); - .box-shadow(1px, 1px, 2px, #636363) -} - -#askButton:hover{ - text-decoration:none; - background: url(../images/bigbutton.png) repeat-x top; - .text-shadow(0px, 1px, 0px, #c6d9dd) -} - /* ----- Content layout, check two_column_body.html or one_column_body.html ----- */ - #ContentLeft { - width: 730px; - float: left; - position: relative; - padding-bottom:10px; + width: 730px; + float: left; + position: relative; + padding-bottom: 10px; } - #ContentRight { - width: 200px; - float: right; - padding: 0 0px 10px 0px; + width: 200px; + float: right; + padding: 0 0px 10px 0px; } - #ContentFull { - float: left; - width: 950px; + float: left; + width: 960px; } - /* ----- Sidebar Widgets Box, check main_page/sidebar.html or question/sidebar.html ----- */ - .box { - background: #fff; - padding: 4px 0px 10px 0px; - width:200px; - - p { - margin-bottom: 4px; - } - - p.info-box-follow-up-links { - text-align: right; - margin: 0; - } - - h2 { - padding-left: 0; - background:#eceeeb; - height:30px; - line-height:30px; - text-align:right; - font-size:24px; - font-weight:normal; - color:#656565; - padding-right:10px; - margin-bottom:10px; - } - h3{ - color:#4a757f; - font-size:18px; - text-align:left; - font-weight:normal; - } - .contributorback{ - background: #eceeeb url(../images/contributorsback.png) no-repeat center left; - } - - label { - color: @info-text; - font-size:15px; - display: block; - float: right; - width: 172px; - } - - ul { - margin-left: 22px; - } - - li { - list-style-type: disc; - font-size: 16px; - line-height: 20px; - margin-bottom: 10px; - color:@info-text; - } - ul.tags { - list-style: none; - margin: 0; - padding: 0; - line-height: 170%; - display: block; - } - #displayTagFilterControl p label{ - color:@info-text; - font-size:15px; - } - - .inputs{ - #interestingTagInput, #ignoredTagInput{ - width:159px; - border:#c9c9b5 1px solid; - height:25px; - } - #interestingTagAdd, #ignoredTagAdd{ - background:url(../images/small-button-blue.png) repeat-x top; - border:0; - color:@button-label; - font-weight:bold; - font-size:12px; - width:33px; - height:27px; - margin-top:-2px; - cursor:pointer; - .rounded-corners(4px); - .text-shadow(0px,1px,0px,#E6F6FA); - .box-shadow(1px, 1px, 2px, #808080) - - } - #interestingTagAdd:hover, #ignoredTagAdd:hover{ - background:url(../images/small-button-blue.png) repeat-x bottom; - } - } - - img.gravatar { - margin:1px; - } - -/* widgets for question template */ - - a.followed, a.follow{ - background: url(../images/medium-button.png) top repeat-x; - height:34px; - line-height:34px; - text-align:center; - border:0; - font-family:@main-font; - color:@button-label; - font-weight:normal; - font-size:21px; - margin-top:3px; - display:block; - width:120px; - text-decoration:none; - .rounded-corners(4px); - .box-shadow(1px, 1px, 2px, #636363); - .center; - } - - a.followed:hover, a.follow:hover{ - text-decoration:none; - background: url(../images/medium-button.png) bottom repeat-x; - .text-shadow(0px, 1px, 0px, #c6d9dd); - } - - a.followed div.unfollow{ - display:none; - } - - a.followed:hover div{ - display:none; - } - a.followed:hover div.unfollow{ - display:inline; - color:#a05736; - } - - .favorite-number { - padding: 5px 0 0 5px; - font-size: 100%; - font-family: Arial; - font-weight: bold; - color: #777; - text-align:center; - } -} - -.statsWidget p{ - color:@info-text; - font-size:16px; - border-bottom:#cccccc 1px solid; - - strong{ - float:right; - padding-right:10px; - } + background: #fff; + padding: 4px 0px 10px 0px; + width: 200px; + /* widgets for question template */ + +} +.box p { + margin-bottom: 4px; +} +.box p.info-box-follow-up-links { + text-align: right; + margin: 0; +} +.box h2 { + padding-left: 0; + background: #eceeeb; + height: 30px; + line-height: 30px; + text-align: right; + font-size: 18px !important; + font-weight: normal; + color: #656565; + padding-right: 10px; + margin-bottom: 10px; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.box h3 { + color: #4a757f; + font-size: 18px; + text-align: left; + font-weight: normal; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.box .contributorback { + background: #eceeeb url(../images/contributorsback.png) no-repeat center left; +} +.box label { + color: #707070; + font-size: 15px; + display: block; + float: right; + width: 177px; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.box ul { + margin-left: 22px; +} +.box li { + list-style-type: disc; + font-size: 13px; + line-height: 20px; + margin-bottom: 10px; + color: #707070; +} +.box ul.tags { + list-style: none; + margin: 0; + padding: 0; + line-height: 170%; + display: block; +} +.box #displayTagFilterControl p label { + color: #707070; + font-size: 15px; +} +.box .inputs #interestingTagInput, .box .inputs #ignoredTagInput { + width: 158px; + border: #c9c9b5 1px solid; + height: 25px; +} +.box .inputs #interestingTagAdd, .box .inputs #ignoredTagAdd { + background: url(../images/small-button-blue.png) repeat-x top; + border: 0; + color: #4a757f; + font-weight: bold; + font-size: 12px; + width: 30px; + height: 27px; + margin-top: -2px; + cursor: pointer; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + text-shadow: 0px 1px 0px #e6f6fa; + -moz-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-box-shadow: 1px 1px 2px #808080; + -moz-box-shadow: 1px 1px 2px #808080; + box-shadow: 1px 1px 2px #808080; +} +.box .inputs #interestingTagAdd:hover, .box .inputs #ignoredTagAdd:hover { + background: url(../images/small-button-blue.png) repeat-x bottom; +} +.box img.gravatar { + margin: 1px; +} +.box a.followed, .box a.follow { + background: url(../images/medium-button.png) top repeat-x; + height: 34px; + line-height: 34px; + text-align: center; + border: 0; + font-family: 'Yanone Kaffeesatz', sans-serif; + color: #4a757f; + font-weight: normal; + font-size: 21px; + margin-top: 3px; + display: block; + width: 120px; + text-decoration: none; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + -webkit-box-shadow: 1px 1px 2px #636363; + -moz-box-shadow: 1px 1px 2px #636363; + box-shadow: 1px 1px 2px #636363; + margin: 0 auto; + padding: 0; +} +.box a.followed:hover, .box a.follow:hover { + text-decoration: none; + background: url(../images/medium-button.png) bottom repeat-x; + text-shadow: 0px 1px 0px #c6d9dd; + -moz-text-shadow: 0px 1px 0px #c6d9dd; + -webkit-text-shadow: 0px 1px 0px #c6d9dd; +} +.box a.followed div.unfollow { + display: none; +} +.box a.followed:hover div { + display: none; +} +.box a.followed:hover div.unfollow { + display: inline; + color: #a05736; +} +.box .favorite-number { + padding: 5px 0 0 5px; + font-size: 100%; + font-family: Arial; + font-weight: bold; + color: #777; + text-align: center; +} +.statsWidget p { + color: #707070; + font-size: 16px; + border-bottom: #cccccc 1px solid; + font-size: 13px; +} +.statsWidget p strong { + float: right; + padding-right: 10px; } .questions-related { - word-wrap: break-word; - - p { - line-height: 20px; - padding: 4px 0px 4px 0px; - font-size: 16px; - font-weight:normal; - border-bottom:#cccccc 1px solid; - } + word-wrap: break-word; +} +.questions-related p { + line-height: 20px; + padding: 4px 0px 4px 0px; + font-size: 16px; + font-weight: normal; + border-bottom: #cccccc 1px solid; +} +.questions-related a { + font-size: 13px; } /* tips and markdown help are widgets for ask template */ - -#tips{ - li{ - color:@info-text; - font-size:16px; - list-style-image: url(../images/tips.png); - } - a{ - font-size:16px; - } +#tips li { + color: #707070; + font-size: 13px; + list-style-image: url(../images/tips.png); } - -#markdownHelp{ - li{ - color:@info-text; - font-size:16px; - } - a{ - font-size:16px; - } +#tips a { + font-size: 16px; +} +#markdownHelp li { + color: #707070; + font-size: 13px; +} +#markdownHelp a { + font-size: 16px; } - - /* ----- Sorting top Tab, check main_page/tab_bar.html ------*/ - .tabBar { - background-color: #eff5f6; - height: 30px; - width: 336px; - margin-bottom: 3px; - margin-top: 3px; - float:right; - font-family:@sort-font; - font-size:16px; - .rounded-corners(5px); + background-color: #eff5f6; + height: 30px; + margin-bottom: 3px; + margin-top: 3px; + float: right; + font-family: Georgia, serif; + font-size: 16px; + border-radius: 5px; + -ms-border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -khtml-border-radius: 5px; } - .tabBar h2 { - float: left; + float: left; } - .tabsA, .tabsC { - float: right; - position: relative; - display: block; - height: 20px; + float: right; + position: relative; + display: block; + height: 20px; } - /* tabsA - used for sorting */ -.tabsA { float: right; } -.tabsC { float: left; } - -.tabsA a, .tabsC a{ - - border-left: 1px solid #d0e1e4; - color: @section-title; - display: block; - float: left; - height: 20px; - line-height: 20px; - padding:4px 7px 4px 7px; - text-decoration: none; -} - -.tabsA a.on, .tabsC a.on, .tabsA a:hover, .tabsC a:hover { - color: @button-label; -} - -.tabsA a.rev.on, tabsA a.rev.on:hover { +.tabsA { + float: right; +} +.tabsC { + float: left; +} +.tabsA a, .tabsC a { + border-left: 1px solid #d0e1e4; + color: #7ea9b3; + display: block; + float: left; + height: 20px; + line-height: 20px; + padding: 4px 7px 4px 7px; + text-decoration: none; +} +.tabsA a.on, +.tabsC a.on, +.tabsA a:hover, +.tabsC a:hover { + color: #4a757f; } - .tabsA .label, .tabsC .label { - float: left; - color: #646464; - margin-top:4px; - margin-right:5px; + float: left; + color: #646464; + margin-top: 4px; + margin-right: 5px; } - .tabsB a { - background: #eee; - border: 1px solid #eee; - color: #777; - display: block; - float: left; - height: 22px; - line-height: 28px; - margin: 5px 0px 0 4px; - padding: 0 11px 0 11px; - text-decoration: none; + background: #eee; + border: 1px solid #eee; + color: #777; + display: block; + float: left; + height: 22px; + line-height: 28px; + margin: 5px 0px 0 4px; + padding: 0 11px 0 11px; + text-decoration: none; } - .rss { - float: right; - font-size: 16px; - color: #f57900; - margin: 5px 0px 3px 7px; - width:52px; - padding-left: 16px; - padding-top:3px; - background:#fff url(../images/feed-icon-small.png) no-repeat center right; - float:right; - font-family:@sort-font; - font-size:16px; + float: right; + font-size: 16px; + color: #f57900; + margin: 5px 0px 3px 7px; + width: 52px; + padding-left: 16px; + padding-top: 3px; + background: #ffffff url(../images/feed-icon-small.png) no-repeat center right; + float: right; + font-family: Georgia, serif; + font-size: 16px; } - .rss:hover { - color: #F4A731 !important; + color: #F4A731 !important; } - /* ----- Headline, containing number of questions and tags selected, check main_page/headline.html ----- */ - -#questionCount{ - font-weight:bold; - font-size:23px; - color:@section-title; - width:200px; - float:left; - margin-bottom:8px; - padding-top:6px; -} - -#listSearchTags{ - float:left; - margin-top:3px; - color:@info-text; - font-size:16px; +#questionCount { + font-weight: bold; + font-size: 23px; + color: #7ea9b3; + width: 200px; + float: left; + margin-bottom: 8px; + padding-top: 6px; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +#listSearchTags { + float: left; + margin-top: 3px; + color: #707070; + font-size: 16px; + font-family: 'Yanone Kaffeesatz', sans-serif; } - ul#searchTags { - margin-left:10px; - float:right; - padding-top:2px; + margin-left: 10px; + float: right; + padding-top: 2px; } - .search-tips { - font-size:16px; - line-height:17px; - color: @info-text; - margin:5px 0 10px 0; - padding:0px; - float:left; - - a { - text-decoration: underline; - color: @link; - } + font-size: 16px; + line-height: 17px; + color: #707070; + margin: 5px 0 10px 0; + padding: 0px; + float: left; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.search-tips a { + text-decoration: underline; + color: #1b79bd; } - /* ----- Question list , check main_page/content.html and macros/macros.html----- */ - #question-list { - float: left; - position: relative; - background-color: #FFF; - padding: 0; - width: 100%; + float: left; + position: relative; + background-color: #FFF; + padding: 0; + width: 100%; } - .short-summary { - position: relative; - filter: inherit; - padding: 10px; - border-bottom: 1px solid #DDDBCE; - margin-bottom:1px; - overflow: hidden; - width: 710px; - float: left; - background: url(../images/summary-background.png) repeat-x; - - h2 { - font-size: 24px; - font-weight:normal; - line-height: 26px; - padding-left: 0; - margin-bottom:8px; - display:block; - } - - a { - color:@question-link; - } - - .userinfo { - text-align:right; - line-height:16px; - font-family:@body-font; - padding-right:4px; - } - - - .userinfo .relativetime, span.anonymous - { - font-size: 11px; - clear:both; - font-weight: normal; - color: #555; - } - - .userinfo a{ - font-weight:bold; - font-size:11px; - } - - .counts { - float: right; - margin: 4px 0 0 5px; - } - - .counts .item-count { - padding:0px 5px 0px 5px; - font-size: 25px; - font-family:@main-font; - } - - .counts .votes div, - .counts .views div, - .counts .answers div, - .counts .favorites div - { - margin-top:3px; - font-size: 14px; - line-height:14px; - color: #646464; - } - - .tags { - margin-top: 0; - } - - .votes, .answers, .favorites, .views { - text-align: center; - margin: 0 3px; - padding: 8px 2px 0px 2px; - width: 51px; - float: right; - height:44px; - border:#dbdbd4 1px solid; - } - - .votes{ - background: url(../images/vote-background.png) repeat-x; - } - - .answers{ - background:url(../images/answers-background.png) repeat-x; - } - - .views { - background:url(../images/view-background.png) repeat-x; - } - - .no-votes .item-count { - color: #b1b5b6; - } - .some-votes .item-count { - color: #4a757f; - } - - .no-answers .item-count { - color: #b1b5b6; - } - .some-answers .item-count { - color: #eab243; - } - - .no-views .item-count { - color: #b1b5b6; - } - .some-views .item-count { - color: #d33f00; - } - - .accepted .item-count { - background:url(../images/accept.png) no-repeat top right; - display: block; - text-align: center; - width: 40px; - color: #eab243; - } - - .some-favorites .item-count { - background:#338333; - color:#d0f5a9; - } - .no-favorites .item-count { - background: #eab243; - color: yellow; - } - + position: relative; + filter: inherit; + padding: 10px; + border-bottom: 1px solid #DDDBCE; + margin-bottom: 1px; + overflow: hidden; + width: 710px; + float: left; + background: url(../images/summary-background.png) repeat-x; +} +.short-summary h2 { + font-size: 24px; + font-weight: normal; + line-height: 26px; + padding-left: 0; + margin-bottom: 8px; + display: block; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.short-summary a { + color: #464646; +} +.short-summary .userinfo { + text-align: right; + line-height: 16px; + font-family: Arial; + padding-right: 4px; +} +.short-summary .userinfo .relativetime, .short-summary span.anonymous { + font-size: 11px; + clear: both; + font-weight: normal; + color: #555; +} +.short-summary .userinfo a { + font-weight: bold; + font-size: 11px; +} +.short-summary .counts { + float: right; + margin: 4px 0 0 5px; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.short-summary .counts .item-count { + padding: 0px 5px 0px 5px; + font-size: 25px; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.short-summary .counts .votes div, +.short-summary .counts .views div, +.short-summary .counts .answers div, +.short-summary .counts .favorites div { + margin-top: 3px; + font-size: 14px; + line-height: 14px; + color: #646464; +} +.short-summary .tags { + margin-top: 0; +} +.short-summary .votes, +.short-summary .answers, +.short-summary .favorites, +.short-summary .views { + text-align: center; + margin: 0 3px; + padding: 8px 2px 0px 2px; + width: 51px; + float: right; + height: 44px; + border: #dbdbd4 1px solid; +} +.short-summary .votes { + background: url(../images/vote-background.png) repeat-x; +} +.short-summary .answers { + background: url(../images/answers-background.png) repeat-x; +} +.short-summary .views { + background: url(../images/view-background.png) repeat-x; +} +.short-summary .no-votes .item-count { + color: #b1b5b6; +} +.short-summary .some-votes .item-count { + color: #4a757f; +} +.short-summary .no-answers .item-count { + color: #b1b5b6; +} +.short-summary .some-answers .item-count { + color: #eab243; +} +.short-summary .no-views .item-count { + color: #b1b5b6; +} +.short-summary .some-views .item-count { + color: #d33f00; +} +.short-summary .accepted .item-count { + background: url(../images/accept.png) no-repeat top right; + display: block; + text-align: center; + width: 40px; + color: #eab243; +} +.short-summary .some-favorites .item-count { + background: #338333; + color: #d0f5a9; +} +.short-summary .no-favorites .item-count { + background: #eab243; + color: yellow; } - /* ----- Question list Paginator , check main_content/pager.html and macros/utils_macros.html----- */ - .evenMore { - font-size: 16px; - color:@info-text; - padding:15px 0px 10px 0px; - clear:both; + font-size: 13px; + color: #707070; + padding: 15px 0px 10px 0px; + clear: both; } - .evenMore a { - text-decoration: underline; - color:@link; + text-decoration: underline; + color: #1b79bd; } - .pager { - margin-top: 10px; - margin-bottom: 16px; + margin-top: 10px; + margin-bottom: 16px; } - .pagesize { - margin-top: 10px; - margin-bottom: 16px; - float: right; + margin-top: 10px; + margin-bottom: 16px; + float: right; } - .paginator { - padding: 5px 0 10px 0; - font-size:16px; - - .prev a, .prev a:visited, - .next a, .next a:visited { - background-color: #fff; - color: #777; - padding: 2px 4px 3px 4px; - font-family:@main-font; - } - a{ - color:@section-title; - } - .prev { - margin-right: .5em; - } - - .next { - margin-left: .5em; - } - - .page a, .page a:visited, .curr { - padding: .25em; - background-color: #fff; - margin: 0em .25em; - color: #ff; - } - - .curr { - background-color: #8ebcc7; - color: #fff; - font-weight: bold; - } - .next a, .prev a{ - color:@section-title - } - .page a:hover, - .curr a:hover, - .prev a:hover, - .next a:hover { - color: #8C8C8C; - background-color: #E1E1E1; - text-decoration: none; - } - - .text { - color: #777; - padding: .3em; - } - - .paginator-container-left { - padding: 5px 0 10px 0; - } - + padding: 5px 0 10px 0; + font-size: 13px; +} +.paginator .prev a, +.paginator .prev a:visited, +.paginator .next a, +.paginator .next a:visited { + background-color: #fff; + color: #777; + padding: 2px 4px 3px 4px; +} +.paginator a { + color: #7ea9b3; +} +.paginator .prev { + margin-right: .5em; +} +.paginator .next { + margin-left: .5em; +} +.paginator .page a, .paginator .page a:visited, .paginator .curr { + padding: .25em; + background-color: #fff; + margin: 0em .25em; + color: #ff; +} +.paginator .curr { + background-color: #8ebcc7; + color: #fff; + font-weight: bold; +} +.paginator .next a, .paginator .prev a { + color: #7ea9b3; +} +.paginator .page a:hover, +.paginator .curr a:hover, +.paginator .prev a:hover, +.paginator .next a:hover { + color: #8C8C8C; + background-color: #E1E1E1; + text-decoration: none; +} +.paginator .text { + color: #777; + padding: .3em; +} +.paginator .paginator-container-left { + padding: 5px 0 10px 0; } - /* ----- Tags Styles ----- */ - /* tag formatting is also copy-pasted in template because it must be the same in the emails askbot/models/__init__.py:format_instant_notification_email() */ - /* tag cloud */ - .tag-size-1 { - font-size:12px; + font-size: 12px; } .tag-size-2 { - font-size:13px; + font-size: 13px; } .tag-size-3 { - font-size:14px; + font-size: 14px; } .tag-size-4 { - font-size:15px; + font-size: 15px; } .tag-size-5 { - font-size:16px; + font-size: 16px; } .tag-size-6 { - font-size:17px; + font-size: 17px; } .tag-size-7 { - font-size:18px; + font-size: 18px; } .tag-size-8 { - font-size:19px; + font-size: 19px; } .tag-size-9 { - font-size:20px; + font-size: 20px; } .tag-size-10 { - font-size:21px; + font-size: 21px; } - -ul.tags, -ul.tags.marked-tags, -ul#related-tags { - list-style: none; - margin: 0; - padding: 0; - line-height: 170%; - display: block; +ul.tags, ul.tags.marked-tags, ul#related-tags { + list-style: none; + margin: 0; + padding: 0; + line-height: 170%; + display: block; } - ul.tags li { - float:left; - display: block; - margin: 0 5px 0 0; - padding: 0; - height:20px; + float: left; + display: block; + margin: 0 5px 0 0; + padding: 0; + height: 20px; } - .wildcard-tags { - clear: both; + clear: both; } - -ul.tags.marked-tags li, -.wildcard-tags ul.tags li { - margin-bottom: 5px; +ul.tags.marked-tags li, .wildcard-tags ul.tags li { + margin-bottom: 5px; } - #tagSelector div.inputs { - clear: both; - float: none; - margin-bottom:10px; + clear: both; + float: none; + margin-bottom: 10px; } - -.tags-page ul.tags li, -ul#ab-user-tags li { - width: 160px; - margin:5px; +.tags-page ul.tags li, ul#ab-user-tags li { + width: 160px; + margin: 5px; } - ul#related-tags li { - margin: 0 5px 5px 0; - float: left; - clear: left; + margin: 0 5px 5px 0; + float: left; + clear: left; } - /* .tag-left and .tag-right are for the sliding doors decoration of tags */ - .tag-left { - background: url(../images/tag-right.png) no-repeat right center; - border: none; - cursor: pointer; - display: block; - float: left; - height: 20px; - margin: 0 5px 0 0; - padding: 0; + background: url(../images/tag-right.png) no-repeat right center; + border: none; + cursor: pointer; + display: block; + float: left; + height: 20px; + margin: 0 5px 0 0; + padding: 0; } - .tag-right { - background:url(../images/tag-left.png) no-repeat left center; - border: none; - display: block; - float: left; - height: 20px; - line-height: 20px; - font-weight: normal; - font-size: 11px; - padding: 0px 10px 0px 15px; - text-decoration: none; - text-align: center; - white-space: nowrap; - vertical-align: middle; - font-family:@body-font; - color:#717179; + background: url(../images/tag-left.png) no-repeat left center; + border: none; + display: block; + float: left; + height: 20px; + line-height: 20px; + font-weight: normal; + font-size: 11px; + padding: 0px 10px 0px 15px; + text-decoration: none; + text-align: center; + white-space: nowrap; + vertical-align: middle; + font-family: Arial; + color: #717179; } .deletable-tag { - margin-right: 3px; - white-space: nowrap; + margin-right: 3px; + white-space: nowrap; } - .deletable-tag .tag-right { - padding-right: 0px; - float: left; + padding-right: 0px; + float: left; } .deletable-tag.tag-left { - padding-right: 0px; + padding-right: 0px; } - -.tags a.tag-right, -.tags span.tag-right { - color: #585858; - text-decoration: none; - +.tags a.tag-right, .tags span.tag-right { + color: #585858; + text-decoration: none; } -.tags a:hover{ - color: #1A1A1A; +.tags a:hover { + color: #1A1A1A; } - .users-page h1, .tags-page h1 { - float: left; + float: left; } - .main-page h1 { - margin-right: 5px; + margin-right: 5px; } - span.delete-icon { - padding-left: 13px; - vertical-align: bottom; - background: url(../images/close-small-dark.png) bottom no-repeat; - cursor: default; + padding-left: 13px; + vertical-align: bottom; + background: url(../images/close-small-dark.png) bottom no-repeat; + cursor: default; } span.delete-icon:hover { - background: url(../images/close-small-dark.png) top no-repeat; + background: url(../images/close-small-dark.png) top no-repeat; } - .tags span.delete-icon { - float: left; - height: 20px; - width:8px; - margin: 0px 0 0 10px; - display: block; + float: left; + height: 20px; + width: 8px; + margin: 0px 0 0 10px; + display: block; } - .tag-number { - font-weight: normal; - float: left; - font-size:16px; - color:#5d5d5d; + font-weight: normal; + float: left; + font-size: 16px; + color: #5d5d5d; } - .badges .tag-number { - float: none; - display: inline; - padding-right: 15px; + float: none; + display: inline; + padding-right: 15px; } - /* ----- Ask and Edit Question Form template----- */ - -.section-title{ - color:@section-title; - font-family:@main-font; - font-weight:bold; - font-size:24px; +.section-title { + color: #7ea9b3; + font-family: 'Yanone Kaffeesatz', sans-serif; + font-weight: bold; + font-size: 24px; } - .ask-body { - padding-right: 10px; + padding-right: 10px; } - -#fmask{ - margin-bottom:30px; - width:100%; +#fmask { + margin-bottom: 30px; + width: 100%; } - #askFormBar { - display:inline-block; - padding: 4px 7px 5px 0px; - margin-top:0px; - - p{ - margin:0 0 5px 0; - font-size:16px; - color:@info-text-dark; - line-height:1.2; - } - .questionTitleInput { - font-size: 24px; - line-height: 24px; - height: 36px; - margin: 0px; - padding: 0px 0 0 5px; - border:#cce6ec 3px solid; - width:725px; - } -} - -.ask-page, .edit-question-page{ - - div#question-list { - float: none; - border-bottom:#f0f0ec 1px solid; - float:left; - margin-bottom:10px; - - } - - div#question-list h2 { - font-size: 16px; - padding-bottom: 0; - color:@link; - border-top:#f0f0ec 1px solid; - border-left:#f0f0ec 1px solid; - height:30px; - line-height:30px; - font-weight:normal; - } - - div#question-list span { - width:28px; - height:26px; - line-height:26px; - text-align:center; - margin-right: 10px; - float:left; - display:block; - color:#fff; - background: #b8d0d5; - .rounded-corners(3px); - } - label{ - color:@info-text-dark; - font-size:15px; - } - - #id_tags{ - border:#cce6ec 3px solid; - height:25px; - padding-left:5px; - width:395px; - font-size:14px; - } + display: inline-block; + padding: 4px 7px 5px 0px; + margin-top: 0px; +} +#askFormBar p { + margin: 0 0 5px 0; + font-size: 14px; + color: #525252; + line-height: 1.4; +} +#askFormBar .questionTitleInput { + font-size: 24px; + line-height: 24px; + height: 36px; + margin: 0px; + padding: 0px 0 0 5px; + border: #cce6ec 3px solid; + width: 725px; +} +.ask-page div#question-list, .edit-question-page div#question-list { + float: none; + border-bottom: #f0f0ec 1px solid; + float: left; + margin-bottom: 10px; +} +.ask-page div#question-list a, .edit-question-page div#question-list a { + line-height: 30px; +} +.ask-page div#question-list h2, .edit-question-page div#question-list h2 { + font-size: 13px; + padding-bottom: 0; + color: #1b79bd; + border-top: #f0f0ec 1px solid; + border-left: #f0f0ec 1px solid; + height: 30px; + line-height: 30px; + font-weight: normal; +} +.ask-page div#question-list span, .edit-question-page div#question-list span { + width: 28px; + height: 26px; + line-height: 26px; + text-align: center; + margin-right: 10px; + float: left; + display: block; + color: #fff; + background: #b8d0d5; + border-radius: 3px; + -ms-border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + -khtml-border-radius: 3px; +} +.ask-page label, .edit-question-page label { + color: #525252; + font-size: 13px; +} +.ask-page #id_tags, .edit-question-page #id_tags { + border: #cce6ec 3px solid; + height: 25px; + padding-left: 5px; + width: 395px; + font-size: 14px; } - .title-desc { - color: @info-text; - font-size: 15px; -} - -#fmanswer input.submit, -.ask-page input.submit, -.edit-question-page input.submit { - float: left; - background: url(../images/medium-button.png) top repeat-x; - height:34px; - border:0; - font-family:@main-font; - color:@button-label; - font-weight:normal; - font-size:21px; - margin-top:3px; - .rounded-corners(4px); - .box-shadow(1px, 1px, 2px, #636363); - margin-right:7px; + color: #707070; + font-size: 13px; +} +#fmanswer input.submit, .ask-page input.submit, .edit-question-page input.submit { + float: left; + background: url(../images/medium-button.png) top repeat-x; + height: 34px; + border: 0; + font-family: 'Yanone Kaffeesatz', sans-serif; + color: #4a757f; + font-weight: normal; + font-size: 21px; + margin-top: 3px; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + -webkit-box-shadow: 1px 1px 2px #636363; + -moz-box-shadow: 1px 1px 2px #636363; + box-shadow: 1px 1px 2px #636363; + margin-right: 7px; +} +#fmanswer input.submit:hover, .ask-page input.submit:hover, .edit-question-page input.submit:hover { + text-decoration: none; + background: url(../images/medium-button.png) bottom repeat-x; + text-shadow: 0px 1px 0px #c6d9dd; + -moz-text-shadow: 0px 1px 0px #c6d9dd; + -webkit-text-shadow: 0px 1px 0px #c6d9dd; +} +#editor { + /*adjustment for editor preview*/ + + font-size: 100%; + min-height: 200px; + line-height: 18px; + margin: 0; + border-left: #cce6ec 3px solid; + border-bottom: #cce6ec 3px solid; + border-right: #cce6ec 3px solid; + border-top: 0; + padding: 10px; + margin-bottom: 10px; + width: 710px; } - -#fmanswer input.submit:hover, -.ask-page input.submit:hover, -.edit-question-page input.submit:hover{ - text-decoration:none; - background: url(../images/medium-button.png) bottom repeat-x; - .text-shadow(0px, 1px, 0px, #c6d9dd) -} -#editor { /*adjustment for editor preview*/ - font-size: 100%; - min-height: 200px; - line-height: 18px; - margin:0; - border-left:#cce6ec 3px solid; - border-bottom:#cce6ec 3px solid; - border-right:#cce6ec 3px solid; - border-top:0; - padding:10px; - margin-bottom:10px; - width:710px; -} - #id_title { - width: 100%; + width: 100%; } - .wmd-preview { - margin: 3px 0 5px 0; - padding: 6px; - background-color: #F5F5F5; - min-height: 20px; - overflow: auto; - font-size:13px; - font-family:@body-font; - - p{ - margin-bottom:14px; - line-height:1.4; - font-size:14px; - } + margin: 3px 0 5px 0; + padding: 6px; + background-color: #F5F5F5; + min-height: 20px; + overflow: auto; + font-size: 13px; + font-family: Arial; +} +.wmd-preview p { + margin-bottom: 14px; + line-height: 1.4; + font-size: 14px; } - .wmd-preview pre { - background-color: #E7F1F8; - + background-color: #E7F1F8; } - .wmd-preview blockquote { - background-color: #eee; + background-color: #eee; } - .wmd-preview IMG { - max-width: 600px; + max-width: 600px; } - .preview-toggle { - width: 100%; - color: #b6a475; /*letter-spacing:1px;*/ - text-align: left; -} + width: 100%; + color: #b6a475; + /*letter-spacing:1px;*/ + text-align: left; +} .preview-toggle span:hover { - cursor: pointer; + cursor: pointer; } - .after-editor { - margin-top: 10px; + margin-top: 10px; } - .checkbox { - margin-left:5px; - font-weight:normal; - cursor:help + margin-left: 5px; + font-weight: normal; + cursor: help; } - .question-options { - margin-top: 1px; - color: #666; - line-height: 13px; - margin-bottom:5px; + margin-top: 1px; + color: #666; + line-height: 13px; + margin-bottom: 5px; } .question-options label { - vertical-align: text-bottom; + vertical-align: text-bottom; } - .edit-content-html { - border-top: 1px dotted #D8D2A9; - border-bottom: 1px dotted #D8D2A9; - margin: 5px 0 5px 0; -} - -.edit-question-page{ - #id_revision{ - font-size:14px; - margin-top:10px; - } - #id_title{ - font-size: 24px; - line-height: 24px; - height: 36px; - margin: 0px; - padding: 0px 0 0 5px; - border:#cce6ec 3px solid; - width:725px; - margin-bottom:10px; - } - #id_summary{ - border:#cce6ec 3px solid; - height:25px; - padding-left:5px; - width:395px; - font-size:14px; - } - .title-desc{ - margin-bottom:10px; - } + border-top: 1px dotted #D8D2A9; + border-bottom: 1px dotted #D8D2A9; + margin: 5px 0 5px 0; +} +.edit-question-page, #fmedit { + color: #525252; +} +.edit-question-page #id_revision, #fmedit #id_revision { + font-size: 14px; + margin-top: 5px; + margin-bottom: 5px; +} +.edit-question-page #id_title, #fmedit #id_title { + font-size: 24px; + line-height: 24px; + height: 36px; + margin: 0px; + padding: 0px 0 0 5px; + border: #cce6ec 3px solid; + width: 725px; + margin-bottom: 10px; +} +.edit-question-page #id_summary, #fmedit #id_summary { + border: #cce6ec 3px solid; + height: 25px; + padding-left: 5px; + width: 395px; + font-size: 14px; +} +.edit-question-page .title-desc, #fmedit .title-desc { + margin-bottom: 10px; } - /* ----- Question template ----- */ - -.question-page{ - - h1{ - padding-top:0px; - } - - h1 a{ - color:@question-link; - font-size:30px; - font-weight:normal; - line-height:1; - } - - p.rss { - float:none; - clear:both; - padding: 3px 0 0 25px; - font-size: 15px; - width:110px; - background-position:center left; - margin-left:4px; - } - - p.rss a { - font-family:@main-font; - vertical-align: top; - } - - .question-content{ - float:right; - width:690px; - margin-bottom:10px; - } - - #question-table{ - float:left; - border-top:#f0f0f0 1px solid; - } - - #question-table, - .answer-table { - margin: 6px 0 0px 0; - border-spacing: 0px; - width: 680px; - padding-right:3px; - } - - .answer-table { - margin-top:0px; - border-bottom: 1px solid #D4D4D4; - float:left; - } - - .answer-table td, - #question-table td { - width:20px; - vertical-align:top; - } - .question-body, .answer-body { - overflow: auto; - margin-top:10px; - font-family:@body-font; - color:#4b4b4b; - - p{ - margin-bottom:14px; - line-height:1.4; - font-size:14px; - padding:0px 5px 5px 0px; - } - - a { - color:@link; - } - - li { - margin-bottom:7px; - } - } - - .question-body IMG, .answer-body IMG { - max-width: 600px; - } - - .post-update-info-container { - float: right; - width: 175px; - } - - .post-update-info { - background: #fff url(../images/background-user-info.png) repeat-x bottom; - float: right; - font-size: 9px; - font-family:@secondary-font; - width: 158px; - padding:4px; - margin:0px 0px 5px 5px; - line-height: 14px; - .rounded-corners(4px); - .box-shadow (0px, 2px,1px,#bfbfbf); - - p { - line-height: 13px; - font-size: 11px; - margin: 0 0 2px 1px; - padding: 0; - } - a{ - color:#444; - } - .gravatar { - float: left; - margin-right: 4px; - } - - p.tip { - color: #444; - line-height: 13px; - font-size: 10px; - } - } - - .post-controls{ - font-size: 11px; - line-height: 12px; - min-width: 200px; - padding-left: 5px; - text-align:right; - clear: left; - float: right; - margin-top:10px; - - a { - color: #777; - padding: 0px 3px 3px 22px; - cursor: pointer; - border: none; - font-size:12px; - font-family:@body-font; - text-decoration: none; - height:18px; - display:block; - float:right; - line-height:18px; - margin-top:-2px; - margin-left:4px; - } - - a:hover { - background-color: #f5f0c9; - - } - .sep { - color: #ccc; - float:right; - height:18px; - font-size:18px; - } - } - .post-controls, .answer-controls{ - .question-delete{ - background: url(../images/delete.png) no-repeat center left; - padding-left:16px; - } - .question-flag{ - background: url(../images/flag.png) no-repeat center left; - } - .question-edit{ - background: url(../images/edit2.png) no-repeat center left; - } - .question-retag{ - background: url(../images/retag.png) no-repeat center left; - } - .question-close{ - background: url(../images/close.png) no-repeat center left; - } - .permant-link{ - background: url(../images/link.png) no-repeat center left; - } - } - .tabBar{ - width:100%; - } - - #questionCount{ - float:left; - font-family:@main-font; - line-height:15px; - } - - .question-img-upvote, .question-img-downvote, - .answer-img-upvote, .answer-img-downvote { - width: 25px; - height: 20px; - cursor:pointer; - } - - .question-img-upvote, .answer-img-upvote { - background: url(../images/vote-arrow-up-new.png) no-repeat; - } - - .question-img-downvote, .answer-img-downvote { - background: url(../images/vote-arrow-down-new.png) no-repeat; - } - - .question-img-upvote:hover, .question-img-upvote.on, - .answer-img-upvote:hover, .answer-img-upvote.on { - background: url(../images/vote-arrow-up-on-new.png) no-repeat; - } - - .question-img-downvote:hover, .question-img-downvote.on, - .answer-img-downvote:hover, .answer-img-downvote.on { - background: url(../images/vote-arrow-down-on-new.png) no-repeat; - } - - .question-img-favorite:hover { - background: url(../images/vote-favorite-on.png) - } - div.comments { - padding: 0; - } - #comment-title{ - font-weight:bold; - font-size:23px; - color:@section-title; - width:200px; - float:left; - } - .comments { - font-size: 12px; - clear: both; - - div.controls { - clear: both; - float:left; - width: 100%; - margin: 3px 0 20px 5px; - } - - .controls a { - color: #988e4c; - padding: 0 3px 2px 22px; - font-family:@body-font; - font-size:13px; - background:url(../images/comment.png) no-repeat center left; - } - - .controls a:hover { - background-color: #f5f0c9; - text-decoration: none; - } - - .button { - color: #988e4c; - font-size: 11px; - padding: 3px; - cursor: pointer; - } - a { - background-color: inherit; - color: @link; - padding: 0; - } - - form.post-comments { - margin: 3px 30px 4px 5px; - } - - textarea { - height: 42px; - width:100%; - margin: 12px 0 5px 1px; - font-family: @body-font; - outline: none; - overflow:auto; - font-size: 12px; - line-height: 140%; - padding-left:2px; - padding-top:4px; - border:#cce6ec 3px solid; - } - - input { - margin-left: 10px; - margin-top: 1px; - vertical-align: top; - width: 100px; - } - button{ - background:url(../images/small-button-blue.png) repeat-x top; - border:0; - color:@button-label; - font-size:12px; - width:95px; - font-weight:bold; - height:24px; - margin-top:-2px; - cursor:pointer; - .rounded-corners(4px); - .text-shadow(0px,1px,0px,#E6F6FA); - .box-shadow(1px, 1px, 2px, #808080); - float:left; - } - button:hover{ - background: url(../images/small-button-blue.png) bottom repeat-x; - .text-shadow(0px, 1px, 0px, #c6d9dd); - } - .counter { - display: inline-block; - width: 245px; - float:right; - color:#b6a475 !important; - vertical-align: top; - font-family:@body-font; - float:right; - text-align:right; - } - .comment { - border-bottom: 1px solid #edeeeb; - margin: 0; - margin-top:8px; - padding-bottom:4px; - overflow: auto; - font-family:@body-font; - font-size:11px; - min-height: 25px; - background:url(../images/comment-background.png) bottom repeat-x; - .rounded-corners(5px); - } - div.comment:hover { - background-color: #efefef; - } - a.author{ - background-color: inherit; - color: @link; - padding: 0; - } - - a.author:hover { - text-decoration: underline; - } - span.delete-icon{ - background:url(../images/close-small.png) no-repeat; - } - span.delete-icon:hover{ - border:#BC564B 2px solid; - .rounded-corners(10px); - - } - .content { - margin-bottom: 7px; - } - - .comment-votes { - float: left; - width: 37px; - line-height: 130%; - padding: 6px 5px 6px 3px; - } - - .comment-body { - line-height: 1.3; - margin: 3px 26px 0 46px; - padding: 5px 3px; - color: #666; - font-size:13px; - } - - .comment-body p{ - font-size:13px; - line-height:1.3; - margin-bottom: 3px; - padding: 0; - } - - .comment-delete { - float: right; - width: 14px; - line-height: 130%; - padding: 8px 6px; - } - - .upvote { - margin: 0px; - padding-right: 17px; - padding-top: 2px; - text-align: right; - height: 20px; - font-size: 13px; - font-weight: bold; - color: #777; - } - - .upvote.upvoted { - color: #d64000; - } - - .upvote.hover { - background: url(../images/go-up-grey.png) no-repeat; - background-position: right 1px; - } - - .upvote:hover { - background: url(../images/go-up-orange.png) no-repeat; - background-position: right 1px; - } - - .help-text{ - float: right; - text-align:right; - color: gray; - margin-bottom: 0px; - margin-top: 0px; - line-height: 50%; - } - } - #questionTools { - font-size: 22px; - margin-top: 11px; - text-align: left; - } - - .question-status { - margin-top: 10px; - margin-bottom:15px; - padding: 20px; - background-color: #fef7cc; - text-align: center; - border:#e1c04a 1px solid; - } - - .question-status h3 { - font-size: 20px; - color:@info-text; - font-weight:normal; - } - - .vote-buttons { - float: left; - text-align: center; - padding-top: 2px; - margin:3px 10px 0px 3px; - } - - .vote-buttons IMG { - cursor: pointer; - } - - .vote-number { - font-family: @main-font; - padding: 0px 0 5px 0; - font-size: 25px; - font-weight: bold; - color: #777; - } - - .vote-buttons .notify-sidebar { - text-align: left; - } - .vote-buttons .notify-sidebar label { - vertical-align: top; - } - - .tabBar-answer{ - margin-bottom:15px; - padding-left:7px; - width:723px; - margin-top:10px; - } - .answer{ - .vote-buttons { - float:left; - } - } - .accepted-answer { - background-color: #f7fecc; - border-bottom-color: #9BD59B; - - .vote-buttons { - width:27px; - margin-right:10px; - } - } - - .answer .post-update-info a{ - color:#444444; - } - - .accepted-answer .comments { - background-color: #f1f6d4; - } - - .answered { - background: #CCC; - color: #999; - } - - .answered-accepted { - background: #DCDCDC; - color: #763333; - - strong { - color: #E1E818; - } - } - - .answered-by-owner { - background: #F1F1FF; - - .comments .button { - background-color: #E6ECFF; - } - .comments { - background-color: #E6ECFF; - } - .vote-buttons { - margin-right:10px; - } - } - - .answer-img-accept:hover { - background: url(../images/vote-accepted-on.png) - } - .answer-body a { - color:@link; - } - .answer-body li { - margin-bottom:0.7em; - } - - #fmanswer{ - color:@info-text; - font-size:16px; - line-height:1.2; - margin-top:10px; - } - .message { - padding: 5px; - margin: 10px 0 10px 0; - - } - +.question-page h1 { + padding-top: 0px; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.question-page h1 a { + color: #464646; + font-size: 30px; + font-weight: normal; + line-height: 1; +} +.question-page p.rss { + float: none; + clear: both; + padding: 3px 0 0 23px; + font-size: 15px; + width: 110px; + background-position: center left; + margin-left: 0px !important; +} +.question-page p.rss a { + font-family: 'Yanone Kaffeesatz', sans-serif; + vertical-align: top; +} +.question-page .question-content { + float: right; + width: 690px; + margin-bottom: 10px; +} +.question-page #question-table { + float: left; + border-top: #f0f0f0 1px solid; +} +.question-page #question-table, .question-page .answer-table { + margin: 6px 0 0px 0; + border-spacing: 0px; + width: 680px; + padding-right: 3px; +} +.question-page .answer-table { + margin-top: 0px; + border-bottom: 1px solid #D4D4D4; + float: left; +} +.question-page .answer-table td, .question-page #question-table td { + width: 20px; + vertical-align: top; +} +.question-page .question-body, .question-page .answer-body { + overflow: auto; + margin-top: 10px; + font-family: Arial; + color: #4b4b4b; +} +.question-page .question-body p, .question-page .answer-body p { + margin-bottom: 14px; + line-height: 1.4; + font-size: 14px; + padding: 0px 5px 5px 0px; +} +.question-page .question-body a, .question-page .answer-body a { + color: #1b79bd; +} +.question-page .question-body li, .question-page .answer-body li { + margin-bottom: 7px; +} +.question-page .question-body IMG, .question-page .answer-body IMG { + max-width: 600px; +} +.question-page .post-update-info-container { + float: right; + width: 175px; +} +.question-page .post-update-info { + background: #ffffff url(../images/background-user-info.png) repeat-x bottom; + float: right; + font-size: 9px; + font-family: Arial; + width: 158px; + padding: 4px; + margin: 0px 0px 5px 5px; + line-height: 14px; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + -webkit-box-shadow: 0px 2px 1px #bfbfbf; + -moz-box-shadow: 0px 2px 1px #bfbfbf; + box-shadow: 0px 2px 1px #bfbfbf; +} +.question-page .post-update-info p { + line-height: 13px; + font-size: 11px; + margin: 0 0 2px 1px; + padding: 0; +} +.question-page .post-update-info a { + color: #444; +} +.question-page .post-update-info .gravatar { + float: left; + margin-right: 4px; +} +.question-page .post-update-info p.tip { + color: #444; + line-height: 13px; + font-size: 10px; +} +.question-page .post-controls { + font-size: 11px; + line-height: 12px; + min-width: 200px; + padding-left: 5px; + text-align: right; + clear: left; + float: right; + margin-top: 10px; +} +.question-page .post-controls a { + color: #777; + padding: 0px 3px 3px 22px; + cursor: pointer; + border: none; + font-size: 12px; + font-family: Arial; + text-decoration: none; + height: 18px; + display: block; + float: right; + line-height: 18px; + margin-top: -2px; + margin-left: 4px; +} +.question-page .post-controls a:hover { + background-color: #f5f0c9; +} +.question-page .post-controls .sep { + color: #ccc; + float: right; + height: 18px; + font-size: 18px; +} +.question-page .post-controls .question-delete, .question-page .answer-controls .question-delete { + background: url(../images/delete.png) no-repeat center left; + padding-left: 16px; +} +.question-page .post-controls .question-flag, .question-page .answer-controls .question-flag { + background: url(../images/flag.png) no-repeat center left; +} +.question-page .post-controls .question-edit, .question-page .answer-controls .question-edit { + background: url(../images/edit2.png) no-repeat center left; +} +.question-page .post-controls .question-retag, .question-page .answer-controls .question-retag { + background: url(../images/retag.png) no-repeat center left; +} +.question-page .post-controls .question-close, .question-page .answer-controls .question-close { + background: url(../images/close.png) no-repeat center left; +} +.question-page .post-controls .permant-link, .question-page .answer-controls .permant-link { + background: url(../images/link.png) no-repeat center left; +} +.question-page .tabBar { + width: 100%; +} +.question-page #questionCount { + float: left; + font-family: 'Yanone Kaffeesatz', sans-serif; + line-height: 15px; +} +.question-page .question-img-upvote, +.question-page .question-img-downvote, +.question-page .answer-img-upvote, +.question-page .answer-img-downvote { + width: 25px; + height: 20px; + cursor: pointer; +} +.question-page .question-img-upvote, .question-page .answer-img-upvote { + background: url(../images/vote-arrow-up-new.png) no-repeat; +} +.question-page .question-img-downvote, .question-page .answer-img-downvote { + background: url(../images/vote-arrow-down-new.png) no-repeat; +} +.question-page .question-img-upvote:hover, +.question-page .question-img-upvote.on, +.question-page .answer-img-upvote:hover, +.question-page .answer-img-upvote.on { + background: url(../images/vote-arrow-up-on-new.png) no-repeat; +} +.question-page .question-img-downvote:hover, +.question-page .question-img-downvote.on, +.question-page .answer-img-downvote:hover, +.question-page .answer-img-downvote.on { + background: url(../images/vote-arrow-down-on-new.png) no-repeat; +} +.question-page .question-img-favorite:hover { + background: url(../images/vote-favorite-on.png); +} +.question-page div.comments { + padding: 0; +} +.question-page #comment-title { + font-weight: bold; + font-size: 23px; + color: #7ea9b3; + width: 200px; + float: left; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +.question-page .comments { + font-size: 12px; + clear: both; +} +.question-page .comments div.controls { + clear: both; + float: left; + width: 100%; + margin: 3px 0 20px 5px; +} +.question-page .comments .controls a { + color: #988e4c; + padding: 0 3px 2px 22px; + font-family: Arial; + font-size: 13px; + background: url(../images/comment.png) no-repeat center left; +} +.question-page .comments .controls a:hover { + background-color: #f5f0c9; + text-decoration: none; +} +.question-page .comments .button { + color: #988e4c; + font-size: 11px; + padding: 3px; + cursor: pointer; +} +.question-page .comments a { + background-color: inherit; + color: #1b79bd; + padding: 0; +} +.question-page .comments form.post-comments { + margin: 3px 30px 4px 5px; +} +.question-page .comments textarea { + height: 42px; + width: 100%; + margin: 12px 0 5px 1px; + font-family: Arial; + outline: none; + overflow: auto; + font-size: 12px; + line-height: 140%; + padding-left: 2px; + padding-top: 4px; + border: #cce6ec 3px solid; +} +.question-page .comments input { + margin-left: 10px; + margin-top: 1px; + vertical-align: top; + width: 100px; +} +.question-page .comments button { + background: url(../images/small-button-blue.png) repeat-x top; + border: 0; + color: #4a757f; + font-size: 12px; + width: 95px; + font-weight: bold; + height: 24px; + margin-top: -2px; + cursor: pointer; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + text-shadow: 0px 1px 0px #e6f6fa; + -moz-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-box-shadow: 1px 1px 2px #808080; + -moz-box-shadow: 1px 1px 2px #808080; + box-shadow: 1px 1px 2px #808080; + float: left; +} +.question-page .comments button:hover { + background: url(../images/small-button-blue.png) bottom repeat-x; + text-shadow: 0px 1px 0px #c6d9dd; + -moz-text-shadow: 0px 1px 0px #c6d9dd; + -webkit-text-shadow: 0px 1px 0px #c6d9dd; +} +.question-page .comments .counter { + display: inline-block; + width: 245px; + float: right; + color: #b6a475 !important; + vertical-align: top; + font-family: Arial; + float: right; + text-align: right; +} +.question-page .comments .comment { + border-bottom: 1px solid #edeeeb; + margin: 0; + margin-top: 8px; + padding-bottom: 4px; + overflow: auto; + font-family: Arial; + font-size: 11px; + min-height: 25px; + background: url(../images/comment-background.png) bottom repeat-x; + border-radius: 5px; + -ms-border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -khtml-border-radius: 5px; +} +.question-page .comments div.comment:hover { + background-color: #efefef; +} +.question-page .comments a.author { + background-color: inherit; + color: #1b79bd; + padding: 0; +} +.question-page .comments a.author:hover { + text-decoration: underline; +} +.question-page .comments span.delete-icon { + background: url(../images/close-small.png) no-repeat; +} +.question-page .comments span.delete-icon:hover { + border: #BC564B 2px solid; + border-radius: 10px; + -ms-border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + -khtml-border-radius: 10px; +} +.question-page .comments .content { + margin-bottom: 7px; +} +.question-page .comments .comment-votes { + float: left; + width: 37px; + line-height: 130%; + padding: 6px 5px 6px 3px; +} +.question-page .comments .comment-body { + line-height: 1.3; + margin: 3px 26px 0 46px; + padding: 5px 3px; + color: #666; + font-size: 13px; +} +.question-page .comments .comment-body p { + font-size: 13px; + line-height: 1.3; + margin-bottom: 3px; + padding: 0; +} +.question-page .comments .comment-delete { + float: right; + width: 14px; + line-height: 130%; + padding: 8px 6px; +} +.question-page .comments .upvote { + margin: 0px; + padding-right: 17px; + padding-top: 2px; + text-align: right; + height: 20px; + font-size: 13px; + font-weight: bold; + color: #777; +} +.question-page .comments .upvote.upvoted { + color: #d64000; +} +.question-page .comments .upvote.hover { + background: url(../images/go-up-grey.png) no-repeat; + background-position: right 1px; +} +.question-page .comments .upvote:hover { + background: url(../images/go-up-orange.png) no-repeat; + background-position: right 1px; +} +.question-page .comments .help-text { + float: right; + text-align: right; + color: gray; + margin-bottom: 0px; + margin-top: 0px; + line-height: 50%; +} +.question-page #questionTools { + font-size: 22px; + margin-top: 11px; + text-align: left; +} +.question-page .question-status { + margin-top: 10px; + margin-bottom: 15px; + padding: 20px; + background-color: #fef7cc; + text-align: center; + border: #e1c04a 1px solid; +} +.question-page .question-status h3 { + font-size: 20px; + color: #707070; + font-weight: normal; +} +.question-page .vote-buttons { + float: left; + text-align: center; + padding-top: 2px; + margin: 3px 10px 0px 3px; +} +.question-page .vote-buttons IMG { + cursor: pointer; +} +.question-page .vote-number { + font-family: 'Yanone Kaffeesatz', sans-serif; + padding: 0px 0 5px 0; + font-size: 25px; + font-weight: bold; + color: #777; +} +.question-page .vote-buttons .notify-sidebar { + text-align: left; +} +.question-page .vote-buttons .notify-sidebar label { + vertical-align: top; +} +.question-page .tabBar-answer { + margin-bottom: 15px; + padding-left: 7px; + width: 723px; + margin-top: 10px; +} +.question-page .answer .vote-buttons { + float: left; +} +.question-page .accepted-answer { + background-color: #f7fecc; + border-bottom-color: #9BD59B; +} +.question-page .accepted-answer .vote-buttons { + width: 27px; + margin-right: 10px; +} +.question-page .answer .post-update-info a { + color: #444444; +} +.question-page .accepted-answer .comments { + background-color: #f1f6d4; +} +.question-page .answered { + background: #CCC; + color: #999; +} +.question-page .answered-accepted { + background: #DCDCDC; + color: #763333; +} +.question-page .answered-accepted strong { + color: #E1E818; +} +.question-page .answered-by-owner { + background: #F1F1FF; +} +.question-page .answered-by-owner .comments .button { + background-color: #E6ECFF; +} +.question-page .answered-by-owner .comments { + background-color: #E6ECFF; +} +.question-page .answered-by-owner .vote-buttons { + margin-right: 10px; +} +.question-page .answer-img-accept:hover { + background: url(../images/vote-accepted-on.png); +} +.question-page .answer-body a { + color: #1b79bd; +} +.question-page .answer-body li { + margin-bottom: 0.7em; +} +.question-page #fmanswer { + color: #707070; + line-height: 1.2; + margin-top: 10px; } - -.facebook-share.icon, .twitter-share.icon, .linkedin-share.icon, .identica-share.icon { - background: url(../images/socialsprite.png) no-repeat; - display:block; - text-indent:-100em; - height:25px; - width:25px; - margin-bottom:3px; +.question-page #fmanswer p { + font-size: 13px; + line-height: 1.3; } - -.facebook-share.icon:hover, .twitter-share.icon:hover, .linkedin-share.icon:hover, .identica-share.icon:hover{ - opacity:0.8; - filter: alpha(opacity=80); +.question-page #fmanswer h2 { + font-family: 'Yanone Kaffeesatz', sans-serif; + color: #7ea9b3; + font-size: 24px; +} +.question-page #fmanswer label { + font-size: 13px; +} +.question-page .message { + padding: 5px; + margin: 0px 0 10px 0; +} +.facebook-share.icon, +.twitter-share.icon, +.linkedin-share.icon, +.identica-share.icon { + background: url(../images/socialsprite.png) no-repeat; + display: block; + text-indent: -100em; + height: 25px; + width: 25px; + margin-bottom: 3px; +} +.facebook-share.icon:hover, +.twitter-share.icon:hover, +.linkedin-share.icon:hover, +.identica-share.icon:hover { + opacity: 0.8; + filter: alpha(opacity=80); } - .facebook-share.icon { - background-position: -26px 0px; + background-position: -26px 0px; } .identica-share.icon { - background-position: -78px 0px; + background-position: -78px 0px; } .twitter-share.icon { - margin-top:10px; - background-position: 0px 0px; + margin-top: 10px; + background-position: 0px 0px; } .linkedin-share.icon { - background-position: -52px 0px; + background-position: -52px 0px; } - /* -----Content pages, Login, About, FAQ, Users----- */ - -.openid-signin, -.meta, -.users-page, -{ - p{ - font-size:15px; - color:@info-text; - } - h2{ - color:@info-text-dark; - padding-left:0px; - } -} - -#email-input-fs,#local_login_buttons,#password-fs,#openid-fs{ - margin-top:10px; - #id_email,#id_username,#id_password,input{ - font-size: 12px; - line-height: 20px; - height: 20px; - margin: 0px; - padding: 0px 0 0 5px; - border:#cce6ec 3px solid; - width:200px; - } - .submit-b{ - background:url(../images/small-button-blue.png) repeat-x top; - border:0; - color:@button-label; - font-weight:bold; - font-size:12px; - height:24px; - margin-top:-2px; - cursor:pointer; - .rounded-corners(4px); - .text-shadow(0px,1px,0px,#E6F6FA); - .box-shadow(1px, 1px, 2px, #808080) - } - .submit-b:hover{ - background:url(../images/small-button-blue.png) repeat-x bottom; - } +.openid-signin, .meta, .users-page { + font-size: 13px; + line-height: 1.3; + color: #525252; +} +.openid-signin p, .meta p, .users-page p { + font-size: 13px; + color: #707070; + line-height: 1.3; + font-family: Arial; + color: #525252; + margin-bottom: 12px; +} +.openid-signin h2, .meta h2, .users-page h2 { + color: #525252; + padding-left: 0px; + font-size: 16px; +} +.openid-signin #id_email, +.meta #id_email, +.users-page #id_email, +.openid-signin #id_name, +.meta #id_name, +.users-page #id_name { + border: #cce6ec 3px solid; + height: 25px; + padding-left: 5px; + width: 395px; + font-size: 14px; +} +.openid-signin textarea, .meta textarea, .users-page textarea { + border: #cce6ec 3px solid; + padding-left: 5px; + padding-top: 5px; + width: 395px; + font-size: 14px; +} +.openid-signin input.submit, .meta input.submit, .users-page input.submit { + background: url(../images/small-button-blue.png) repeat-x top; + border: 0; + color: #4a757f; + font-weight: bold; + font-size: 12px; + height: 24px; + margin-top: -2px; + cursor: pointer; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + text-shadow: 0px 1px 0px #e6f6fa; + -moz-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-box-shadow: 1px 1px 2px #808080; + -moz-box-shadow: 1px 1px 2px #808080; + box-shadow: 1px 1px 2px #808080; +} +.openid-signin input.submit:hover, .meta input.submit:hover, .users-page input.submit:hover { + background: url(../images/small-button-blue.png) repeat-x bottom; + text-decoration: none; +} +.openid-signin .cancel, .meta .cancel, .users-page .cancel { + background: url(../images/small-button-cancel.png) repeat-x top !important; + color: #525252 !important; +} +.openid-signin .cancel:hover, .meta .cancel:hover, .users-page .cancel:hover { + background: url(../images/small-button-cancel.png) repeat-x bottom !important; +} +#email-input-fs, +#local_login_buttons, +#password-fs, +#openid-fs { + margin-top: 10px; +} +#email-input-fs #id_email, +#local_login_buttons #id_email, +#password-fs #id_email, +#openid-fs #id_email, +#email-input-fs #id_username, +#local_login_buttons #id_username, +#password-fs #id_username, +#openid-fs #id_username, +#email-input-fs #id_password, +#local_login_buttons #id_password, +#password-fs #id_password, +#openid-fs #id_password, +#email-input-fs input, +#local_login_buttons input, +#password-fs input, +#openid-fs input { + font-size: 12px; + line-height: 20px; + height: 20px; + margin: 0px; + padding: 0px 0 0 5px; + border: #cce6ec 3px solid; + width: 200px; +} +#email-input-fs .submit-b, +#local_login_buttons .submit-b, +#password-fs .submit-b, +#openid-fs .submit-b { + background: url(../images/small-button-blue.png) repeat-x top; + border: 0; + color: #4a757f; + font-weight: bold; + font-size: 12px; + height: 24px; + margin-top: -2px; + cursor: pointer; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + text-shadow: 0px 1px 0px #e6f6fa; + -moz-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-box-shadow: 1px 1px 2px #808080; + -moz-box-shadow: 1px 1px 2px #808080; + box-shadow: 1px 1px 2px #808080; +} +#email-input-fs .submit-b:hover, +#local_login_buttons .submit-b:hover, +#password-fs .submit-b:hover, +#openid-fs .submit-b:hover { + background: url(../images/small-button-blue.png) repeat-x bottom; } .openid-input { - background: url(../images/openid.gif) no-repeat; - padding-left: 15px; - cursor: pointer; + background: url(../images/openid.gif) no-repeat; + padding-left: 15px; + cursor: pointer; } - .openid-login-input { - background-position: center left; - background: url(../images/openid.gif) no-repeat 0% 50%; - padding: 5px 5px 5px 15px; - cursor: pointer; - font-family: Trebuchet MS; - font-weight: 300; - font-size: 150%; - width: 500px; + background-position: center left; + background: url(../images/openid.gif) no-repeat 0% 50%; + padding: 5px 5px 5px 15px; + cursor: pointer; + font-family: Trebuchet MS; + font-weight: 300; + font-size: 150%; + width: 500px; } - .openid-login-submit { - height: 40px; - width: 80px; - line-height: 40px; - cursor: pointer; - border: 1px solid #777; - font-weight: bold; - font-size: 120%; + height: 40px; + width: 80px; + line-height: 40px; + cursor: pointer; + border: 1px solid #777; + font-weight: bold; + font-size: 120%; } - /* People page */ - -.tabBar-user{ - width:375px; +.tabBar-user { + width: 375px; } - .user { - padding: 5px; - line-height: 140%; - width: 166px; - border:#eee 1px solid; - margin-bottom:5px; - .rounded-corners(3px); - .user-micro-info{ - color:@info-text-dark; - } - + padding: 5px; + line-height: 140%; + width: 166px; + border: #eee 1px solid; + margin-bottom: 5px; + border-radius: 3px; + -ms-border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + -khtml-border-radius: 3px; +} +.user .user-micro-info { + color: #525252; } - .user ul { - margin: 0; - list-style-type: none; + margin: 0; + list-style-type: none; } - .user .thumb { - clear: both; - float: left; - margin-right: 4px; - display: inline; + clear: both; + float: left; + margin-right: 4px; + display: inline; } - /* tags page */ - -.tabBar-tags{ - width:270px; - margin-bottom:15px; +.tabBar-tags { + width: 270px; + margin-bottom: 15px; } - /* badges page */ - a.medal { - font-size: 17px; - line-height: 250%; - margin-right:5px; - color: #333; - text-decoration: none; - background: url(../images/medala.gif) no-repeat; - border-left: 1px solid #EEE; - border-top: 1px solid #EEE; - border-bottom: 1px solid #CCC; - border-right: 1px solid #CCC; - padding: 4px 12px 4px 6px; + font-size: 17px; + line-height: 250%; + margin-right: 5px; + color: #333; + text-decoration: none; + background: url(../images/medala.gif) no-repeat; + border-left: 1px solid #EEE; + border-top: 1px solid #EEE; + border-bottom: 1px solid #CCC; + border-right: 1px solid #CCC; + padding: 4px 12px 4px 6px; } - a:hover.medal { - color: #333; - text-decoration: none; - background: url(../images/medala_on.gif) no-repeat; - border-left: 1px solid #E7E296; - border-top: 1px solid #E7E296; - border-bottom: 1px solid #D1CA3D; - border-right: 1px solid #D1CA3D; -} - -#award-list{ - .user{ - float:left; - margin:5px; - } + color: #333; + text-decoration: none; + background: url(../images/medala_on.gif) no-repeat; + border-left: 1px solid #E7E296; + border-top: 1px solid #E7E296; + border-bottom: 1px solid #D1CA3D; + border-right: 1px solid #D1CA3D; +} +#award-list .user { + float: left; + margin: 5px; } - /* profile page */ - -.tabBar-profile{ - width:100%; - margin-bottom:15px; - float:left; -} - -.user-profile-page{ - font-size:15px; - color:@info-text-dark; - .avatar img{ - border:#eee 1px solid; - padding:5px; - } - h2{ - padding:10px 0px 10px 0px; - } +.tabBar-profile { + width: 100%; + margin-bottom: 15px; + float: left; } - -.user-details { - font-size: 15px; +.user-profile-page { + font-size: 13px; + color: #525252; } - -.user-about { - background-color: #EEEEEE; - height: 200px; - line-height: 20px; - overflow: auto; - padding: 10px; - width: 90%; - p{font-size:18px;} +.user-profile-page p { + font-size: 13px; + line-height: 1.3; + color: #525252; } - -.user-info-table td{ - padding-bottom:5px; +.user-profile-page .avatar img { + border: #eee 1px solid; + padding: 5px; } - -.follow-toggle { - border:0; - color:@button-label; - font-weight:bold; - font-size:12px; - height:26px; - line-height:26px; - margin-top:-2px; - font-size:15px; - cursor:pointer; - background:url(../images/small-button-blue.png) repeat-x top; - .rounded-corners(4px); - .text-shadow(0px,1px,0px,#E6F6FA); - .box-shadow(1px, 1px, 2px, #808080) +.user-profile-page h2 { + padding: 10px 0px 10px 0px; + font-family: 'Yanone Kaffeesatz', sans-serif; } - -.follow-toggle:hover { - background:url(../images/small-button-blue.png) repeat-x bottom; +.user-details { + font-size: 13px; } - -.follow-toggle .follow{ - font-color: #000; - font-style:normal; +.user-details h3 { + font-size: 16px; } - -.follow-toggle .unfollow div.unfollow-red{ - display:none; +.user-about { + background-color: #EEEEEE; + height: 200px; + line-height: 20px; + overflow: auto; + padding: 10px; + width: 90%; +} +.user-about p { + font-size: 13px; +} +.follow-toggle, .submit { + border: 0 !important; + color: #4a757f; + font-weight: bold; + font-size: 12px; + height: 26px; + line-height: 26px; + margin-top: -2px; + font-size: 15px; + cursor: pointer; + font-family: 'Yanone Kaffeesatz', sans-serif; + background: url(../images/small-button-blue.png) repeat-x top; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + text-shadow: 0px 1px 0px #e6f6fa; + -moz-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-text-shadow: 0px 1px 0px #e6f6fa; + -webkit-box-shadow: 1px 1px 2px #808080; + -moz-box-shadow: 1px 1px 2px #808080; + box-shadow: 1px 1px 2px #808080; +} +.follow-toggle:hover, .submit:hover { + background: url(../images/small-button-blue.png) repeat-x bottom; + text-decoration: none !important; +} +.follow-toggle .follow { + font-color: #000; + font-style: normal; +} +.follow-toggle .unfollow div.unfollow-red { + display: none; +} +.follow-toggle .unfollow:hover div.unfollow-red { + display: inline; + color: #fff; + font-weight: bold; + color: #A05736; +} +.follow-toggle .unfollow:hover div.unfollow-green { + display: none; } - -.follow-toggle .unfollow:hover div.unfollow-red{ - display:inline; - color:#fff; - font-weight:bold; - color:#A05736; +.count { + font-family: 'Yanone Kaffeesatz', sans-serif; + font-size: 200%; + font-weight: 700; + color: #777777; } +.scoreNumber { + font-family: 'Yanone Kaffeesatz', sans-serif; + font-size: 35px; + font-weight: 800; + color: #777; + line-height: 40px; + /*letter-spacing:0px*/ -.follow-toggle .unfollow:hover div.unfollow-green{ - display:none; + margin-top: 3px; } - .vote-count { - font-family: Arial; - font-size: 160%; - font-weight: 700; - color: #777; + font-family: Arial; + font-size: 160%; + font-weight: 700; + color: #777; } - .answer-summary { - display: block; - clear: both; - padding: 3px; + display: block; + clear: both; + padding: 3px; } - .answer-votes { - background-color: #EEEEEE; - color: #555555; - float: left; - font-family: Arial; - font-size: 15px; - font-weight: bold; - height: 17px; - padding: 2px 4px 5px; - text-align: center; - text-decoration: none; - width: 20px; - margin-right: 10px; - .rounded-corners(4px); + background-color: #EEEEEE; + color: #555555; + float: left; + font-family: Arial; + font-size: 15px; + font-weight: bold; + height: 17px; + padding: 2px 4px 5px; + text-align: center; + text-decoration: none; + width: 20px; + margin-right: 10px; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; } - +.karma-summary { + padding: 5px; + font-size: 13px; +} +.karma-summary h3 { + text-align: center; + font-weight: bold; + padding: 5px; +} +.karma-diagram { + width: 477px; + height: 300px; + float: left; + margin-right: 10px; +} +.karma-details { + float: right; + width: 450px; + height: 250px; + overflow-y: auto; + word-wrap: break-word; +} +.karma-details p { + margin-bottom: 10px; +} +.karma-gained { + font-weight: bold; + background: #eee; + width: 25px; + margin-right: 5px; + color: green; + padding: 3px; + display: block; + float: left; + text-align: center; + border-radius: 3px; + -ms-border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + -khtml-border-radius: 3px; +} +.karma-lost { + font-weight: bold; + background: #eee; + width: 25px; + color: red; + padding: 3px; + display: block; + margin-right: 5px; + float: left; + text-align: center; + border-radius: 3px; + -ms-border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + -khtml-border-radius: 3px; +} +.submit-row { + margin-bottom: 10px; +} +/*----- Revision pages ----- */ +.revision { + margin: 10px 0 10px 0; + font-size: 13px; + color: #525252; +} +.revision p { + font-size: 13px; + line-height: 1.3; + color: #525252; +} +.revision h3 { + font-family: 'Yanone Kaffeesatz', sans-serif; + font-size: 21px; + padding-left: 0px; +} +.revision .header { + background-color: #F5F5F5; + padding: 5px; + cursor: pointer; +} +.revision .author { + background-color: #e9f3f5; +} +.revision .summary { + padding: 5px 0 10px 0; +} +.revision .summary span { + background-color: #fde785; + padding: 6px; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + display: inline; + -webkit-box-shadow: 1px 1px 4px #cfb852; + -moz-box-shadow: 1px 1px 4px #cfb852; + box-shadow: 1px 1px 4px #cfb852; +} +.revision .answerbody { + padding: 10px 0 5px 10px; +} +.revision .revision-mark { + width: 150px; + text-align: left; + display: inline-block; + font-size: 11px; + overflow: hidden; +} +.revision .revision-mark .gravatar { + float: left; + margin-right: 4px; + padding-top: 5px; +} +.revision .revision-number { + font-size: 300%; + font-weight: bold; + font-family: sans-serif; +} +del, del .post-tag { + color: #C34719; +} +ins .post-tag, ins p, ins { + background-color: #E6F0A2; +} +/* ----- Red Popup notification ----- */ .vote-notification { - z-index: 1; - cursor: pointer; - display: none; - position: absolute; - font-family:@secondary-font; - font-size:14px; - font-weight:normal; - color: white; - background-color: #8e0000; - text-align: center; - padding-bottom:10px; - .box-shadow(0px, 2px, 4px, #370000); - .rounded-corners(4px); - - h3{ - background:url(../images/notification.png) repeat-x top; - padding:10px 10px 10px 10px; - font-size:13px; - margin-bottom:5px; - border-top:#8e0000 1px solid; - color:#fff; - font-weight:normal; - .rounded-corners-top(4px); - } - a { - color: #fb7321; - text-decoration: underline; - font-weight:bold; - } - + z-index: 1; + cursor: pointer; + display: none; + position: absolute; + font-family: Arial; + font-size: 14px; + font-weight: normal; + color: white; + background-color: #8e0000; + text-align: center; + padding-bottom: 10px; + -webkit-box-shadow: 0px 2px 4px #370000; + -moz-box-shadow: 0px 2px 4px #370000; + box-shadow: 0px 2px 4px #370000; + border-radius: 4px; + -ms-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; +} +.vote-notification h3 { + background: url(../images/notification.png) repeat-x top; + padding: 10px 10px 10px 10px; + font-size: 13px; + margin-bottom: 5px; + border-top: #8e0000 1px solid; + color: #fff; + font-weight: normal; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; +} +.vote-notification a { + color: #fb7321; + text-decoration: underline; + font-weight: bold; } - /* ----- Footer links , check blocks/footer.html----- */ - #ground { - width: 100%; - clear: both; - border-top: 1px solid #000; - padding: 6px 0 0 0; - background: @header-color; - font-size:16px; - - p { - margin-bottom:0; - } + width: 100%; + clear: both; + border-top: 1px solid #000; + padding: 6px 0 0 0; + background: #16160f; + font-size: 16px; + font-family: 'Yanone Kaffeesatz', sans-serif; +} +#ground p { + margin-bottom: 0; } - .footer-links { - color: #EEE; - text-align:left; - width:500px; - float:left; - a { - color: #e7e8a8; - } + color: #EEE; + text-align: left; + width: 500px; + float: left; } - -.powered-link{ - width:500px; - float:left; - text-align:left; - a{ - color:#8ebcc7; - } +.footer-links a { + color: #e7e8a8; } - -.copyright{ - color:#616161; - width:450px; - float:right; - text-align:right; - - a{ - color:#8ebcc7; - } - img.license-logo { - margin: 6px 0px 20px 10px; - float:right; - } +.powered-link { + width: 500px; + float: left; + text-align: left; +} +.powered-link a { + color: #8ebcc7; +} +.copyright { + color: #616161; + width: 450px; + float: right; + text-align: right; +} +.copyright a { + color: #8ebcc7; +} +.copyright img.license-logo { + margin: 6px 0px 20px 10px; + float: right; } - - .notify-me { - float: left; + float: left; } - - span.text-counter { - margin-right: 20px; + margin-right: 20px; } - span.form-error { - color: #990000; - font-weight: normal; - margin-left: 5px; + color: #990000; + font-weight: normal; + margin-left: 5px; } - p.form-item { - margin: 0px; + margin: 0px; } - - - - .deleted { - background: #F4E7E7 none repeat scroll 0 0; + background: #F4E7E7 none repeat scroll 0 0; } - - /* openid styles */ .form-row { - line-height: 25px; + line-height: 25px; } - table.form-as-table { - margin-top: 5px; + margin-top: 5px; } - table.form-as-table ul { - list-style-type: none; - display: inline; + list-style-type: none; + display: inline; } - table.form-as-table li { - display: inline; + display: inline; } - table.form-as-table td { - text-align: right; + text-align: right; } - table.form-as-table th { - text-align: left; - font-weight: normal; + text-align: left; + font-weight: normal; } - table.ab-subscr-form { - width: 45em; + width: 45em; } - table.ab-tag-filter-form { - width: 45em; + width: 45em; } - .submit-row { - line-height: 30px; - padding-top: 10px; - display: block; - clear: both; + line-height: 30px; + padding-top: 10px; + display: block; + clear: both; } - .errors { - line-height: 20px; - color: red; + line-height: 20px; + color: red; } - .error { - color: darkred; - margin: 0; - font-size: 10px; + color: darkred; + margin: 0; + font-size: 10px; } - label.retag-error { - color: darkred; - padding-left: 5px; - font-size: 10px; + color: darkred; + padding-left: 5px; + font-size: 10px; } - .fieldset { - border: none; - margin-top: 10px; - padding: 10px; + border: none; + margin-top: 10px; + padding: 10px; } - - span.form-error { - color: #990000; - font-size: 90%; - font-weight: normal; - margin-left: 5px; + color: #990000; + font-size: 90%; + font-weight: normal; + margin-left: 5px; } - -.revision { - margin: 10px 0 10px 0; - width: 100%; - font-size: 13px; -} - -.revision .header { - background-color: #eee; - padding: 5px; - cursor: pointer; -} - -.revision .author { - background-color: #E9E9FF; -} - -.revision .summary { - padding: 5px 0 10px 0; -} - -.revision .summary span { - background-color: yellow; - padding-left: 3px; - padding-right: 3px; - display: inline; -} - -.revision h1 { - font-size: 130%; - font-weight: 600; - padding: 15px 0 15px 0; -} - -.revision-mark { - width: 200px; - text-align: left; - display: inline-block; - font-size: 90%; - overflow: hidden; -} - -.revision-number { - font-size: 300%; - font-weight: bold; - font-family: sans-serif; -} - -.revision .answerbody { - padding: 10px 0 5px 10px; -} - -/* Revision pages */ -del { - color: #FF5F5F; -} - -del .post-tag { - color: #FF5F5F; -} - -ins { - background-color: #97ff97; -} - -ins p{ - background-color: #97ff97; -} - -ins .post-tag { - background-color: #97ff97; -} - -/*用户资料页面*/ -.count { - font-family: Arial; - font-size: 200%; - font-weight: 700; - color: #777 -} - -.scoreNumber { - font-family: Arial; - font-size: 35px; - font-weight: 800; - color: #777; - line-height: 40px; /*letter-spacing:0px*/ - margin-top: 3px; -} - - /* .favorites-count-off { color: #919191; @@ -2511,620 +2495,527 @@ ins .post-tag { text-align: center; } */ - /* todo: get rid of this in html */ .favorites-empty { - width: 32px; - height: 45px; - float: left; + width: 32px; + height: 45px; + float: left; } - .user-info-table { - margin-bottom: 10px; - border-spacing: 0; + margin-bottom: 10px; + border-spacing: 0; } - /* todo: remove this hack? */ .user-stats-table .narrow { - width: 660px; + width: 660px; } - .narrow .summary h3 { - padding: 0px; - margin: 0px; + padding: 0px; + margin: 0px; } - .relativetime { - font-weight: bold; - text-decoration: none; + font-weight: bold; + text-decoration: none; } - .narrow .tags { - float: left; + float: left; } - - - - /* todo: make these more semantic */ .user-action-1 { - font-weight: bold; - color: #333; + font-weight: bold; + color: #333; } - .user-action-2 { - font-weight: bold; - color: #CCC; + font-weight: bold; + color: #CCC; } - .user-action-3 { - color: #333; + color: #333; } - .user-action-4 { - color: #333; + color: #333; } - .user-action-5 { - color: darkred; + color: darkred; } - .user-action-6 { - color: darkred; + color: darkred; } - .user-action-7 { - color: #333; + color: #333; } - .user-action-8 { - padding: 3px; - font-weight: bold; - background-color: #CCC; - color: #763333; + padding: 3px; + font-weight: bold; + background-color: #CCC; + color: #763333; } - .revision-summary { - background-color: #FFFE9B; - padding: 2px; + background-color: #FFFE9B; + padding: 2px; } - .question-title-link a { - font-weight: bold; - color: #0077CC; + font-weight: bold; + color: #0077CC; } - .answer-title-link a { - color: #333; + color: #333; } - /* todo: make these more semantic */ .post-type-1 a { - font-weight: bold; - + font-weight: bold; } - .post-type-3 a { - font-weight: bold; - + font-weight: bold; } - .post-type-5 a { - font-weight: bold; + font-weight: bold; } - .post-type-2 a { - color: #333; + color: #333; } - .post-type-4 a { - color: #333; + color: #333; } - .post-type-6 a { - color: #333; + color: #333; } - .post-type-8 a { - color: #333; + color: #333; } - .hilite { - background-color: #ff0; + background-color: #ff0; } - .hilite1 { - background-color: #ff0; + background-color: #ff0; } - .hilite2 { - background-color: #f0f; + background-color: #f0f; } - .hilite3 { - background-color: #0ff; + background-color: #0ff; } - .gold, .badge1 { - color: #FFCC00; + color: #FFCC00; } - .silver, .badge2 { - color: #CCCCCC; + color: #CCCCCC; } - .bronze, .badge3 { - color: #CC9933; + color: #CC9933; } - .score { - font-weight: 800; - color: #333; + font-weight: 800; + color: #333; } - - a.comment { - background: #EEE; - color: #993300; - padding: 5px; + background: #EEE; + color: #993300; + padding: 5px; } - a.offensive { - color: #999; + color: #999; } - .message h1 { - padding-top: 0px; - font-size: 15px; + padding-top: 0px; + font-size: 15px; } - .message p { - margin-bottom: 0px; + margin-bottom: 0px; } - p.space-above { - margin-top: 10px; + margin-top: 10px; } - .warning { - color: red; + color: red; } - - - button::-moz-focus-inner { - padding:0; - border:none; + padding: 0; + border: none; } .submit { - cursor: pointer; /*letter-spacing:1px;*/ - background-color: #D4D0C8; - height: 30px; - border: 1px solid #777777; /* width:100px; */ - font-weight: bold; - font-size: 120%; -} + cursor: pointer; + /*letter-spacing:1px;*/ + background-color: #D4D0C8; + height: 30px; + border: 1px solid #777777; + /* width:100px; */ + + font-weight: bold; + font-size: 120%; +} .submit:hover { - text-decoration: underline; + text-decoration: underline; } - .submit.small { - margin-right:5px; - height:20px; - font-weight:normal; - font-size:12px; - padding:1px 5px; + margin-right: 5px; + height: 20px; + font-weight: normal; + font-size: 12px; + padding: 1px 5px; } .submit.small:hover { - text-decoration:none; + text-decoration: none; } .question-page a.submit { - display: -moz-inline-stack; - display: inline-block; - line-height: 30px; - padding: 0 5px; - *display: inline; + display: -moz-inline-stack; + display: inline-block; + line-height: 30px; + padding: 0 5px; + *display: inline; } - .noscript { - position: fixed; - top: 0px; - left: 0px; - width: 100%; - z-index: 100; - padding: 5px 0; - text-align: center; - font-family: sans-serif; - font-size: 120%; - font-weight: Bold; - color: #FFFFFF; - background-color: #AE0000; + position: fixed; + top: 0px; + left: 0px; + width: 100%; + z-index: 100; + padding: 5px 0; + text-align: center; + font-family: sans-serif; + font-size: 120%; + font-weight: Bold; + color: #FFFFFF; + background-color: #AE0000; } - .big { - font-size: 15px; + font-size: 14px; } - .strong { - font-weight: bold; + font-weight: bold; } +.orange { + /* used in django.po */ -.orange {/* used in django.po */ - color: #d64000; - font-weight: bold; + color: #d64000; + font-weight: bold; } - .grey { - color: #808080; + color: #808080; } - .about div { - padding: 10px 5px 10px 5px; - border-top: 1px dashed #aaaaaa; + padding: 10px 5px 10px 5px; + border-top: 1px dashed #aaaaaa; } - .highlight { - background-color: #FFF8C6; + background-color: #FFF8C6; } - .nomargin { - margin: 0; + margin: 0; } - .margin-bottom { - margin-bottom: 10px; + margin-bottom: 10px; } - .margin-top { - margin-top: 10px; + margin-top: 10px; } - .inline-block { - display: inline-block; + display: inline-block; } - .action-status { - margin: 0; - border: none; - text-align: center; - line-height: 10px; - font-size: 12px; - padding: 0; + margin: 0; + border: none; + text-align: center; + line-height: 10px; + font-size: 12px; + padding: 0; } - .action-status span { - padding: 3px 5px 3px 5px; - background-color: #fff380; /* nice yellow */ - font-weight: normal; - -moz-border-radius: 5px; - -khtml-border-radius: 5px; - -webkit-border-radius: 5px; -} + padding: 3px 5px 3px 5px; + background-color: #fff380; + /* nice yellow */ + font-weight: normal; + -moz-border-radius: 5px; + -khtml-border-radius: 5px; + -webkit-border-radius: 5px; +} .list-table td { - vertical-align: top; + vertical-align: top; } - /* these need to go */ table.form-as-table .errorlist { - display: block; - margin: 0; - padding: 0 0 0 5px; - text-align: left; - font-size: 10px; - color: darkred; + display: block; + margin: 0; + padding: 0 0 0 5px; + text-align: left; + font-size: 10px; + color: darkred; } - table.form-as-table input { - display: inline; - margin-left: 4px; + display: inline; + margin-left: 4px; } - table.form-as-table th { - vertical-align: bottom; - padding-bottom: 4px; + vertical-align: bottom; + padding-bottom: 4px; } - .form-row-vertical { - margin-top: 8px; - display: block; + margin-top: 8px; + display: block; } - .form-row-vertical label { - margin-bottom: 3px; - display: block; + margin-bottom: 3px; + display: block; } - /* above stuff needs to go */ .text-align-right { - text-align: center; + text-align: center; } - ul.form-horizontal-rows { - list-style: none; - margin: 0; + list-style: none; + margin: 0; } - ul.form-horizontal-rows li { - position: relative; - height: 40px; + position: relative; + height: 40px; } - ul.form-horizontal-rows label { - display: inline-block; + display: inline-block; } - ul.form-horizontal-rows ul.errorlist { - list-style: none; - color: darkred; - font-size: 10px; - line-height: 10px; - position: absolute; - top: 2px; - left: 180px; - text-align: left; - margin: 0; + list-style: none; + color: darkred; + font-size: 10px; + line-height: 10px; + position: absolute; + top: 2px; + left: 180px; + text-align: left; + margin: 0; } - ul.form-horizontal-rows ul.errorlist li { - height: 10px; + height: 10px; } - ul.form-horizontal-rows label { - position: absolute; - left: 0px; - bottom: 6px; - margin: 0px; - line-height: 12px; - font-size: 12px; + position: absolute; + left: 0px; + bottom: 6px; + margin: 0px; + line-height: 12px; + font-size: 12px; } - ul.form-horizontal-rows li input { - position: absolute; - bottom: 0px; - left: 180px; - margin: 0px; + position: absolute; + bottom: 0px; + left: 180px; + margin: 0px; } - .narrow .summary { - float: left; + float: left; } - .user-profile-tool-links { - font-weight: bold; - vertical-align: top; + font-weight: bold; + vertical-align: top; } - - ul.post-tags { - margin-left: 7px; + margin-left: 7px; } ul.post-tags li { - margin-top: 4px; - margin-bottom: 3px; + margin-top: 4px; + margin-bottom: 3px; } - ul.post-retag { - margin-bottom:0px; - margin-left:5px; + margin-bottom: 0px; + margin-left: 5px; } - #question-controls .tags { - margin: 0 0 3px 0; + margin: 0 0 3px 0; } - #tagSelector { - padding-bottom: 2px; - margin-bottom: 0; + padding-bottom: 2px; + margin-bottom: 0; } - #related-tags { - padding-left: 3px; + padding-left: 3px; } - #hideIgnoredTagsControl { - margin: 5px 0 0 0; + margin: 5px 0 0 0; } - #hideIgnoredTagsControl label { - font-size: 12px; - color: #666; + font-size: 12px; + color: #666; } - #hideIgnoredTagsCb { - margin: 0 2px 0 1px; + margin: 0 2px 0 1px; } - #recaptcha_widget_div { - width: 318px; - float: left; - clear: both; + width: 318px; + float: left; + clear: both; } - p.signup_p { - margin: 20px 0px 0px 0px; + margin: 20px 0px 0px 0px; } - .simple-subscribe-options ul { - list-style: none; - list-style-position: outside; - margin: 0; + list-style: none; + list-style-position: outside; + margin: 0; } - /* a workaround to set link colors correctly */ - .wmd-preview a { - color:@link; + color: #1b79bd; } .wmd-preview li { - margin-bottom:7px; + margin-bottom: 7px; + font-size: 14px; } - -.karma-summary { - padding:5px; - font-size:13px; -} - -.karma-summary h3 { - text-align: center; - font-weight: bold; - padding:5px; -} - -.karma-diagram { - width:377px; - height:300px; - float:left; - margin-right:10px; -} - -.karma-details { - float:right; - width:300px; - height:250px; - overflow-y:auto; - word-wrap:break-word; -} - -.karma-gained { - font-weight:bold; - background:#eee; - width:20px; - color:green; - padding:5px; -} - -.karma-lost { - font-weight:bold; - background:#eee; - width:20px; - color:red; - padding:5px; -} - .search-result-summary { - font-weight: bold; - font-size:18px; - line-height:22px; - margin:0px 0px 0px 0px; - padding:2px 0 0 0; - float: left; + font-weight: bold; + font-size: 18px; + line-height: 22px; + margin: 0px 0px 0px 0px; + padding: 2px 0 0 0; + float: left; } - -.faq-rep-item { - text-align:right; - padding-right:5px; +.faq-rep-item { + text-align: right; + padding-right: 5px; } - - .user-info-table .gravatar { - margin:0; + margin: 0; } - #responses { - clear:both; - line-height:18px; - margin-bottom:15px; + clear: both; + line-height: 18px; + margin-bottom: 15px; } - #responses div.face { - float:left; - text-align: center; - width: 54px; - padding: 3px; - overflow:hidden; + float: left; + text-align: center; + width: 54px; + padding: 3px; + overflow: hidden; } - .response-parent { - margin-top: 18px; + margin-top: 18px; } - -.response-parent strong{ - font-size: 20px; +.response-parent strong { + font-size: 20px; } - .re { - min-height: 57px; - clear: both; - margin-top: 10px; + min-height: 57px; + clear: both; + margin-top: 10px; } - #responses input { - float:left; + float: left; } #re_tools { - margin-bottom:10px; + margin-bottom: 10px; } #re_sections { - margin-bottom:6px; + margin-bottom: 6px; } #re_sections .on { - font-weight:bold; + font-weight: bold; } - .avatar-page ul { - list-style: none; + list-style: none; } .avatar-page li { - display: inline; + display: inline; } .user-profile-page .avatar p { - margin-bottom: 0px; + margin-bottom: 0px; } .user-profile-page .tabBar a#stats { - margin-left: 0; + margin-left: 0; } .user-profile-page img.gravatar { - margin: 2px 0 3px 0; + margin: 2px 0 3px 0; } .user-profile-page h3 { - padding: 0; - margin-top: -3px; + padding: 0; + margin-top: -3px; } .userList { - font-size: 13px; + font-size: 13px; } - img.flag { - border: 1px solid #eee; - vertical-align: text-top; + border: 1px solid #eee; + vertical-align: text-top; } - .main-page img.flag { - vertical-align: text-bottom; + vertical-align: text-bottom; } - - /* Pretty printing styles. Used with prettify.js. */ - a.edit { - padding-left:3px; - color: #145bff; + padding-left: 3px; + color: #145bff; +} +.str { + color: #080; +} +.kwd { + color: #008; +} +.com { + color: #800; +} +.typ { + color: #606; +} +.lit { + color: #066; +} +.pun { + color: #660; +} +.pln { + color: #000; +} +.tag { + color: #008; +} +/* name conflict here */ +.atn { + color: #606; +} +.atv { + color: #080; +} +.dec { + color: #606; +} +pre.prettyprint { + padding: 3px; + border: 0px solid #888; } - -.str { color: #080; } -.kwd { color: #008; } -.com { color: #800; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -.tag { color: #008; }/* name conflict here */ -.atn { color: #606; } -.atv { color: #080; } -.dec { color: #606; } -pre.prettyprint { padding: 3px; border: 0px solid #888; } - @media print { - .str { color: #060; } - .kwd { color: #006; font-weight: bold; } - .com { color: #600; font-style: italic; } - .typ { color: #404; font-weight: bold; } - .lit { color: #044; } - .pun { color: #440; } - .pln { color: #000; } - .tag { color: #006; font-weight: bold; } - .atn { color: #404; } - .atv { color: #060; } + .str { + color: #060; + } + .kwd { + color: #006; + font-weight: bold; + } + .com { + color: #600; + font-style: italic; + } + .typ { + color: #404; + font-weight: bold; + } + .lit { + color: #044; + } + .pun { + color: #440; + } + .pln { + color: #000; + } + .tag { + color: #006; + font-weight: bold; + } + .atn { + color: #404; + } + .atv { + color: #060; + } } diff --git a/askbot/skins/default/media/style/style.less b/askbot/skins/default/media/style/style.less new file mode 100644 index 00000000..543b6157 --- /dev/null +++ b/askbot/skins/default/media/style/style.less @@ -0,0 +1,3263 @@ +@import url(jquery.autocomplete.css); +@import "lib_style.less"; /* Library of predifined less functions styles */ + +/* ----- General HTML Styles----- */ + +body { + background: #FFF; + font-size: 14px; + line-height: 150%; + margin: 0; + padding: 0; + color: #000; + font-family:@body-font; +} + +div { + margin: 0 auto; + padding: 0; +} + +h1, h2, h3, h4, h5, h6, ul, li, dl, dt, dd, form, img, p { + margin: 0; + padding: 0; + border: none; +} + +label { + vertical-align: middle; +} + +hr { + border: none; + border-top: 1px dashed #ccccce; +} + +input, select { + vertical-align: middle; + font-family: Trebuchet MS, "segoe ui", Helvetica, Tahoma, Verdana, MingLiu, PMingLiu, Arial, sans-serif; + margin-left:0px; +} + +p { + font-size: 14px; + line-height: 140%; + margin-bottom: 6px; +} + +a { + color:@link; + text-decoration: none; + cursor: pointer; +} + +h2 { + font-size: 21px; + padding: 3px 0 3px 5px; +} + +h3 { + font-size: 19px; + padding: 3px 0 3px 5px; +} + +ul { + list-style: disc; + margin-left: 20px; + padding-left: 0px; + margin-bottom: 1em; +} + +ol { + list-style: decimal; + margin-left: 30px; + margin-bottom: 1em; + padding-left: 0px; +} + +td ul { + vertical-align: middle; +} + +li input { + margin: 3px 3px 4px 3px; +} + +pre { + font-family: Consolas, Monaco, Liberation Mono, Lucida Console, Monospace; + font-size: 100%; + margin-bottom: 10px; + /*overflow: auto;*/ + background-color: #F5F5F5; + padding-left: 5px; + padding-top: 5px; + /*width: 671px;*/ + padding-bottom: 20px ! ie7; +} + +code { + font-family: Consolas, Monaco, Liberation Mono, Lucida Console, Monospace; + font-size: 100%; + +} + +blockquote { + margin-bottom: 10px; + margin-right: 15px; + padding: 10px 0px 1px 10px; + background-color: #F5F5F5; +} + +/* http://pathfindersoftware.com/2007/09/developers-note-2/ */ +* html .clearfix, +* html .paginator { + height: 1; + overflow: visible; +} ++ html .clearfix, ++ html .paginator { + min-height: 1%; +} +.clearfix:after, +.paginator:after { + clear: both; + content:"."; + display:block; + height: 0; + visibility: hidden; +} + +.badges a { + color: #763333; + text-decoration: underline; +} + +a:hover { + text-decoration: underline; +} + +.badge-context-toggle.active { + cursor: pointer; + text-decoration: underline; +} + +h1 { + font-size: 24px; + padding: 10px 0 5px 0px; +} + +/* ----- Extra space above for messages ----- */ + +body.user-messages { + margin-top: 2.4em; +} + +/* ----- Custom positions ----- */ + +.left{float:left} +.right{float:right} +.clean{clear:both} +.center{ + margin: 0 auto; + padding: 0; +} + + +/* ----- Notify message bar , check blocks/system_messages.html ----- */ + +.notify { + position: fixed; + top: 0px; + left: 0px; + width: 100%; + z-index: 100; + padding: 0; + text-align: center; + background-color: #f5dd69; + border-top:#fff 1px solid; + font-family:@main-font; + + p.notification { + margin-top: 6px; + margin-bottom: 6px; + font-size: 16px; + color:#424242 + } +} + +#closeNotify { + position: absolute; + right: 5px; + top: 7px; + color: #735005; + text-decoration: none; + line-height: 18px; + .sprites(-6px,-5px); + cursor: pointer; + width:20px; + height:20px; +} + +#closeNotify:hover { + .sprites(-26px,-5px); +} + +/* ----- Header, check blocks/header.html ----- */ + +#header { + margin-top: 0px; + background: @header-color; + font-family:@main-font; +} + +.content-wrapper {/* wrapper positioning class */ + width: 960px; + margin: auto; + position:relative; +} + +#logo img{ + padding: 5px 0px 5px 0px; + height: 75px; + width: auto; + float: left; +} + +#userToolsNav {/* Navigation bar containing login link or user information, check widgets/user_navigation.html*/ + height: 20px; + position:absolute; + bottom: 0; + right:0px; + padding-bottom:5px; + + a { + height: 35px; + text-align: right; + margin-left: 20px; + text-decoration: underline; + color:#d0e296; + font-size:16px; + } + + a:first-child { + margin-left: 0; + } + + a#ab-responses { + margin-left: 3px; + } + + .user-info,.user-micro-info{ + color:#b5b593; + } + + a img { + vertical-align:middle; + margin-bottom:2px; + } + + .user-info a { + margin: 0; + text-decoration: none; + } +} + +#metaNav {/* Top Navigation bar containing links for tags, people and badges, check widgets/header.html */ + float:right; + + a { + color: #e2e2ae; + padding: 0px 0px 0px 35px; + height: 25px; + line-height: 30px; + margin:5px 0px 0px 10px; + font-size: 18px; + font-weight: 100; + text-decoration: none; + display: block; + float: left; + } + + a:hover { + text-decoration: underline; + } + + a.on { + font-weight:bold; + color: #FFF; + text-decoration: none; + } + + a.special { + font-size: 18px; + color: #B02B2C; + font-weight: bold; + text-decoration: none; + } + + a.special:hover { + text-decoration: underline; + } + + #navTags{ + .sprites(-50px,-5px) + } + + #navUsers{ + .sprites(-125px,-5px) + } + + #navBadges{ + .sprites(-210px,-5px) + } +} + +#secondaryHeader{ /* Div containing Home button, scope navigation, search form and ask button, check blocks/secondary_header.html */ + height:55px; + background:#e9e9e1; + border-bottom:#d3d3c2 1px solid; + border-top:#fcfcfc 1px solid; + margin-bottom:10px; + font-family:@main-font; + + #homeButton{ + border-right:#afaf9e 1px solid; + .sprites(-6px,-36px); + height:55px; + width:43px; + display:block; + float:left; + } + + #homeButton:hover{ + .sprites(-6px-45,-36px); + } + + #scopeWrapper{ + width:688px; + float:left; + + a{ + display:block; + float:left; + } + + .scope-selector{ + font-size:21px; + color:#5a5a4b; + height:55px; + line-height:55px; + margin-left:24px + } + .on{ + background:url(../images/scopearrow.png) no-repeat center bottom; + } + + .ask-message{ + font-size:24px; + } + } +} + +#searchBar { /* Main search form , check widgets/search_bar.html */ + display:inline-block; + background-color: #fff; + width:412px; + border: 1px solid #c9c9b5; + float:right; + height:42px; + margin:6px 0px 0px 15px; + + .searchInput, .searchInputCancelable, + .searchInputAuth, .searchInputCancelableAuth { + font-size: 30px; + height: 40px; + font-weight:300; + background:#FFF; + border:0px; + color:#484848; + padding-left:10px; + font-family:@body-font; + vertical-align: middle; + } + + .searchInput, .searchInputCancelable { + width: 352px; + } + + .searchInputCancelable { + width: 317px; + } + + .searchInputAuth{ + width: 340px; + } + + .searchInputCancelableAuth { + width: 310px; /*FIXME byron */ + } + + .logoutsearch { + width: 337px; + } + + .searchBtn { + font-size: 10px; + color: #666; + background-color: #eee; + height: 42px; + border:#FFF 1px solid; + line-height: 22px; + text-align: center; + float:right; + margin: 0px; + width:48px; + .sprites(-98px,-36px); + cursor:pointer; + } + + .searchBtn:hover { + .sprites(-98px-48,-36px); + } + + .cancelSearchBtn { + font-size: 30px; + color: #ce8888; + background:#fff; + height: 42px; + border:0px; + border-left:#deded0 1px solid; + text-align: center; + width: 35px; + cursor:pointer; + } + + .cancelSearchBtn:hover { + color: #d84040; + } +} + +#askButton{ /* check blocks/secondary_header.html and widgets/ask_button.html*/ + background: url(../images/bigbutton.png) repeat-x bottom; + line-height:44px; + text-align:center; + width:200px; + height:42px; + font-size:23px; + color:@button-label; + margin-top:7px; + float:right; + text-transform:uppercase; + .rounded-corners(5px); + .box-shadow(1px, 1px, 2px, #636363) +} + +#askButton:hover{ + text-decoration:none; + background: url(../images/bigbutton.png) repeat-x top; + .text-shadow(0px, 1px, 0px, #c6d9dd) +} + +/* ----- Content layout, check two_column_body.html or one_column_body.html ----- */ + +#ContentLeft { + width: 730px; + float: left; + position: relative; + padding-bottom:10px; +} + +#ContentRight { + width: 200px; + float: right; + padding: 0 0px 10px 0px; +} + +#ContentFull { + float: left; + width: 960px; +} + +/* ----- Sidebar Widgets Box, check main_page/sidebar.html or question/sidebar.html ----- */ + +.box { + background: #fff; + padding: 4px 0px 10px 0px; + width:200px; + + p { + margin-bottom: 4px; + } + + p.info-box-follow-up-links { + text-align: right; + margin: 0; + } + + h2 { + padding-left: 0; + background:#eceeeb; + height:30px; + line-height:30px; + text-align:right; + font-size:18px !important; + font-weight:normal; + color:#656565; + padding-right:10px; + margin-bottom:10px; + font-family:@main-font; + } + h3{ + color:#4a757f; + font-size:18px; + text-align:left; + font-weight:normal; + font-family:@main-font; + } + .contributorback{ + background: #eceeeb url(../images/contributorsback.png) no-repeat center left; + } + + label { + color: @info-text; + font-size:15px; + display: block; + float: right; + width: 177px; + font-family:@main-font; + } + + ul { + margin-left: 22px; + } + + li { + list-style-type: disc; + font-size: 13px; + line-height: 20px; + margin-bottom: 10px; + color:@info-text; + } + ul.tags { + list-style: none; + margin: 0; + padding: 0; + line-height: 170%; + display: block; + } + #displayTagFilterControl p label{ + color:@info-text; + font-size:15px; + } + + .inputs{ + #interestingTagInput, #ignoredTagInput{ + width:158px; + border:#c9c9b5 1px solid; + height:25px; + } + #interestingTagAdd, #ignoredTagAdd{ + background:url(../images/small-button-blue.png) repeat-x top; + border:0; + color:@button-label; + font-weight:bold; + font-size:12px; + width:30px; + height:27px; + margin-top:-2px; + cursor:pointer; + .rounded-corners(4px); + .text-shadow(0px,1px,0px,#E6F6FA); + .box-shadow(1px, 1px, 2px, #808080); + + + } + #interestingTagAdd:hover, #ignoredTagAdd:hover{ + background:url(../images/small-button-blue.png) repeat-x bottom; + } + } + + img.gravatar { + margin:1px; + } + +/* widgets for question template */ + + a.followed, a.follow{ + background: url(../images/medium-button.png) top repeat-x; + height:34px; + line-height:34px; + text-align:center; + border:0; + font-family:@main-font; + color:@button-label; + font-weight:normal; + font-size:21px; + margin-top:3px; + display:block; + width:120px; + text-decoration:none; + .rounded-corners(4px); + .box-shadow(1px, 1px, 2px, #636363); + .center; + } + + a.followed:hover, a.follow:hover{ + text-decoration:none; + background: url(../images/medium-button.png) bottom repeat-x; + .text-shadow(0px, 1px, 0px, #c6d9dd); + } + + a.followed div.unfollow{ + display:none; + } + + a.followed:hover div{ + display:none; + } + a.followed:hover div.unfollow{ + display:inline; + color:#a05736; + } + + .favorite-number { + padding: 5px 0 0 5px; + font-size: 100%; + font-family: Arial; + font-weight: bold; + color: #777; + text-align:center; + } + + /* notify by email box */ + .notify-sidebar #question-subscribe-sidebar { + margin: 7px 0 0 3px; + } +} + +.statsWidget p{ + color:@info-text; + font-size:16px; + border-bottom:#cccccc 1px solid; + font-size:13px; + + strong{ + float:right; + padding-right:10px; + } +} +.questions-related { + word-wrap: break-word; + + p { + line-height: 20px; + padding: 4px 0px 4px 0px; + font-size: 16px; + font-weight:normal; + border-bottom:#cccccc 1px solid; + } + a{ + font-size:13px; + } +} +/* tips and markdown help are widgets for ask template */ + +#tips{ + li{ + color:@info-text; + font-size:13px; + list-style-image: url(../images/tips.png); + } + a{ + font-size:16px; + } +} + +#markdownHelp{ + li{ + color:@info-text; + font-size:13px; + } + a{ + font-size:16px; + } +} + + +/* ----- Sorting top Tab, check main_page/tab_bar.html ------*/ + +.tabBar { + background-color: #eff5f6; + height: 30px; + margin-bottom: 3px; + margin-top: 3px; + float:right; + font-family:@sort-font; + font-size:16px; + .rounded-corners(5px); +} + +.tabBar h2 { + float: left; +} + +.tabsA, .tabsC { + float: right; + position: relative; + display: block; + height: 20px; +} + +/* tabsA - used for sorting */ +.tabsA { float: right; } +.tabsC { float: left; } + +.tabsA a, .tabsC a{ + + border-left: 1px solid #d0e1e4; + color: @section-title; + display: block; + float: left; + height: 20px; + line-height: 20px; + padding:4px 7px 4px 7px; + text-decoration: none; +} + +.tabsA a.on, .tabsC a.on, .tabsA a:hover, .tabsC a:hover { + color: @button-label; +} + +.tabsA a.rev.on, tabsA a.rev.on:hover { +} + +.tabsA .label, .tabsC .label { + float: left; + color: #646464; + margin-top:4px; + margin-right:5px; +} + +.tabsB a { + background: #eee; + border: 1px solid #eee; + color: #777; + display: block; + float: left; + height: 22px; + line-height: 28px; + margin: 5px 0px 0 4px; + padding: 0 11px 0 11px; + text-decoration: none; +} + +.rss { + float: right; + font-size: 16px; + color: #f57900; + margin: 5px 0px 3px 7px; + width:52px; + padding-left: 16px; + padding-top:3px; + background:#fff url(../images/feed-icon-small.png) no-repeat center right; + float:right; + font-family:@sort-font; + font-size:16px; +} + +.rss:hover { + color: #F4A731 !important; +} + +/* ----- Headline, containing number of questions and tags selected, check main_page/headline.html ----- */ + +#questionCount{ + font-weight:bold; + font-size:23px; + color:@section-title; + width:200px; + float:left; + margin-bottom:8px; + padding-top:6px; + font-family:@main-font; +} + +#listSearchTags{ + float:left; + margin-top:3px; + color:@info-text; + font-size:16px; + font-family:@main-font; +} + +ul#searchTags { + margin-left:10px; + float:right; + padding-top:2px; +} + +.search-tips { + font-size:16px; + line-height:17px; + color: @info-text; + margin:5px 0 10px 0; + padding:0px; + float:left; + font-family:@main-font; + + a { + text-decoration: underline; + color: @link; + } +} + +/* ----- Question list , check main_page/content.html and macros/macros.html----- */ + +#question-list { + float: left; + position: relative; + background-color: #FFF; + padding: 0; + width: 100%; +} + +.short-summary { + position: relative; + filter: inherit; + padding: 10px; + border-bottom: 1px solid #DDDBCE; + margin-bottom:1px; + overflow: hidden; + width: 710px; + float: left; + background: url(../images/summary-background.png) repeat-x; + + h2 { + font-size: 24px; + font-weight:normal; + line-height: 26px; + padding-left: 0; + margin-bottom:8px; + display:block; + font-family:@main-font; + } + + a { + color:@question-link; + } + + .userinfo { + text-align:right; + line-height:16px; + font-family:@body-font; + padding-right:4px; + } + + + .userinfo .relativetime, span.anonymous + { + font-size: 11px; + clear:both; + font-weight: normal; + color: #555; + } + + .userinfo a{ + font-weight:bold; + font-size:11px; + } + + .counts { + float: right; + margin: 4px 0 0 5px; + font-family:@main-font; + } + + .counts .item-count { + padding:0px 5px 0px 5px; + font-size: 25px; + font-family:@main-font; + } + + .counts .votes div, + .counts .views div, + .counts .answers div, + .counts .favorites div + { + margin-top:3px; + font-size: 14px; + line-height:14px; + color: #646464; + } + + .tags { + margin-top: 0; + } + + .votes, .answers, .favorites, .views { + text-align: center; + margin: 0 3px; + padding: 8px 2px 0px 2px; + width: 51px; + float: right; + height:44px; + border:#dbdbd4 1px solid; + } + + .votes{ + background: url(../images/vote-background.png) repeat-x; + } + + .answers{ + background:url(../images/answers-background.png) repeat-x; + } + + .views { + background:url(../images/view-background.png) repeat-x; + } + + .no-votes .item-count { + color: #b1b5b6; + } + .some-votes .item-count { + color: #4a757f; + } + + .no-answers .item-count { + color: #b1b5b6; + } + .some-answers .item-count { + color: #eab243; + } + + .no-views .item-count { + color: #b1b5b6; + } + .some-views .item-count { + color: #d33f00; + } + + .accepted .item-count { + background:url(../images/accept.png) no-repeat top right; + display: block; + text-align: center; + width: 40px; + color: #eab243; + } + + .some-favorites .item-count { + background:#338333; + color:#d0f5a9; + } + .no-favorites .item-count { + background: #eab243; + color: yellow; + } + +} + +/* ----- Question list Paginator , check main_content/pager.html and macros/utils_macros.html----- */ + +.evenMore { + font-size: 13px; + color:@info-text; + padding:15px 0px 10px 0px; + clear:both; +} + +.evenMore a { + text-decoration: underline; + color:@link; +} + +.pager { + margin-top: 10px; + margin-bottom: 16px; +} + +.pagesize { + margin-top: 10px; + margin-bottom: 16px; + float: right; +} + +.paginator { + padding: 5px 0 10px 0; + font-size:13px; + + .prev a, .prev a:visited, + .next a, .next a:visited { + background-color: #fff; + color: #777; + padding: 2px 4px 3px 4px; + } + a{ + color:@section-title; + } + .prev { + margin-right: .5em; + } + + .next { + margin-left: .5em; + } + + .page a, .page a:visited, .curr { + padding: .25em; + background-color: #fff; + margin: 0em .25em; + color: #ff; + } + + .curr { + background-color: #8ebcc7; + color: #fff; + font-weight: bold; + } + .next a, .prev a{ + color:@section-title + } + .page a:hover, + .curr a:hover, + .prev a:hover, + .next a:hover { + color: #8C8C8C; + background-color: #E1E1E1; + text-decoration: none; + } + + .text { + color: #777; + padding: .3em; + } + + .paginator-container-left { + padding: 5px 0 10px 0; + } + +} + +/* ----- Tags Styles ----- */ + +/* tag formatting is also copy-pasted in template + because it must be the same in the emails + askbot/models/__init__.py:format_instant_notification_email() +*/ + +/* tag cloud */ + +.tag-size-1 { + font-size:12px; +} +.tag-size-2 { + font-size:13px; +} +.tag-size-3 { + font-size:14px; +} +.tag-size-4 { + font-size:15px; +} +.tag-size-5 { + font-size:16px; +} +.tag-size-6 { + font-size:17px; +} +.tag-size-7 { + font-size:18px; +} +.tag-size-8 { + font-size:19px; +} +.tag-size-9 { + font-size:20px; +} +.tag-size-10 { + font-size:21px; +} + +ul.tags, +ul.tags.marked-tags, +ul#related-tags { + list-style: none; + margin: 0; + padding: 0; + line-height: 170%; + display: block; +} + +ul.tags li { + float:left; + display: block; + margin: 0 5px 0 0; + padding: 0; + height:20px; +} + +.wildcard-tags { + clear: both; +} + +ul.tags.marked-tags li, +.wildcard-tags ul.tags li { + margin-bottom: 5px; +} + +#tagSelector div.inputs { + clear: both; + float: none; + margin-bottom:10px; +} + +.tags-page ul.tags li, +ul#ab-user-tags li { + width: 160px; + margin:5px; +} + +ul#related-tags li { + margin: 0 5px 5px 0; + float: left; + clear: left; +} + +/* .tag-left and .tag-right are for the sliding doors decoration of tags */ + +.tag-left { + background: url(../images/tag-right.png) no-repeat right center; + border: none; + cursor: pointer; + display: block; + float: left; + height: 20px; + margin: 0 5px 0 0; + padding: 0; +} + +.tag-right { + background:url(../images/tag-left.png) no-repeat left center; + border: none; + display: block; + float: left; + height: 20px; + line-height: 20px; + font-weight: normal; + font-size: 11px; + padding: 0px 10px 0px 15px; + text-decoration: none; + text-align: center; + white-space: nowrap; + vertical-align: middle; + font-family:@body-font; + color:#717179; +} +.deletable-tag { + margin-right: 3px; + white-space: nowrap; +} + +.deletable-tag .tag-right { + padding-right: 0px; + float: left; +} +.deletable-tag.tag-left { + padding-right: 0px; +} + +.tags a.tag-right, +.tags span.tag-right { + color: #585858; + text-decoration: none; + +} +.tags a:hover{ + color: #1A1A1A; +} + +.users-page h1, .tags-page h1 { + float: left; +} + +.main-page h1 { + margin-right: 5px; +} + +span.delete-icon { + padding-left: 13px; + vertical-align: bottom; + background: url(../images/close-small-dark.png) bottom no-repeat; + cursor: default; +} +span.delete-icon:hover { + background: url(../images/close-small-dark.png) top no-repeat; +} + +.tags span.delete-icon { + float: left; + height: 20px; + width:8px; + margin: 0px 0 0 10px; + display: block; +} + +.tag-number { + font-weight: normal; + float: left; + font-size:16px; + color:#5d5d5d; +} + +.badges .tag-number { + float: none; + display: inline; + padding-right: 15px; +} + +/* ----- Ask and Edit Question Form template----- */ + +.section-title{ + color:@section-title; + font-family:@main-font; + font-weight:bold; + font-size:24px; +} + +.ask-body { + padding-right: 10px; +} + +#fmask{ + margin-bottom:30px; + width:100%; +} + +#askFormBar { + display:inline-block; + padding: 4px 7px 5px 0px; + margin-top:0px; + + p{ + margin:0 0 5px 0; + font-size:14px; + color:@info-text-dark; + line-height:1.4; + } + .questionTitleInput { + font-size: 24px; + line-height: 24px; + height: 36px; + margin: 0px; + padding: 0px 0 0 5px; + border:#cce6ec 3px solid; + width:725px; + } +} + +.ask-page, .edit-question-page{ + + div#question-list { + float: none; + border-bottom:#f0f0ec 1px solid; + float:left; + margin-bottom:10px; + a{ + line-height:30px; + } + + } + + div#question-list h2 { + font-size: 13px; + padding-bottom: 0; + color:@link; + border-top:#f0f0ec 1px solid; + border-left:#f0f0ec 1px solid; + height:30px; + line-height:30px; + font-weight:normal; + } + + div#question-list span { + width:28px; + height:26px; + line-height:26px; + text-align:center; + margin-right: 10px; + float:left; + display:block; + color:#fff; + background: #b8d0d5; + .rounded-corners(3px); + } + label{ + color:@info-text-dark; + font-size:13px; + } + + #id_tags{ + border:#cce6ec 3px solid; + height:25px; + padding-left:5px; + width:395px; + font-size:14px; + } +} + +.title-desc { + color: @info-text; + font-size: 13px; +} + +#fmanswer input.submit, +.ask-page input.submit, +.edit-question-page input.submit { + float: left; + background: url(../images/medium-button.png) top repeat-x; + height:34px; + border:0; + font-family:@main-font; + color:@button-label; + font-weight:normal; + font-size:21px; + margin-top:3px; + .rounded-corners(4px); + .box-shadow(1px, 1px, 2px, #636363); + margin-right:7px; +} + +#fmanswer input.submit:hover, +.ask-page input.submit:hover, +.edit-question-page input.submit:hover{ + text-decoration:none; + background: url(../images/medium-button.png) bottom repeat-x; + .text-shadow(0px, 1px, 0px, #c6d9dd) +} +#editor { /*adjustment for editor preview*/ + font-size: 100%; + min-height: 200px; + line-height: 18px; + margin:0; + border-left:#cce6ec 3px solid; + border-bottom:#cce6ec 3px solid; + border-right:#cce6ec 3px solid; + border-top:0; + padding:10px; + margin-bottom:10px; + width:710px; +} + +#id_title { + width: 100%; +} + +.wmd-preview { + margin: 3px 0 5px 0; + padding: 6px; + background-color: #F5F5F5; + min-height: 20px; + overflow: auto; + font-size:13px; + font-family:@body-font; + + p{ + margin-bottom:14px; + line-height:1.4; + font-size:14px; + } +} + +.wmd-preview pre { + background-color: #E7F1F8; + +} + +.wmd-preview blockquote { + background-color: #eee; +} + +.wmd-preview IMG { + max-width: 600px; +} + +.preview-toggle { + width: 100%; + color: #b6a475; /*letter-spacing:1px;*/ + text-align: left; +} + +.preview-toggle span:hover { + cursor: pointer; +} + +.after-editor { + margin-top: 10px; +} + +.checkbox { + margin-left:5px; + font-weight:normal; + cursor:help +} + +.question-options { + margin-top: 1px; + color: #666; + line-height: 13px; + margin-bottom:5px; +} +.question-options label { + vertical-align: text-bottom; +} + +.edit-content-html { + border-top: 1px dotted #D8D2A9; + border-bottom: 1px dotted #D8D2A9; + margin: 5px 0 5px 0; +} + +.edit-question-page, #fmedit{ + color:@info-text-dark; + + #id_revision{ + font-size:14px; + margin-top:5px; + margin-bottom:5px; + } + #id_title{ + font-size: 24px; + line-height: 24px; + height: 36px; + margin: 0px; + padding: 0px 0 0 5px; + border:#cce6ec 3px solid; + width:725px; + margin-bottom:10px; + } + #id_summary{ + border:#cce6ec 3px solid; + height:25px; + padding-left:5px; + width:395px; + font-size:14px; + } + .title-desc{ + margin-bottom:10px; + } +} + +/* ----- Question template ----- */ + +.question-page{ + + h1{ + padding-top:0px; + font-family:@main-font; + } + + h1 a{ + color:@question-link; + font-size:30px; + font-weight:normal; + line-height:1; + } + + p.rss { + float:none; + clear:both; + padding: 3px 0 0 23px; + font-size: 15px; + width:110px; + background-position:center left; + margin-left:0px !important; + } + + p.rss a { + font-family:@main-font; + vertical-align: top; + } + + .question-content{ + float:right; + width:690px; + margin-bottom:10px; + } + + #question-table{ + float:left; + border-top:#f0f0f0 1px solid; + } + + #question-table, + .answer-table { + margin: 6px 0 0px 0; + border-spacing: 0px; + width: 680px; + padding-right:3px; + } + + .answer-table { + margin-top:0px; + border-bottom: 1px solid #D4D4D4; + float:left; + } + + .answer-table td, + #question-table td { + width:20px; + vertical-align:top; + } + .question-body, .answer-body { + overflow: auto; + margin-top:10px; + font-family:@body-font; + color:#4b4b4b; + + p{ + margin-bottom:14px; + line-height:1.4; + font-size:14px; + padding:0px 5px 5px 0px; + } + + a { + color:@link; + } + + li { + margin-bottom:7px; + } + } + + .question-body IMG, .answer-body IMG { + max-width: 600px; + } + + .post-update-info-container { + float: right; + width: 175px; + } + + .post-update-info { + background: #fff url(../images/background-user-info.png) repeat-x bottom; + float: right; + font-size: 9px; + font-family:@secondary-font; + width: 158px; + padding:4px; + margin:0px 0px 5px 5px; + line-height: 14px; + .rounded-corners(4px); + .box-shadow (0px, 2px,1px,#bfbfbf); + + p { + line-height: 13px; + font-size: 11px; + margin: 0 0 2px 1px; + padding: 0; + } + a{ + color:#444; + } + .gravatar { + float: left; + margin-right: 4px; + } + + p.tip { + color: #444; + line-height: 13px; + font-size: 10px; + } + } + + .post-controls{ + font-size: 11px; + line-height: 12px; + min-width: 200px; + padding-left: 5px; + text-align:right; + clear: left; + float: right; + margin-top:10px; + + a { + color: #777; + padding: 0px 3px 3px 22px; + cursor: pointer; + border: none; + font-size:12px; + font-family:@body-font; + text-decoration: none; + height:18px; + display:block; + float:right; + line-height:18px; + margin-top:-2px; + margin-left:4px; + } + + a:hover { + background-color: #f5f0c9; + + } + .sep { + color: #ccc; + float:right; + height:18px; + font-size:18px; + } + } + .post-controls, .answer-controls{ + .question-delete{ + background: url(../images/delete.png) no-repeat center left; + padding-left:16px; + } + .question-flag{ + background: url(../images/flag.png) no-repeat center left; + } + .question-edit{ + background: url(../images/edit2.png) no-repeat center left; + } + .question-retag{ + background: url(../images/retag.png) no-repeat center left; + } + .question-close{ + background: url(../images/close.png) no-repeat center left; + } + .permant-link{ + background: url(../images/link.png) no-repeat center left; + } + } + .tabBar{ + width:100%; + } + + #questionCount{ + float:left; + font-family:@main-font; + line-height:15px; + } + + .question-img-upvote, .question-img-downvote, + .answer-img-upvote, .answer-img-downvote { + width: 25px; + height: 20px; + cursor:pointer; + } + + .question-img-upvote, .answer-img-upvote { + background: url(../images/vote-arrow-up-new.png) no-repeat; + } + + .question-img-downvote, .answer-img-downvote { + background: url(../images/vote-arrow-down-new.png) no-repeat; + } + + .question-img-upvote:hover, .question-img-upvote.on, + .answer-img-upvote:hover, .answer-img-upvote.on { + background: url(../images/vote-arrow-up-on-new.png) no-repeat; + } + + .question-img-downvote:hover, .question-img-downvote.on, + .answer-img-downvote:hover, .answer-img-downvote.on { + background: url(../images/vote-arrow-down-on-new.png) no-repeat; + } + + .question-img-favorite:hover { + background: url(../images/vote-favorite-on.png) + } + div.comments { + padding: 0; + } + #comment-title{ + font-weight:bold; + font-size:23px; + color:@section-title; + width:200px; + float:left; + font-family:@main-font; + } + .comments { + font-size: 12px; + clear: both; + + div.controls { + clear: both; + float:left; + width: 100%; + margin: 3px 0 20px 5px; + } + + .controls a { + color: #988e4c; + padding: 0 3px 2px 22px; + font-family:@body-font; + font-size:13px; + background:url(../images/comment.png) no-repeat center left; + } + + .controls a:hover { + background-color: #f5f0c9; + text-decoration: none; + } + + .button { + color: #988e4c; + font-size: 11px; + padding: 3px; + cursor: pointer; + } + a { + background-color: inherit; + color: @link; + padding: 0; + } + + form.post-comments { + margin: 3px 30px 4px 5px; + } + + textarea { + height: 42px; + width:100%; + margin: 12px 0 5px 1px; + font-family: @body-font; + outline: none; + overflow:auto; + font-size: 12px; + line-height: 140%; + padding-left:2px; + padding-top:4px; + border:#cce6ec 3px solid; + } + + input { + margin-left: 10px; + margin-top: 1px; + vertical-align: top; + width: 100px; + } + button{ + background:url(../images/small-button-blue.png) repeat-x top; + border:0; + color:@button-label; + font-size:12px; + width:95px; + font-weight:bold; + height:24px; + margin-top:-2px; + cursor:pointer; + .rounded-corners(4px); + .text-shadow(0px,1px,0px,#E6F6FA); + .box-shadow(1px, 1px, 2px, #808080); + float:left; + } + button:hover{ + background: url(../images/small-button-blue.png) bottom repeat-x; + .text-shadow(0px, 1px, 0px, #c6d9dd); + } + .counter { + display: inline-block; + width: 245px; + float:right; + color:#b6a475 !important; + vertical-align: top; + font-family:@body-font; + float:right; + text-align:right; + } + .comment { + border-bottom: 1px solid #edeeeb; + margin: 0; + margin-top:8px; + padding-bottom:4px; + overflow: auto; + font-family:@body-font; + font-size:11px; + min-height: 25px; + background:url(../images/comment-background.png) bottom repeat-x; + .rounded-corners(5px); + } + div.comment:hover { + background-color: #efefef; + } + a.author{ + background-color: inherit; + color: @link; + padding: 0; + } + + a.author:hover { + text-decoration: underline; + } + span.delete-icon{ + background:url(../images/close-small.png) no-repeat; + } + span.delete-icon:hover{ + border:#BC564B 2px solid; + .rounded-corners(10px); + + } + .content { + margin-bottom: 7px; + } + + .comment-votes { + float: left; + width: 37px; + line-height: 130%; + padding: 6px 5px 6px 3px; + } + + .comment-body { + line-height: 1.3; + margin: 3px 26px 0 46px; + padding: 5px 3px; + color: #666; + font-size:13px; + } + + .comment-body p{ + font-size:13px; + line-height:1.3; + margin-bottom: 3px; + padding: 0; + } + + .comment-delete { + float: right; + width: 14px; + line-height: 130%; + padding: 8px 6px; + } + + .upvote { + margin: 0px; + padding-right: 17px; + padding-top: 2px; + text-align: right; + height: 20px; + font-size: 13px; + font-weight: bold; + color: #777; + } + + .upvote.upvoted { + color: #d64000; + } + + .upvote.hover { + background: url(../images/go-up-grey.png) no-repeat; + background-position: right 1px; + } + + .upvote:hover { + background: url(../images/go-up-orange.png) no-repeat; + background-position: right 1px; + } + + .help-text{ + float: right; + text-align:right; + color: gray; + margin-bottom: 0px; + margin-top: 0px; + line-height: 50%; + } + } + #questionTools { + font-size: 22px; + margin-top: 11px; + text-align: left; + } + + .question-status { + margin-top: 10px; + margin-bottom:15px; + padding: 20px; + background-color: #fef7cc; + text-align: center; + border:#e1c04a 1px solid; + } + + .question-status h3 { + font-size: 20px; + color:@info-text; + font-weight:normal; + } + + .vote-buttons { + float: left; + text-align: center; + padding-top: 2px; + margin:3px 10px 0px 3px; + } + + .vote-buttons IMG { + cursor: pointer; + } + + .vote-number { + font-family: @main-font; + padding: 0px 0 5px 0; + font-size: 25px; + font-weight: bold; + color: #777; + } + + .vote-buttons .notify-sidebar { + text-align: left; + } + .vote-buttons .notify-sidebar label { + vertical-align: top; + } + + .tabBar-answer{ + margin-bottom:15px; + padding-left:7px; + width:723px; + margin-top:10px; + } + .answer{ + .vote-buttons { + float:left; + } + } + .accepted-answer { + background-color: #f7fecc; + border-bottom-color: #9BD59B; + + .vote-buttons { + width:27px; + margin-right:10px; + } + } + + .answer .post-update-info a{ + color:#444444; + } + + .accepted-answer .comments { + background-color: #f1f6d4; + } + + .answered { + background: #CCC; + color: #999; + } + + .answered-accepted { + background: #DCDCDC; + color: #763333; + + strong { + color: #E1E818; + } + } + + .answered-by-owner { + background: #F1F1FF; + + .comments .button { + background-color: #E6ECFF; + } + .comments { + background-color: #E6ECFF; + } + .vote-buttons { + margin-right:10px; + } + } + + .answer-img-accept:hover { + background: url(../images/vote-accepted-on.png) + } + .answer-body a { + color:@link; + } + .answer-body li { + margin-bottom:0.7em; + } + + #fmanswer{ + color:@info-text; + line-height:1.2; + margin-top:10px; + p{ + font-size:13px; + line-height:1.3; + } + h2{ + font-family:@main-font; + color:@section-title; + font-size:24px; + } + label{ + font-size:13px; + } + } + .message { + padding: 5px; + margin: 0px 0 10px 0; + + } + +} + +.facebook-share.icon, .twitter-share.icon, .linkedin-share.icon, .identica-share.icon { + background: url(../images/socialsprite.png) no-repeat; + display:block; + text-indent:-100em; + height:25px; + width:25px; + margin-bottom:3px; +} + +.facebook-share.icon:hover, .twitter-share.icon:hover, .linkedin-share.icon:hover, .identica-share.icon:hover{ + opacity:0.8; + filter: alpha(opacity=80); +} + +.facebook-share.icon { + background-position: -26px 0px; +} +.identica-share.icon { + background-position: -78px 0px; +} +.twitter-share.icon { + margin-top:10px; + background-position: 0px 0px; +} +.linkedin-share.icon { + background-position: -52px 0px; +} + +/* -----Content pages, Login, About, FAQ, Users----- */ + +.openid-signin, +.meta, +.users-page, +{ + font-size:13px; + line-height:1.3; + color:@info-text-dark; + p{ + font-size:13px; + color:@info-text; + line-height:1.3; + font-family:@body-font; + color:@info-text-dark; + margin-bottom:12px; + } + h2{ + color:@info-text-dark; + padding-left:0px; + font-size:16px; + } + #id_email,#id_name{ + border:#cce6ec 3px solid; + height:25px; + padding-left:5px; + width:395px; + font-size:14px; + } + textarea{ + border:#cce6ec 3px solid; + padding-left:5px; + padding-top:5px; + width:395px; + font-size:14px; + } + input.submit{ + background:url(../images/small-button-blue.png) repeat-x top; + border:0; + color:@button-label; + font-weight:bold; + font-size:12px; + height:24px; + margin-top:-2px; + cursor:pointer; + .rounded-corners(4px); + .text-shadow(0px,1px,0px,#E6F6FA); + .box-shadow(1px, 1px, 2px, #808080); + } + input.submit:hover{ + background:url(../images/small-button-blue.png) repeat-x bottom; + text-decoration:none; + } + .cancel{ + background:url(../images/small-button-cancel.png) repeat-x top !important; + color:#525252 !important; + } + .cancel:hover{ + background:url(../images/small-button-cancel.png) repeat-x bottom !important; + } +} + +#email-input-fs,#local_login_buttons,#password-fs,#openid-fs{ + margin-top:10px; + #id_email,#id_username,#id_password,input{ + font-size: 12px; + line-height: 20px; + height: 20px; + margin: 0px; + padding: 0px 0 0 5px; + border:#cce6ec 3px solid; + width:200px; + } + .submit-b{ + background:url(../images/small-button-blue.png) repeat-x top; + border:0; + color:@button-label; + font-weight:bold; + font-size:12px; + height:24px; + margin-top:-2px; + cursor:pointer; + .rounded-corners(4px); + .text-shadow(0px,1px,0px,#E6F6FA); + .box-shadow(1px, 1px, 2px, #808080) + } + .submit-b:hover{ + background:url(../images/small-button-blue.png) repeat-x bottom; + } +} +.openid-input { + background: url(../images/openid.gif) no-repeat; + padding-left: 15px; + cursor: pointer; +} + +.openid-login-input { + background-position: center left; + background: url(../images/openid.gif) no-repeat 0% 50%; + padding: 5px 5px 5px 15px; + cursor: pointer; + font-family: Trebuchet MS; + font-weight: 300; + font-size: 150%; + width: 500px; +} + +.openid-login-submit { + height: 40px; + width: 80px; + line-height: 40px; + cursor: pointer; + border: 1px solid #777; + font-weight: bold; + font-size: 120%; +} + +/* People page */ + +.tabBar-user{ + width:375px; +} + +.user { + padding: 5px; + line-height: 140%; + width: 166px; + border:#eee 1px solid; + margin-bottom:5px; + .rounded-corners(3px); + .user-micro-info{ + color:@info-text-dark; + } + +} + +.user ul { + margin: 0; + list-style-type: none; +} + +.user .thumb { + clear: both; + float: left; + margin-right: 4px; + display: inline; +} + +/* tags page */ + +.tabBar-tags{ + width:270px; + margin-bottom:15px; +} + +/* badges page */ + +a.medal { + font-size: 17px; + line-height: 250%; + margin-right:5px; + color: #333; + text-decoration: none; + background: url(../images/medala.gif) no-repeat; + border-left: 1px solid #EEE; + border-top: 1px solid #EEE; + border-bottom: 1px solid #CCC; + border-right: 1px solid #CCC; + padding: 4px 12px 4px 6px; +} + +a:hover.medal { + color: #333; + text-decoration: none; + background: url(../images/medala_on.gif) no-repeat; + border-left: 1px solid #E7E296; + border-top: 1px solid #E7E296; + border-bottom: 1px solid #D1CA3D; + border-right: 1px solid #D1CA3D; +} + +#award-list{ + .user{ + float:left; + margin:5px; + } +} + +/* profile page */ + +.tabBar-profile{ + width:100%; + margin-bottom:15px; + float:left; +} + +.user-profile-page{ + font-size:13px; + color:@info-text-dark; + + p{ + font-size:13px; + line-height:1.3; + color:@info-text-dark; + } + .avatar img{ + border:#eee 1px solid; + padding:5px; + } + h2{ + padding:10px 0px 10px 0px; + font-family:@main-font; + } +} + +.user-details { + font-size: 13px; + h3{ + font-size:16px; + } +} + +.user-about { + background-color: #EEEEEE; + height: 200px; + line-height: 20px; + overflow: auto; + padding: 10px; + width: 90%; + p{font-size:13px;} +} + +.follow-toggle,.submit { + border:0 !important; + color:@button-label; + font-weight:bold; + font-size:12px; + height:26px; + line-height:26px; + margin-top:-2px; + font-size:15px; + cursor:pointer; + font-family:@main-font; + background:url(../images/small-button-blue.png) repeat-x top; + .rounded-corners(4px); + .text-shadow(0px,1px,0px,#E6F6FA); + .box-shadow(1px, 1px, 2px, #808080) +} + +.follow-toggle:hover, .submit:hover { + background:url(../images/small-button-blue.png) repeat-x bottom; + text-decoration:none !important; +} + +.follow-toggle .follow{ + font-color: #000; + font-style:normal; +} + +.follow-toggle .unfollow div.unfollow-red{ + display:none; +} + +.follow-toggle .unfollow:hover div.unfollow-red{ + display:inline; + color:#fff; + font-weight:bold; + color:#A05736; +} + +.follow-toggle .unfollow:hover div.unfollow-green{ + display:none; +} + +.count { + font-family: @main-font; + font-size: 200%; + font-weight: 700; + color: #777 +} + +.scoreNumber { + font-family: @main-font; + font-size: 35px; + font-weight: 800; + color: #777; + line-height: 40px; /*letter-spacing:0px*/ + margin-top: 3px; +} + +.vote-count { + font-family: Arial; + font-size: 160%; + font-weight: 700; + color: #777; +} + +.answer-summary { + display: block; + clear: both; + padding: 3px; +} + +.answer-votes { + background-color: #EEEEEE; + color: #555555; + float: left; + font-family: Arial; + font-size: 15px; + font-weight: bold; + height: 17px; + padding: 2px 4px 5px; + text-align: center; + text-decoration: none; + width: 20px; + margin-right: 10px; + .rounded-corners(4px); +} + +.karma-summary { + padding:5px; + font-size:13px; +} + +.karma-summary h3 { + text-align: center; + font-weight: bold; + padding:5px; +} + +.karma-diagram { + width:477px; + height:300px; + float:left; + margin-right:10px; +} + +.karma-details { + float:right; + width:450px; + height:250px; + overflow-y:auto; + word-wrap:break-word; + p{margin-bottom:10px;} +} + +.karma-gained { + font-weight:bold; + background:#eee; + width:25px; + margin-right:5px; + color:green; + padding:3px; + display:block; + float:left; + text-align:center; + .rounded-corners(3px); +} + +.karma-lost { + font-weight:bold; + background:#eee; + width:25px; + color:red; + padding:3px; + display:block; + margin-right:5px; + float:left; + text-align:center; + .rounded-corners(3px); +} + +.submit-row{ + margin-bottom:10px; +} + +/*----- Revision pages ----- */ + +.revision { + margin: 10px 0 10px 0; + font-size: 13px; + color:@info-text-dark; + + p{ + font-size:13px; + line-height:1.3; + color:@info-text-dark; + } + + h3{ + font-family:@main-font; + font-size:21px; + padding-left:0px; + } + + .header { + background-color: #F5F5F5; + padding: 5px; + cursor: pointer; + } + + .author { + background-color: #e9f3f5; + } + + .summary { + padding: 5px 0 10px 0; + } + + .summary span { + background-color:#fde785; + padding:6px; + .rounded-corners(4px); + display: inline; + .box-shadow(1px, 1px, 4px, #cfb852); + } + + .answerbody { + padding: 10px 0 5px 10px; + } + + .revision-mark { + width: 150px; + text-align: left; + display: inline-block; + font-size: 11px; + overflow: hidden; + + .gravatar{ + float:left; + margin-right:4px; + padding-top:5px; + } + } + + .revision-number { + font-size: 300%; + font-weight: bold; + font-family: sans-serif; + } +} + +del, del .post-tag { + color: #C34719; +} + +ins .post-tag, ins p, ins { + background-color: #E6F0A2; +} + +/* ----- Red Popup notification ----- */ + +.vote-notification { + z-index: 1; + cursor: pointer; + display: none; + position: absolute; + font-family:@secondary-font; + font-size:14px; + font-weight:normal; + color: white; + background-color: #8e0000; + text-align: center; + padding-bottom:10px; + .box-shadow(0px, 2px, 4px, #370000); + .rounded-corners(4px); + + h3{ + background:url(../images/notification.png) repeat-x top; + padding:10px 10px 10px 10px; + font-size:13px; + margin-bottom:5px; + border-top:#8e0000 1px solid; + color:#fff; + font-weight:normal; + .rounded-corners-top(4px); + } + a { + color: #fb7321; + text-decoration: underline; + font-weight:bold; + } + +} + + +/* ----- Footer links , check blocks/footer.html----- */ + +#ground { + width: 100%; + clear: both; + border-top: 1px solid #000; + padding: 6px 0 0 0; + background: @header-color; + font-size:16px; + font-family:@main-font; + + p { + margin-bottom:0; + } +} + +.footer-links { + color: #EEE; + text-align:left; + width:500px; + float:left; + a { + color: #e7e8a8; + } +} + +.powered-link{ + width:500px; + float:left; + text-align:left; + a{ + color:#8ebcc7; + } +} + +.copyright{ + color:#616161; + width:450px; + float:right; + text-align:right; + + a{ + color:#8ebcc7; + } + img.license-logo { + margin: 6px 0px 20px 10px; + float:right; + } +} + + +.notify-me { + float: left; +} + + +span.text-counter { + margin-right: 20px; +} + +span.form-error { + color: #990000; + font-weight: normal; + margin-left: 5px; +} + +p.form-item { + margin: 0px; +} + + + + +.deleted { + background: #F4E7E7 none repeat scroll 0 0; +} + + +/* openid styles */ +.form-row { + line-height: 25px; +} + +table.form-as-table { + margin-top: 5px; +} + +table.form-as-table ul { + list-style-type: none; + display: inline; +} + +table.form-as-table li { + display: inline; +} + +table.form-as-table td { + text-align: right; +} + +table.form-as-table th { + text-align: left; + font-weight: normal; +} + +table.ab-subscr-form { + width: 45em; +} + +table.ab-tag-filter-form { + width: 45em; +} + +.submit-row { + line-height: 30px; + padding-top: 10px; + display: block; + clear: both; +} + +.errors { + line-height: 20px; + color: red; +} + +.error { + color: darkred; + margin: 0; + font-size: 10px; +} + +label.retag-error { + color: darkred; + padding-left: 5px; + font-size: 10px; +} + +.fieldset { + border: none; + margin-top: 10px; + padding: 10px; +} + + +span.form-error { + color: #990000; + font-size: 90%; + font-weight: normal; + margin-left: 5px; +} + + +/* +.favorites-count-off { + color: #919191; + float: left; + text-align: center; +} + +.favorites-count { + color: #D4A849; + float: left; + text-align: center; +} +*/ + +/* todo: get rid of this in html */ +.favorites-empty { + width: 32px; + height: 45px; + float: left; +} + +.user-info-table { + margin-bottom: 10px; + border-spacing: 0; +} + +/* todo: remove this hack? */ +.user-stats-table .narrow { + width: 660px; +} + +.narrow .summary h3 { + padding: 0px; + margin: 0px; +} + +.relativetime { + font-weight: bold; + text-decoration: none; +} + +.narrow .tags { + float: left; +} + + + + +/* todo: make these more semantic */ +.user-action-1 { + font-weight: bold; + color: #333; +} + +.user-action-2 { + font-weight: bold; + color: #CCC; +} + +.user-action-3 { + color: #333; +} + +.user-action-4 { + color: #333; +} + +.user-action-5 { + color: darkred; +} + +.user-action-6 { + color: darkred; +} + +.user-action-7 { + color: #333; +} + +.user-action-8 { + padding: 3px; + font-weight: bold; + background-color: #CCC; + color: #763333; +} + +.revision-summary { + background-color: #FFFE9B; + padding: 2px; +} + +.question-title-link a { + font-weight: bold; + color: #0077CC; +} + +.answer-title-link a { + color: #333; +} + +/* todo: make these more semantic */ +.post-type-1 a { + font-weight: bold; + +} + +.post-type-3 a { + font-weight: bold; + +} + +.post-type-5 a { + font-weight: bold; +} + +.post-type-2 a { + color: #333; +} + +.post-type-4 a { + color: #333; +} + +.post-type-6 a { + color: #333; +} + +.post-type-8 a { + color: #333; +} + +.hilite { + background-color: #ff0; +} + +.hilite1 { + background-color: #ff0; +} + +.hilite2 { + background-color: #f0f; +} + +.hilite3 { + background-color: #0ff; +} + +.gold, .badge1 { + color: #FFCC00; +} + +.silver, .badge2 { + color: #CCCCCC; +} + +.bronze, .badge3 { + color: #CC9933; +} + +.score { + font-weight: 800; + color: #333; +} + + +a.comment { + background: #EEE; + color: #993300; + padding: 5px; +} + +a.offensive { + color: #999; +} + +.message h1 { + padding-top: 0px; + font-size: 15px; +} + +.message p { + margin-bottom: 0px; +} + +p.space-above { + margin-top: 10px; +} + +.warning { + color: red; +} + + + +button::-moz-focus-inner { + padding:0; + border:none; +} +.submit { + cursor: pointer; /*letter-spacing:1px;*/ + background-color: #D4D0C8; + height: 30px; + border: 1px solid #777777; /* width:100px; */ + font-weight: bold; + font-size: 120%; +} + +.submit:hover { + text-decoration: underline; +} + +.submit.small { + margin-right:5px; + height:20px; + font-weight:normal; + font-size:12px; + padding:1px 5px; +} +.submit.small:hover { + text-decoration:none; +} +.question-page a.submit { + display: -moz-inline-stack; + display: inline-block; + line-height: 30px; + padding: 0 5px; + *display: inline; +} + +.noscript { + position: fixed; + top: 0px; + left: 0px; + width: 100%; + z-index: 100; + padding: 5px 0; + text-align: center; + font-family: sans-serif; + font-size: 120%; + font-weight: Bold; + color: #FFFFFF; + background-color: #AE0000; +} + +.big { + font-size: 14px; +} + +.strong { + font-weight: bold; +} + +.orange {/* used in django.po */ + color: #d64000; + font-weight: bold; +} + +.grey { + color: #808080; +} + +.about div { + padding: 10px 5px 10px 5px; + border-top: 1px dashed #aaaaaa; +} + +.highlight { + background-color: #FFF8C6; +} + +.nomargin { + margin: 0; +} + +.margin-bottom { + margin-bottom: 10px; +} + +.margin-top { + margin-top: 10px; +} + +.inline-block { + display: inline-block; +} + +.action-status { + margin: 0; + border: none; + text-align: center; + line-height: 10px; + font-size: 12px; + padding: 0; +} + +.action-status span { + padding: 3px 5px 3px 5px; + background-color: #fff380; /* nice yellow */ + font-weight: normal; + -moz-border-radius: 5px; + -khtml-border-radius: 5px; + -webkit-border-radius: 5px; +} + +.list-table td { + vertical-align: top; +} + +/* these need to go */ +table.form-as-table .errorlist { + display: block; + margin: 0; + padding: 0 0 0 5px; + text-align: left; + font-size: 10px; + color: darkred; +} + +table.form-as-table input { + display: inline; + margin-left: 4px; +} + +table.form-as-table th { + vertical-align: bottom; + padding-bottom: 4px; +} + +.form-row-vertical { + margin-top: 8px; + display: block; +} + +.form-row-vertical label { + margin-bottom: 3px; + display: block; +} + +/* above stuff needs to go */ +.text-align-right { + text-align: center; +} + +ul.form-horizontal-rows { + list-style: none; + margin: 0; +} + +ul.form-horizontal-rows li { + position: relative; + height: 40px; +} + +ul.form-horizontal-rows label { + display: inline-block; +} + +ul.form-horizontal-rows ul.errorlist { + list-style: none; + color: darkred; + font-size: 10px; + line-height: 10px; + position: absolute; + top: 2px; + left: 180px; + text-align: left; + margin: 0; +} + +ul.form-horizontal-rows ul.errorlist li { + height: 10px; +} + +ul.form-horizontal-rows label { + position: absolute; + left: 0px; + bottom: 6px; + margin: 0px; + line-height: 12px; + font-size: 12px; +} + +ul.form-horizontal-rows li input { + position: absolute; + bottom: 0px; + left: 180px; + margin: 0px; +} + +.narrow .summary { + float: left; +} + +.user-profile-tool-links { + font-weight: bold; + vertical-align: top; +} + + +ul.post-tags { + margin-left: 7px; +} +ul.post-tags li { + margin-top: 4px; + margin-bottom: 3px; +} + +ul.post-retag { + margin-bottom:0px; + margin-left:5px; +} + +#question-controls .tags { + margin: 0 0 3px 0; +} + +#tagSelector { + padding-bottom: 2px; + margin-bottom: 0; +} + +#related-tags { + padding-left: 3px; +} + +#hideIgnoredTagsControl { + margin: 5px 0 0 0; +} + +#hideIgnoredTagsControl label { + font-size: 12px; + color: #666; +} + +#hideIgnoredTagsCb { + margin: 0 2px 0 1px; +} + +#recaptcha_widget_div { + width: 318px; + float: left; + clear: both; +} + +p.signup_p { + margin: 20px 0px 0px 0px; +} + +.simple-subscribe-options ul { + list-style: none; + list-style-position: outside; + margin: 0; +} + +/* a workaround to set link colors correctly */ + +.wmd-preview a { + color:@link; +} + +.wmd-preview li { + margin-bottom:7px; + font-size:14px; +} + +.search-result-summary { + font-weight: bold; + font-size:18px; + line-height:22px; + margin:0px 0px 0px 0px; + padding:2px 0 0 0; + float: left; +} + +.faq-rep-item { + text-align:right; + padding-right:5px; +} + + +.user-info-table .gravatar { + margin:0; +} + +#responses { + clear:both; + line-height:18px; + margin-bottom:15px; +} + +#responses div.face { + float:left; + text-align: center; + width: 54px; + padding: 3px; + overflow:hidden; +} + +.response-parent { + margin-top: 18px; +} + +.response-parent strong{ + font-size: 20px; +} + +.re { + min-height: 57px; + clear: both; + margin-top: 10px; +} + +#responses input { + float:left; +} +#re_tools { + margin-bottom:10px; +} +#re_sections { + margin-bottom:6px; +} +#re_sections .on { + font-weight:bold; +} + +.avatar-page ul { + list-style: none; +} +.avatar-page li { + display: inline; +} +.user-profile-page .avatar p { + margin-bottom: 0px; +} +.user-profile-page .tabBar a#stats { + margin-left: 0; +} +.user-profile-page img.gravatar { + margin: 2px 0 3px 0; +} +.user-profile-page h3 { + padding: 0; + margin-top: -3px; +} +.userList { + font-size: 13px; +} + +img.flag { + border: 1px solid #eee; + vertical-align: text-top; +} + +.main-page img.flag { + vertical-align: text-bottom; +} + + +/* Pretty printing styles. Used with prettify.js. */ + +a.edit { + padding-left:3px; + color: #145bff; +} + +.str { color: #080; } +.kwd { color: #008; } +.com { color: #800; } +.typ { color: #606; } +.lit { color: #066; } +.pun { color: #660; } +.pln { color: #000; } +.tag { color: #008; }/* name conflict here */ +.atn { color: #606; } +.atv { color: #080; } +.dec { color: #606; } +pre.prettyprint { padding: 3px; border: 0px solid #888; } + +@media print { + .str { color: #060; } + .kwd { color: #006; font-weight: bold; } + .com { color: #600; font-style: italic; } + .typ { color: #404; font-weight: bold; } + .lit { color: #044; } + .pun { color: #440; } + .pln { color: #000; } + .tag { color: #006; font-weight: bold; } + .atn { color: #404; } + .atv { color: #060; } +} diff --git a/askbot/skins/default/templates/about.html b/askbot/skins/default/templates/about.html index fce4223e..d5d1b949 100644 --- a/askbot/skins/default/templates/about.html +++ b/askbot/skins/default/templates/about.html @@ -2,7 +2,7 @@ <!-- template about.html --> {% block title %}{% spaceless %}{% trans site_name=settings.APP_SHORT_NAME %}About {{site_name}}{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -<h1>{% trans site_name=settings.APP_SHORT_NAME %}About {{site_name}}{% endtrans %}</h1> +<h1 class="section-title">{% trans site_name=settings.APP_SHORT_NAME %}About {{site_name}}{% endtrans %}</h1> <div class="content"> {{settings.FORUM_ABOUT}} </div> diff --git a/askbot/skins/default/templates/answer_edit.html b/askbot/skins/default/templates/answer_edit.html index 168ba784..bbf3edef 100644 --- a/askbot/skins/default/templates/answer_edit.html +++ b/askbot/skins/default/templates/answer_edit.html @@ -6,24 +6,25 @@ <link rel="stylesheet" type="text/css" href="{{"/js/wmd/wmd.css"|media}}" /> {% endblock %} {% block content %} -<h1> +<h1 class="section-title"> {% trans %}Edit answer{% endtrans %} [<a href="{{ answer.question.get_absolute_url() }}#{{ answer.id }}">{% trans %}back{% endtrans %}</a>] </h1> <div id="main-body" class="ask-body"> <form id="fmedit" action="{% url edit_answer answer.id %}" method="post" >{% csrf_token %} - <label for="id_revision" ><strong>{% trans %}revision{% endtrans %}:</strong></label> <br/> + <label for="id_revision" >{% trans %}revision{% endtrans %}:</label> <br/> {% if revision_form.revision.errors %}{{ revision_form.revision.errors.as_ul() }}{% endif %} <div style="vertical-align:middle"> {{ revision_form.revision }} <input type="submit" style="display:none" id="select_revision" name="select_revision" value="{% trans %}select revision{% endtrans %}"> </div> {{ macros.edit_post(form) }} + {% if settings.WIKI_ON and answer.wiki == False %} + {{ macros.checkbox_in_div(form.wiki) }} + {% endif %} <div class="after-editor"> <input type="submit" value="{% trans %}Save edit{% endtrans %}" class="submit" /> <input type="button" value="{% trans %}Cancel{% endtrans %}" class="submit" onclick="history.back(-1);" /> </div> - {% if settings.WIKI_ON and answer.wiki == False %} - {{ macros.checkbox_in_div(form.wiki) }} - {% endif %} + </form> </div> {% endblock %} diff --git a/askbot/skins/default/templates/base.html b/askbot/skins/default/templates/base.html index f84e031d..9e44494b 100644 --- a/askbot/skins/default/templates/base.html +++ b/askbot/skins/default/templates/base.html @@ -14,7 +14,7 @@ {% endif %} </head> {% endspaceless %} - <body class="{% block body_class %}{% endblock %}{% if page_class %} {{page_class}}{% endif %}"> + <body class="{% block body_class %}{% endblock %}{% if user_messages %} user-messages{% endif %}{% if page_class %} {{page_class}}{% endif %}"> {% include "widgets/system_messages.html" %} {% include "custom_header.html" ignore missing %} {% include "widgets/header.html" %} {# Logo, user tool navigation and meta navitation #} diff --git a/askbot/skins/default/templates/faq.html b/askbot/skins/default/templates/faq.html index be25d2ee..51873a06 100644 --- a/askbot/skins/default/templates/faq.html +++ b/askbot/skins/default/templates/faq.html @@ -3,6 +3,7 @@ {% block title %}{% spaceless %}{% trans %}FAQ{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} <div class="content"> +<h1 class="section-title">FAQ</h1> {{forum_faq}} </div> {% endblock %} diff --git a/askbot/skins/default/templates/feedback.html b/askbot/skins/default/templates/feedback.html index d5e8b3a7..60ea2fca 100644 --- a/askbot/skins/default/templates/feedback.html +++ b/askbot/skins/default/templates/feedback.html @@ -2,7 +2,7 @@ <!-- template feedback.html --> {% block title %}{% spaceless %}{% trans %}Feedback{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -<h1>{% trans %}Give us your feedback!{% endtrans %}</h1> +<h1 class="section-title">{% trans %}Give us your feedback!{% endtrans %}</h1> <form method="post" action="{% url feedback %}" accept-charset="utf-8">{% csrf_token %} {% if user.is_authenticated() %} <p class="message"> @@ -39,7 +39,7 @@ {{form.next}} <div class="submit-row"> <input type="submit" class="submit" value="{% trans %}Send Feedback{% endtrans %}"/> - <input type="submit" class="submit" name="cancel" value="{% trans %}Cancel{% endtrans %}"/> + <input type="submit" class="submit cancel" name="cancel" value="{% trans %}Cancel{% endtrans %}"/> </div> </form> {% endblock %} diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index d0a27b5d..680b9d7b 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -92,7 +92,7 @@ poor design of the data or methods on data objects #} {% else %} {% trans %}posted{% endtrans %} {% endif %} - {% if post.__class__.__name__ in ('QuestionRevision', 'AnswerRevision') %} + {% if post.__class__.__name__ == 'PostRevision' %} <strong>{{post.revised_at|diff_date}}</strong> {% else %} <strong>{{post.added_at|diff_date}}</strong> @@ -106,7 +106,7 @@ poor design of the data or methods on data objects #} {% set last_edited_at = post.last_edited_at %} {% set original_author = post.author %} {% set update_author = post.last_edited_by %} - {% elif post.__class__.__name__ in ('QuestionRevision', 'AnswerRevision') %} + {% elif post.__class__.__name__ == 'PostRevision' %} {% set last_edited_at = post.revised_at %} {% set original_author = None %}{# fake value to force display widget in the revision views #} {% set update_author = post.author %} diff --git a/askbot/skins/default/templates/main_page/javascript.html b/askbot/skins/default/templates/main_page/javascript.html index deef318c..e35113dd 100644 --- a/askbot/skins/default/templates/main_page/javascript.html +++ b/askbot/skins/default/templates/main_page/javascript.html @@ -34,8 +34,13 @@ askbot['urls']['unmark_tag'] = scriptUrl + '{% url unmark_tag %}'; askbot['urls']['set_tag_filter_strategy'] = '{% url "set_tag_filter_strategy" %}'; askbot['urls']['questions'] = '{% url "questions" %}'; + {% if settings.ASKBOT_TRANSLATE_URL %} askbot['urls']['question_url_template'] = scriptUrl + '{% trans %}question/{% endtrans %}{{ "{{QuestionID}}/" }}'; askbot['urls']['user_url_template'] = scriptUrl + '{% trans %}users/{% endtrans %}{{ "{{user_id}}" }}/{{ "{{slug}}" }}/'; + {% else %} + askbot['urls']['question_url_template'] = scriptUrl + 'question/{{ "{{QuestionID}}/" }}'; + askbot['urls']['user_url_template'] = scriptUrl + 'users/{{ "{{user_id}}" }}/{{ "{{slug}}" }}/'; + {% endif %} askbot['messages']['name_of_anonymous_user'] = '{{ name_of_anonymous_user }}'; </script> <script type='text/javascript' src='{{"/js/editor.js"|media}}'></script> diff --git a/askbot/skins/default/templates/main_page/nothing_found.html b/askbot/skins/default/templates/main_page/nothing_found.html index 50f2f340..e6d65ea5 100644 --- a/askbot/skins/default/templates/main_page/nothing_found.html +++ b/askbot/skins/default/templates/main_page/nothing_found.html @@ -5,7 +5,7 @@ {% endif %} {% if scope == "favorite" %} {% trans %}No questions here. {% endtrans %} - {% trans %}Please star (bookmark) some questions or follow some users.{% endtrans %} + {% trans %}Please follow some questions or follow some users.{% endtrans %} {% endif %} </p> {% if query or search_tags or author_name %} diff --git a/askbot/skins/default/templates/main_page/tab_bar.html b/askbot/skins/default/templates/main_page/tab_bar.html index dc4ede35..5ed6e5b5 100644 --- a/askbot/skins/default/templates/main_page/tab_bar.html +++ b/askbot/skins/default/templates/main_page/tab_bar.html @@ -1,7 +1,11 @@ {% import "macros.html" as macros %} {% cache 0 "scope_sort_tabs" search_tags request.user scope sort query context.page context.page_size language_code %} <a class="rss" + {% if feed_url %} + href="{{settings.APP_URL}}{{feed_url}}" + {% else %} href="{{settings.APP_URL}}/feeds/rss/" + {% endif %} title="{% trans %}subscribe to the questions feed{% endtrans %}" >{% trans %}RSS{% endtrans %} </a> diff --git a/askbot/skins/default/templates/meta/bottom_scripts.html b/askbot/skins/default/templates/meta/bottom_scripts.html index 0693a3e4..0df25e7c 100644 --- a/askbot/skins/default/templates/meta/bottom_scripts.html +++ b/askbot/skins/default/templates/meta/bottom_scripts.html @@ -37,10 +37,8 @@ src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js" {% endif %} ></script> -<script type='text/javascript' src="{{"/js/i18n.js"|media }}"></script> -<script type='text/javascript' src="{{"/js/jquery.i18n.js"|media }}"></script> <script type='text/javascript' src="{{"/js/utils.js"|media }}"></script> -<link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:300,400,700' rel='stylesheet' type='text/css'> +<script type="text/javascript" src="{% url django.views.i18n.javascript_catalog %}"></script> {% if settings.ENABLE_MATHJAX %} <script type='text/javascript' src="{{settings.MATHJAX_BASE_URL}}/MathJax.js"> MathJax.Hub.Config({ diff --git a/askbot/skins/default/templates/meta/html_head_javascript.html b/askbot/skins/default/templates/meta/html_head_javascript.html index 900b1191..f960d11d 100644 --- a/askbot/skins/default/templates/meta/html_head_javascript.html +++ b/askbot/skins/default/templates/meta/html_head_javascript.html @@ -5,7 +5,6 @@ askbot['settings'] = {}; askbot['messages'] = {}; </script> -<script type="text/javascript" src="{% url django.views.i18n.javascript_catalog %}"></script> {% block forejs %} {% endblock %} {# avoid adding javascript here so that pages load faster #} diff --git a/askbot/skins/default/templates/meta/html_head_stylesheets.html b/askbot/skins/default/templates/meta/html_head_stylesheets.html index 9d5aebad..14f3c106 100644 --- a/askbot/skins/default/templates/meta/html_head_stylesheets.html +++ b/askbot/skins/default/templates/meta/html_head_stylesheets.html @@ -1,5 +1,10 @@ -<link href="{{"/style/style.css"|media }}" rel="stylesheet/less" type="text/css" /> +{% if settings.ASKBOT_CSS_DEVEL == False %} +<link href="{{"/style/style.css"|media }}" rel="stylesheet" type="text/css" /> +{% else %} +<link href="{{"/style/style.less"|media }}" rel="stylesheet/less" type="text/css" /> <script type="text/javascript" src="{{"/js/less.min.js"|media}}"></script> +{% endif %} +<link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:300,400,700' rel='stylesheet' type='text/css'> {{ skin.get_extra_css_link() }} {% if settings.USE_CUSTOM_CSS %} <link @@ -8,8 +13,3 @@ type="text/css" /> {% endif %} -{% if user_messages %} -<style type="text/css"> - body { margin-top:2.4em; } -</style> -{% endif %} diff --git a/askbot/skins/default/templates/privacy.html b/askbot/skins/default/templates/privacy.html index 61f4d945..e9b6f58b 100644 --- a/askbot/skins/default/templates/privacy.html +++ b/askbot/skins/default/templates/privacy.html @@ -1,8 +1,8 @@ -{% extends "one_column_body.html" %} +{% extends "two_column_body.html" %} <!-- privacy.html --> {% block title %}{% spaceless %}{% trans %}Privacy policy{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -<h1>{% trans %}Privacy policy{% endtrans %}</h1> +<h1 class="section-title">{% trans %}Privacy policy{% endtrans %}</h1> {{settings.FORUM_PRIVACY}} {% endblock %} <!-- end privacy.html --> diff --git a/askbot/skins/default/templates/question/answer_tab_bar.html b/askbot/skins/default/templates/question/answer_tab_bar.html index 24042b4a..3e39f795 100644 --- a/askbot/skins/default/templates/question/answer_tab_bar.html +++ b/askbot/skins/default/templates/question/answer_tab_bar.html @@ -1,11 +1,11 @@ <div class="tabBar tabBar-answer"> - <h1 id="questionCount"> + <h2 id="questionCount"> {% trans counter=answers|length %} {{counter}} Answer {% pluralize %} {{counter}} Answers {% endtrans %} - </h1> + </h2> <div class="tabsA"> <span class="label"> Sort by » diff --git a/askbot/skins/default/templates/question/javascript.html b/askbot/skins/default/templates/question/javascript.html index 552155de..c5dd9f37 100644 --- a/askbot/skins/default/templates/question/javascript.html +++ b/askbot/skins/default/templates/question/javascript.html @@ -11,9 +11,14 @@ askbot['urls']['editComment'] = '{% url edit_comment %}'; askbot['urls']['deleteComment'] = '{% url delete_comment %}'; askbot['urls']['getComment'] = '{% url get_comment %}'; + {%if settings.ASKBOT_TRANSLATE_URL %} askbot['urls']['question_url_template'] = scriptUrl + '{% trans %}question/{% endtrans %}{{ "{{QuestionID}}/{{questionSlug}}" }}';{# yes it needs to be that whacky #} - askbot['urls']['user_signin'] = '{{ settings.LOGIN_URL }}'; askbot['urls']['vote_url_template'] = scriptUrl + '{% trans %}questions/{% endtrans %}{{ "{{QuestionID}}/" }}{% trans %}vote/{% endtrans %}'; + {%else%} + askbot['urls']['question_url_template'] = scriptUrl + 'question/{{ "{{QuestionID}}/{{questionSlug}}" }}';{# yes it needs to be that whacky #} + askbot['urls']['vote_url_template'] = scriptUrl + 'questions/{{ "{{QuestionID}}/" }}vote/'; + {%endif%} + askbot['urls']['user_signin'] = '{{ settings.LOGIN_URL }}'; askbot['urls']['swap_question_with_answer'] = '{% url swap_question_with_answer %}'; askbot['urls']['upvote_comment'] = '{% url upvote_comment %}'; askbot['messages']['addComment'] = '{% trans %}add comment{% endtrans %}'; diff --git a/askbot/skins/default/templates/revisions.html b/askbot/skins/default/templates/revisions.html index 0c10e6d4..7fb985e2 100644 --- a/askbot/skins/default/templates/revisions.html +++ b/askbot/skins/default/templates/revisions.html @@ -3,7 +3,7 @@ <!-- revisions.html --> {% block title %}{% spaceless %}{% trans %}Revision history{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -<h1> +<h1 class="section-title"> {% trans %}Revision history{% endtrans %} [<a href="{{ post.get_absolute_url() }}">{% trans %}back{% endtrans %}</a>] </h1> <div id="revisions"> diff --git a/askbot/skins/default/templates/user_profile/user.html b/askbot/skins/default/templates/user_profile/user.html index 6ec4bc3a..1693303e 100644 --- a/askbot/skins/default/templates/user_profile/user.html +++ b/askbot/skins/default/templates/user_profile/user.html @@ -1,4 +1,4 @@ -{% extends "two_column_body.html" %} +{% extends "one_column_body.html" %} <!-- user.html --> {% block title %}{% spaceless %}{{ page_title }}{% endspaceless %}{% endblock %} {% block forestyle%} diff --git a/askbot/skins/default/templates/user_profile/user_reputation.html b/askbot/skins/default/templates/user_profile/user_reputation.html index 99b304d2..0deb2b97 100644 --- a/askbot/skins/default/templates/user_profile/user_reputation.html +++ b/askbot/skins/default/templates/user_profile/user_reputation.html @@ -8,16 +8,17 @@ <div id="diagram" class="karma-diagram"></div> <div class="karma-details"> {% if view_user.id == user.id %} - <h3>{% trans %}Your karma change log.{% endtrans %}</h3> + <h2>{% trans %}Your karma change log.{% endtrans %}</h2> {% else %} - <h3>{% trans user_name=view_user.username %}{{user_name}}'s karma change log{% endtrans %}</h3> + <h2>{% trans user_name=view_user.username %}{{user_name}}'s karma change log{% endtrans %}</h2> {% endif %} {% for rep in reputation %} <p> <span class="karma-gained">{{ rep.positive }}</span> <span class="karma-lost">{{ rep.negative }}</span> {{ rep.get_explanation_snippet() }} - <span class="small">({{rep.reputed_at|diff_date}})</span> + <span class="small">({{rep.reputed_at|diff_date}})</span> + <div class="clean"></div> </p> {% endfor %} </div> diff --git a/askbot/skins/default/templates/widgets/answer_edit_tips.html b/askbot/skins/default/templates/widgets/answer_edit_tips.html index 23e4df53..9cf0606e 100644 --- a/askbot/skins/default/templates/widgets/answer_edit_tips.html +++ b/askbot/skins/default/templates/widgets/answer_edit_tips.html @@ -1,8 +1,8 @@ <!-- template answer_edit_tips.html --> -<div class="boxC"> +<div class="box"> <h2>{% trans %}answer tips{% endtrans %}</h2> - <div> - <ul> + <div id="tips"> + <ul > <li> <b>{% trans %}please make your answer relevant to this community{% endtrans %}</b> </li> <li> @@ -16,12 +16,14 @@ </li> </ul> <p class='info-box-follow-up-links'> - <a href="{% url faq %}" target="_blank" title="{% trans %}see frequently asked questions{% endtrans %}">faq »</a> +<!-- will be change to a popup windows + <a href="{% url faq %}" target="_blank" title="{% trans %}see frequently asked questions{% endtrans %}">{% trans %}FAQ{% endtrans %} »</a> +--> </p> </div> </div> -<div class="boxC"> +<div class="box"> <h2>{% trans %}Markdown tips{% endtrans %}</h2> <ul> {% if settings.MARKUP_CODE_FRIENDLY or settings.ENABLE_MATHJAX %} @@ -57,7 +59,9 @@ </li> </ul> <p class='info-box-follow-up-links'> +<!-- will be change to a popup windows <a href="http://en.wikipedia.org/wiki/Markdown" target="_blank">{% trans %}learn more about Markdown{% endtrans %} »</a> +--> </p> </div> <!-- end template answer_edit_tips.html --> diff --git a/askbot/skins/default/templates/widgets/system_messages.html b/askbot/skins/default/templates/widgets/system_messages.html index 6b803846..10ba4a84 100644 --- a/askbot/skins/default/templates/widgets/system_messages.html +++ b/askbot/skins/default/templates/widgets/system_messages.html @@ -1,7 +1,7 @@ <div class="notify" style="display:none"> {% if user_messages %} {% for message in user_messages %} - <p>{{ message }}</p> + <p class="notification">{{ message }}</p> {% endfor %} {% endif %} <a id="closeNotify" onclick="notify.close(true)"></a> diff --git a/askbot/skins/loaders.py b/askbot/skins/loaders.py index 64d14072..24559512 100644 --- a/askbot/skins/loaders.py +++ b/askbot/skins/loaders.py @@ -108,9 +108,11 @@ def get_template(template, request = None): request variable will be used in the future to set template according to the user preference or admins preference - at this point request variable is not used though + request variable is used to localize the skin if possible """ skin = get_skin(request) + if hasattr(request,'LANGUAGE_CODE'): + skin.set_language(request.LANGUAGE_CODE) return skin.get_template(template) def render_into_skin(template, data, request, mimetype = 'text/html'): diff --git a/askbot/skins/old/media/js/post.js b/askbot/skins/old/media/js/post.js index 52772cc0..260d081e 100644 --- a/askbot/skins/old/media/js/post.js +++ b/askbot/skins/old/media/js/post.js @@ -1570,7 +1570,7 @@ var socialSharing = function(){ url = url.replace('{TEXT}', TEXT); var params = SERVICE_DATA[service_name]['params']; if(!window.open(url, "sharing", params)){ - window.location.href=share_url; + window.location.href=url; } } }); diff --git a/askbot/skins/old/templates/authopenid/email_validation.txt b/askbot/skins/old/templates/authopenid/email_validation.txt index 9c5baa8a..087ce844 100644 --- a/askbot/skins/old/templates/authopenid/email_validation.txt +++ b/askbot/skins/old/templates/authopenid/email_validation.txt @@ -6,9 +6,9 @@ {% trans %}Following the link above will help us verify your email address.{% endtrans %} -{% trans %}If you beleive that this message was sent in mistake - -no further action is needed. Just ingore this email, we apologize -for any inconvenience{% endtrans %} +{% trans %}If you believe that this message was sent in mistake - +no further action is needed. Just ignore this email, we apologize +for any inconvenience.{% endtrans %} {% trans %}Sincerely, Forum Administrator{% endtrans %} diff --git a/askbot/skins/old/templates/main_page/headline.html b/askbot/skins/old/templates/main_page/headline.html index 130a9bd9..71d36fa5 100644 --- a/askbot/skins/old/templates/main_page/headline.html +++ b/askbot/skins/old/templates/main_page/headline.html @@ -3,7 +3,11 @@ <div style="clear:both"> <p class="rss"> (<a + {% if feed_url %} + href="{{settings.APP_URL}}{{feed_url}}" + {% else %} href="{{settings.APP_URL}}/feeds/rss/" + {% endif %} title="{% trans %}subscribe to the questions feed{% endtrans %}" >{% trans %}rss feed{% endtrans %}</a>) </p> diff --git a/askbot/startup_procedures.py b/askbot/startup_procedures.py index 94d9b852..7ca06e1b 100644 --- a/askbot/startup_procedures.py +++ b/askbot/startup_procedures.py @@ -8,6 +8,7 @@ question: why not run these from askbot/__init__.py? the main function is run_startup_tests """ import sys +import os from django.db import transaction from django.conf import settings as django_settings from django.core.exceptions import ImproperlyConfigured @@ -34,7 +35,7 @@ def format_as_text_tuple_entries(items): # # *validate emails in settings.py def test_askbot_url(): - """Tests the ASKBOT_URL setting for the + """Tests the ASKBOT_URL setting for the well-formedness and raises the ImproperlyConfigured exception, if the setting is not good. """ @@ -76,6 +77,7 @@ def test_middleware(): 'django.middleware.common.CommonMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'askbot.middleware.anon_user.ConnectToSessionMessagesMiddleware', + 'askbot.middleware.forum_mode.ForumModeMiddleware', 'askbot.middleware.pagesize.QuestionsPageSizeMiddleware', 'askbot.middleware.cancel.CancelActionMiddleware', 'django.middleware.transaction.TransactionMiddleware', @@ -91,8 +93,8 @@ def test_middleware(): if missing_middleware_set: error_message = """\n\nPlease add the following middleware (listed after this message) -to the MIDDLEWARE_CLASSES variable in your site settings.py file. -The order the middleware records may be important, please take a look at the example in +to the MIDDLEWARE_CLASSES variable in your site settings.py file. +The order the middleware records may be important, please take a look at the example in https://github.com/ASKBOT/askbot-devel/blob/master/askbot/setup_templates/settings.py:\n\n""" middleware_text = format_as_text_tuple_entries(missing_middleware_set) raise ImproperlyConfigured(PREAMBLE + error_message + middleware_text) @@ -112,19 +114,8 @@ the list of MIDDLEWARE_CLASSES in your settings.py - these are not used any more middleware_text = format_as_text_tuple_entries(remove_middleware_set) raise ImproperlyConfigured(PREAMBLE + error_message + middleware_text) - - -def test_i18n(): - """askbot requires use of USE_I18N setting""" - if getattr(django_settings, 'USE_I18N', False) == False: - raise ImproperlyConfigured( - 'Please set USE_I18N = True in settings.py and ' - 'set the LANGUAGE_CODE parameter correctly ' - 'it is very important for askbot.' - ) - def try_import(module_name, pypi_package_name): - """tries importing a module and advises to install + """tries importing a module and advises to install A corresponding Python package in the case import fails""" try: load_module(module_name) @@ -173,17 +164,90 @@ def test_encoding(): ) def test_template_loader(): - """Sends a warning if you have an old style template + """Sends a warning if you have an old style template loader that used to send a warning""" old_template_loader = 'askbot.skins.loaders.load_template_source' if old_template_loader in django_settings.TEMPLATE_LOADERS: raise ImproperlyConfigured(PREAMBLE + \ "\nPlease change: \n" - "'askbot.skins.loaders.load_template_source', to\n" + "'askbot.skins.loaders.load_template_source', to\n" "'askbot.skins.loaders.filesystem_load_template_source',\n" "in the TEMPLATE_LOADERS of your settings.py file" ) +def test_celery(): + """Tests celery settings + todo: we are testing two things here + that correct name is used for the setting + and that a valid value is chosen + """ + broker_backend = getattr(django_settings, 'BROKER_BACKEND', None) + broker_transport = getattr(django_settings, 'BROKER_TRANSPORT', None) + + if broker_backend is None: + if broker_transport is None: + raise ImproperlyConfigured(PREAMBLE + \ + "\nPlease add\n" + 'BROKER_TRANSPORT = "djkombu.transport.DatabaseTransport"\n' + "or other valid value to your settings.py file" + ) + else: + #todo: check that broker transport setting is valid + return + + if broker_backend != broker_transport: + raise ImproperlyConfigured(PREAMBLE + \ + "\nPlease rename setting BROKER_BACKEND to BROKER_TRANSPORT\n" + "in your settings.py file\n" + "If you have both in your settings.py - then\n" + "delete the BROKER_BACKEND setting and leave the BROKER_TRANSPORT" + ) + + if hasattr(django_settings, 'BROKER_BACKEND') and not hasattr(django_settings, 'BROKER_TRANSPORT'): + raise ImproperlyConfigured(PREAMBLE + \ + "\nPlease rename setting BROKER_BACKEND to BROKER_TRANSPORT\n" + "in your settings.py file" + ) + +class SettingsTester(object): + """class to test contents of the settings.py file""" + + def __init__(self, requirements = None): + """loads the settings module and inits some variables + parameter `requirements` is a dictionary with keys + as setting names and values - another dictionary, which + has keys (optional, if noted and required otherwise):: + + * required_value (optional) + * error_message + """ + self.settings = load_module(os.environ['DJANGO_SETTINGS_MODULE']) + self.messages = list() + self.requirements = requirements + + + def test_setting(self, name, value = None, message = None): + """if setting does is not present or if the value != required_value, + adds an error message + """ + if not hasattr(self.settings, name): + self.messages.append(message) + elif value and getattr(self.settings, name) != value: + self.messages.append(message) + + def run(self): + for setting_name in self.requirements: + self.test_setting( + setting_name, + **self.requirements[setting_name] + ) + if len(self.messages) != 0: + raise ImproperlyConfigured( + PREAMBLE + + '\n\nTime to do some maintenance of your settings.py:\n\n* ' + + '\n\n* '.join(self.messages) + ) + def run_startup_tests(): """function that runs all startup tests, mainly checking settings config so far @@ -194,9 +258,27 @@ def run_startup_tests(): test_encoding() test_modules() test_askbot_url() - test_i18n() test_postgres() test_middleware() + test_celery() + settings_tester = SettingsTester({ + 'CACHE_MIDDLEWARE_ANONYMOUS_ONLY': { + 'value': True, + 'message': "add line CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True" + }, + 'USE_I18N': { + 'value': True, + 'message': 'Please set USE_I18N = True and\n' + 'set the LANGUAGE_CODE parameter correctly' + }, + 'LOGIN_REDIRECT_URL': { + 'message': 'add setting LOGIN_REDIRECT_URL - an url\n' + 'where you want to send users after they log in\n' + 'a reasonable default is\n' + 'LOGIN_REDIRECT_URL = ASKBOT_URL' + } + }) + settings_tester.run() @transaction.commit_manually def run(): diff --git a/askbot/tests/__init__.py b/askbot/tests/__init__.py index b06c2b06..ca74d696 100644 --- a/askbot/tests/__init__.py +++ b/askbot/tests/__init__.py @@ -1,3 +1,4 @@ +from askbot.tests.cache_tests import * from askbot.tests.email_alert_tests import * from askbot.tests.on_screen_notification_tests import * from askbot.tests.page_load_tests import * @@ -11,3 +12,5 @@ from askbot.tests.form_tests import * from askbot.tests.follow_tests import * from askbot.tests.templatefilter_tests import * from askbot.tests.markup_test import * +#from askbot.tests.misc_tests import * +from askbot.tests.post_model_tests import * diff --git a/askbot/tests/cache_tests.py b/askbot/tests/cache_tests.py new file mode 100644 index 00000000..5eda8c74 --- /dev/null +++ b/askbot/tests/cache_tests.py @@ -0,0 +1,43 @@ +from django.db import connection +from django.core.urlresolvers import reverse +from django.conf import settings +from askbot.tests.utils import AskbotTestCase + +class CacheTests(AskbotTestCase): + def setUp(self): + self.create_user() + self.create_user('other_user') + self.question = self.post_question() + self.post_answer(question = self.question) + settings.DEBUG = True # because it's forsed to False + + def visit_question(self): + self.client.get(self.question.get_absolute_url(), follow=True) + + def test_anonymous_question_cache(self): + + self.visit_question() + counter = len(connection.queries) + print 'we have %d queries' % counter + self.visit_question() + + #second hit to the same question should give fewer queries + self.assertTrue(counter > len(connection.queries)) + settings.DEBUG = False + + def test_authentificated_no_question_cache(self): + url = reverse('question', kwargs={'id': self.question.id}) + + password = '123' + self.other_user.set_password(password) + self.client.login(username=self.other_user.username, password=password) + + self.visit_question() + counter = len(connection.queries) + self.visit_question() + + #expect the same number of queries both times + self.assertEqual(counter, len(connection.queries)) + settings.DEBUG = False + + diff --git a/askbot/tests/db_api_tests.py b/askbot/tests/db_api_tests.py index e1268d9f..b54bb2e9 100644 --- a/askbot/tests/db_api_tests.py +++ b/askbot/tests/db_api_tests.py @@ -5,7 +5,6 @@ e.g. ``some_user.do_something(...)`` """ from django.core import exceptions from django.core.urlresolvers import reverse -from django.db import connection from django.test.client import Client from django.conf import settings from askbot.tests.utils import AskbotTestCase @@ -43,37 +42,6 @@ class DBApiTests(AskbotTestCase): self.assertTrue(post.deleted_by == None) self.assertTrue(post.deleted_at == None) - def test_anonymous_question_cache(self): - question = self.post_question() - settings.DEBUG = True # because it's forsed to False - url = reverse('question', kwargs={'id': question.id}) - - client = Client() - client.get(url, follow=True) - counter = len(connection.queries) - client.get(url, follow=True) - - self.assertTrue(counter > len(connection.queries)) - self.assertEqual(3, len(connection.queries)) # session-related only - settings.DEBUG = False - - def test_authentificated_no_question_cache(self): - question = self.post_question() - settings.DEBUG = True # because it's forsed to False - url = reverse('question', kwargs={'id': question.id}) - - password = '123' - client = Client() - self.other_user.set_password(password) - client.login(username=self.other_user.username, password=password) - - client.get(url, follow=True) - counter = len(connection.queries) - client.get(url, follow=True) - - self.assertEqual(counter, len(connection.queries)) - settings.DEBUG = False - def test_flag_question(self): self.user.set_status('m') self.user.flag_post(self.question) diff --git a/askbot/tests/email_alert_tests.py b/askbot/tests/email_alert_tests.py index dcea2e54..5ff45d6b 100644 --- a/askbot/tests/email_alert_tests.py +++ b/askbot/tests/email_alert_tests.py @@ -810,31 +810,84 @@ class TagFollowedInstantWholeForumEmailAlertTests(utils.AskbotTestCase): self.user1.email in outbox[0].recipients() ) -class UnansweredReminderTests(utils.AskbotTestCase): +class EmailReminderTestCase(utils.AskbotTestCase): + #subclass must define these (example below) + #enable_setting_name = 'ENABLE_UNANSWERED_REMINDERS' + #frequency_setting_name = 'UNANSWERED_REMINDER_FREQUENCY' + #days_before_setting_name = 'DAYS_BEFORE_SENDING_UNANSWERED_REMINDER' + #max_reminder_setting_name = 'MAX_UNANSWERED_REMINDERS' + def setUp(self): self.u1 = self.create_user(username = 'user1') self.u2 = self.create_user(username = 'user2') - askbot_settings.update('ENABLE_UNANSWERED_REMINDERS', True) - askbot_settings.update('MAX_UNANSWERED_REMINDERS', 5) - askbot_settings.update('UNANSWERED_REMINDER_FREQUENCY', 1) - askbot_settings.update('DAYS_BEFORE_SENDING_UNANSWERED_REMINDER', 2) - - self.wait_days = askbot_settings.DAYS_BEFORE_SENDING_UNANSWERED_REMINDER - self.recurrence_days = askbot_settings.UNANSWERED_REMINDER_FREQUENCY - self.max_emails = askbot_settings.MAX_UNANSWERED_REMINDERS + askbot_settings.update(self.enable_setting_name, True) + askbot_settings.update(self.max_reminder_setting_name, 5) + askbot_settings.update(self.frequency_setting_name, 1) + askbot_settings.update(self.days_before_setting_name, 2) + self.wait_days = getattr(askbot_settings, self.days_before_setting_name) + self.recurrence_days = getattr(askbot_settings, self.frequency_setting_name) + self.max_emails = getattr(askbot_settings, self.max_reminder_setting_name) def assert_have_emails(self, email_count = None): - management.call_command('send_unanswered_question_reminders') + management.call_command(self.command_name) outbox = django.core.mail.outbox self.assertEqual(len(outbox), email_count) def do_post(self, timestamp): - self.post_question( + self.question = self.post_question( user = self.u1, timestamp = timestamp ) + +class AcceptAnswerReminderTests(EmailReminderTestCase): + """only two test cases here, because the algorithm here + is the same as for unanswered questons, + except here we are dealing with the questions that have + or do not have an accepted answer + """ + enable_setting_name = 'ENABLE_ACCEPT_ANSWER_REMINDERS' + frequency_setting_name = 'ACCEPT_ANSWER_REMINDER_FREQUENCY' + days_before_setting_name = 'DAYS_BEFORE_SENDING_ACCEPT_ANSWER_REMINDER' + max_reminder_setting_name = 'MAX_ACCEPT_ANSWER_REMINDERS' + command_name = 'send_accept_answer_reminders' + + def do_post(self, timestamp): + super(AcceptAnswerReminderTests, self).do_post(timestamp) + self.answer = self.post_answer( + question = self.question, + user = self.u2, + timestamp = timestamp + ) + + def test_reminder_positive_wait(self): + """a positive test - user must receive a reminder + """ + days_ago = self.wait_days + timestamp = datetime.datetime.now() - datetime.timedelta(days_ago, 3600) + self.do_post(timestamp) + self.assert_have_emails(1) + + def test_reminder_negative_wait(self): + """negative test - the answer is accepted already""" + days_ago = self.wait_days + timestamp = datetime.datetime.now() - datetime.timedelta(days_ago, 3600) + self.do_post(timestamp) + self.u1.accept_best_answer( + answer = self.answer, + ) + self.assert_have_emails(0) + + +class UnansweredReminderTests(EmailReminderTestCase): + + enable_setting_name = 'ENABLE_UNANSWERED_REMINDERS' + frequency_setting_name = 'UNANSWERED_REMINDER_FREQUENCY' + days_before_setting_name = 'DAYS_BEFORE_SENDING_UNANSWERED_REMINDER' + max_reminder_setting_name = 'MAX_UNANSWERED_REMINDERS' + command_name = 'send_unanswered_question_reminders' + def test_reminder_positive_wait(self): """a positive test - user must receive a reminder """ diff --git a/askbot/tests/management_command_tests.py b/askbot/tests/management_command_tests.py index 9eb41cdf..001689c1 100644 --- a/askbot/tests/management_command_tests.py +++ b/askbot/tests/management_command_tests.py @@ -26,3 +26,26 @@ class ManagementCommandTests(AskbotTestCase): #try to log in user = auth.authenticate(username = username, password = password) self.assertTrue(user is not None) + + def test_merge_users(self): + """Verify a users account can be transfered to another user""" + # Create a new user and add some random related objects + user_one = self.create_user() + question = self.post_question(user=user_one) + comment = self.post_comment(user=user_one, parent_post=question) + number_of_gold = 50 + user_one.gold = number_of_gold + reputation = 20 + user_one.reputation = reputation + user_one.save() + # Create a second user and transfer all objects from 'user_one' to 'user_two' + user_two = self.create_user(username='unique') + management.call_command('merge_users', user_one.id, user_two.id) + # Check that the first user was deleted + self.assertEqual(models.User.objects.filter(pk=user_one.id).count(), 0) + # Explicitly check that the values assigned to user_one are now user_two's + self.assertEqual(user_two.questions.filter(pk=question.id).count(), 1) + self.assertEqual(user_two.comments.filter(pk=comment.id).count(), 1) + user_two = models.User.objects.get(pk=2) + self.assertEqual(user_two.gold, number_of_gold) + self.assertEqual(user_two.reputation, reputation) diff --git a/askbot/tests/misc_tests.py b/askbot/tests/misc_tests.py new file mode 100644 index 00000000..ddf16360 --- /dev/null +++ b/askbot/tests/misc_tests.py @@ -0,0 +1,50 @@ +import datetime +from django.contrib.contenttypes.models import ContentType +from django.test.client import Client +from askbot.tests.utils import AskbotTestCase +from askbot.conf import settings +from askbot import models +from askbot.models.badges import award_badges_signal + +from askbot.views.users import get_related_object_type_name + +class MiscTests(AskbotTestCase): + + def setUp(self): + self.u1 = self.create_user(username='user1') + self.u2 = self.create_user(username='user2') + self.u3 = self.create_user(username='user3') + + def test_get_related_object_type_name_for_question(self): + question = self.post_question(user=self.u1) + ct = ContentType.objects.get_for_model(question) + self.assertEqual('question', get_related_object_type_name(ct.id, question.id)) + + def test_get_related_object_type_name_for_question_revision(self): + question = self.post_question(user=self.u1) + revision = question.revisions.all()[0] + ct = ContentType.objects.get_for_model(revision) + self.assertEqual('question', get_related_object_type_name(ct.id, revision.id)) + + def test_get_related_object_type_name_for_answer(self): + question = self.post_question(user=self.u1) + answer = self.post_answer(user=self.u1, question=question) + ct = ContentType.objects.get_for_model(answer) + self.assertEqual('answer', get_related_object_type_name(ct.id, answer.id)) + + def test_get_related_object_type_name_for_answer_revision(self): + question = self.post_question(user=self.u1) + answer = self.post_answer(user=self.u1, question=question) + revision = answer.revisions.all()[0] + ct = ContentType.objects.get_for_model(revision) + self.assertEqual('answer', get_related_object_type_name(ct.id, revision.id)) + + def test_get_related_object_type_name_for_anything_else_1(self): + ct = ContentType.objects.get_for_model(self.u2) + self.assertIsNone(get_related_object_type_name(ct.id, self.u2.id)) + + def test_get_related_object_type_name_for_anything_else_2(self): + question = self.post_question(user=self.u1) + comment = self.post_comment(user=self.u1, parent_post=question) + ct = ContentType.objects.get_for_model(comment) + self.assertIsNone(get_related_object_type_name(ct.id, comment.id)) diff --git a/askbot/tests/page_load_tests.py b/askbot/tests/page_load_tests.py index 9c107112..e0bcce86 100644 --- a/askbot/tests/page_load_tests.py +++ b/askbot/tests/page_load_tests.py @@ -1,6 +1,7 @@ from django.test import TestCase from django.test import signals from django.template import defaultfilters +from django.conf import settings from django.core.urlresolvers import reverse import coffin import coffin.template @@ -8,11 +9,15 @@ from askbot import models from askbot.utils.slug import slugify from askbot.deployment import package_utils from askbot.tests.utils import AskbotTestCase +from askbot.conf import settings as askbot_settings +from askbot.tests.utils import skipIf import sys + def patch_jinja2(): from jinja2 import Template ORIG_JINJA2_RENDERER = Template.render + def instrumented_render(template_object, *args, **kwargs): context = dict(*args, **kwargs) signals.template_rendered.send( @@ -25,28 +30,38 @@ def patch_jinja2(): (CMAJOR, CMINOR, CMICRO) = package_utils.get_coffin_version() if CMAJOR == 0 and CMINOR == 3 and CMICRO < 4: + import ipdb; ipdb.set_trace() patch_jinja2() -class PageLoadTestCase(TestCase): + +class PageLoadTestCase(AskbotTestCase): def try_url( self, - url_name, status_code=200, template=None, + url_name, status_code=200, template=None, kwargs={}, redirect_url=None, follow=False, - data = {}, - ): - url = reverse(url_name, kwargs = kwargs) - url_info = 'getting url %s' % url + data={}): + url = reverse(url_name, kwargs=kwargs) + if status_code == 302: + url_info = 'redirecting to LOGIN_URL in closed_mode: %s' % url + else: + url_info = 'getting url %s' % url if data: url_info += '?' + '&'.join(['%s=%s' % (k, v) for k, v in data.iteritems()]) print url_info + # if redirect expected, but we wont' follow + if status_code == 302 and follow: + response = self.client.get(url, data=data) + self.assertTrue(settings.LOGIN_URL in response['Location']) + return + r = self.client.get(url, data=data, follow=follow) if hasattr(self.client, 'redirect_chain'): print 'redirect chain: %s' % ','.join(self.client.redirect_chain) self.assertEqual(r.status_code, status_code) - if template: + if template and status_code != 302: if isinstance(r.template, coffin.template.Template): self.assertEqual(r.template.name, template) elif isinstance(r.template, list): @@ -66,8 +81,29 @@ class PageLoadTestCase(TestCase): else: raise Exception('unexpected error while runnig test') -class PageLoadTests(PageLoadTestCase): - fixtures = ['tmp/fixture2.json', ] + def setUp(self): + self.u1 = self.create_user(username='user1') + self.u2 = self.create_user(username='user2') + self.u3 = self.create_user(username='user3') + + self.question = self.post_question(user=self.u1) + + self.answer = self.post_answer(user=self.u1, question=self.question) + self.answer.id = 38 # one of the tests tries this id + self.answer.save() + + self.question2 = self.post_question(user=self.u2) + self.question2.id = 2 + self.question2.save() + + self.question3 = self.post_question(user=self.u3) + self.question3.id = 3 + self.question3.save() + + self.question17 = self.post_question(user=self.u1) + self.question17.id = 17 + self.question17.save() + def test_index(self): #todo: merge this with all reader url tests @@ -77,168 +113,236 @@ class PageLoadTests(PageLoadTestCase): self.failUnless(response.redirect_chain[0][0].endswith('/questions/')) self.assertEquals(response.template.name, 'main_page.html') - def proto_test_non_user_urls(self): + def proto_test_ask_page(self, allow_anonymous, status_code): + prev_setting = askbot_settings.ALLOW_POSTING_BEFORE_LOGGING_IN + askbot_settings.update('ALLOW_POSTING_BEFORE_LOGGING_IN', allow_anonymous) + self.try_url( + 'ask', + status_code = status_code, + template = 'ask.html' + ) + askbot_settings.update('ALLOW_POSTING_BEFORE_LOGGING_IN', prev_setting) + + def test_ask_page_allowed_anonymous(self): + self.proto_test_ask_page(True, 200) + + def test_ask_page_disallowed_anonymous(self): + self.proto_test_ask_page(False, 302) + + def proto_test_non_user_urls(self, status_code): """test all reader views thoroughly on non-crashiness (no correcteness tests here) """ self.try_url('sitemap') - self.try_url('feeds', kwargs={'url':'rss'}) - self.try_url('about', template='about.html') - self.try_url('privacy', template='privacy.html') + self.try_url( + 'feeds', + status_code=status_code, + kwargs={'url':'rss'}) + self.try_url( + 'about', + status_code=status_code, + template='about.html') + self.try_url( + 'privacy', + status_code=status_code, + template='privacy.html') self.try_url('logout', template='authopenid/logout.html') #todo: test different tabs - self.try_url('tags', template='tags.html') - self.try_url('tags', data={'sort':'name'}, template='tags.html') - self.try_url('tags', data={'sort':'used'}, template='tags.html') - self.try_url('badges', template='badges.html') self.try_url( - 'answer_revisions', + 'tags', + status_code=status_code, + template='tags.html') + self.try_url( + 'tags', + status_code=status_code, + data={'sort':'name'}, template='tags.html') + self.try_url( + 'tags', + status_code=status_code, + data={'sort':'used'}, template='tags.html') + self.try_url( + 'badges', + status_code=status_code, + template='badges.html') + self.try_url( + 'answer_revisions', + status_code=status_code, template='revisions.html', kwargs={'id':38} ) #todo: test different sort methods and scopes self.try_url( 'questions', + status_code=status_code, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'start_over':'true'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'scope':'unanswered'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'scope':'favorite'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'scope':'unanswered', 'sort':'age-desc'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'scope':'unanswered', 'sort':'age-asc'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'scope':'unanswered', 'sort':'activity-desc'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'scope':'unanswered', 'sort':'activity-asc'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'sort':'answers-desc'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'sort':'answers-asc'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'sort':'votes-desc'}, template='main_page.html' ) self.try_url( 'questions', + status_code=status_code, data={'sort':'votes-asc'}, template='main_page.html' ) self.try_url( 'question', + status_code=status_code, kwargs={'id':1}, follow=True, template='question.html' ) self.try_url( 'question', + status_code=status_code, kwargs={'id':2}, follow=True, template='question.html' ) self.try_url( 'question', + status_code=status_code, kwargs={'id':3}, follow=True, template='question.html' ) self.try_url( 'question_revisions', + status_code=status_code, kwargs={'id':17}, template='revisions.html' ) - self.try_url('users', template='users.html') + self.try_url('users', + status_code=status_code, + template='users.html') #todo: really odd naming conventions for sort methods self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'reputation'}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'newest'}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'last'}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'user'}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'reputation', 'page':2}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'newest', 'page':2}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'last', 'page':2}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'user', 'page':2}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'reputation', 'page':1}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'newest', 'page':1}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'last', 'page':1}, ) self.try_url( 'users', + status_code=status_code, template='users.html', data={'sort':'user', 'page':1}, ) @@ -246,72 +350,99 @@ class PageLoadTests(PageLoadTestCase): 'edit_user', template='authopenid/signin.html', kwargs={'id':4}, - status_code=200, + status_code=status_code, follow=True, ) self.try_url( 'faq', template='faq_static.html', - status_code=200, + status_code=status_code, ) def test_non_user_urls(self): - self.proto_test_non_user_urls() + self.proto_test_non_user_urls(status_code=200) + + @skipIf('askbot.middleware.forum_mode.ForumModeMiddleware' \ + not in settings.MIDDLEWARE_CLASSES, + 'no ForumModeMiddleware set') + def test_non_user_urls_in_closed_forum_mode(self): + askbot_settings.ASKBOT_CLOSED_FORUM_MODE = True + self.proto_test_non_user_urls(status_code=302) + askbot_settings.ASKBOT_CLOSED_FORUM_MODE = False #def test_non_user_urls_logged_in(self): #user = User.objects.get(id=1) #somehow login this user #self.proto_test_non_user_urls() - def test_user_urls(self): + def proto_test_user_urls(self, status_code): user = models.User.objects.get(id=2) name_slug = slugify(user.username) self.try_url( - 'user_profile', + 'user_profile', kwargs={'id': 2, 'slug': name_slug}, - data={'sort':'stats'}, + status_code=status_code, + data={'sort':'stats'}, template='user_profile/user_stats.html' ) self.try_url( - 'user_profile', + 'user_profile', kwargs={'id': 2, 'slug': name_slug}, - data={'sort':'recent'}, + status_code=status_code, + data={'sort':'recent'}, template='user_profile/user_recent.html' ) self.try_url( - 'user_profile', + 'user_profile', kwargs={'id': 2, 'slug': name_slug}, - data={'sort':'inbox'}, + status_code=status_code, + data={'sort':'inbox'}, template='authopenid/signin.html', follow=True ) self.try_url( - 'user_profile', + 'user_profile', kwargs={'id': 2, 'slug': name_slug}, - data={'sort':'reputation'}, + status_code=status_code, + data={'sort':'reputation'}, template='user_profile/user_reputation.html' ) self.try_url( - 'user_profile', + 'user_profile', kwargs={'id': 2, 'slug': name_slug}, - data={'sort':'votes'}, + status_code=status_code, + data={'sort':'votes'}, template='authopenid/signin.html', follow = True ) self.try_url( - 'user_profile', + 'user_profile', kwargs={'id': 2, 'slug': name_slug}, - data={'sort':'favorites'}, + status_code=status_code, + data={'sort':'favorites'}, template='user_profile/user_favorites.html' ) self.try_url( - 'user_profile', + 'user_profile', kwargs={'id': 2, 'slug': name_slug}, - data={'sort':'email_subscriptions'}, + status_code=status_code, + data={'sort':'email_subscriptions'}, template='authopenid/signin.html', follow = True ) + def test_user_urls(self): + self.proto_test_user_urls(status_code=200) + + @skipIf('askbot.middleware.forum_mode.ForumModeMiddleware' \ + not in settings.MIDDLEWARE_CLASSES, + 'no ForumModeMiddleware set') + def test_user_urls_in_closed_forum_mode(self): + askbot_settings.ASKBOT_CLOSED_FORUM_MODE = True + self.proto_test_user_urls(status_code=302) + askbot_settings.ASKBOT_CLOSED_FORUM_MODE = False + + def test_user_urls_logged_in(self): user = models.User.objects.get(id=2) name_slug = slugify(user.username) @@ -338,12 +469,13 @@ class PageLoadTests(PageLoadTestCase): ) self.client.login(method = 'force', user_id = asker.id) self.try_url( - 'user_profile', + 'user_profile', kwargs={'id': asker.id, 'slug': slugify(asker.username)}, - data={'sort':'inbox'}, + data={'sort':'inbox'}, template='user_profile/user_inbox.html', ) + class AvatarTests(AskbotTestCase): def test_avatar_for_two_word_user_works(self): diff --git a/askbot/tests/permission_assertion_tests.py b/askbot/tests/permission_assertion_tests.py index fc1fbcb7..b83d7827 100644 --- a/askbot/tests/permission_assertion_tests.py +++ b/askbot/tests/permission_assertion_tests.py @@ -1,10 +1,15 @@ import datetime +from django.test.client import Client +from django.core.urlresolvers import reverse +from django.conf import settings from django.test import TestCase from django.core import exceptions from askbot.tests import utils from askbot.conf import settings as askbot_settings from askbot import models from askbot.templatetags import extra_filters as template_filters +from askbot.tests.utils import skipIf + class PermissionAssertionTestCase(TestCase): """base TestCase class for permission @@ -1573,3 +1578,43 @@ class UploadPermissionAssertionTests(PermissionAssertionTestCase): self.user.assert_can_upload_file() except exceptions.PermissionDenied: self.fail('high rep user must be able to upload') + +class ClosedForumTests(utils.AskbotTestCase): + def setUp(self): + self.password = '123' + self.create_user() + self.create_user(username = 'other_user') + self.other_user.set_password(self.password) + self.other_user.save() + self.question = self.post_question() + self.test_url = self.question.get_absolute_url() + self.redirect_to = settings.LOGIN_URL + self.client = Client() + askbot_settings.ASKBOT_CLOSED_FORUM_MODE = True + + @skipIf('askbot.middleware.forum_mode.ForumModeMiddleware' \ + not in settings.MIDDLEWARE_CLASSES, + 'no ForumModeMiddleware set') + def test_login_page_accessable(self): + # futher see in page_load_tests.py + response = self.client.get(reverse('user_signin')) + self.assertEquals(response.status_code, 200) + + @skipIf('askbot.middleware.forum_mode.ForumModeMiddleware' \ + not in settings.MIDDLEWARE_CLASSES, + 'no ForumModeMiddleware set') + def test_anonymous_access(self): + response = self.client.get(self.test_url) + self.assertEquals(response.status_code, 302) + self.assertTrue(self.redirect_to in response['Location']) + + @skipIf('askbot.middleware.forum_mode.ForumModeMiddleware' \ + not in settings.MIDDLEWARE_CLASSES, + 'no ForumModeMiddleware set') + def test_authenticated_access(self): + self.client.login(username=self.other_user.username, password=self.password) + response = self.client.get(self.test_url) + self.assertEquals(response.status_code, 200) + + def tearDown(self): + askbot_settings.ASKBOT_CLOSED_FORUM_MODE = False diff --git a/askbot/tests/post_model_tests.py b/askbot/tests/post_model_tests.py new file mode 100644 index 00000000..7ea8621a --- /dev/null +++ b/askbot/tests/post_model_tests.py @@ -0,0 +1,55 @@ +import datetime + +from django.core.exceptions import ValidationError +from askbot.tests.utils import AskbotTestCase +from askbot.models import PostRevision + + +class PostModelTests(AskbotTestCase): + + def setUp(self): + self.u1 = self.create_user(username='user1') + self.u2 = self.create_user(username='user2') + self.u3 = self.create_user(username='user3') + + def test_model_validation(self): + with self.assertRaises(NotImplementedError): + PostRevision.objects.create(text='blah', author=self.u1, revised_at=datetime.datetime.now(), revision_type=PostRevision.QUESTION_REVISION) + + with self.assertRaisesRegexp(AttributeError, r"'NoneType' object has no attribute 'revisions'"): + # cannot set `revision` without a parent + PostRevision.objects.create_answer_revision(text='blah', author=self.u1, revised_at=datetime.datetime.now()) + + with self.assertRaisesRegexp(ValidationError, r"{'__all__': \[u'One \(and only one\) of question/answer fields has to be set.'\], 'revision_type': \[u'Value 4 is not a valid choice.'\]}"): + # revision_type not in (1,2) + PostRevision(text='blah', author=self.u1, revised_at=datetime.datetime.now(), revision=1, revision_type=4).save() + + question = self.post_question(user=self.u1) + + rev2 = PostRevision(question=question, text='blah', author=self.u1, revised_at=datetime.datetime.now(), revision=2, revision_type=PostRevision.QUESTION_REVISION) + rev2.save() + self.assertIsNotNone(rev2.id) + + with self.assertRaisesRegexp(ValidationError, r"{'__all__': \[u'Revision_type doesn`t match values in question/answer fields.', u'Post revision with this Question and Revision already exists.'\]}"): + PostRevision(question=question, text='blah', author=self.u1, revised_at=datetime.datetime.now(), revision=2, revision_type=PostRevision.ANSWER_REVISION).save() + + with self.assertRaisesRegexp(ValidationError, r"{'__all__': \[u'Revision_type doesn`t match values in question/answer fields.'\]}"): + PostRevision(question=question, text='blah', author=self.u1, revised_at=datetime.datetime.now(), revision=3, revision_type=PostRevision.ANSWER_REVISION).save() + + rev3 = PostRevision.objects.create_question_revision(question=question, text='blah', author=self.u1, revised_at=datetime.datetime.now(), revision_type=123) # revision_type + self.assertIsNotNone(rev3.id) + self.assertEqual(3, rev3.revision) # By the way: let's test the auto-increase of revision number + self.assertEqual(PostRevision.QUESTION_REVISION, rev3.revision_type) + + def test_post_revision_autoincrease(self): + question = self.post_question(user=self.u1) + self.assertEqual(1, question.revisions.all()[0].revision) + self.assertEqual(1, question.revisions.count()) + + question.apply_edit(edited_by=self.u1, text="blah2", comment="blahc2") + self.assertEqual(2, question.revisions.all()[0].revision) + self.assertEqual(2, question.revisions.count()) + + question.apply_edit(edited_by=self.u1, text="blah3", comment="blahc3") + self.assertEqual(3, question.revisions.all()[0].revision) + self.assertEqual(3, question.revisions.count()) diff --git a/askbot/tests/utils.py b/askbot/tests/utils.py index 03478419..54a2a0ec 100644 --- a/askbot/tests/utils.py +++ b/askbot/tests/utils.py @@ -1,6 +1,7 @@ """utility functions used by Askbot test cases """ from django.test import TestCase +from django.utils.unittest.compatibility import wraps from askbot import models def create_user( @@ -176,3 +177,46 @@ class AskbotTestCase(TestCase): ) return comment + +""" +Some test decorators, taken from Django-1.3 +""" + + +class SkipTest(Exception): + """ + Raise this exception in a test to skip it. + + Usually you can use TestResult.skip() or one of the skipping decorators + instead of raising this directly. + """ + + +def _id(obj): + return obj + + +def skip(reason): + """ + Unconditionally skip a test. + """ + def decorator(test_item): + if not (isinstance(test_item, type) and issubclass(test_item, TestCase)): + @wraps(test_item) + def skip_wrapper(*args, **kwargs): + raise SkipTest(reason) + test_item = skip_wrapper + + test_item.__unittest_skip__ = True + test_item.__unittest_skip_why__ = reason + return test_item + return decorator + + +def skipIf(condition, reason): + """ + Skip a test if the condition is true. + """ + if condition: + return skip(reason) + return _id diff --git a/askbot/urls.py b/askbot/urls.py index a45a530f..be21217b 100644 --- a/askbot/urls.py +++ b/askbot/urls.py @@ -6,7 +6,6 @@ from django.conf import settings from django.conf.urls.defaults import url, patterns, include from django.conf.urls.defaults import handler500, handler404 from django.contrib import admin -from django.utils.translation import ugettext as _ from askbot import views from askbot.feed import RssLastestQuestionsFeed, RssIndividualQuestionFeed from askbot.sitemap import QuestionsSitemap @@ -15,6 +14,11 @@ from askbot.skins.utils import update_media_revision admin.autodiscover() update_media_revision()#needs to be run once, so put it here +if hasattr(settings, "ASKBOT_TRANSLATE_URL") and settings.ASKBOT_TRANSLATE_URL: + from django.utils.translation import ugettext as _ +else: + _ = lambda s:s + feeds = { 'rss': RssLastestQuestionsFeed, 'question':RssIndividualQuestionFeed diff --git a/askbot/utils/classes.py b/askbot/utils/classes.py new file mode 100644 index 00000000..4d1e1394 --- /dev/null +++ b/askbot/utils/classes.py @@ -0,0 +1,34 @@ +"""various utility classes""" +import datetime + +class ReminderSchedule(object): + """class that given the three settings: + * days to wait before sending the reminders + * frequency of reminders + * maximum number of reminders + return dates when to start sending the reminders, + when to stop, and give friendly names to other + variables + + These objects can be reused to all methods that + intend to remind of certain events periodically + """ + + def __init__(self, + days_before_starting = None, + frequency_days = None, + max_reminders = None): + """function that calculates values + and assigns them to user-friendly variable names + + * ``days_before_starting`` - days to wait before sending any reminders + * ``frequency_days`` - days to wait between sending reminders + * ``max_reminders`` - maximum number of reminders to send + """ + self.wait_period = datetime.timedelta(days_before_starting) + self.end_cutoff_date = datetime.datetime.now() - self.wait_period + + self.recurrence_delay = datetime.timedelta(frequency_days) + self.max_reminders = max_reminders + self.start_cutoff_date = self.end_cutoff_date - \ + (self.max_reminders - 1)*self.recurrence_delay diff --git a/askbot/utils/forms.py b/askbot/utils/forms.py index 575416bc..c3bccf24 100644 --- a/askbot/utils/forms.py +++ b/askbot/utils/forms.py @@ -11,19 +11,19 @@ import logging import urllib DEFAULT_NEXT = '/' + getattr(settings, 'ASKBOT_URL') -def clean_next(next): - if next is None: - return DEFAULT_NEXT +def clean_next(next, default = None): + if next is None or not next.startswith('/'): + if default: + return default + else: + return DEFAULT_NEXT next = str_to_unicode(urllib.unquote(next), 'utf-8') next = next.strip() - if next.startswith('/'): - logging.debug('next url is %s' % next) - return next - logging.debug('next url is %s' % DEFAULT_NEXT) - return DEFAULT_NEXT + logging.debug('next url is %s' % next) + return next -def get_next_url(request): - return clean_next(request.REQUEST.get('next')) +def get_next_url(request, default = None): + return clean_next(request.REQUEST.get('next'), default) class StrippedNonEmptyCharField(forms.CharField): def clean(self,value): diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 4a12fe2c..53ef519e 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -24,6 +24,7 @@ from django.core.urlresolvers import reverse from django.core import exceptions as django_exceptions from django.contrib.humanize.templatetags import humanize from django.views.decorators.cache import cache_page +from django.http import QueryDict import askbot from askbot import exceptions @@ -124,6 +125,24 @@ def questions(request): 'page_size' : search_state.page_size,#todo in T pagesize -> page_size } + # We need to pass the rss feed url based + # on the search state to the template. + # We use QueryDict to get a querystring + # from dicts and arrays. Much cleaner + # than parsing and string formating. + rss_query_dict = QueryDict("").copy() + if search_state.query: + # We have search string in session - pass it to + # the QueryDict + rss_query_dict.update({"q": search_state.query}) + if search_state.tags: + # We have tags in session - pass it to the + # QueryDict but as a list - we want tags+ + rss_query_dict.setlist("tags", search_state.tags) + + # Format the url with the QueryDict + context_feed_url = '/feeds/rss/?%s' % rss_query_dict.urlencode() + if request.is_ajax(): q_count = paginator.count @@ -170,7 +189,8 @@ def questions(request): 'question_counter': question_counter, 'questions': list(), 'related_tags': list(), - 'faces': list() + 'faces': list(), + 'feed_url': context_feed_url, } badge_levels = dict(const.BADGE_TYPE_CHOICES) @@ -223,6 +243,7 @@ def questions(request): reset_method_count += 1 if meta_data.get('author_name',None): reset_method_count += 1 + template_data = { 'active_tab': 'questions', @@ -249,6 +270,7 @@ def questions(request): 'font_size' : font_size, 'tag_filter_strategy_choices': const.TAG_FILTER_STRATEGY_CHOICES, 'update_avatar_data': schedules.should_update_avatar_data(request), + 'feed_url': context_feed_url, } assert(request.is_ajax() == False) @@ -350,11 +372,12 @@ def tags(request):#view showing a listing of available tags - plain list return render_into_skin('tags.html', data, request) @csrf.csrf_protect -@cache_page(60 * 5) +#@cache_page(60 * 5) def question(request, id):#refactor - long subroutine. display question body, answers and comments """view that displays body of the question and all answers to it """ + #process url parameters #todo: fix inheritance of sort method from questions default_sort_method = request.session.get('questions_sort_method', 'votes') form = ShowQuestionForm(request.GET, default_sort_method) @@ -373,7 +396,14 @@ def question(request, id):#refactor - long subroutine. display question body, an #redirect also happens if id of the object's origin post != requested id show_post = None #used for permalinks if show_comment is not None: - #comments + #if url calls for display of a specific comment, + #check that comment exists, that it belongs to + #the current question + #if it is an answer comment and the answer is hidden - + #redirect to the default view of the question + #if the question is hidden - redirect to the main page + #in addition - if url points to a comment and the comment + #is for the answer - we need the answer object try: show_comment = models.Comment.objects.get(id = show_comment) if str(show_comment.get_origin_post().id) != id: @@ -396,7 +426,10 @@ def question(request, id):#refactor - long subroutine. display question body, an return HttpResponseRedirect(reverse('index')) elif show_answer is not None: - #answers + #if the url calls to view a particular answer to + #question - we must check whether the question exists + #whether answer is actually corresponding to the current question + #and that the visitor is allowed to see it try: show_post = get_object_or_404(models.Answer, id = show_answer) if str(show_post.question.id) != id: diff --git a/askbot/views/users.py b/askbot/views/users.py index f1f29f71..130f79a4 100644 --- a/askbot/views/users.py +++ b/askbot/views/users.py @@ -38,27 +38,30 @@ from askbot.templatetags import extra_tags question_type = ContentType.objects.get_for_model(models.Question) answer_type = ContentType.objects.get_for_model(models.Answer) comment_type = ContentType.objects.get_for_model(models.Comment) -question_revision_type = ContentType.objects.get_for_model( - models.QuestionRevision - ) - -answer_revision_type = ContentType.objects.get_for_model( - models.AnswerRevision - ) +post_revision_type = ContentType.objects.get_for_model(models.PostRevision) repute_type = ContentType.objects.get_for_model(models.Repute) + question_type_id = question_type.id answer_type_id = answer_type.id comment_type_id = comment_type.id -question_revision_type_id = question_revision_type.id -answer_revision_type_id = answer_revision_type.id +post_revision_type_id = post_revision_type.id repute_type_id = repute_type.id #todo: queries in the user activity summary view must be redone -def get_related_object_type_name(content_type_id): - if content_type_id in (question_type_id, question_revision_type_id,): +def get_related_object_type_name(content_type_id, object_id): +# if content_type_id in (question_type_id, question_revision_type_id,): +# return 'question' +# elif content_type_id in (answer_type_id, answer_revision_type_id,): +# return 'answer' + + if content_type_id == question_type_id: return 'question' - elif content_type_id in (answer_type_id, answer_revision_type_id,): + elif content_type_id == answer_type_id: return 'answer' + elif content_type_id == post_revision_type_id: + post_revision = models.PostRevision.objects.get(id=object_id) + return post_revision.revision_type_str() + return None def owner_or_moderator_required(f): @@ -556,18 +559,20 @@ def user_recent(request, user, context): # question revisions revisions = models.Activity.objects.extra( select={ - 'title' : 'question_revision.title', - 'question_id' : 'question_revision.question_id', + 'title' : 'askbot_postrevision.title', + 'question_id' : 'askbot_postrevision.question_id', 'added_at' : 'activity.active_at', 'activity_type' : 'activity.activity_type', - 'summary' : 'question_revision.summary' + 'summary' : 'askbot_postrevision.summary' }, - tables=['activity', 'question_revision', 'question'], - where=['activity.content_type_id = %s AND activity.object_id = question_revision.id AND '+ - 'question_revision.id=question.id AND NOT question.deleted AND '+ - 'activity.user_id = question_revision.author_id AND activity.user_id = %s AND '+ - 'activity.activity_type=%s'], - params=[question_revision_type_id, user.id, const.TYPE_ACTIVITY_UPDATE_QUESTION], + tables=['activity', 'askbot_postrevision', 'question'], + where=[''' + activity.content_type_id=%s AND activity.object_id=askbot_postrevision.id AND + askbot_postrevision.question_id=question.id AND askbot_postrevision.revision_type=%s AND NOT question.deleted AND + activity.user_id=askbot_postrevision.author_id AND activity.user_id=%s AND + activity.activity_type=%s + '''], + params=[post_revision_type_id, models.PostRevision.QUESTION_REVISION, user.id, const.TYPE_ACTIVITY_UPDATE_QUESTION], order_by=['-activity.active_at'] ).values( 'title', @@ -590,16 +595,17 @@ def user_recent(request, user, context): 'answer_id' : 'answer.id', 'added_at' : 'activity.active_at', 'activity_type' : 'activity.activity_type', - 'summary' : 'answer_revision.summary' + 'summary' : 'askbot_postrevision.summary' }, - tables=['activity', 'answer_revision', 'question', 'answer'], - - where=['activity.content_type_id = %s AND activity.object_id = answer_revision.id AND '+ - 'activity.user_id = answer_revision.author_id AND activity.user_id = %s AND '+ - 'answer_revision.answer_id=answer.id AND answer.question_id = question.id AND '+ - 'NOT question.deleted AND NOT answer.deleted AND '+ - 'activity.activity_type=%s'], - params=[answer_revision_type_id, user.id, const.TYPE_ACTIVITY_UPDATE_ANSWER], + tables=['activity', 'askbot_postrevision', 'question', 'answer'], + where=[''' + activity.content_type_id=%s AND activity.object_id=askbot_postrevision.id AND + askbot_postrevision.answer_id=answer.id AND askbot_postrevision.revision_type=%s AND + answer.question_id=question.id AND NOT question.deleted AND NOT answer.deleted AND + activity.user_id=askbot_postrevision.author_id AND activity.user_id=%s AND + activity.activity_type=%s + '''], + params=[post_revision_type_id, models.PostRevision.ANSWER_REVISION, user.id, const.TYPE_ACTIVITY_UPDATE_ANSWER], order_by=['-activity.active_at'] ).values( 'title', @@ -662,7 +668,10 @@ def user_recent(request, user, context): 'activity_type' ) for award in awards: - related_object_type = get_related_object_type_name(award['content_type_id']) + related_object_type = get_related_object_type_name( + content_type_id=award['content_type_id'], + object_id=award['object_id'] + ) activities.append( AwardEvent( award['awarded_at'], diff --git a/askbot/views/writers.py b/askbot/views/writers.py index 8b07681a..5f073b37 100644 --- a/askbot/views/writers.py +++ b/askbot/views/writers.py @@ -274,7 +274,7 @@ def ask(request):#view used to ask a new question else: #attemp to get tags from search state search_state = request.session.get('search_state', None) - if search_state.tags: + if search_state and search_state.tags: tags = ' '.join(search_state.tags) form.initial['tags'] = tags @@ -363,7 +363,7 @@ def edit_question(request, id): if revision_form.is_valid(): # Replace with those from the selected revision rev_id = revision_form.cleaned_data['revision'] - selected_revision = models.QuestionRevision.objects.get( + selected_revision = models.PostRevision.objects.question_revisions().get( question = question, revision = rev_id ) @@ -448,7 +448,7 @@ def edit_answer(request, id): if revision_form.is_valid(): # Replace with those from the selected revision rev = revision_form.cleaned_data['revision'] - selected_revision = models.AnswerRevision.objects.get( + selected_revision = models.PostRevision.objects.answer_revisions().get( answer = answer, revision = rev ) diff --git a/askbot_requirements.txt b/askbot_requirements.txt index a1d3b603..fc11d9d1 100644 --- a/askbot_requirements.txt +++ b/askbot_requirements.txt @@ -16,3 +16,4 @@ django-kombu==0.9.2 django-followit django-recaptcha-works python-openid +pystache==0.3.1 @@ -25,6 +25,7 @@ install_requires = [ 'django-followit', 'django-recaptcha-works', 'python-openid', + 'pystache==0.3.1', ] import askbot |