From 84e573c204b24fe06d4edba03bf4b4696da3339a Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Wed, 14 Sep 2011 16:52:13 -0300 Subject: Added parameters to the askbot_setup command and checked verbosity TODO: finish templating of settings.py to make it work --- askbot/deployment/__init__.py | 199 +++++++++++++++++-------- askbot/deployment/path_utils.py | 31 ++-- askbot/deployment/template_loader.py | 13 ++ askbot/setup_templates/settings.py.mustache | 217 ++++++++++++++++++++++++++++ askbot_requirements.txt | 1 + 5 files changed, 392 insertions(+), 69 deletions(-) create mode 100644 askbot/deployment/template_loader.py create mode 100644 askbot/setup_templates/settings.py.mustache diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index 3f04e39d..bfddeccc 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -2,6 +2,7 @@ module for deploying askbot """ import os.path +from optparse import OptionParser from askbot.utils import console from askbot.deployment import messages from askbot.deployment import path_utils @@ -13,52 +14,102 @@ def askbot_setup(): or gives hints on how to add askbot to an existing Django project """ - #ask - print messages.DEPLOY_PREAMBLE + parser = OptionParser(usage="%prog [options]") + + parser.add_option("-v", "--verbose", + dest="verbosity", + type="int", + default=1, + help="verbosity level available values 0, 1, 2." + ) - 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: + parser.add_option("-n", + dest="name", + default=None, + help="Destination name" + ) - directory = raw_input(where_to_deploy_msg + ' ') + parser.add_option("-d", "--db-name", + dest="database_name", + default=None, + help="The database name" + ) - where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT + parser.add_option("-u", "--db-user", + dest="database_user", + default=None, + help="The database user" + ) - directory = os.path.normpath(directory) - directory = os.path.abspath(directory) + parser.add_option("-p", "--db-password", + dest="database_password", + default=None, + help="the database password" + ) - if os.path.isfile(directory): - print messages.CANT_INSTALL_INTO_FILE % {'path':directory} - directory = None - continue + (options, args) = parser.parse_args() + #ask + if options.verbosity >= 1: + print messages.DEPLOY_PREAMBLE - 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) + directory = options.name #directory where to put stuff + create_new = False #create new django project or not + where_to_deploy_msg = messages.WHERE_TO_DEPLOY + + if directory == None: + while directory is None: + where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT + directory = raw_input(where_to_deploy_msg + ' ') + directory = check_directory(directory, options) + if not directory: + 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: - directory = None - continue else: - assert(directory != None) + print messages.format_msg_dir_unclean_django(directory) + directory = None + continue + else: + #creates dir + 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 @@ -66,38 +117,70 @@ def askbot_setup(): 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: + print messages.format_msg_dir_not_writable(directory) + directory = None + continue + + deploy_askbot(directory, create_new, options) + else: + directory = check_directory(directory, options) + create_new = True + if directory==None: + raise Exception("the directory you choosed is invalid") + #TODO middle steps! + 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): + if options.verbosity >= 1: + print "Integrating askbot to your current app" + create_new=False + else: + assert(directory != None) + if path_utils.dir_name_acceptable(directory): + pass + else: + raise Exception(messages.format_msg_bad_dir_name(directory)) else: - directory = None - continue + raise Exception(messages.format_msg_dir_unclean_django(directory)) + else: + if path_utils.dir_name_acceptable(directory): + pass + else: + raise Exception(messages.format_msg_bad_dir_name(directory)) else: - print messages.format_msg_dir_not_writable(directory) - directory = None - continue + raise Exception(messages.format_msg_dir_not_writable(directory)) + + deploy_askbot(directory, create_new, options) +#separated all the directory creation process to make it more useful + +def deploy_askbot(directory, create_new, options): + '''function that copies the templates''' 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} + path_utils.deploy_into(directory, new_project = True, + verbosity = options.verbosity) + if options.verbosity >= 1: + print messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file} else: - path_utils.deploy_into(directory, new_project = False) - print messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file} + path_utils.deploy_into(directory, new_project = False, + verbosity = options.verbosity) + if options.verbosity >= 1: + print messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file} + +def check_directory(directory, options): + directory = os.path.normpath(directory) + directory = os.path.abspath(directory) + + if os.path.isfile(directory): + directory = None + if options.verbosity >= 1: + print messages.CANT_INSTALL_INTO_FILE % {'path':directory} + + return directory diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py index 6ad9fc99..7499e2c9 100644 --- a/askbot/deployment/path_utils.py +++ b/askbot/deployment/path_utils.py @@ -123,24 +123,27 @@ 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 = None, verbosity=1): """will copy necessary files into the directory """ assert(new_project is not None) if new_project: copy_files = ('__init__.py', 'settings.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 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 +151,8 @@ def deploy_into(directory, new_project = None): create_path(log_dir) touch(os.path.join(log_dir, 'askbot.log')) - print '' + if verbosity >=1: + print '' app_dir = os.path.join(directory, 'askbot') copy_dirs = ('doc', 'cron', 'upfiles') @@ -158,17 +162,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""" diff --git a/askbot/deployment/template_loader.py b/askbot/deployment/template_loader.py new file mode 100644 index 00000000..b7820ed0 --- /dev/null +++ b/askbot/deployment/template_loader.py @@ -0,0 +1,13 @@ +import os +import pystache +from path_utils import SOURCE_DIR + + +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/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache new file mode 100644 index 00000000..55fbb4a5 --- /dev/null +++ b/askbot/setup_templates/settings.py.mustache @@ -0,0 +1,217 @@ +## 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.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.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 +#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 +_ = lambda v:v #fake translation function for the login url +LOGIN_URL = '/%s%s%s' % (ASKBOT_URL,_('account/'),_('signin/')) +#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_BACKEND = "djkombu.transport.DatabaseTransport" +CELERY_ALWAYS_EAGER = True + +import djcelery +djcelery.setup_loader() + +CSRF_COOKIE_NAME = 'askbot_scrf' +CSRF_COOKIE_DOMAIN = ''#enter domain name here - e.g. example.com diff --git a/askbot_requirements.txt b/askbot_requirements.txt index 70bc5874..b4b5a1f4 100644 --- a/askbot_requirements.txt +++ b/askbot_requirements.txt @@ -15,3 +15,4 @@ django-kombu==0.9.2 django-followit django-recaptcha-works python-openid +pystache==0.3.1 -- cgit v1.2.3-1-g7c22 From e2c285f8208624a51c969f92e055808fb64f93a4 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Thu, 15 Sep 2011 10:13:45 -0300 Subject: almost done with new setup command options --- askbot/deployment/__init__.py | 14 ++++++++++++-- askbot/deployment/path_utils.py | 20 ++++++++++++++++++-- askbot/deployment/template_loader.py | 2 +- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index bfddeccc..10de3c25 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -162,15 +162,25 @@ def askbot_setup(): def deploy_askbot(directory, create_new, options): '''function that copies the templates''' help_file = path_utils.get_path_to_help_file() + context = {'database_name': options.database_name, + 'database_password': options.database_password, + 'database_user': options.database_user + } + 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 + if create_new: path_utils.create_path(directory) path_utils.deploy_into(directory, new_project = True, - verbosity = options.verbosity) + verbosity = options.verbosity, context = context) if options.verbosity >= 1: print messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file} else: path_utils.deploy_into(directory, new_project = False, - verbosity = options.verbosity) + verbosity = options.verbosity, context = context) if options.verbosity >= 1: print messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file} diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py index 7499e2c9..95f24735 100644 --- a/askbot/deployment/path_utils.py +++ b/askbot/deployment/path_utils.py @@ -11,6 +11,7 @@ import re import glob import shutil import imp +from askbot.deployment.template_loader import SettingsTemplate def split_at_break_point(directory): """splits directory path into two pieces @@ -123,12 +124,12 @@ 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, verbosity=1): +def deploy_into(directory, new_project = None, verbosity=1, context=None): """will copy necessary files into the directory """ assert(new_project is not None) 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') if verbosity >=1: print 'Copying files: ' @@ -151,6 +152,21 @@ def deploy_into(directory, new_project = None, verbosity=1): create_path(log_dir) touch(os.path.join(log_dir, 'askbot.log')) + #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): + if verbosity>=1: + print "* you already have a settings file please merge the contents" + else: + settings_file = open(settings_path, 'w+') + settings_file.write(settings_contents) + settings_file.close() + if verbosity>=1: + print "settings file created" + if verbosity >=1: print '' app_dir = os.path.join(directory, 'askbot') diff --git a/askbot/deployment/template_loader.py b/askbot/deployment/template_loader.py index b7820ed0..fe7c11e6 100644 --- a/askbot/deployment/template_loader.py +++ b/askbot/deployment/template_loader.py @@ -1,7 +1,7 @@ import os import pystache -from path_utils import SOURCE_DIR +SOURCE_DIR = os.path.dirname(os.path.dirname(__file__)) class SettingsTemplate(pystache.View): '''Class for settings''' -- cgit v1.2.3-1-g7c22 From 8d20cd9246a5215973aff41aa05da7c65a62a4b2 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Thu, 15 Sep 2011 10:56:39 -0300 Subject: added documentation --- askbot/doc/source/initial-configuration.rst | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/askbot/doc/source/initial-configuration.rst b/askbot/doc/source/initial-configuration.rst index 0cd2c033..25f0346f 100644 --- a/askbot/doc/source/initial-configuration.rst +++ b/askbot/doc/source/initial-configuration.rst @@ -29,10 +29,19 @@ 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.23 + `askbot-setup` also have command line arguments such as folder name(name), database name, database password and database user also added verbosity support. + +.. 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:: +.. deprecated:: 0.7.23 + 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 +49,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 -- cgit v1.2.3-1-g7c22 From 91a3a9b19a61b8d6d00cd3ad5c088418a4e593e4 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Tue, 20 Sep 2011 10:33:26 -0300 Subject: adding domain name parameter --- askbot/deployment/__init__.py | 9 ++++++++- askbot/setup_templates/settings.py.mustache | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index 10de3c25..50643798 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -47,6 +47,12 @@ def askbot_setup(): help="the database password" ) + parser.add_option("--domain", + dest="domain_name", + default=None, + help="the domain name of the instance" + ) + (options, args) = parser.parse_args() #ask if options.verbosity >= 1: @@ -164,7 +170,8 @@ def deploy_askbot(directory, create_new, options): help_file = path_utils.get_path_to_help_file() context = {'database_name': options.database_name, 'database_password': options.database_password, - 'database_user': options.database_user + 'database_user': options.database_user, + 'domain_name': options.domain_name } for key in context.keys(): if context[key] == None: diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache index 55fbb4a5..9a115077 100644 --- a/askbot/setup_templates/settings.py.mustache +++ b/askbot/setup_templates/settings.py.mustache @@ -213,5 +213,5 @@ CELERY_ALWAYS_EAGER = True import djcelery djcelery.setup_loader() -CSRF_COOKIE_NAME = 'askbot_scrf' -CSRF_COOKIE_DOMAIN = ''#enter domain name here - e.g. example.com +CSRF_COOKIE_NAME = '{{domain_name}}_scrf' +CSRF_COOKIE_DOMAIN = '{{domain_name}}'#enter domain name here - e.g. example.com -- cgit v1.2.3-1-g7c22 From bb2bb449fddb4ed66a3d8f5e281defd78d59b17a Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Tue, 20 Sep 2011 10:33:26 -0300 Subject: adding domain name parameter, added extra setup file appending --- askbot/deployment/__init__.py | 16 +++++++++++++++- askbot/deployment/path_utils.py | 6 ++++++ askbot/setup_templates/settings.py.mustache | 4 ++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index 10de3c25..d7dbe92b 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -47,6 +47,18 @@ def askbot_setup(): 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" + ) + (options, args) = parser.parse_args() #ask if options.verbosity >= 1: @@ -164,7 +176,9 @@ def deploy_askbot(directory, create_new, options): help_file = path_utils.get_path_to_help_file() context = {'database_name': options.database_name, 'database_password': options.database_password, - 'database_user': options.database_user + 'database_user': options.database_user, + 'domain_name': options.domain_name, + 'local_settings': options.local_settings } for key in context.keys(): if context[key] == None: diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py index 95f24735..64818b03 100644 --- a/askbot/deployment/path_utils.py +++ b/askbot/deployment/path_utils.py @@ -163,6 +163,12 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): else: settings_file = open(settings_path, 'w+') settings_file.write(settings_contents) + #Grab the file! + if 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" diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache index 55fbb4a5..9a115077 100644 --- a/askbot/setup_templates/settings.py.mustache +++ b/askbot/setup_templates/settings.py.mustache @@ -213,5 +213,5 @@ CELERY_ALWAYS_EAGER = True import djcelery djcelery.setup_loader() -CSRF_COOKIE_NAME = 'askbot_scrf' -CSRF_COOKIE_DOMAIN = ''#enter domain name here - e.g. example.com +CSRF_COOKIE_NAME = '{{domain_name}}_scrf' +CSRF_COOKIE_DOMAIN = '{{domain_name}}'#enter domain name here - e.g. example.com -- cgit v1.2.3-1-g7c22 From 24870d7752473d1604d2fc5c5354fcb6aafb8ef6 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Wed, 21 Sep 2011 09:38:27 -0300 Subject: fixed a bug and added some documentation --- askbot/doc/source/initial-configuration.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/askbot/doc/source/initial-configuration.rst b/askbot/doc/source/initial-configuration.rst index 25f0346f..7c4ba969 100644 --- a/askbot/doc/source/initial-configuration.rst +++ b/askbot/doc/source/initial-configuration.rst @@ -30,7 +30,8 @@ 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.23 - `askbot-setup` also have command line arguments such as folder name(name), database name, database password and database user also added verbosity support. + `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. .. note:: -- cgit v1.2.3-1-g7c22 From 139420e02a1efb53c581b411c9b9559cac43cbe8 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Tue, 27 Sep 2011 10:30:40 -0300 Subject: fixed a path error --- askbot/deployment/path_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py index 64818b03..ad289798 100644 --- a/askbot/deployment/path_utils.py +++ b/askbot/deployment/path_utils.py @@ -164,7 +164,7 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): settings_file = open(settings_path, 'w+') settings_file.write(settings_contents) #Grab the file! - if exists(context['local_settings']): + if os.path.exists(context['local_settings']): local_settings = open(context['local_settings'], 'r').read() settings_file.write('\n') settings_file.write(local_settings) -- cgit v1.2.3-1-g7c22 From 763f08898185a546a07fda8cf9c837932614148f Mon Sep 17 00:00:00 2001 From: Rosandra Cuello Date: Wed, 28 Sep 2011 01:00:53 -0700 Subject: properly internationalize javascript -- copied zh_CN tranlations from i18n.js, other languages remain --- askbot/locale/de/LC_MESSAGES/djangojs.po | 311 +++++++++++++++++++- askbot/locale/en/LC_MESSAGES/djangojs.po | 311 +++++++++++++++++++- askbot/locale/es/LC_MESSAGES/djangojs.po | 311 +++++++++++++++++++- askbot/locale/fi/LC_MESSAGES/djangojs.po | 311 +++++++++++++++++++- askbot/locale/fr/LC_MESSAGES/djangojs.po | 311 +++++++++++++++++++- askbot/locale/it/LC_MESSAGES/djangojs.po | 311 +++++++++++++++++++- askbot/locale/ja/LC_MESSAGES/djangojs.po | 310 +++++++++++++++++++- askbot/locale/ko/LC_MESSAGES/djangojs.po | 310 +++++++++++++++++++- askbot/locale/pt_BR/LC_MESSAGES/djangojs.po | 311 +++++++++++++++++++- askbot/locale/ro/LC_MESSAGES/djangojs.po | 312 ++++++++++++++++++++- askbot/locale/ru/LC_MESSAGES/djangojs.po | 312 ++++++++++++++++++++- askbot/locale/sr/LC_MESSAGES/djangojs.po | 312 ++++++++++++++++++++- askbot/locale/tr/LC_MESSAGES/djangojs.po | 311 +++++++++++++++++++- askbot/locale/vi/LC_MESSAGES/djangojs.po | 310 +++++++++++++++++++- askbot/locale/zh-tw/LC_MESSAGES/djangojs.po | 310 +++++++++++++++++++- askbot/locale/zh_CN/LC_MESSAGES/djangojs.po | 310 +++++++++++++++++++- .../common/media/jquery-openid/jquery.openid.js | 55 ++-- askbot/skins/common/media/js/post.js | 115 ++++---- askbot/skins/common/media/js/user.js | 10 +- askbot/skins/common/media/js/utils.js | 13 +- askbot/skins/common/media/js/wmd/wmd.js | 40 +-- .../templates/meta/html_head_javascript.html | 1 + askbot/urls.py | 2 +- 23 files changed, 4864 insertions(+), 346 deletions(-) diff --git a/askbot/locale/de/LC_MESSAGES/djangojs.po b/askbot/locale/de/LC_MESSAGES/djangojs.po index 4fdeb3e9..b890fa9f 100644 --- a/askbot/locale/de/LC_MESSAGES/djangojs.po +++ b/askbot/locale/de/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:24-0500\n" +"POT-Creation-Date: 2011-09-28 00:32-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,332 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/en/LC_MESSAGES/djangojs.po b/askbot/locale/en/LC_MESSAGES/djangojs.po index 3d39c7d3..8ec58477 100644 --- a/askbot/locale/en/LC_MESSAGES/djangojs.po +++ b/askbot/locale/en/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:25-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,332 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/es/LC_MESSAGES/djangojs.po b/askbot/locale/es/LC_MESSAGES/djangojs.po index 57d10b13..97370910 100644 --- a/askbot/locale/es/LC_MESSAGES/djangojs.po +++ b/askbot/locale/es/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:25-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,332 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/fi/LC_MESSAGES/djangojs.po b/askbot/locale/fi/LC_MESSAGES/djangojs.po index 78b1f23e..97370910 100644 --- a/askbot/locale/fi/LC_MESSAGES/djangojs.po +++ b/askbot/locale/fi/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:26-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,332 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/fr/LC_MESSAGES/djangojs.po b/askbot/locale/fr/LC_MESSAGES/djangojs.po index 96c21a1c..cba62186 100644 --- a/askbot/locale/fr/LC_MESSAGES/djangojs.po +++ b/askbot/locale/fr/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:27-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,332 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/it/LC_MESSAGES/djangojs.po b/askbot/locale/it/LC_MESSAGES/djangojs.po index ce10412c..97370910 100644 --- a/askbot/locale/it/LC_MESSAGES/djangojs.po +++ b/askbot/locale/it/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:27-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,332 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/ja/LC_MESSAGES/djangojs.po b/askbot/locale/ja/LC_MESSAGES/djangojs.po index 9dc61083..fdbc6f65 100644 --- a/askbot/locale/ja/LC_MESSAGES/djangojs.po +++ b/askbot/locale/ja/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:28-0500\n" +"POT-Creation-Date: 2011-09-28 00:32-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,331 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/ko/LC_MESSAGES/djangojs.po b/askbot/locale/ko/LC_MESSAGES/djangojs.po index b033cb97..7cec7ad6 100644 --- a/askbot/locale/ko/LC_MESSAGES/djangojs.po +++ b/askbot/locale/ko/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:29-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,331 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/pt_BR/LC_MESSAGES/djangojs.po b/askbot/locale/pt_BR/LC_MESSAGES/djangojs.po index eb07cced..cba62186 100644 --- a/askbot/locale/pt_BR/LC_MESSAGES/djangojs.po +++ b/askbot/locale/pt_BR/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:35-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,332 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/ro/LC_MESSAGES/djangojs.po b/askbot/locale/ro/LC_MESSAGES/djangojs.po index b6f24438..988f77ca 100644 --- a/askbot/locale/ro/LC_MESSAGES/djangojs.po +++ b/askbot/locale/ro/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:30-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,49 +18,333 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/ru/LC_MESSAGES/djangojs.po b/askbot/locale/ru/LC_MESSAGES/djangojs.po index a92490fb..e41757f3 100644 --- a/askbot/locale/ru/LC_MESSAGES/djangojs.po +++ b/askbot/locale/ru/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:30-0500\n" +"POT-Creation-Date: 2011-09-28 00:32-0700\n" "PO-Revision-Date: 2011-09-05 09:02\n" "Last-Translator: \n" "Language-Team: LANGUAGE \n" @@ -19,56 +19,340 @@ msgstr "" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" "X-Translated-Using: django-rosetta 0.6.2\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "Добавить закладку" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "%s закладка" msgstr[1] "%s закладки" msgstr[2] "%s закладок" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "
Есть закладка!
Убрать закладку
" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "Пожалуйста, добавьте заглавие к вопросу (>10 букв)" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "Тег \"\" подходит для:" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "и ещё %s, не показано..." -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" "Пожалуйста авторизуйтесь чтобы отметить " "профиль %(username)s" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" + #~ msgid "%(q_num)s question" #~ msgid_plural "%(q_num)s questions" #~ msgstr[0] "%(q_num)s вопрос" diff --git a/askbot/locale/sr/LC_MESSAGES/djangojs.po b/askbot/locale/sr/LC_MESSAGES/djangojs.po index 91b621d4..f3f038d0 100644 --- a/askbot/locale/sr/LC_MESSAGES/djangojs.po +++ b/askbot/locale/sr/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:31-0500\n" +"POT-Creation-Date: 2011-09-28 00:32-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,49 +18,333 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/tr/LC_MESSAGES/djangojs.po b/askbot/locale/tr/LC_MESSAGES/djangojs.po index 5872aa10..8ec58477 100644 --- a/askbot/locale/tr/LC_MESSAGES/djangojs.po +++ b/askbot/locale/tr/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:32-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,332 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" +msgstr[1] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/vi/LC_MESSAGES/djangojs.po b/askbot/locale/vi/LC_MESSAGES/djangojs.po index 3448d342..7cec7ad6 100644 --- a/askbot/locale/vi/LC_MESSAGES/djangojs.po +++ b/askbot/locale/vi/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:33-0500\n" +"POT-Creation-Date: 2011-09-28 00:33-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,331 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/zh-tw/LC_MESSAGES/djangojs.po b/askbot/locale/zh-tw/LC_MESSAGES/djangojs.po index 7e7b0ccb..4bc00569 100644 --- a/askbot/locale/zh-tw/LC_MESSAGES/djangojs.po +++ b/askbot/locale/zh-tw/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:50-0500\n" +"POT-Creation-Date: 2011-09-28 00:32-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,331 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "" + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/locale/zh_CN/LC_MESSAGES/djangojs.po b/askbot/locale/zh_CN/LC_MESSAGES/djangojs.po index 3448d342..b35c902e 100644 --- a/askbot/locale/zh_CN/LC_MESSAGES/djangojs.po +++ b/askbot/locale/zh_CN/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-10-08 02:33-0500\n" +"POT-Creation-Date: 2011-09-28 00:32-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,49 +17,331 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" -#: skins/default/media/js/post.js:532 +#: skins/common/media/jquery-openid/jquery.openid.js:73 +#, c-format +msgid "Are you sure you want to remove your %s login?" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:90 +msgid "Please add one or more login methods." +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:93 +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/common/media/jquery-openid/jquery.openid.js:135 +msgid "passwords do not match" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:162 +msgid "Show/change current login methods" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:223 +#, c-format +msgid "Please enter your %s, then proceed" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:225 +msgid "Connect your %(provider_name)s account to %(site)s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:319 +#, c-format +msgid "Change your %s password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:320 +msgid "Change password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:323 +#, c-format +msgid "Create a password for %s" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:324 +msgid "Create password" +msgstr "" + +#: skins/common/media/jquery-openid/jquery.openid.js:340 +msgid "Create a password-protected account" +msgstr "" + +#: skins/common/media/js/post.js:28 +msgid "loading..." +msgstr "读取中..." + +#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +msgid "tags cannot be empty" +msgstr "标签不能为空。" + +#: skins/common/media/js/post.js:133 +msgid "content cannot be empty" +msgstr "内容不能为空。" + +#: skins/common/media/js/post.js:134 +msgid "content minchars" +msgstr "请输入至少 {0} 字符。" + +#: skins/common/media/js/post.js:137 +msgid "please enter title" +msgstr "请输入标题。" + +#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +msgid "title minchars" +msgstr "请输入至少 {0} 字符。" + +#: skins/common/media/js/post.js:281 +msgid "insufficient privilege" +msgstr "用户权限不在操作范围" + +#: skins/common/media/js/post.js:282 +msgid "cannot pick own answer as best" +msgstr "不能设置自己的回答为最佳答案" + +#: skins/common/media/js/post.js:287 +msgid "please login" +msgstr "注册或者登录" + +#: skins/common/media/js/post.js:289 +msgid "anonymous users cannot follow questions" +msgstr "" + +#: skins/common/media/js/post.js:290 +msgid "anonymous users cannot subscribe to questions" +msgstr "" + +#: skins/common/media/js/post.js:291 +msgid "anonymous users cannot vote" +msgstr "" + +#: skins/common/media/js/post.js:293 +msgid "please confirm offensive" +msgstr "确定要归类该帖为广告、人身攻击、恶意言论吗?" + +#: skins/common/media/js/post.js:294 +msgid "anonymous users cannot flag offensive posts" +msgstr "匿名用户不能操作,请先" + +#: skins/common/media/js/post.js:295 +msgid "confirm delete" +msgstr "确定要删除/撤销删除该帖吗?" + +#: skins/common/media/js/post.js:296 +msgid "anonymous users cannot delete/undelete" +msgstr "匿名用户不能删除或撤销删除帖子" + +#: skins/common/media/js/post.js:297 +msgid "post recovered" +msgstr "操作成功!该帖子已被恢复。" + +#: skins/common/media/js/post.js:298 +msgid "post deleted" +msgstr "操作成功!该帖子已删除。" + +#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/default/media/js/post.js:541 skins/default/media/js/post.js.py:550 -#, perl-format +#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/default/media/js/post.js:546 +#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/old/media/js/post.js:549 msgid "
Following
Unfollow
" msgstr "" -#: skins/default/media/js/post.js:1613 +#: skins/common/media/js/post.js:612 +msgid "undelete" +msgstr "取消" + +#: skins/common/media/js/post.js:617 +msgid "delete" +msgstr "删除" + +#: skins/common/media/js/post.js:954 +msgid "add comment" +msgstr "添加评论" + +#: skins/common/media/js/post.js:957 +msgid "save comment" +msgstr "" + +#: skins/common/media/js/post.js:984 +msgid "enter more characters" +msgstr "" + +#: skins/common/media/js/post.js:989 +#, c-format +msgid "%s characters left" +msgstr "还可写%s字符" + +#: skins/common/media/js/post.js:1060 +msgid "cancel" +msgstr "" + +#: skins/common/media/js/post.js:1103 +msgid "confirm abandon comment" +msgstr "" + +#: skins/common/media/js/post.js:1177 +msgid "delete this comment" +msgstr "删除此评论" + +#: skins/common/media/js/post.js:1381 +msgid "confirm delete comment" +msgstr "真要删除此评论吗?" + +#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" +#: skins/common/media/js/tag_selector.js:15 #: skins/default/media/js/tag_selector.js:15 +#: skins/old/media/js/tag_selector.js:15 msgid "Tag \"\" matches:" msgstr "" +#: skins/common/media/js/tag_selector.js:84 #: skins/default/media/js/tag_selector.js:84 -#, perl-format +#: skins/old/media/js/tag_selector.js:84 +#, c-format msgid "and %s more, not shown..." msgstr "" -#: skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:14 +msgid "Please select at least one item" +msgstr "" + +#: skins/common/media/js/user.js:58 +msgid "Delete this notification?" +msgid_plural "Delete these notifications?" +msgstr[0] "" + +#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/default/media/js/user.js:161 -#, perl-format +#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/old/media/js/user.js:161 +#, c-format msgid "unfollow %s" msgstr "" -#: skins/default/media/js/user.js:164 -#, perl-format +#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/old/media/js/user.js:164 +#, c-format msgid "following %s" msgstr "" -#: skins/default/media/js/user.js:170 -#, perl-format +#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/old/media/js/user.js:170 +#, c-format msgid "follow %s" msgstr "" + +#: skins/common/media/js/utils.js:43 +msgid "click to close" +msgstr "点击消息框关闭" + +#: skins/common/media/js/utils.js:214 +msgid "click to edit this comment" +msgstr "" + +#: skins/common/media/js/utils.js:215 +msgid "edit" +msgstr "" + +#: skins/common/media/js/utils.js:369 +#, c-format +msgid "see questions tagged '%s'" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:30 +msgid "bold" +msgstr "粗体" + +#: skins/common/media/js/wmd/wmd.js:31 +msgid "italic" +msgstr "斜体" + +#: skins/common/media/js/wmd/wmd.js:32 +msgid "link" +msgstr "超链接" + +#: skins/common/media/js/wmd/wmd.js:33 +msgid "quote" +msgstr "引用" + +#: skins/common/media/js/wmd/wmd.js:34 +msgid "preformatted text" +msgstr "代码" + +#: skins/common/media/js/wmd/wmd.js:35 +msgid "image" +msgstr "图片" + +#: skins/common/media/js/wmd/wmd.js:36 +msgid "attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:37 +msgid "numbered list" +msgstr "数字编号列表" + +#: skins/common/media/js/wmd/wmd.js:38 +msgid "bulleted list" +msgstr "项目符号列表" + +#: skins/common/media/js/wmd/wmd.js:39 +msgid "heading" +msgstr "标题" + +#: skins/common/media/js/wmd/wmd.js:40 +msgid "horizontal bar" +msgstr "水平线" + +#: skins/common/media/js/wmd/wmd.js:41 +msgid "undo" +msgstr "撤销" + +#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +msgid "redo" +msgstr "重做" + +#: skins/common/media/js/wmd/wmd.js:53 +msgid "enter image url" +msgstr "输入图片地址

示例:
http://www.example.com/image.jpg \"我的截图\"" + +#: skins/common/media/js/wmd/wmd.js:54 +msgid "enter url" +msgstr "输入Web地址

示例:
http://www.cnprog.com/ \"我的网站\"

"" + +#: skins/common/media/js/wmd/wmd.js:55 +msgid "upload file attachment" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1778 +msgid "image description" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1781 +msgid "file name" +msgstr "" + +#: skins/common/media/js/wmd/wmd.js:1785 +msgid "link text" +msgstr "" diff --git a/askbot/skins/common/media/jquery-openid/jquery.openid.js b/askbot/skins/common/media/jquery-openid/jquery.openid.js index 7ba9adce..1d972b55 100644 --- a/askbot/skins/common/media/jquery-openid/jquery.openid.js +++ b/askbot/skins/common/media/jquery-openid/jquery.openid.js @@ -70,13 +70,7 @@ $.fn.authenticator = function() { ).find('button'); remove_button.click( function(){ - var message = $.i18n._( - 'Are you sure you want to remove ' + - 'your {provider} login?' - ).replace( - '{provider}', - provider_name - ); + var message = interpolate(gettext('Are you sure you want to remove your %s login?'), [provider_name]); if (confirm(message)){ $.ajax({ type: 'POST', @@ -93,10 +87,10 @@ $.fn.authenticator = function() { $('#ab-existing-login-methods').remove(); $('#ab-show-login-methods').remove(); $('h1').html( - $.i18n._("Please add one or more login methods.") + gettext("Please add one or more login methods.") ); $('#login-intro').html( - $.i18n._("You don\'t have a method to log in right now, please add one or more by clicking any of the icons below.") + gettext("You don\'t have a method to log in right now, please add one or more by clicking any of the icons below.") ); existing_login_methods = null; } @@ -138,7 +132,7 @@ $.fn.authenticator = function() { if (newpass.val() !== newpass_retyped.val()){ newpass_retyped.after( '' + - $.i18n._('passwords do not match') + + gettext('passwords do not match') + '' ); newpass.val('').focus(); @@ -165,7 +159,7 @@ $.fn.authenticator = function() { else { enabler = $( '

' + - $.i18n._('Show/change current login methods') + + gettext('Show/change current login methods') + '

'); setup_event_handlers( enabler, @@ -225,18 +219,15 @@ $.fn.authenticator = function() { reset_form(); var token_name = extra_token_name[provider_name] if (userIsAuthenticated){ - var heading_text = $.i18n._( - 'Please enter your {token_name}, then proceed' - ); $('#openid-heading').html( - heading_text.replace('{token_name}', token_name) + interpolate(gettext('Please enter your %s, then proceed'), [token_name]) ); - var button_text = $.i18n._('Connect your {provider_name} account to {site}'); - button_text = button_text.replace( - '{provider_name}', provider_name - ).replace( - '{site}', siteName - ); + var button_text = gettext('Connect your %(provider_name)s account to %(site)s'); + var data = { + provider_name: provider_name, + site: siteName + } + button_text = interpolate(button_text, data, true); openid_submit_button.val(button_text); } else { @@ -318,24 +309,22 @@ $.fn.authenticator = function() { if (userIsAuthenticated === true){ var password_button = $('input[name=change_password]'); var submit_action = submit_change_password; - if (existing_login_methods && existing_login_methods[provider_name]){ - var change_pw_heading = 'Change your {provider} password'; - var password_heading_text = $.i18n._(change_pw_heading); - var password_button_text = $.i18n._('Change password'); - } - else { - var create_pw_heading = 'Create a password for {provider}'; - var password_heading_text = $.i18n._(create_pw_heading); - var password_button_text = $.i18n._('Create password'); - } if (provider_name === 'local'){ var provider_cleaned_name = siteName; } else { var provider_cleaned_name = provider_name; } + if (existing_login_methods && existing_login_methods[provider_name]){ + var password_heading_text = interpolate(gettext('Change your %s password'), [provider_cleaned_name]) + var password_button_text = gettext('Change password') + } + else { + var password_heading_text = interpolate(gettext('Create a password for %s'), [provider_cleaned_name]) + var password_button_text = gettext('Create password') + } $('#password-heading').html( - password_heading_text.replace('{provider}', provider_cleaned_name) + password_heading_text ) password_button.val(password_button_text); password_action_input.val('change_password'); @@ -348,7 +337,7 @@ $.fn.authenticator = function() { var submit_action = submit_login_with_password; var create_pw_link = $('a.create-password-account') if (create_pw_link.length > 0){ - create_pw_link.html($.i18n._('Create a password-protected account')); + create_pw_link.html(gettext('Create a password-protected account')); var url = create_pw_link.attr('href'); if (url.indexOf('?') !== -1){ url = url.replace(/\?.*$/,'?login_provider=' + provider_name); diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js index 31d42803..0c98068e 100644 --- a/askbot/skins/common/media/js/post.js +++ b/askbot/skins/common/media/js/post.js @@ -25,11 +25,12 @@ var lanai = }; function appendLoader(element) { + loading = gettext('loading...') element.append('' +
-        $.i18n._('loading...') +
+        loading +
     ''); } @@ -123,18 +124,18 @@ var CPValidator = function(){ getQuestionFormMessages: function(){ return { tags: { - required: " " + $.i18n._('tags cannot be empty'), + required: " " + gettext('tags cannot be empty'), maxlength: askbot['messages']['tagLimits'], limit_tag_count: askbot['messages']['maxTagsPerPost'], limit_tag_length: askbot['messages']['maxTagLength'] }, text: { - required: " " + $.i18n._('content cannot be empty'), - minlength: $.i18n._('content minchars').replace('{0}', 10) + required: " " + gettext('content cannot be empty'), + minlength: gettext('content minchars').replace('{0}', 10) }, title: { - required: " " + $.i18n._('please enter title'), - minlength: $.i18n._('title minchars').replace('{0}', 10) + required: " " + gettext('please enter title'), + minlength: gettext('title minchars').replace('{0}', 10) } }; } @@ -277,24 +278,24 @@ var Vote = function(){ var questionSubscribeUpdates = 'question-subscribe-updates'; var questionSubscribeSidebar= 'question-subscribe-sidebar'; - var acceptAnonymousMessage = $.i18n._('insufficient privilege'); - var acceptOwnAnswerMessage = $.i18n._('cannot pick own answer as best'); + var acceptAnonymousMessage = gettext('insufficient privilege'); + var acceptOwnAnswerMessage = gettext('cannot pick own answer as best'); var pleaseLogin = " " - + $.i18n._('please login') + ""; + + gettext('please login') + ""; - var favoriteAnonymousMessage = $.i18n._('anonymous users cannot follow questions') + pleaseLogin; - var subscribeAnonymousMessage = $.i18n._('anonymous users cannot subscribe to questions') + pleaseLogin; - var voteAnonymousMessage = $.i18n._('anonymous users cannot vote') + pleaseLogin; + var favoriteAnonymousMessage = gettext('anonymous users cannot follow questions') + pleaseLogin; + var subscribeAnonymousMessage = gettext('anonymous users cannot subscribe to questions') + pleaseLogin; + var voteAnonymousMessage = gettext('anonymous users cannot vote') + pleaseLogin; //there were a couple of more messages... - var offensiveConfirmation = $.i18n._('please confirm offensive'); - var offensiveAnonymousMessage = $.i18n._('anonymous users cannot flag offensive posts') + pleaseLogin; - var removeConfirmation = $.i18n._('confirm delete'); - var removeAnonymousMessage = $.i18n._('anonymous users cannot delete/undelete') + pleaseLogin; - var recoveredMessage = $.i18n._('post recovered'); - var deletedMessage = $.i18n._('post deleted'); + var offensiveConfirmation = gettext('please confirm offensive'); + var offensiveAnonymousMessage = gettext('anonymous users cannot flag offensive posts') + pleaseLogin; + var removeConfirmation = gettext('confirm delete'); + var removeAnonymousMessage = gettext('anonymous users cannot delete/undelete') + pleaseLogin; + var recoveredMessage = gettext('post recovered'); + var deletedMessage = gettext('post deleted'); var VoteType = { acceptAnswer : 0, @@ -321,27 +322,27 @@ var Vote = function(){ return $(favoriteNumber); }; var getQuestionVoteUpButton = function(){ - var questionVoteUpButton = 'div.'+ voteContainerId +' div[id^='+ imgIdPrefixQuestionVoteup +']'; + var questionVoteUpButton = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixQuestionVoteup +']'; return $(questionVoteUpButton); }; var getQuestionVoteDownButton = function(){ - var questionVoteDownButton = 'div.'+ voteContainerId +' div[id^='+ imgIdPrefixQuestionVotedown +']'; + var questionVoteDownButton = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixQuestionVotedown +']'; return $(questionVoteDownButton); }; var getAnswerVoteUpButtons = function(){ - var answerVoteUpButton = 'div.'+ voteContainerId +' div[id^='+ imgIdPrefixAnswerVoteup +']'; + var answerVoteUpButton = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAnswerVoteup +']'; return $(answerVoteUpButton); }; var getAnswerVoteDownButtons = function(){ - var answerVoteDownButton = 'div.'+ voteContainerId +' div[id^='+ imgIdPrefixAnswerVotedown +']'; + var answerVoteDownButton = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAnswerVotedown +']'; return $(answerVoteDownButton); }; var getAnswerVoteUpButton = function(id){ - var answerVoteUpButton = 'div.'+ voteContainerId +' div[id='+ imgIdPrefixAnswerVoteup + id + ']'; + var answerVoteUpButton = 'div.'+ voteContainerId +' img[id='+ imgIdPrefixAnswerVoteup + id + ']'; return $(answerVoteUpButton); }; var getAnswerVoteDownButton = function(id){ - var answerVoteDownButton = 'div.'+ voteContainerId +' div[id='+ imgIdPrefixAnswerVotedown + id + ']'; + var answerVoteDownButton = 'div.'+ voteContainerId +' img[id='+ imgIdPrefixAnswerVotedown + id + ']'; return $(answerVoteDownButton); }; @@ -373,13 +374,22 @@ var Vote = function(){ return $(removeAnswerLinks); }; - var setVoteImage = function(voteType, undo, elem){ - elem.siblings('.post-vote').removeClass('on'); - if (undo){ - elem.removeClass('on'); - return; + 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")); + + // 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")); + } + else{ + $(getAnswerVoteUpButton(postId)).attr("src", mediaUrl("media/images/vote-arrow-up.png")); + $(getAnswerVoteDownButton(postId)).attr("src", mediaUrl("media/images/vote-arrow-down.png")); + } } - elem.addClass('on'); }; var setVoteNumber = function(object, number){ @@ -389,10 +399,12 @@ var Vote = function(){ var bindEvents = function(){ // accept answers - var acceptedButtons = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAccept +']'; - $(acceptedButtons).unbind('click').click(function(event){ - Vote.accept($(event.target)); - }); + if(questionAuthorId == currentUserId){ + var acceptedButtons = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAccept +']'; + $(acceptedButtons).unbind('click').click(function(event){ + Vote.accept($(event.target)); + }); + } // set favorite question var favoriteButton = getFavoriteButton(); favoriteButton.unbind('click').click(function(event){ @@ -555,7 +567,6 @@ var Vote = function(){ } else { if (data.status == '1'){ - //cancel vote setVoteImage(voteType, true, object); } else { @@ -598,12 +609,12 @@ var Vote = function(){ if (data.success == "1"){ if (removeActionType == 'delete'){ postNode.addClass('deleted'); - postRemoveLink.innerHTML = $.i18n._('undelete'); + postRemoveLink.innerHTML = gettext('undelete'); showMessage(object, deletedMessage); } else if (removeActionType == 'undelete') { postNode.removeClass('deleted'); - postRemoveLink.innerHTML = $.i18n._('delete'); + postRemoveLink.innerHTML = gettext('delete'); showMessage(object, recoveredMessage); } } @@ -828,7 +839,7 @@ var questionRetagger = function(){ setupInputEventHandlers(tagInput); //button = $(''); - //button.val($.i18n._('save tags')); + //button.val(gettext('save tags')); //div.append(button); //setupButtonEventHandlers(button); div.validate({//copy-paste from utils.js @@ -842,7 +853,7 @@ var questionRetagger = function(){ }, messages: { tags: { - required: $.i18n._('tags cannot be empty'), + required: gettext('tags cannot be empty'), maxlength: askbot['messages']['tagLimits'], limit_tag_count: askbot['messages']['maxTagsPerPost'], limit_tag_length: askbot['messages']['maxTagLength'] @@ -940,10 +951,10 @@ EditCommentForm.prototype.attachTo = function(comment, mode){ comment.getElement().hide(); this._comment_widget.hideButton(); if (this._type == 'add'){ - this._submit_btn.html($.i18n._('add comment')); + this._submit_btn.html(gettext('add comment')); } else { - this._submit_btn.html($.i18n._('save comment')); + this._submit_btn.html(gettext('save comment')); } this.getElement().show(); this.focus(); @@ -967,17 +978,17 @@ EditCommentForm.prototype.getCounterUpdater = function(){ var color = 'maroon'; if (length === 0){ - var feedback = $.i18n._('title minchars').replace('{0}', 10); + var feedback = gettext('title minchars').replace('{0}', 10); } else if (length < 10){ - var feedback = $.i18n._('enter more characters').replace('{0}', 10 - length); + var feedback = gettext('enter more characters').replace('{0}', 10 - length); } else { - color = length > length2 ? "#f00" : length > length1 ? "#f60" : "#999"; - var feedback = $.i18n._('{0} characters left') - .replace('{0}', maxCommentLength - length); + color = length > length2 ? "#f00" : length > length1 ? "#f60" : "#999" + chars = maxCommentLength - length + var feedback = interpolate(gettext('%s characters left'), [chars]) } - counter.html(feedback).css('color', color); + counter.html(feedback).css('color', color) }; return handler; }; @@ -1046,7 +1057,7 @@ EditCommentForm.prototype.createDom = function(){ this._submit_btn = $(''); div.append(this._submit_btn); this._cancel_btn = $(''); - this._cancel_btn.html($.i18n._('cancel')); + this._cancel_btn.html(gettext('cancel')); div.append(this._cancel_btn); setupButtonEventHandlers(this._submit_btn, this.getSaveHandler()); @@ -1089,7 +1100,7 @@ EditCommentForm.prototype.reset = function(){ EditCommentForm.prototype.confirmAbandon = function(){ this.focus(true); this._textarea.addClass('highlight'); - var answer = confirm($.i18n._('confirm abandon comment')); + var answer = confirm(gettext('confirm abandon comment')); this._textarea.removeClass('highlight'); return answer; }; @@ -1163,7 +1174,7 @@ var Comment = function(widget, data){ this._data = data || {}; this._blank = true;//set to false by setContent this._element = null; - this._delete_prompt = $.i18n._('delete this comment'); + this._delete_prompt = gettext('delete this comment'); if (data && data['is_deletable']){ this._deletable = data['is_deletable']; } @@ -1367,7 +1378,7 @@ Comment.prototype.getDeleteHandler = function(){ var comment = this; var del_icon = this._delete_icon; return function(){ - if (confirm($.i18n._('confirm delete comment'))){ + if (confirm(gettext('confirm delete comment'))){ comment.getElement().hide(); $.ajax({ type: 'POST', diff --git a/askbot/skins/common/media/js/user.js b/askbot/skins/common/media/js/user.js index 438a3273..d80adad6 100644 --- a/askbot/skins/common/media/js/user.js +++ b/askbot/skins/common/media/js/user.js @@ -11,7 +11,7 @@ $(document).ready(function(){ }); if (id_list.length === 0){ - alert($.i18n._('Please select at least one item')); + alert(gettext('Please select at least one item')); } return {id_list: id_list, elements: elements}; @@ -55,12 +55,8 @@ $(document).ready(function(){ return; } if (action_type == 'delete'){ - if (data['id_list'].length === 1){ - var msg = $.i18n._('Delete this notification?') - } - else { - var msg = $.i18n._('Delete these notifications?') - } + msg = ngettext('Delete this notification?', + 'Delete these notifications?', data['id_list'].length); if (confirm(msg) === false){ return; } diff --git a/askbot/skins/common/media/js/utils.js b/askbot/skins/common/media/js/utils.js index 2b2579ab..0afd03a7 100644 --- a/askbot/skins/common/media/js/utils.js +++ b/askbot/skins/common/media/js/utils.js @@ -40,7 +40,7 @@ var getUniqueWords = function(value){ var showMessage = function(element, msg, where) { var div = $('

' + msg + '

(' + - $.i18n._('click to close') + ')
'); + gettext('click to close') + ')'); div.click(function(event) { $(".vote-notification").fadeOut("fast", function() { $(this).remove(); }); @@ -211,8 +211,8 @@ EditLink.prototype.createDom = function(){ EditLink.prototype.decorate = function(element){ this._element = element; - this._element.attr('title', $.i18n._('click to edit this comment')); - this._element.html($.i18n._('edit')); + this._element.attr('title', gettext('click to edit this comment')); + this._element.html(gettext('edit')); this.setHandlerInternal(); }; @@ -366,12 +366,7 @@ Tag.prototype.createDom = function(){ this._inner_element.attr('rel', 'tag'); if (this._title === null){ this.setTitle( - $.i18n._( - "see questions tagged '{tag}'" - ).replace( - '{tag}', - this.getName() - ) + interpolate(gettext("see questions tagged '%s'"), [this.getName()]) ); } this._inner_element.attr('title', this._title); diff --git a/askbot/skins/common/media/js/wmd/wmd.js b/askbot/skins/common/media/js/wmd/wmd.js index bc3b5a0c..85e3ccd6 100644 --- a/askbot/skins/common/media/js/wmd/wmd.js +++ b/askbot/skins/common/media/js/wmd/wmd.js @@ -27,19 +27,19 @@ Attacklab.wmdBase = function(){ global.isOpera = /opera/.test(nav.userAgent.toLowerCase()); global.isKonqueror = /konqueror/.test(nav.userAgent.toLowerCase()); - var toolbar_strong_label = $.i18n._('bold') + " Ctrl-B"; - var toolbar_emphasis_label = $.i18n._('italic') + " Ctrl-I"; - var toolbar_hyperlink_label = $.i18n._('link') + " Ctrl-L"; - var toolbar_blockquote_label = $.i18n._('quote') + "
Ctrl-."; - var toolbar_code_label = $.i18n._('preformatted text') + "
 Ctrl-K";
-    var toolbar_image_label = $.i18n._('image') + "  Ctrl-G";
-    var toolbar_attachment_label = $.i18n._('attachment') + " Ctrl-F";
-    var toolbar_numbered_label = $.i18n._('numbered list') + " 
    Ctrl-O"; - var toolbar_bulleted_label = $.i18n._('bulleted list') + "
      Ctrl-U"; - var toolbar_heading_label = $.i18n._('heading') + "

      /

      Ctrl-H"; - var toolbar_horizontal_label = $.i18n._('horizontal bar') + "
      Ctrl-R"; - var toolbar_undo_label = $.i18n._('undo') + " Ctrl-Z"; - var toolbar_redo_label = $.i18n._('redo') + " Ctrl-Y"; + var toolbar_strong_label = gettext('bold') + " Ctrl-B"; + var toolbar_emphasis_label = gettext('italic') + " Ctrl-I"; + var toolbar_hyperlink_label = gettext('link') + "
      Ctrl-L"; + var toolbar_blockquote_label = gettext('quote') + "
      Ctrl-."; + var toolbar_code_label = gettext('preformatted text') + "
       Ctrl-K";
      +    var toolbar_image_label = gettext('image') + "  Ctrl-G";
      +    var toolbar_attachment_label = gettext('attachment') + " Ctrl-F";
      +    var toolbar_numbered_label = gettext('numbered list') + " 
        Ctrl-O"; + var toolbar_bulleted_label = gettext('bulleted list') + "
          Ctrl-U"; + var toolbar_heading_label = gettext('heading') + "

          /

          Ctrl-H"; + var toolbar_horizontal_label = gettext('horizontal bar') + "
          Ctrl-R"; + var toolbar_undo_label = gettext('undo') + " Ctrl-Z"; + var toolbar_redo_label = gettext('redo') + " Ctrl-Y"; // ------------------------------------------------------------------- // YOUR CHANGES GO HERE @@ -50,9 +50,9 @@ Attacklab.wmdBase = function(){ // The text that appears on the upper part of the dialog box when // entering links. - var imageDialogText = "

          " + $.i18n._('enter image url') + '

          '; - var linkDialogText = "

          " + $.i18n._('enter url') + '

          '; - var fileDialogText = "

          " + $.i18n._('upload file attachment') + '

          '; + var imageDialogText = "

          " + gettext('enter image url') + '

          '; + var linkDialogText = "

          " + gettext('enter url') + '

          '; + var fileDialogText = "

          " + gettext('upload file attachment') + '

          '; // The default text that appears in the dialog input box when entering // links. var imageDefaultText = "http://"; @@ -1113,7 +1113,7 @@ util.prompt = function(text, defaultInputText, makeLinkMarkdown, dialogType){ } else { // mac and other non-Windows platforms - redoButton.title = $.i18n._('redo') + " - Ctrl+Shift+Z"; + redoButton.title = gettext('redo') + " - Ctrl+Shift+Z"; } redoButton.XShift = "-240px"; redoButton.execute = function(manager){ @@ -1775,14 +1775,14 @@ util.prompt = function(text, defaultInputText, makeLinkMarkdown, dialogType){ if (!chunk.selection) { if (itemType == 'image') { - chunk.selection = $.i18n._("image description"); + chunk.selection = gettext("image description"); } else if (itemType == 'file'){ - chunk.selection = localUploadFileName || $.i18n._("file name"); + chunk.selection = localUploadFileName || gettext("file name"); localUploadFileName = null; } else { - chunk.selection = $.i18n._("link text"); + chunk.selection = gettext("link text"); } } } diff --git a/askbot/skins/default/templates/meta/html_head_javascript.html b/askbot/skins/default/templates/meta/html_head_javascript.html index f960d11d..900b1191 100644 --- a/askbot/skins/default/templates/meta/html_head_javascript.html +++ b/askbot/skins/default/templates/meta/html_head_javascript.html @@ -5,6 +5,7 @@ askbot['settings'] = {}; askbot['messages'] = {}; + {% block forejs %} {% endblock %} {# avoid adding javascript here so that pages load faster #} diff --git a/askbot/urls.py b/askbot/urls.py index 8c1e3c3a..a45a530f 100644 --- a/askbot/urls.py +++ b/askbot/urls.py @@ -280,7 +280,7 @@ urlpatterns = patterns('', url( r'^jsi18n/$', 'django.views.i18n.javascript_catalog', - {'packages': ('askbot',)}, + {'domain': 'djangojs','packages': ('askbot',)}, name = 'askbot_jsi18n' ), ) -- cgit v1.2.3-1-g7c22 From 52441036f659ac40cd6f1cbd82510a5f53a61134 Mon Sep 17 00:00:00 2001 From: Rosandra Cuello Date: Wed, 28 Sep 2011 08:32:41 -0700 Subject: i18n.js messages moved to .po files --- askbot/locale/de/LC_MESSAGES/djangojs.mo | Bin 408 -> 2686 bytes askbot/locale/de/LC_MESSAGES/djangojs.po | 120 +++++++------- askbot/locale/en/LC_MESSAGES/djangojs.mo | Bin 407 -> 2128 bytes askbot/locale/en/LC_MESSAGES/djangojs.po | 42 ++--- askbot/locale/es/LC_MESSAGES/djangojs.mo | Bin 408 -> 2815 bytes askbot/locale/es/LC_MESSAGES/djangojs.po | 120 +++++++------- askbot/locale/fi/LC_MESSAGES/djangojs.mo | Bin 408 -> 1658 bytes askbot/locale/fi/LC_MESSAGES/djangojs.po | 28 ++-- askbot/locale/fr/LC_MESSAGES/djangojs.mo | Bin 407 -> 2763 bytes askbot/locale/fr/LC_MESSAGES/djangojs.po | 118 +++++++------- askbot/locale/it/LC_MESSAGES/djangojs.mo | Bin 408 -> 2849 bytes askbot/locale/it/LC_MESSAGES/djangojs.po | 120 +++++++------- askbot/locale/ja/LC_MESSAGES/djangojs.mo | Bin 401 -> 401 bytes askbot/locale/ko/LC_MESSAGES/djangojs.mo | Bin 401 -> 401 bytes askbot/locale/pt_BR/LC_MESSAGES/djangojs.mo | Bin 407 -> 407 bytes askbot/locale/ro/LC_MESSAGES/djangojs.mo | Bin 472 -> 472 bytes askbot/locale/ru/LC_MESSAGES/djangojs.mo | Bin 1407 -> 7106 bytes askbot/locale/ru/LC_MESSAGES/djangojs.po | 173 +++++++++++---------- askbot/locale/sr/LC_MESSAGES/djangojs.mo | Bin 482 -> 482 bytes askbot/locale/tr/LC_MESSAGES/djangojs.mo | Bin 407 -> 2683 bytes askbot/locale/tr/LC_MESSAGES/djangojs.po | 120 +++++++------- askbot/locale/vi/LC_MESSAGES/djangojs.mo | Bin 401 -> 401 bytes askbot/locale/zh-tw/LC_MESSAGES/djangojs.mo | Bin 402 -> 2543 bytes askbot/locale/zh-tw/LC_MESSAGES/djangojs.po | 72 ++++----- askbot/locale/zh_CN/LC_MESSAGES/djangojs.mo | Bin 401 -> 2645 bytes askbot/locale/zh_CN/LC_MESSAGES/djangojs.po | 2 +- .../default/templates/meta/bottom_scripts.html | 1 - 27 files changed, 492 insertions(+), 424 deletions(-) diff --git a/askbot/locale/de/LC_MESSAGES/djangojs.mo b/askbot/locale/de/LC_MESSAGES/djangojs.mo index 7e87fdc8..71a9a6cb 100644 Binary files a/askbot/locale/de/LC_MESSAGES/djangojs.mo and b/askbot/locale/de/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/de/LC_MESSAGES/djangojs.po b/askbot/locale/de/LC_MESSAGES/djangojs.po index b890fa9f..6d48c0bb 100644 --- a/askbot/locale/de/LC_MESSAGES/djangojs.po +++ b/askbot/locale/de/LC_MESSAGES/djangojs.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-09-28 00:32-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2011-09-28 04:28-0800\n" +"Last-Translator: Rosandra Cuello \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" @@ -27,9 +27,7 @@ msgid "Please add one or more login methods." msgstr "" #: skins/common/media/jquery-openid/jquery.openid.js:93 -msgid "" -"You don't have a method to log in right now, please add one or more by " -"clicking any of the icons below." +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/common/media/jquery-openid/jquery.openid.js:135 @@ -73,39 +71,41 @@ msgstr "" #: skins/common/media/js/post.js:28 msgid "loading..." -msgstr "" +msgstr "Lade..." -#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +#: skins/common/media/js/post.js:127 +#: skins/common/media/js/post.js.c:856 msgid "tags cannot be empty" -msgstr "" +msgstr "Tags dürfen nicht leer sein" #: skins/common/media/js/post.js:133 msgid "content cannot be empty" -msgstr "" +msgstr "Inhalt darf nicht leer sein" #: skins/common/media/js/post.js:134 msgid "content minchars" -msgstr "" +msgstr "Bitte mindestens {0} Zeichen eingeben" #: skins/common/media/js/post.js:137 msgid "please enter title" -msgstr "" +msgstr "Bitte Titel eingeben" -#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +#: skins/common/media/js/post.js:138 +#: skins/common/media/js/post.js.c:981 msgid "title minchars" -msgstr "" +msgstr "Bitte mindestens {0} Zeichen eingeben" #: skins/common/media/js/post.js:281 msgid "insufficient privilege" -msgstr "" +msgstr "nicht genügend Rechte" #: skins/common/media/js/post.js:282 msgid "cannot pick own answer as best" -msgstr "" +msgstr "Eigene Antworten können nicht als die korrekte akzeptiert werden" #: skins/common/media/js/post.js:287 msgid "please login" -msgstr "" +msgstr "Bitte einloggen" #: skins/common/media/js/post.js:289 msgid "anonymous users cannot follow questions" @@ -117,62 +117,67 @@ msgstr "" #: skins/common/media/js/post.js:291 msgid "anonymous users cannot vote" -msgstr "" +msgstr "Gastbenutzer können nicht abstimmen " #: skins/common/media/js/post.js:293 msgid "please confirm offensive" -msgstr "" +msgstr "Bitte beleidigenden/regelwidrigen Beitrag bestätigen" #: skins/common/media/js/post.js:294 msgid "anonymous users cannot flag offensive posts" -msgstr "" +msgstr "Gastbenutzer können Beiträge nicht melden" #: skins/common/media/js/post.js:295 msgid "confirm delete" -msgstr "" +msgstr "Löschen bestätigen" #: skins/common/media/js/post.js:296 msgid "anonymous users cannot delete/undelete" -msgstr "" +msgstr "Gastbenutzer können Beiträge nicht löschen oder wiederherstellen" #: skins/common/media/js/post.js:297 msgid "post recovered" -msgstr "" +msgstr "Beitrag wiederhergestellt" #: skins/common/media/js/post.js:298 msgid "post deleted" -msgstr "" +msgstr "Beitrag gelöscht" -#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/common/media/js/post.js:536 +#: skins/default/media/js/post.js:535 #: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 -#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 -#: skins/old/media/js/post.js:544 skins/old/media/js/post.js.c:553 +#: skins/common/media/js/post.js:545 +#: skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 +#: skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/common/media/js/post.js:550 +#: skins/default/media/js/post.js:549 #: skins/old/media/js/post.js:549 msgid "
          Following
          Unfollow
          " msgstr "" #: skins/common/media/js/post.js:612 msgid "undelete" -msgstr "" +msgstr "wiederherstellen" #: skins/common/media/js/post.js:617 msgid "delete" -msgstr "" +msgstr "löschen" #: skins/common/media/js/post.js:954 msgid "add comment" -msgstr "" +msgstr "OK" #: skins/common/media/js/post.js:957 msgid "save comment" @@ -185,7 +190,7 @@ msgstr "" #: skins/common/media/js/post.js:989 #, c-format msgid "%s characters left" -msgstr "" +msgstr "%s characters left" #: skins/common/media/js/post.js:1060 msgid "cancel" @@ -197,13 +202,14 @@ msgstr "" #: skins/common/media/js/post.js:1177 msgid "delete this comment" -msgstr "" +msgstr "Diesen Kommentar löschen" #: skins/common/media/js/post.js:1381 msgid "confirm delete comment" -msgstr "" +msgstr "Löschen des Kommentars bestätigen" -#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/common/media/js/post.js:1622 +#: skins/default/media/js/post.js:1621 #: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" @@ -231,24 +237,28 @@ msgid_plural "Delete these notifications?" msgstr[0] "" msgstr[1] "" -#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:125 +#: skins/default/media/js/user.js:129 #: skins/old/media/js/user.js:129 msgid "Please
          signin to follow %(username)s" msgstr "" -#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/common/media/js/user.js:157 +#: skins/default/media/js/user.js:161 #: skins/old/media/js/user.js:161 #, c-format msgid "unfollow %s" msgstr "" -#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/common/media/js/user.js:160 +#: skins/default/media/js/user.js:164 #: skins/old/media/js/user.js:164 #, c-format msgid "following %s" msgstr "" -#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/common/media/js/user.js:166 +#: skins/default/media/js/user.js:170 #: skins/old/media/js/user.js:170 #, c-format msgid "follow %s" @@ -273,27 +283,27 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:30 msgid "bold" -msgstr "" +msgstr "Fett" #: skins/common/media/js/wmd/wmd.js:31 msgid "italic" -msgstr "" +msgstr "Kursiv" #: skins/common/media/js/wmd/wmd.js:32 msgid "link" -msgstr "" +msgstr "Link" #: skins/common/media/js/wmd/wmd.js:33 msgid "quote" -msgstr "" +msgstr "Zitat" #: skins/common/media/js/wmd/wmd.js:34 msgid "preformatted text" -msgstr "" +msgstr "Vorformatierter Text" #: skins/common/media/js/wmd/wmd.js:35 msgid "image" -msgstr "" +msgstr "Bild" #: skins/common/media/js/wmd/wmd.js:36 msgid "attachment" @@ -301,35 +311,36 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:37 msgid "numbered list" -msgstr "" +msgstr "Nummerierte Liste" #: skins/common/media/js/wmd/wmd.js:38 msgid "bulleted list" -msgstr "" +msgstr "Liste" #: skins/common/media/js/wmd/wmd.js:39 msgid "heading" -msgstr "" +msgstr "Titel" #: skins/common/media/js/wmd/wmd.js:40 msgid "horizontal bar" -msgstr "" +msgstr "horizontaler Balken" #: skins/common/media/js/wmd/wmd.js:41 msgid "undo" -msgstr "" +msgstr "Rückgängig" -#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +#: skins/common/media/js/wmd/wmd.js:42 +#: skins/common/media/js/wmd/wmd.js:1116 msgid "redo" -msgstr "" +msgstr "Wiederholen" #: skins/common/media/js/wmd/wmd.js:53 msgid "enter image url" -msgstr "" +msgstr "Bild-URL eingeben, zum Beispiel
          http://www.ihredomain.de/bildname.jpg" #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "" +msgstr "URL eingeben, zum Beispiel
          http://www.askbot.org/

          " #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" @@ -346,3 +357,4 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:1785 msgid "link text" msgstr "" + diff --git a/askbot/locale/en/LC_MESSAGES/djangojs.mo b/askbot/locale/en/LC_MESSAGES/djangojs.mo index 674f4542..2ff7a404 100644 Binary files a/askbot/locale/en/LC_MESSAGES/djangojs.mo and b/askbot/locale/en/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/en/LC_MESSAGES/djangojs.po b/askbot/locale/en/LC_MESSAGES/djangojs.po index 8ec58477..783a1d82 100644 --- a/askbot/locale/en/LC_MESSAGES/djangojs.po +++ b/askbot/locale/en/LC_MESSAGES/djangojs.po @@ -77,7 +77,7 @@ msgstr "" #: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 msgid "tags cannot be empty" -msgstr "" +msgstr "please enter at least one tag" #: skins/common/media/js/post.js:133 msgid "content cannot be empty" @@ -85,7 +85,7 @@ msgstr "" #: skins/common/media/js/post.js:134 msgid "content minchars" -msgstr "" +msgstr "please enter more than {0} characters" #: skins/common/media/js/post.js:137 msgid "please enter title" @@ -93,7 +93,7 @@ msgstr "" #: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 msgid "title minchars" -msgstr "" +msgstr "please enter at least {0} characters" #: skins/common/media/js/post.js:281 msgid "insufficient privilege" @@ -101,7 +101,7 @@ msgstr "" #: skins/common/media/js/post.js:282 msgid "cannot pick own answer as best" -msgstr "" +msgstr "sorry, you cannot accept your own answer" #: skins/common/media/js/post.js:287 msgid "please login" @@ -117,11 +117,11 @@ msgstr "" #: skins/common/media/js/post.js:291 msgid "anonymous users cannot vote" -msgstr "" +msgstr "sorry, anonymous users cannot vote " #: skins/common/media/js/post.js:293 msgid "please confirm offensive" -msgstr "" +msgstr "are you sure this post is offensive, contains spam, advertising, malicious remarks, etc.?" #: skins/common/media/js/post.js:294 msgid "anonymous users cannot flag offensive posts" @@ -129,24 +129,24 @@ msgstr "" #: skins/common/media/js/post.js:295 msgid "confirm delete" -msgstr "" +msgstr "are you sure you want to delete this?" #: skins/common/media/js/post.js:296 msgid "anonymous users cannot delete/undelete" -msgstr "" +msgstr "sorry, anonymous users cannot delete or undelete posts" #: skins/common/media/js/post.js:297 msgid "post recovered" -msgstr "" +msgstr "your post is now restored!" #: skins/common/media/js/post.js:298 msgid "post deleted" -msgstr "" +msgstr "your post has been deleted" #: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 #: skins/old/media/js/post.js:535 msgid "Follow" -msgstr "" +msgstr "Follow" #: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 #: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 @@ -160,7 +160,7 @@ msgstr[1] "" #: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 #: skins/old/media/js/post.js:549 msgid "
          Following
          Unfollow
          " -msgstr "" +msgstr "FollowingUnfollow" #: skins/common/media/js/post.js:612 msgid "undelete" @@ -176,11 +176,11 @@ msgstr "" #: skins/common/media/js/post.js:957 msgid "save comment" -msgstr "" +msgstr "save comment" #: skins/common/media/js/post.js:984 msgid "enter more characters" -msgstr "" +msgstr "please enter at least {0} more characters" #: skins/common/media/js/post.js:989 #, c-format @@ -193,7 +193,7 @@ msgstr "" #: skins/common/media/js/post.js:1103 msgid "confirm abandon comment" -msgstr "" +msgstr "Are you sure you do not want to post this comment?" #: skins/common/media/js/post.js:1177 msgid "delete this comment" @@ -201,7 +201,7 @@ msgstr "" #: skins/common/media/js/post.js:1381 msgid "confirm delete comment" -msgstr "" +msgstr "do you really want to delete this comment?" #: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 #: skins/old/media/js/post.js:1621 @@ -260,11 +260,11 @@ msgstr "" #: skins/common/media/js/utils.js:214 msgid "click to edit this comment" -msgstr "" +msgstr "click to edit this comment" #: skins/common/media/js/utils.js:215 msgid "edit" -msgstr "" +msgstr "edit" #: skins/common/media/js/utils.js:369 #, c-format @@ -325,15 +325,15 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:53 msgid "enter image url" -msgstr "" +msgstr "enter URL of the image, e.g. http://www.example.com/image.jpg or upload an image file" #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "" +msgstr "enter Web address, e.g. http://www.example.com \"page title\"" #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" -msgstr "" +msgstr "Please choose and upload a file:" #: skins/common/media/js/wmd/wmd.js:1778 msgid "image description" diff --git a/askbot/locale/es/LC_MESSAGES/djangojs.mo b/askbot/locale/es/LC_MESSAGES/djangojs.mo index 462417d2..b6e2eb66 100644 Binary files a/askbot/locale/es/LC_MESSAGES/djangojs.mo and b/askbot/locale/es/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/es/LC_MESSAGES/djangojs.po b/askbot/locale/es/LC_MESSAGES/djangojs.po index 97370910..a5dc9d4c 100644 --- a/askbot/locale/es/LC_MESSAGES/djangojs.po +++ b/askbot/locale/es/LC_MESSAGES/djangojs.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-09-28 00:33-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2011-09-28 04:20-0800\n" +"Last-Translator: Rosandra Cuello \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" @@ -27,9 +27,7 @@ msgid "Please add one or more login methods." msgstr "" #: skins/common/media/jquery-openid/jquery.openid.js:93 -msgid "" -"You don't have a method to log in right now, please add one or more by " -"clicking any of the icons below." +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/common/media/jquery-openid/jquery.openid.js:135 @@ -73,39 +71,41 @@ msgstr "" #: skins/common/media/js/post.js:28 msgid "loading..." -msgstr "" +msgstr "cargando..." -#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +#: skins/common/media/js/post.js:127 +#: skins/common/media/js/post.js.c:856 msgid "tags cannot be empty" -msgstr "" +msgstr "las etiquetas no pueden estar vacías" #: skins/common/media/js/post.js:133 msgid "content cannot be empty" -msgstr "" +msgstr "el contenido no puede estar vacío" #: skins/common/media/js/post.js:134 msgid "content minchars" -msgstr "" +msgstr "por favor introduzca mas de {0} caracteres" #: skins/common/media/js/post.js:137 msgid "please enter title" -msgstr "" +msgstr "por favor ingrese un título" -#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +#: skins/common/media/js/post.js:138 +#: skins/common/media/js/post.js.c:981 msgid "title minchars" -msgstr "" +msgstr "por favor introduzca al menos {0} caracteres" #: skins/common/media/js/post.js:281 msgid "insufficient privilege" -msgstr "" +msgstr "privilegio insuficiente" #: skins/common/media/js/post.js:282 msgid "cannot pick own answer as best" -msgstr "" +msgstr "no puede escoger su propia respuesta como la mejor" #: skins/common/media/js/post.js:287 msgid "please login" -msgstr "" +msgstr "por favor inicie sesión" #: skins/common/media/js/post.js:289 msgid "anonymous users cannot follow questions" @@ -117,62 +117,67 @@ msgstr "" #: skins/common/media/js/post.js:291 msgid "anonymous users cannot vote" -msgstr "" +msgstr "usuarios anónimos no pueden votar" #: skins/common/media/js/post.js:293 msgid "please confirm offensive" -msgstr "" +msgstr "por favor confirme ofensiva" #: skins/common/media/js/post.js:294 msgid "anonymous users cannot flag offensive posts" -msgstr "" +msgstr "usuarios anónimos no pueden marcar publicaciones como ofensivas" #: skins/common/media/js/post.js:295 msgid "confirm delete" -msgstr "" +msgstr "¿Está seguro que desea borrar esto?" #: skins/common/media/js/post.js:296 msgid "anonymous users cannot delete/undelete" -msgstr "" +msgstr "usuarios anónimos no pueden borrar o recuperar publicaciones" #: skins/common/media/js/post.js:297 msgid "post recovered" -msgstr "" +msgstr "publicación recuperada" #: skins/common/media/js/post.js:298 msgid "post deleted" -msgstr "" +msgstr "publicación borrada。" -#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/common/media/js/post.js:536 +#: skins/default/media/js/post.js:535 #: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 -#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 -#: skins/old/media/js/post.js:544 skins/old/media/js/post.js.c:553 +#: skins/common/media/js/post.js:545 +#: skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 +#: skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/common/media/js/post.js:550 +#: skins/default/media/js/post.js:549 #: skins/old/media/js/post.js:549 msgid "
          Following
          Unfollow
          " msgstr "" #: skins/common/media/js/post.js:612 msgid "undelete" -msgstr "" +msgstr "recuperar" #: skins/common/media/js/post.js:617 msgid "delete" -msgstr "" +msgstr "borrar" #: skins/common/media/js/post.js:954 msgid "add comment" -msgstr "" +msgstr "agregar comentario" #: skins/common/media/js/post.js:957 msgid "save comment" @@ -185,7 +190,7 @@ msgstr "" #: skins/common/media/js/post.js:989 #, c-format msgid "%s characters left" -msgstr "" +msgstr "%s caracteres faltantes" #: skins/common/media/js/post.js:1060 msgid "cancel" @@ -197,13 +202,14 @@ msgstr "" #: skins/common/media/js/post.js:1177 msgid "delete this comment" -msgstr "" +msgstr "borrar este comentario" #: skins/common/media/js/post.js:1381 msgid "confirm delete comment" -msgstr "" +msgstr "¿Realmente desea borrar este comentario?" -#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/common/media/js/post.js:1622 +#: skins/default/media/js/post.js:1621 #: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" @@ -231,24 +237,28 @@ msgid_plural "Delete these notifications?" msgstr[0] "" msgstr[1] "" -#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:125 +#: skins/default/media/js/user.js:129 #: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/common/media/js/user.js:157 +#: skins/default/media/js/user.js:161 #: skins/old/media/js/user.js:161 #, c-format msgid "unfollow %s" msgstr "" -#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/common/media/js/user.js:160 +#: skins/default/media/js/user.js:164 #: skins/old/media/js/user.js:164 #, c-format msgid "following %s" msgstr "" -#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/common/media/js/user.js:166 +#: skins/default/media/js/user.js:170 #: skins/old/media/js/user.js:170 #, c-format msgid "follow %s" @@ -273,27 +283,27 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:30 msgid "bold" -msgstr "" +msgstr "negrita" #: skins/common/media/js/wmd/wmd.js:31 msgid "italic" -msgstr "" +msgstr "cursiva" #: skins/common/media/js/wmd/wmd.js:32 msgid "link" -msgstr "" +msgstr "enlace" #: skins/common/media/js/wmd/wmd.js:33 msgid "quote" -msgstr "" +msgstr "citar" #: skins/common/media/js/wmd/wmd.js:34 msgid "preformatted text" -msgstr "" +msgstr "texto preformateado" #: skins/common/media/js/wmd/wmd.js:35 msgid "image" -msgstr "" +msgstr "imagen" #: skins/common/media/js/wmd/wmd.js:36 msgid "attachment" @@ -301,35 +311,36 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:37 msgid "numbered list" -msgstr "" +msgstr "lista numerada" #: skins/common/media/js/wmd/wmd.js:38 msgid "bulleted list" -msgstr "" +msgstr "lista no numerada" #: skins/common/media/js/wmd/wmd.js:39 msgid "heading" -msgstr "" +msgstr "encabezado" #: skins/common/media/js/wmd/wmd.js:40 msgid "horizontal bar" -msgstr "" +msgstr "barra horizontal" #: skins/common/media/js/wmd/wmd.js:41 msgid "undo" -msgstr "" +msgstr "deshacer" -#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +#: skins/common/media/js/wmd/wmd.js:42 +#: skins/common/media/js/wmd/wmd.js:1116 msgid "redo" -msgstr "" +msgstr "rehacer" #: skins/common/media/js/wmd/wmd.js:53 msgid "enter image url" -msgstr "" +msgstr "introduzca la URL de la imagen, por ejemplo:
          http://www.example.com/image.jpg \"titulo de imagen\"" #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "" +msgstr "introduzca direcciones web, ejemplo:
          http://www.cnprog.com/ \"titulo del enlace\"

          " #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" @@ -346,3 +357,4 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:1785 msgid "link text" msgstr "" + diff --git a/askbot/locale/fi/LC_MESSAGES/djangojs.mo b/askbot/locale/fi/LC_MESSAGES/djangojs.mo index 0be0e2e5..ec5b9631 100644 Binary files a/askbot/locale/fi/LC_MESSAGES/djangojs.mo and b/askbot/locale/fi/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/fi/LC_MESSAGES/djangojs.po b/askbot/locale/fi/LC_MESSAGES/djangojs.po index 97370910..d98fb20e 100644 --- a/askbot/locale/fi/LC_MESSAGES/djangojs.po +++ b/askbot/locale/fi/LC_MESSAGES/djangojs.po @@ -77,7 +77,7 @@ msgstr "" #: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 msgid "tags cannot be empty" -msgstr "" +msgstr "anna vähintään yksi tagi" #: skins/common/media/js/post.js:133 msgid "content cannot be empty" @@ -85,7 +85,7 @@ msgstr "" #: skins/common/media/js/post.js:134 msgid "content minchars" -msgstr "" +msgstr "syötä vähintään {0} merkkiä" #: skins/common/media/js/post.js:137 msgid "please enter title" @@ -93,7 +93,7 @@ msgstr "" #: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 msgid "title minchars" -msgstr "" +msgstr "syötä vähintään {0} merkkiä" #: skins/common/media/js/post.js:281 msgid "insufficient privilege" @@ -101,7 +101,7 @@ msgstr "" #: skins/common/media/js/post.js:282 msgid "cannot pick own answer as best" -msgstr "" +msgstr "et voi hyväksyä omaa vastaustasi parhaaksi" #: skins/common/media/js/post.js:287 msgid "please login" @@ -117,11 +117,11 @@ msgstr "" #: skins/common/media/js/post.js:291 msgid "anonymous users cannot vote" -msgstr "" +msgstr "kirjaudu sisään, jotta voit käyttää tätä ominaisuutta " #: skins/common/media/js/post.js:293 msgid "please confirm offensive" -msgstr "" +msgstr "oletko varma, että tämä on roskaposti, loukkaava tai muuta hyväksymätöntä?" #: skins/common/media/js/post.js:294 msgid "anonymous users cannot flag offensive posts" @@ -129,19 +129,19 @@ msgstr "" #: skins/common/media/js/post.js:295 msgid "confirm delete" -msgstr "" +msgstr "oletko varma, että haluat poistaa tämän?" #: skins/common/media/js/post.js:296 msgid "anonymous users cannot delete/undelete" -msgstr "" +msgstr "kirjaudu sisään, jotta voit käyttää tätä ominaisuutta" #: skins/common/media/js/post.js:297 msgid "post recovered" -msgstr "" +msgstr "postauksesi on palautettu!" #: skins/common/media/js/post.js:298 msgid "post deleted" -msgstr "" +msgstr "postauksesi on poistettu" #: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 #: skins/old/media/js/post.js:535 @@ -185,7 +185,7 @@ msgstr "" #: skins/common/media/js/post.js:989 #, c-format msgid "%s characters left" -msgstr "" +msgstr "%s merkkiä jäljellä" #: skins/common/media/js/post.js:1060 msgid "cancel" @@ -201,7 +201,7 @@ msgstr "" #: skins/common/media/js/post.js:1381 msgid "confirm delete comment" -msgstr "" +msgstr "oletko varma, että haluat poistaa tämän kommentin?" #: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 #: skins/old/media/js/post.js:1621 @@ -325,11 +325,11 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:53 msgid "enter image url" -msgstr "" +msgstr "Anna kuvan URL-osoite, esim. http://www.example.com/image.jpg \"kuvan otsikko\"" #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "" +msgstr "Anna URL-osoite, esim. http://www.example.com \"sivun otsikko\"" #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" diff --git a/askbot/locale/fr/LC_MESSAGES/djangojs.mo b/askbot/locale/fr/LC_MESSAGES/djangojs.mo index 386cff64..0a8cfd17 100644 Binary files a/askbot/locale/fr/LC_MESSAGES/djangojs.mo and b/askbot/locale/fr/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/fr/LC_MESSAGES/djangojs.po b/askbot/locale/fr/LC_MESSAGES/djangojs.po index cba62186..52594fab 100644 --- a/askbot/locale/fr/LC_MESSAGES/djangojs.po +++ b/askbot/locale/fr/LC_MESSAGES/djangojs.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-09-28 00:33-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2011-09-28 08:12-0800\n" +"Last-Translator: Rosandra Cuello \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" @@ -27,9 +27,7 @@ msgid "Please add one or more login methods." msgstr "" #: skins/common/media/jquery-openid/jquery.openid.js:93 -msgid "" -"You don't have a method to log in right now, please add one or more by " -"clicking any of the icons below." +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/common/media/jquery-openid/jquery.openid.js:135 @@ -73,39 +71,41 @@ msgstr "" #: skins/common/media/js/post.js:28 msgid "loading..." -msgstr "" +msgstr "Chargement en cours..." -#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +#: skins/common/media/js/post.js:127 +#: skins/common/media/js/post.js.c:856 msgid "tags cannot be empty" -msgstr "" +msgstr "Les mots-clés ne doivent pas être vides" #: skins/common/media/js/post.js:133 msgid "content cannot be empty" -msgstr "" +msgstr "Le contenu ne doit pas être vide" #: skins/common/media/js/post.js:134 msgid "content minchars" -msgstr "" +msgstr "Veuillez saisir au moins {0} caractères" #: skins/common/media/js/post.js:137 msgid "please enter title" -msgstr "" +msgstr "Veuillez saisir un titre" -#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +#: skins/common/media/js/post.js:138 +#: skins/common/media/js/post.js.c:981 msgid "title minchars" -msgstr "" +msgstr "Veuillez saisir au moins {0} caractères" #: skins/common/media/js/post.js:281 msgid "insufficient privilege" -msgstr "" +msgstr "Privilèges insuffisants" #: skins/common/media/js/post.js:282 msgid "cannot pick own answer as best" -msgstr "" +msgstr "Vous ne pouvez pas désigner une de vos propres réponses comme étant la meilleure réponse" #: skins/common/media/js/post.js:287 msgid "please login" -msgstr "" +msgstr "Veuillez vous authentifier" #: skins/common/media/js/post.js:289 msgid "anonymous users cannot follow questions" @@ -117,62 +117,67 @@ msgstr "" #: skins/common/media/js/post.js:291 msgid "anonymous users cannot vote" -msgstr "" +msgstr "les utilisateurs anonyment ne peuvent pas voter " #: skins/common/media/js/post.js:293 msgid "please confirm offensive" -msgstr "" +msgstr "Veuillez confirmer que le contenu est abusif" #: skins/common/media/js/post.js:294 msgid "anonymous users cannot flag offensive posts" -msgstr "" +msgstr "Les utilisateurs anonymes ne peuvent pas signaler les messages à contenu abusif" #: skins/common/media/js/post.js:295 msgid "confirm delete" -msgstr "" +msgstr "Confirmer la suppression" #: skins/common/media/js/post.js:296 msgid "anonymous users cannot delete/undelete" -msgstr "" +msgstr "Les utilisateurs anonymes ne peuvent pas supprimer/restaurer" #: skins/common/media/js/post.js:297 msgid "post recovered" -msgstr "" +msgstr "Message restauré" #: skins/common/media/js/post.js:298 msgid "post deleted" -msgstr "" +msgstr "Message supprimé" -#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/common/media/js/post.js:536 +#: skins/default/media/js/post.js:535 #: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 -#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 -#: skins/old/media/js/post.js:544 skins/old/media/js/post.js.c:553 +#: skins/common/media/js/post.js:545 +#: skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 +#: skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/common/media/js/post.js:550 +#: skins/default/media/js/post.js:549 #: skins/old/media/js/post.js:549 msgid "
          Following
          Unfollow
          " msgstr "" #: skins/common/media/js/post.js:612 msgid "undelete" -msgstr "" +msgstr "Restaurer" #: skins/common/media/js/post.js:617 msgid "delete" -msgstr "" +msgstr "supprimer" #: skins/common/media/js/post.js:954 msgid "add comment" -msgstr "" +msgstr "OK" #: skins/common/media/js/post.js:957 msgid "save comment" @@ -197,13 +202,14 @@ msgstr "" #: skins/common/media/js/post.js:1177 msgid "delete this comment" -msgstr "" +msgstr "supprimer ce commentaire" #: skins/common/media/js/post.js:1381 msgid "confirm delete comment" -msgstr "" +msgstr "Confirmer la suppression du commentaire" -#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/common/media/js/post.js:1622 +#: skins/default/media/js/post.js:1621 #: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" @@ -231,24 +237,28 @@ msgid_plural "Delete these notifications?" msgstr[0] "" msgstr[1] "" -#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:125 +#: skins/default/media/js/user.js:129 #: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/common/media/js/user.js:157 +#: skins/default/media/js/user.js:161 #: skins/old/media/js/user.js:161 #, c-format msgid "unfollow %s" msgstr "" -#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/common/media/js/user.js:160 +#: skins/default/media/js/user.js:164 #: skins/old/media/js/user.js:164 #, c-format msgid "following %s" msgstr "" -#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/common/media/js/user.js:166 +#: skins/default/media/js/user.js:170 #: skins/old/media/js/user.js:170 #, c-format msgid "follow %s" @@ -273,27 +283,27 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:30 msgid "bold" -msgstr "" +msgstr "gras" #: skins/common/media/js/wmd/wmd.js:31 msgid "italic" -msgstr "" +msgstr "italique" #: skins/common/media/js/wmd/wmd.js:32 msgid "link" -msgstr "" +msgstr "lien" #: skins/common/media/js/wmd/wmd.js:33 msgid "quote" -msgstr "" +msgstr "Citer" #: skins/common/media/js/wmd/wmd.js:34 msgid "preformatted text" -msgstr "" +msgstr "Texte préformaté" #: skins/common/media/js/wmd/wmd.js:35 msgid "image" -msgstr "" +msgstr "Image" #: skins/common/media/js/wmd/wmd.js:36 msgid "attachment" @@ -301,35 +311,36 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:37 msgid "numbered list" -msgstr "" +msgstr "liste numérotée" #: skins/common/media/js/wmd/wmd.js:38 msgid "bulleted list" -msgstr "" +msgstr "liste" #: skins/common/media/js/wmd/wmd.js:39 msgid "heading" -msgstr "" +msgstr "Titre" #: skins/common/media/js/wmd/wmd.js:40 msgid "horizontal bar" -msgstr "" +msgstr "Barre horizontale" #: skins/common/media/js/wmd/wmd.js:41 msgid "undo" -msgstr "" +msgstr "Annuler" -#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +#: skins/common/media/js/wmd/wmd.js:42 +#: skins/common/media/js/wmd/wmd.js:1116 msgid "redo" -msgstr "" +msgstr "Rétablir" #: skins/common/media/js/wmd/wmd.js:53 msgid "enter image url" -msgstr "" +msgstr "Veuillez saisir une URL menant à une image, par exemple
          http://www.votre-domaine.com/nom-image.jpg" #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "" +msgstr "Entrez une URL, par exemple
          http://www.askbot.org/

          " #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" @@ -346,3 +357,4 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:1785 msgid "link text" msgstr "" + diff --git a/askbot/locale/it/LC_MESSAGES/djangojs.mo b/askbot/locale/it/LC_MESSAGES/djangojs.mo index e51c1286..cd794c2b 100644 Binary files a/askbot/locale/it/LC_MESSAGES/djangojs.mo and b/askbot/locale/it/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/it/LC_MESSAGES/djangojs.po b/askbot/locale/it/LC_MESSAGES/djangojs.po index 97370910..8077b936 100644 --- a/askbot/locale/it/LC_MESSAGES/djangojs.po +++ b/askbot/locale/it/LC_MESSAGES/djangojs.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-09-28 00:33-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2011-09-28 08:20-0800\n" +"Last-Translator: Rosandra Cuello \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" @@ -27,9 +27,7 @@ msgid "Please add one or more login methods." msgstr "" #: skins/common/media/jquery-openid/jquery.openid.js:93 -msgid "" -"You don't have a method to log in right now, please add one or more by " -"clicking any of the icons below." +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/common/media/jquery-openid/jquery.openid.js:135 @@ -73,39 +71,41 @@ msgstr "" #: skins/common/media/js/post.js:28 msgid "loading..." -msgstr "" +msgstr "Caricamento..." -#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +#: skins/common/media/js/post.js:127 +#: skins/common/media/js/post.js.c:856 msgid "tags cannot be empty" -msgstr "" +msgstr "Il campo Tags non può essere vuoto" #: skins/common/media/js/post.js:133 msgid "content cannot be empty" -msgstr "" +msgstr "il contenuto non può essere vuoto" #: skins/common/media/js/post.js:134 msgid "content minchars" -msgstr "" +msgstr "per favore inserisci più di {0} caratteri" #: skins/common/media/js/post.js:137 msgid "please enter title" -msgstr "" +msgstr "Per favore inserisci il titolo" -#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +#: skins/common/media/js/post.js:138 +#: skins/common/media/js/post.js.c:981 msgid "title minchars" -msgstr "" +msgstr "per favore inserisci almeno {0} caratteri" #: skins/common/media/js/post.js:281 msgid "insufficient privilege" -msgstr "" +msgstr "privilegi non sufficienti" #: skins/common/media/js/post.js:282 msgid "cannot pick own answer as best" -msgstr "" +msgstr "non è possibile assegnare come miglior risposta ad una propria domanda una propria risposta" #: skins/common/media/js/post.js:287 msgid "please login" -msgstr "" +msgstr "Per favore effettua il login" #: skins/common/media/js/post.js:289 msgid "anonymous users cannot follow questions" @@ -117,62 +117,67 @@ msgstr "" #: skins/common/media/js/post.js:291 msgid "anonymous users cannot vote" -msgstr "" +msgstr "Gli utenti anonimi non possono votare " #: skins/common/media/js/post.js:293 msgid "please confirm offensive" -msgstr "" +msgstr "sei certo che questo post sia offensivo, contenga spam, pubblicità, osservazioni poco idonee, ecc.?" #: skins/common/media/js/post.js:294 msgid "anonymous users cannot flag offensive posts" -msgstr "" +msgstr "Gli utenti anonimi non possono flaggare come offensivo questo post" #: skins/common/media/js/post.js:295 msgid "confirm delete" -msgstr "" +msgstr "conferma la cancellazione" #: skins/common/media/js/post.js:296 msgid "anonymous users cannot delete/undelete" -msgstr "" +msgstr "Gli utenti anonimi non possono cancellare/annullare la cancellazione" #: skins/common/media/js/post.js:297 msgid "post recovered" -msgstr "" +msgstr "Post recuperato" #: skins/common/media/js/post.js:298 msgid "post deleted" -msgstr "" +msgstr "Post eliminato" -#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/common/media/js/post.js:536 +#: skins/default/media/js/post.js:535 #: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 -#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 -#: skins/old/media/js/post.js:544 skins/old/media/js/post.js.c:553 +#: skins/common/media/js/post.js:545 +#: skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 +#: skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/common/media/js/post.js:550 +#: skins/default/media/js/post.js:549 #: skins/old/media/js/post.js:549 msgid "
          Following
          Unfollow
          " msgstr "" #: skins/common/media/js/post.js:612 msgid "undelete" -msgstr "" +msgstr "elimina" #: skins/common/media/js/post.js:617 msgid "delete" -msgstr "" +msgstr "elimina" #: skins/common/media/js/post.js:954 msgid "add comment" -msgstr "" +msgstr "OK" #: skins/common/media/js/post.js:957 msgid "save comment" @@ -185,7 +190,7 @@ msgstr "" #: skins/common/media/js/post.js:989 #, c-format msgid "%s characters left" -msgstr "" +msgstr "%s caratteri rimanenti" #: skins/common/media/js/post.js:1060 msgid "cancel" @@ -197,13 +202,14 @@ msgstr "" #: skins/common/media/js/post.js:1177 msgid "delete this comment" -msgstr "" +msgstr "Elimina questo commento" #: skins/common/media/js/post.js:1381 msgid "confirm delete comment" -msgstr "" +msgstr "Vuoi davvero cancellare il commento?" -#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/common/media/js/post.js:1622 +#: skins/default/media/js/post.js:1621 #: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" @@ -231,24 +237,28 @@ msgid_plural "Delete these notifications?" msgstr[0] "" msgstr[1] "" -#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:125 +#: skins/default/media/js/user.js:129 #: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/common/media/js/user.js:157 +#: skins/default/media/js/user.js:161 #: skins/old/media/js/user.js:161 #, c-format msgid "unfollow %s" msgstr "" -#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/common/media/js/user.js:160 +#: skins/default/media/js/user.js:164 #: skins/old/media/js/user.js:164 #, c-format msgid "following %s" msgstr "" -#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/common/media/js/user.js:166 +#: skins/default/media/js/user.js:170 #: skins/old/media/js/user.js:170 #, c-format msgid "follow %s" @@ -273,27 +283,27 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:30 msgid "bold" -msgstr "" +msgstr "grassetto" #: skins/common/media/js/wmd/wmd.js:31 msgid "italic" -msgstr "" +msgstr "corsivo" #: skins/common/media/js/wmd/wmd.js:32 msgid "link" -msgstr "" +msgstr "Link" #: skins/common/media/js/wmd/wmd.js:33 msgid "quote" -msgstr "" +msgstr "cita" #: skins/common/media/js/wmd/wmd.js:34 msgid "preformatted text" -msgstr "" +msgstr "Testo preformattato" #: skins/common/media/js/wmd/wmd.js:35 msgid "image" -msgstr "" +msgstr "Immagine" #: skins/common/media/js/wmd/wmd.js:36 msgid "attachment" @@ -301,35 +311,36 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:37 msgid "numbered list" -msgstr "" +msgstr "Lista numerata" #: skins/common/media/js/wmd/wmd.js:38 msgid "bulleted list" -msgstr "" +msgstr "Lista" #: skins/common/media/js/wmd/wmd.js:39 msgid "heading" -msgstr "" +msgstr "Titolo" #: skins/common/media/js/wmd/wmd.js:40 msgid "horizontal bar" -msgstr "" +msgstr "barra orizzontale" #: skins/common/media/js/wmd/wmd.js:41 msgid "undo" -msgstr "" +msgstr "annulla" -#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +#: skins/common/media/js/wmd/wmd.js:42 +#: skins/common/media/js/wmd/wmd.js:1116 msgid "redo" -msgstr "" +msgstr "Esegui nuovamente" #: skins/common/media/js/wmd/wmd.js:53 msgid "enter image url" -msgstr "" +msgstr "inserisci l'URL dell'immagine, es. http://www.example.com/immagine.jpg \"titolo immagine\"" #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "" +msgstr "inserisci l'indirizzo web, e.g.
          http://www.askbot.org/

          " #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" @@ -346,3 +357,4 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:1785 msgid "link text" msgstr "" + diff --git a/askbot/locale/ja/LC_MESSAGES/djangojs.mo b/askbot/locale/ja/LC_MESSAGES/djangojs.mo index a0e8222d..7bb76233 100644 Binary files a/askbot/locale/ja/LC_MESSAGES/djangojs.mo and b/askbot/locale/ja/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/ko/LC_MESSAGES/djangojs.mo b/askbot/locale/ko/LC_MESSAGES/djangojs.mo index 94448970..ac9345ee 100644 Binary files a/askbot/locale/ko/LC_MESSAGES/djangojs.mo and b/askbot/locale/ko/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/pt_BR/LC_MESSAGES/djangojs.mo b/askbot/locale/pt_BR/LC_MESSAGES/djangojs.mo index 1b7fa761..673ea50c 100644 Binary files a/askbot/locale/pt_BR/LC_MESSAGES/djangojs.mo and b/askbot/locale/pt_BR/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/ro/LC_MESSAGES/djangojs.mo b/askbot/locale/ro/LC_MESSAGES/djangojs.mo index 6701db6d..06702fae 100644 Binary files a/askbot/locale/ro/LC_MESSAGES/djangojs.mo and b/askbot/locale/ro/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/ru/LC_MESSAGES/djangojs.mo b/askbot/locale/ru/LC_MESSAGES/djangojs.mo index a4408153..80e49dd0 100644 Binary files a/askbot/locale/ru/LC_MESSAGES/djangojs.mo and b/askbot/locale/ru/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/ru/LC_MESSAGES/djangojs.po b/askbot/locale/ru/LC_MESSAGES/djangojs.po index e41757f3..a4709cf8 100644 --- a/askbot/locale/ru/LC_MESSAGES/djangojs.po +++ b/askbot/locale/ru/LC_MESSAGES/djangojs.po @@ -8,106 +8,105 @@ msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-09-28 00:32-0700\n" -"PO-Revision-Date: 2011-09-05 09:02\n" -"Last-Translator: \n" +"PO-Revision-Date: 2011-09-28 08:02-0800\n" +"Last-Translator: Rosandra Cuello \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" "X-Translated-Using: django-rosetta 0.6.2\n" #: skins/common/media/jquery-openid/jquery.openid.js:73 #, c-format msgid "Are you sure you want to remove your %s login?" -msgstr "" +msgstr "Вы действительно хотите удалить логин через %s?" #: skins/common/media/jquery-openid/jquery.openid.js:90 msgid "Please add one or more login methods." -msgstr "" +msgstr "Пожалуйста, добавьте хотя бы один постоянный метод для авторизации." #: skins/common/media/jquery-openid/jquery.openid.js:93 -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 "" +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/common/media/jquery-openid/jquery.openid.js:135 msgid "passwords do not match" -msgstr "" +msgstr "пароли не совпадают" #: skins/common/media/jquery-openid/jquery.openid.js:162 msgid "Show/change current login methods" -msgstr "" +msgstr "Просмотреть, изменить существующие методы авторизации." #: skins/common/media/jquery-openid/jquery.openid.js:223 #, c-format msgid "Please enter your %s, then proceed" -msgstr "" +msgstr "Чтобы продолжить, пожалуйста введите %s" #: skins/common/media/jquery-openid/jquery.openid.js:225 msgid "Connect your %(provider_name)s account to %(site)s" -msgstr "" +msgstr "Соедините %(site)s с Вашим аккаунтом от %(provider_name)s" #: skins/common/media/jquery-openid/jquery.openid.js:319 #, c-format msgid "Change your %s password" -msgstr "" +msgstr "Измените Ваш пароль для %s" #: skins/common/media/jquery-openid/jquery.openid.js:320 msgid "Change password" -msgstr "" +msgstr "Изменить пароль" #: skins/common/media/jquery-openid/jquery.openid.js:323 #, c-format msgid "Create a password for %s" -msgstr "" +msgstr "Создать пароль для %s" #: skins/common/media/jquery-openid/jquery.openid.js:324 msgid "Create password" -msgstr "" +msgstr "Создать пароль" #: skins/common/media/jquery-openid/jquery.openid.js:340 msgid "Create a password-protected account" -msgstr "" +msgstr "Создать аккаунт, защищенный паролем" #: skins/common/media/js/post.js:28 msgid "loading..." -msgstr "" +msgstr "загрузка..." -#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +#: skins/common/media/js/post.js:127 +#: skins/common/media/js/post.js.c:856 msgid "tags cannot be empty" -msgstr "" +msgstr "введите теги" #: skins/common/media/js/post.js:133 msgid "content cannot be empty" -msgstr "" +msgstr "пожалуйста, добавьте содержание" #: skins/common/media/js/post.js:134 msgid "content minchars" -msgstr "" +msgstr "содержание должно быть более {0} символов" #: skins/common/media/js/post.js:137 msgid "please enter title" -msgstr "" +msgstr "пожалуйста, введите заголовок" -#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +#: skins/common/media/js/post.js:138 +#: skins/common/media/js/post.js.c:981 msgid "title minchars" -msgstr "" +msgstr "заголовок должен быть более {0} символов" #: skins/common/media/js/post.js:281 msgid "insufficient privilege" -msgstr "" +msgstr "недостаточно прав" #: skins/common/media/js/post.js:282 msgid "cannot pick own answer as best" -msgstr "" +msgstr "Извините, выбрать собственный ответ в качестве лучшего не разрешается" #: skins/common/media/js/post.js:287 msgid "please login" -msgstr "" +msgstr "введите логин" #: skins/common/media/js/post.js:289 msgid "anonymous users cannot follow questions" @@ -119,40 +118,44 @@ msgstr "" #: skins/common/media/js/post.js:291 msgid "anonymous users cannot vote" -msgstr "" +msgstr "Извините, но для того чтобы голосовать, " #: skins/common/media/js/post.js:293 msgid "please confirm offensive" -msgstr "" +msgstr "Вы уверены что это сообщение неуместно?" #: skins/common/media/js/post.js:294 msgid "anonymous users cannot flag offensive posts" -msgstr "" +msgstr "Извините, но для того чтобы пожаловаться на сообщение, " #: skins/common/media/js/post.js:295 msgid "confirm delete" -msgstr "" +msgstr "Удалить?" #: skins/common/media/js/post.js:296 msgid "anonymous users cannot delete/undelete" -msgstr "" +msgstr "неавторизированные пользователи не могут восстанавливать и удалять сообщения " #: skins/common/media/js/post.js:297 msgid "post recovered" -msgstr "" +msgstr "восстановить сообщение" #: skins/common/media/js/post.js:298 msgid "post deleted" -msgstr "" +msgstr "сообщение удалено" -#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/common/media/js/post.js:536 +#: skins/default/media/js/post.js:535 #: skins/old/media/js/post.js:535 msgid "Follow" msgstr "Добавить закладку" -#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 -#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 -#: skins/old/media/js/post.js:544 skins/old/media/js/post.js.c:553 +#: skins/common/media/js/post.js:545 +#: skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 +#: skins/default/media/js/post.js.c:553 +#: skins/old/media/js/post.js:544 +#: skins/old/media/js/post.js.c:553 #, c-format msgid "%s follower" msgid_plural "%s followers" @@ -160,35 +163,36 @@ msgstr[0] "%s закладка" msgstr[1] "%s закладки" msgstr[2] "%s закладок" -#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/common/media/js/post.js:550 +#: skins/default/media/js/post.js:549 #: skins/old/media/js/post.js:549 msgid "
          Following
          Unfollow
          " msgstr "
          Есть закладка!
          Убрать закладку
          " #: skins/common/media/js/post.js:612 msgid "undelete" -msgstr "" +msgstr "восстановить" #: skins/common/media/js/post.js:617 msgid "delete" -msgstr "" +msgstr "удалить" #: skins/common/media/js/post.js:954 msgid "add comment" -msgstr "" +msgstr "добавить комментарий" #: skins/common/media/js/post.js:957 msgid "save comment" -msgstr "" +msgstr "сохранить комментарий" #: skins/common/media/js/post.js:984 msgid "enter more characters" -msgstr "" +msgstr "недостаточно символов, пожалуйста, добавьте ещё {0}" #: skins/common/media/js/post.js:989 #, c-format msgid "%s characters left" -msgstr "" +msgstr "осталось место для %s символов" #: skins/common/media/js/post.js:1060 msgid "cancel" @@ -200,13 +204,14 @@ msgstr "" #: skins/common/media/js/post.js:1177 msgid "delete this comment" -msgstr "" +msgstr "удалить этот комментарий" #: skins/common/media/js/post.js:1381 msgid "confirm delete comment" -msgstr "" +msgstr "Удалить комментарий?" -#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/common/media/js/post.js:1622 +#: skins/default/media/js/post.js:1621 #: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "Пожалуйста, добавьте заглавие к вопросу (>10 букв)" @@ -226,35 +231,37 @@ msgstr "и ещё %s, не показано..." #: skins/common/media/js/user.js:14 msgid "Please select at least one item" -msgstr "" +msgstr "Пожалуйста, отметьте хотя бы одно извещение" #: skins/common/media/js/user.js:58 msgid "Delete this notification?" msgid_plural "Delete these notifications?" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Удалить это извещение?" +msgstr[1] "Удалить эти извещения?" +msgstr[2] "Удалить эти извещения?" -#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:125 +#: skins/default/media/js/user.js:129 #: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" -msgstr "" -"Пожалуйста авторизуйтесь чтобы отметить " -"профиль %(username)s" +msgstr "Пожалуйста авторизуйтесь чтобы отметить профиль %(username)s" -#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/common/media/js/user.js:157 +#: skins/default/media/js/user.js:161 #: skins/old/media/js/user.js:161 #, c-format msgid "unfollow %s" msgstr "" -#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/common/media/js/user.js:160 +#: skins/default/media/js/user.js:164 #: skins/old/media/js/user.js:164 #, c-format msgid "following %s" msgstr "" -#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/common/media/js/user.js:166 +#: skins/default/media/js/user.js:170 #: skins/old/media/js/user.js:170 #, c-format msgid "follow %s" @@ -266,40 +273,40 @@ msgstr "" #: skins/common/media/js/utils.js:214 msgid "click to edit this comment" -msgstr "" +msgstr "нажмите здесь, чтобы отредактировать этот комментарий" #: skins/common/media/js/utils.js:215 msgid "edit" -msgstr "" +msgstr "редактировать" #: skins/common/media/js/utils.js:369 #, c-format msgid "see questions tagged '%s'" -msgstr "" +msgstr "смотрите вопросы, помеченные '%s'" #: skins/common/media/js/wmd/wmd.js:30 msgid "bold" -msgstr "" +msgstr "жирный" #: skins/common/media/js/wmd/wmd.js:31 msgid "italic" -msgstr "" +msgstr "курсив" #: skins/common/media/js/wmd/wmd.js:32 msgid "link" -msgstr "" +msgstr "ссылка" #: skins/common/media/js/wmd/wmd.js:33 msgid "quote" -msgstr "" +msgstr "цитата" #: skins/common/media/js/wmd/wmd.js:34 msgid "preformatted text" -msgstr "" +msgstr "форматирование текста" #: skins/common/media/js/wmd/wmd.js:35 msgid "image" -msgstr "" +msgstr "изображение" #: skins/common/media/js/wmd/wmd.js:36 msgid "attachment" @@ -307,39 +314,40 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:37 msgid "numbered list" -msgstr "" +msgstr "пронумерованный список" #: skins/common/media/js/wmd/wmd.js:38 msgid "bulleted list" -msgstr "" +msgstr "маркированный список" #: skins/common/media/js/wmd/wmd.js:39 msgid "heading" -msgstr "" +msgstr "заголовок" #: skins/common/media/js/wmd/wmd.js:40 msgid "horizontal bar" -msgstr "" +msgstr "горизонтальная полоса" #: skins/common/media/js/wmd/wmd.js:41 msgid "undo" -msgstr "" +msgstr "отменить" -#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +#: skins/common/media/js/wmd/wmd.js:42 +#: skins/common/media/js/wmd/wmd.js:1116 msgid "redo" -msgstr "" +msgstr "повторить" #: skins/common/media/js/wmd/wmd.js:53 msgid "enter image url" -msgstr "" +msgstr "введите url изображения, например:
          http://www.domain.ru/kartinka.gif" #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "" +msgstr "введите url, например:
          http://www.domain.ru/

          " #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" -msgstr "" +msgstr "загрузить файл" #: skins/common/media/js/wmd/wmd.js:1778 msgid "image description" @@ -347,13 +355,14 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:1781 msgid "file name" -msgstr "" +msgstr "название файла" #: skins/common/media/js/wmd/wmd.js:1785 msgid "link text" msgstr "" #~ msgid "%(q_num)s question" + #~ msgid_plural "%(q_num)s questions" #~ msgstr[0] "%(q_num)s вопрос" #~ msgstr[1] "%(q_num)s вопроса" diff --git a/askbot/locale/sr/LC_MESSAGES/djangojs.mo b/askbot/locale/sr/LC_MESSAGES/djangojs.mo index 2c8ecbcf..4880c727 100644 Binary files a/askbot/locale/sr/LC_MESSAGES/djangojs.mo and b/askbot/locale/sr/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/tr/LC_MESSAGES/djangojs.mo b/askbot/locale/tr/LC_MESSAGES/djangojs.mo index 36a5bdfa..6545f119 100644 Binary files a/askbot/locale/tr/LC_MESSAGES/djangojs.mo and b/askbot/locale/tr/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/tr/LC_MESSAGES/djangojs.po b/askbot/locale/tr/LC_MESSAGES/djangojs.po index 8ec58477..22e96e6c 100644 --- a/askbot/locale/tr/LC_MESSAGES/djangojs.po +++ b/askbot/locale/tr/LC_MESSAGES/djangojs.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-09-28 00:33-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2011-09-28 04:13-0800\n" +"Last-Translator: Rosandra Cuello \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" @@ -27,9 +27,7 @@ msgid "Please add one or more login methods." msgstr "" #: skins/common/media/jquery-openid/jquery.openid.js:93 -msgid "" -"You don't have a method to log in right now, please add one or more by " -"clicking any of the icons below." +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/common/media/jquery-openid/jquery.openid.js:135 @@ -73,39 +71,41 @@ msgstr "" #: skins/common/media/js/post.js:28 msgid "loading..." -msgstr "" +msgstr "yükleniyor..." -#: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 +#: skins/common/media/js/post.js:127 +#: skins/common/media/js/post.js.c:856 msgid "tags cannot be empty" -msgstr "" +msgstr "etiketler boş olamaz" #: skins/common/media/js/post.js:133 msgid "content cannot be empty" -msgstr "" +msgstr "içerik boş olamaz" #: skins/common/media/js/post.js:134 msgid "content minchars" -msgstr "" +msgstr "Lütfen en az (0) karakter girin" #: skins/common/media/js/post.js:137 msgid "please enter title" -msgstr "" +msgstr "lütfen bir başlık yazın" -#: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 +#: skins/common/media/js/post.js:138 +#: skins/common/media/js/post.js.c:981 msgid "title minchars" -msgstr "" +msgstr "Lütfen en az (0) karakter girin" #: skins/common/media/js/post.js:281 msgid "insufficient privilege" -msgstr "" +msgstr "buna yetkiniz yoktur" #: skins/common/media/js/post.js:282 msgid "cannot pick own answer as best" -msgstr "" +msgstr "en cevap olarak kendi cevabınızı seçemezsiniz" #: skins/common/media/js/post.js:287 msgid "please login" -msgstr "" +msgstr "lütfen üye girişi yapınız" #: skins/common/media/js/post.js:289 msgid "anonymous users cannot follow questions" @@ -117,62 +117,67 @@ msgstr "" #: skins/common/media/js/post.js:291 msgid "anonymous users cannot vote" -msgstr "" +msgstr "üye girişi yapmadan oy kullanamazsınız" #: skins/common/media/js/post.js:293 msgid "please confirm offensive" -msgstr "" +msgstr "şikayetinizi onaylayın" #: skins/common/media/js/post.js:294 msgid "anonymous users cannot flag offensive posts" -msgstr "" +msgstr "üye girişi yapmadan şikayet gönderemezsiniz" #: skins/common/media/js/post.js:295 msgid "confirm delete" -msgstr "" +msgstr "Bunu silmek istediğinizden emin misiniz?" #: skins/common/media/js/post.js:296 msgid "anonymous users cannot delete/undelete" -msgstr "" +msgstr "üye girişi yapmadan yazı silemez yada geri alamazsınız" #: skins/common/media/js/post.js:297 msgid "post recovered" -msgstr "" +msgstr "yazı geri alındı" #: skins/common/media/js/post.js:298 msgid "post deleted" -msgstr "" +msgstr "yazı silindi" -#: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 +#: skins/common/media/js/post.js:536 +#: skins/default/media/js/post.js:535 #: skins/old/media/js/post.js:535 msgid "Follow" msgstr "" -#: skins/common/media/js/post.js:545 skins/common/media/js/post.js.c:554 -#: skins/default/media/js/post.js:544 skins/default/media/js/post.js.c:553 -#: skins/old/media/js/post.js:544 skins/old/media/js/post.js.c:553 +#: skins/common/media/js/post.js:545 +#: skins/common/media/js/post.js.c:554 +#: skins/default/media/js/post.js:544 +#: skins/default/media/js/post.js.c:553 +#: 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] "" -#: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 +#: skins/common/media/js/post.js:550 +#: skins/default/media/js/post.js:549 #: skins/old/media/js/post.js:549 msgid "
          Following
          Unfollow
          " msgstr "" #: skins/common/media/js/post.js:612 msgid "undelete" -msgstr "" +msgstr "geri al" #: skins/common/media/js/post.js:617 msgid "delete" -msgstr "" +msgstr "sil" #: skins/common/media/js/post.js:954 msgid "add comment" -msgstr "" +msgstr "yorum ekle" #: skins/common/media/js/post.js:957 msgid "save comment" @@ -185,7 +190,7 @@ msgstr "" #: skins/common/media/js/post.js:989 #, c-format msgid "%s characters left" -msgstr "" +msgstr "yazılabilir %s karakter eksik" #: skins/common/media/js/post.js:1060 msgid "cancel" @@ -197,13 +202,14 @@ msgstr "" #: skins/common/media/js/post.js:1177 msgid "delete this comment" -msgstr "" +msgstr "bu yorumu sil" #: skins/common/media/js/post.js:1381 msgid "confirm delete comment" -msgstr "" +msgstr "yorumu silmek istediğinizden emin misiniz?" -#: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 +#: skins/common/media/js/post.js:1622 +#: skins/default/media/js/post.js:1621 #: skins/old/media/js/post.js:1621 msgid "Please enter question title (>10 characters)" msgstr "" @@ -231,24 +237,28 @@ msgid_plural "Delete these notifications?" msgstr[0] "" msgstr[1] "" -#: skins/common/media/js/user.js:125 skins/default/media/js/user.js:129 +#: skins/common/media/js/user.js:125 +#: skins/default/media/js/user.js:129 #: skins/old/media/js/user.js:129 msgid "Please signin to follow %(username)s" msgstr "" -#: skins/common/media/js/user.js:157 skins/default/media/js/user.js:161 +#: skins/common/media/js/user.js:157 +#: skins/default/media/js/user.js:161 #: skins/old/media/js/user.js:161 #, c-format msgid "unfollow %s" msgstr "" -#: skins/common/media/js/user.js:160 skins/default/media/js/user.js:164 +#: skins/common/media/js/user.js:160 +#: skins/default/media/js/user.js:164 #: skins/old/media/js/user.js:164 #, c-format msgid "following %s" msgstr "" -#: skins/common/media/js/user.js:166 skins/default/media/js/user.js:170 +#: skins/common/media/js/user.js:166 +#: skins/default/media/js/user.js:170 #: skins/old/media/js/user.js:170 #, c-format msgid "follow %s" @@ -273,27 +283,27 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:30 msgid "bold" -msgstr "" +msgstr "kalın" #: skins/common/media/js/wmd/wmd.js:31 msgid "italic" -msgstr "" +msgstr "italik" #: skins/common/media/js/wmd/wmd.js:32 msgid "link" -msgstr "" +msgstr "link" #: skins/common/media/js/wmd/wmd.js:33 msgid "quote" -msgstr "" +msgstr "alıntı" #: skins/common/media/js/wmd/wmd.js:34 msgid "preformatted text" -msgstr "" +msgstr "hazır metin" #: skins/common/media/js/wmd/wmd.js:35 msgid "image" -msgstr "" +msgstr "resimler" #: skins/common/media/js/wmd/wmd.js:36 msgid "attachment" @@ -301,35 +311,36 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:37 msgid "numbered list" -msgstr "" +msgstr "numaralı liste" #: skins/common/media/js/wmd/wmd.js:38 msgid "bulleted list" -msgstr "" +msgstr "işaretli liste" #: skins/common/media/js/wmd/wmd.js:39 msgid "heading" -msgstr "" +msgstr "Başlık" #: skins/common/media/js/wmd/wmd.js:40 msgid "horizontal bar" -msgstr "" +msgstr "yatay bar" #: skins/common/media/js/wmd/wmd.js:41 msgid "undo" -msgstr "" +msgstr "geri" -#: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 +#: skins/common/media/js/wmd/wmd.js:42 +#: skins/common/media/js/wmd/wmd.js:1116 msgid "redo" -msgstr "" +msgstr "yeniden" #: skins/common/media/js/wmd/wmd.js:53 msgid "enter image url" -msgstr "" +msgstr "örnek resmin URLsini girin:
          http://www.example.com/image.jpg \"resim başlığı\"" #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "" +msgstr "web adresini girin:
          http://www.cnprog.com/ \"başlık bağlantısı\"

          " #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" @@ -346,3 +357,4 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:1785 msgid "link text" msgstr "" + diff --git a/askbot/locale/vi/LC_MESSAGES/djangojs.mo b/askbot/locale/vi/LC_MESSAGES/djangojs.mo index 497e70f5..ac9345ee 100644 Binary files a/askbot/locale/vi/LC_MESSAGES/djangojs.mo and b/askbot/locale/vi/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/zh-tw/LC_MESSAGES/djangojs.mo b/askbot/locale/zh-tw/LC_MESSAGES/djangojs.mo index 496607ae..4d81cbf2 100644 Binary files a/askbot/locale/zh-tw/LC_MESSAGES/djangojs.mo and b/askbot/locale/zh-tw/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/zh-tw/LC_MESSAGES/djangojs.po b/askbot/locale/zh-tw/LC_MESSAGES/djangojs.po index 4bc00569..dbd7b604 100644 --- a/askbot/locale/zh-tw/LC_MESSAGES/djangojs.po +++ b/askbot/locale/zh-tw/LC_MESSAGES/djangojs.po @@ -73,39 +73,39 @@ msgstr "" #: skins/common/media/js/post.js:28 msgid "loading..." -msgstr "" +msgstr "讀取中..." #: skins/common/media/js/post.js:127 skins/common/media/js/post.js.c:856 msgid "tags cannot be empty" -msgstr "" +msgstr "標籤不能為空白" #: skins/common/media/js/post.js:133 msgid "content cannot be empty" -msgstr "" +msgstr "內容不能為空白" #: skins/common/media/js/post.js:134 msgid "content minchars" -msgstr "" +msgstr "請輸入至少 {0} 字符。" #: skins/common/media/js/post.js:137 msgid "please enter title" -msgstr "" +msgstr "請輸入標題。" #: skins/common/media/js/post.js:138 skins/common/media/js/post.js.c:981 msgid "title minchars" -msgstr "" +msgstr "請輸入至少 {0} 字符。" #: skins/common/media/js/post.js:281 msgid "insufficient privilege" -msgstr "" +msgstr "權限不足" #: skins/common/media/js/post.js:282 msgid "cannot pick own answer as best" -msgstr "" +msgstr "不能蔽掃自珍" #: skins/common/media/js/post.js:287 msgid "please login" -msgstr "" +msgstr "請先登錄" #: skins/common/media/js/post.js:289 msgid "anonymous users cannot follow questions" @@ -121,27 +121,27 @@ msgstr "" #: skins/common/media/js/post.js:293 msgid "please confirm offensive" -msgstr "" +msgstr "確定要歸類該帖為廣告、人身攻擊、惡意言論嗎?" #: skins/common/media/js/post.js:294 msgid "anonymous users cannot flag offensive posts" -msgstr "" +msgstr "匿名用戶不能操作" #: skins/common/media/js/post.js:295 msgid "confirm delete" -msgstr "" +msgstr "確定刪除" #: skins/common/media/js/post.js:296 msgid "anonymous users cannot delete/undelete" -msgstr "" +msgstr "匿名用戶不能刪除或恢復帖子" #: skins/common/media/js/post.js:297 msgid "post recovered" -msgstr "" +msgstr "操作成功!該帖子已被恢複。" #: skins/common/media/js/post.js:298 msgid "post deleted" -msgstr "" +msgstr "操作成功!該帖子已刪除。" #: skins/common/media/js/post.js:536 skins/default/media/js/post.js:535 #: skins/old/media/js/post.js:535 @@ -164,15 +164,15 @@ msgstr "" #: skins/common/media/js/post.js:612 msgid "undelete" -msgstr "" +msgstr "取消" #: skins/common/media/js/post.js:617 msgid "delete" -msgstr "" +msgstr "刪除" #: skins/common/media/js/post.js:954 msgid "add comment" -msgstr "" +msgstr "添加評論" #: skins/common/media/js/post.js:957 msgid "save comment" @@ -185,7 +185,7 @@ msgstr "" #: skins/common/media/js/post.js:989 #, c-format msgid "%s characters left" -msgstr "" +msgstr "還可寫%s字" #: skins/common/media/js/post.js:1060 msgid "cancel" @@ -197,11 +197,11 @@ msgstr "" #: skins/common/media/js/post.js:1177 msgid "delete this comment" -msgstr "" +msgstr "刪除此評論" #: skins/common/media/js/post.js:1381 msgid "confirm delete comment" -msgstr "" +msgstr "刪除評論確認" #: skins/common/media/js/post.js:1622 skins/default/media/js/post.js:1621 #: skins/old/media/js/post.js:1621 @@ -255,7 +255,7 @@ msgstr "" #: skins/common/media/js/utils.js:43 msgid "click to close" -msgstr "" +msgstr "點擊消息框關閉" #: skins/common/media/js/utils.js:214 msgid "click to edit this comment" @@ -272,27 +272,27 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:30 msgid "bold" -msgstr "" +msgstr "粗體" #: skins/common/media/js/wmd/wmd.js:31 msgid "italic" -msgstr "" +msgstr "斜體" #: skins/common/media/js/wmd/wmd.js:32 msgid "link" -msgstr "" +msgstr "超連接" #: skins/common/media/js/wmd/wmd.js:33 msgid "quote" -msgstr "" +msgstr "引用" #: skins/common/media/js/wmd/wmd.js:34 msgid "preformatted text" -msgstr "" +msgstr "代碼" #: skins/common/media/js/wmd/wmd.js:35 msgid "image" -msgstr "" +msgstr "圖片" #: skins/common/media/js/wmd/wmd.js:36 msgid "attachment" @@ -300,35 +300,35 @@ msgstr "" #: skins/common/media/js/wmd/wmd.js:37 msgid "numbered list" -msgstr "" +msgstr "數字編號列表" #: skins/common/media/js/wmd/wmd.js:38 msgid "bulleted list" -msgstr "" +msgstr "項目符號列表" #: skins/common/media/js/wmd/wmd.js:39 msgid "heading" -msgstr "" +msgstr "標題" #: skins/common/media/js/wmd/wmd.js:40 msgid "horizontal bar" -msgstr "" +msgstr "水平線" #: skins/common/media/js/wmd/wmd.js:41 msgid "undo" -msgstr "" +msgstr "撤銷" #: skins/common/media/js/wmd/wmd.js:42 skins/common/media/js/wmd/wmd.js:1116 msgid "redo" -msgstr "" +msgstr "重做" #: skins/common/media/js/wmd/wmd.js:53 msgid "enter image url" -msgstr "" +msgstr "輸入圖片地址

          示例:
          http://www.example.com/image.jpg \"我的截圖\"" #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "" +msgstr "輸入Web地址

          示例:
          http://www.cnprog.com/ \"我的網站\"

          " #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" diff --git a/askbot/locale/zh_CN/LC_MESSAGES/djangojs.mo b/askbot/locale/zh_CN/LC_MESSAGES/djangojs.mo index 497e70f5..594e1f99 100644 Binary files a/askbot/locale/zh_CN/LC_MESSAGES/djangojs.mo and b/askbot/locale/zh_CN/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/zh_CN/LC_MESSAGES/djangojs.po b/askbot/locale/zh_CN/LC_MESSAGES/djangojs.po index b35c902e..895e57fe 100644 --- a/askbot/locale/zh_CN/LC_MESSAGES/djangojs.po +++ b/askbot/locale/zh_CN/LC_MESSAGES/djangojs.po @@ -328,7 +328,7 @@ msgstr "输入图片地址

          示例:
          http://www.example.com/im #: skins/common/media/js/wmd/wmd.js:54 msgid "enter url" -msgstr "输入Web地址

          示例:
          http://www.cnprog.com/ \"我的网站\"

          "" +msgstr "输入Web地址

          示例:
          http://www.cnprog.com/ \"我的网站\"

          " #: skins/common/media/js/wmd/wmd.js:55 msgid "upload file attachment" diff --git a/askbot/skins/default/templates/meta/bottom_scripts.html b/askbot/skins/default/templates/meta/bottom_scripts.html index 1f63b468..0693a3e4 100644 --- a/askbot/skins/default/templates/meta/bottom_scripts.html +++ b/askbot/skins/default/templates/meta/bottom_scripts.html @@ -39,7 +39,6 @@ > - {% if settings.ENABLE_MATHJAX %} -- cgit v1.2.3-1-g7c22 From 646659eedcb6658f8b59302ed526e48e27d3ce36 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Fri, 30 Sep 2011 11:05:48 -0300 Subject: added better documentation to the setup command --- askbot/doc/source/initial-configuration.rst | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/askbot/doc/source/initial-configuration.rst b/askbot/doc/source/initial-configuration.rst index 7c4ba969..340324a1 100644 --- a/askbot/doc/source/initial-configuration.rst +++ b/askbot/doc/source/initial-configuration.rst @@ -29,18 +29,36 @@ 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.23 +.. 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 of the instance, this is the name that the | + | | folder will use. | + +----------------------------------+------------------------------------------------------------+ + | -d | The database name that the instance will use. | + +----------------------------------+------------------------------------------------------------+ + | -u | The database user that the instance will use. | + +----------------------------------+------------------------------------------------------------+ + | -p | The database password for the user. | + +----------------------------------+------------------------------------------------------------+ + | --domain= | Domain name for the application. | + +----------------------------------+------------------------------------------------------------+ + | --append-settings=| 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. -.. deprecated:: 0.7.23 - 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. +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:: -- cgit v1.2.3-1-g7c22 From 24754038efc3ca4978a4d5f072d4d16bdc632e9b Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Tue, 18 Oct 2011 17:01:50 -0300 Subject: added force parameter --- askbot/deployment/__init__.py | 30 ++++++++++++++++++++---------- askbot/deployment/path_utils.py | 16 ++++++++++------ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index d7dbe92b..c20e168f 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -15,7 +15,7 @@ def askbot_setup(): Django project """ parser = OptionParser(usage="%prog [options]") - + parser.add_option("-v", "--verbose", dest="verbosity", type="int", @@ -23,10 +23,10 @@ def askbot_setup(): help="verbosity level available values 0, 1, 2." ) - parser.add_option("-n", + parser.add_option("-n", "--dir-name", dest="name", default=None, - help="Destination name" + help="Directory where you want to install." ) parser.add_option("-d", "--db-name", @@ -59,8 +59,15 @@ def askbot_setup(): help="Extra settings file to append custom settings" ) + parser.add_option("--force", + dest="force", + action='store_true', + help="Force overwrite settings.py file" + ) + + (options, args) = parser.parse_args() - #ask + #ask if options.verbosity >= 1: print messages.DEPLOY_PREAMBLE @@ -82,7 +89,7 @@ def askbot_setup(): if path_utils.has_existing_django_project(directory): message = messages.SHOULD_ADD_APP_HERE % \ { - 'path': directory + 'path': directory } should_add_app = console.choice_dialog( message, @@ -115,9 +122,9 @@ def askbot_setup(): continue else: #creates dir - message = messages.format_msg_create(directory) + message = messages.format_msg_create(directory) should_create_new = console.choice_dialog( - message, + message, choices = ['yes','no'], invalid_phrase = messages.INVALID_INPUT ) @@ -178,7 +185,7 @@ def deploy_askbot(directory, create_new, options): 'database_password': options.database_password, 'database_user': options.database_user, 'domain_name': options.domain_name, - 'local_settings': options.local_settings + 'local_settings': options.local_settings, } for key in context.keys(): if context[key] == None: @@ -186,14 +193,17 @@ def deploy_askbot(directory, create_new, options): new_value = raw_input(input_message) context[key] = new_value + if options.force: + create_new = options.force + if create_new: path_utils.create_path(directory) - path_utils.deploy_into(directory, new_project = True, + path_utils.deploy_into(directory, new_project = True, verbosity = options.verbosity, context = context) if options.verbosity >= 1: print messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file} else: - path_utils.deploy_into(directory, new_project = False, + path_utils.deploy_into(directory, new_project = False, verbosity = options.verbosity, context = context) if options.verbosity >= 1: print messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file} diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py index ad289798..676f8bf8 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 @@ -48,7 +48,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 """ @@ -139,9 +139,13 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): if file_name in blank_files: continue else: - if verbosity >=1: - 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: if verbosity >=1: print '* %s ' % file_name @@ -157,7 +161,7 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): print "Creating settings file" settings_contents = SettingsTemplate(context).render() settings_path = os.path.join(directory, 'settings.py') - if os.path.exists(settings_path): + if os.path.exists(settings_path) and new_project==False: if verbosity>=1: print "* you already have a settings file please merge the contents" else: -- cgit v1.2.3-1-g7c22 From 60650359067d5f1e684ff5bf4e59e7d43f118c50 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Wed, 19 Oct 2011 11:19:48 -0300 Subject: adding pystache to requirements --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 71ed2abb..253f9db9 100644 --- a/setup.py +++ b/setup.py @@ -25,6 +25,7 @@ install_requires = [ 'django-followit', 'django-recaptcha-works', 'python-openid', + 'pystache==0.3.1', ] import askbot -- cgit v1.2.3-1-g7c22 From 93928e09df2be2cd51cb4e14df4205e52b4e01fc Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Wed, 19 Oct 2011 11:43:35 -0300 Subject: updated settings.mustache --- askbot/setup_templates/settings.py | 6 +++--- askbot/setup_templates/settings.py.mustache | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/askbot/setup_templates/settings.py b/askbot/setup_templates/settings.py index a97402aa..83fe9997 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 = ( @@ -116,7 +116,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('\\','/') diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache index 9a115077..ad954734 100644 --- a/askbot/setup_templates/settings.py.mustache +++ b/askbot/setup_templates/settings.py.mustache @@ -85,7 +85,7 @@ 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.load_template_source', + 'askbot.skins.loaders.filesystem_load_template_source', #'django.template.loaders.eggs.load_template_source', ) -- cgit v1.2.3-1-g7c22 From 42e5c889ec4e91b2e71d315d33f8015ac9aafeb2 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Thu, 20 Oct 2011 14:38:48 -0300 Subject: added DOMAIN_NAME to settings --- askbot/setup_templates/settings.py.mustache | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache index ad954734..18f9ac94 100644 --- a/askbot/setup_templates/settings.py.mustache +++ b/askbot/setup_templates/settings.py.mustache @@ -212,6 +212,7 @@ CELERY_ALWAYS_EAGER = True import djcelery djcelery.setup_loader() +DOMAIN_NAME = '{{domain_name}}' -CSRF_COOKIE_NAME = '{{domain_name}}_scrf' -CSRF_COOKIE_DOMAIN = '{{domain_name}}'#enter domain name here - e.g. example.com +CSRF_COOKIE_NAME = '{{domain_name}}_csrf' +CSRF_COOKIE_DOMAIN = DOMAIN_NAME -- cgit v1.2.3-1-g7c22 From 1ff1bf97acd3e9ccb4ffe529095ba75b3399e4fd Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Thu, 20 Oct 2011 16:23:38 -0300 Subject: broken intermediate commit - refactoring the deployment function to make it more understandable --- askbot/deployment/__init__.py | 288 +++++++++++++++------------------------- askbot/deployment/assertions.py | 3 +- askbot/deployment/messages.py | 6 +- askbot/deployment/path_utils.py | 87 +++++++++--- 4 files changed, 180 insertions(+), 204 deletions(-) diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index c20e168f..1ddf24ca 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -2,6 +2,7 @@ module for deploying askbot """ import os.path +import sys from optparse import OptionParser from askbot.utils import console from askbot.deployment import messages @@ -16,205 +17,124 @@ def askbot_setup(): """ 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="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" - ) - + 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" + ) (options, args) = parser.parse_args() #ask if options.verbosity >= 1: print messages.DEPLOY_PREAMBLE - directory = options.name #directory where to put stuff + directory = path_utils.clean_directory(options.dir_name) + if options.verbosity >= 1 and directory is None: + print messages.CANT_INSTALL_INTO_FILE % {'path':directory} + sys.exit(1) + create_new = False #create new django project or not - where_to_deploy_msg = messages.WHERE_TO_DEPLOY - - if directory == None: - while directory is None: - where_to_deploy_msg = messages.WHERE_TO_DEPLOY_QUIT - directory = raw_input(where_to_deploy_msg + ' ') - directory = check_directory(directory, options) - if not directory: - 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: - #creates dir - 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 - - deploy_askbot(directory, create_new, options) - else: - directory = check_directory(directory, options) - create_new = True - if directory==None: - raise Exception("the directory you choosed is invalid") - #TODO middle steps! - 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): - if options.verbosity >= 1: - print "Integrating askbot to your current app" - create_new=False - else: - assert(directory != None) - if path_utils.dir_name_acceptable(directory): - pass - else: - raise Exception(messages.format_msg_bad_dir_name(directory)) - else: - raise Exception(messages.format_msg_dir_unclean_django(directory)) - else: - if path_utils.dir_name_acceptable(directory): - pass - else: - raise Exception(messages.format_msg_bad_dir_name(directory)) - else: - raise Exception(messages.format_msg_dir_not_writable(directory)) - - deploy_askbot(directory, create_new, options) + while directory is None: + directory = get_install_directory(force = options.force) + + deploy_askbot(directory, create_new_project, options) + #separated all the directory creation process to make it more useful -def deploy_askbot(directory, create_new, options): - '''function that copies the templates''' +def deploy_askbot(directory, create_new_project, 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() - 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, - } + 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, + } 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 - if options.force: - create_new = options.force - - if create_new: - path_utils.create_path(directory) - path_utils.deploy_into(directory, new_project = True, - verbosity = options.verbosity, context = context) - if options.verbosity >= 1: - print messages.HOW_TO_DEPLOY_NEW % {'help_file': help_file} + path_utils.create_path(directory) + + create_new_project = False + if os.path.exists(directory): + if path_utils + + create_new_project or options.force + + 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, - verbosity = options.verbosity, context = context) - if options.verbosity >= 1: - print messages.HOW_TO_ADD_ASKBOT_TO_DJANGO % {'help_file': help_file} - -def check_directory(directory, options): - directory = os.path.normpath(directory) - directory = os.path.abspath(directory) - - if os.path.isfile(directory): - directory = None - if options.verbosity >= 1: - print messages.CANT_INSTALL_INTO_FILE % {'path':directory} - - return directory + 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..a108d927 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' @@ -78,7 +78,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 diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py index 676f8bf8..806fa80c 100644 --- a/askbot/deployment/path_utils.py +++ b/askbot/deployment/path_utils.py @@ -13,6 +13,7 @@ import shutil import imp from askbot.deployment.template_loader import SettingsTemplate + def split_at_break_point(directory): """splits directory path into two pieces first that exists and secon - that does not @@ -29,6 +30,17 @@ 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""" + directory = os.path.normpath(directory) + directory = os.path.abspath(directory) + + if os.path.isfile(directory): + return None + return directory + def directory_is_writable(directory): """returns True if directory exists @@ -66,7 +78,8 @@ 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: py_file = open(file_name) for line in py_file: @@ -124,10 +137,10 @@ 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, verbosity=1, context=None): +def deploy_into(directory, new_project = None, 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', 'manage.py', 'urls.py') blank_files = ('__init__.py', 'manage.py') @@ -143,11 +156,11 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): #overwrite urls.py shutil.copy(src, directory) else: - if verbosity >=1: + if verbosity >= 1: print '* %s' % file_name, print "- you already have one, please add contents of %s" % src else: - if verbosity >=1: + if verbosity >= 1: print '* %s ' % file_name shutil.copy(src, directory) #copy log directory @@ -157,14 +170,14 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): touch(os.path.join(log_dir, 'askbot.log')) #creating settings file from template - if verbosity>=1: + 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: + if os.path.exists(settings_path) and new_project == False: + if verbosity >= 1: print "* you already have a settings file please merge the contents" - else: + elif new_project == True: settings_file = open(settings_path, 'w+') settings_file.write(settings_contents) #Grab the file! @@ -174,10 +187,10 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): settings_file.write(local_settings) settings_file.close() - if verbosity>=1: + if verbosity >= 1: print "settings file created" - if verbosity >=1: + if verbosity >= 1: print '' app_dir = os.path.join(directory, 'askbot') @@ -188,21 +201,21 @@ def deploy_into(directory, new_project = None, verbosity=1, context=None): dst = os.path.join(app_dir, dir_name) if os.path.abspath(src) != os.path.abspath(dst): if dirs_copied == 0: - if verbosity >=1: + if verbosity >= 1: print 'copying directories: ', - if verbosity >=1: + if verbosity >= 1: print '* ' + dir_name if os.path.exists(dst): if os.path.isdir(dst): - if verbosity >=1: + if verbosity >= 1: print 'Directory %s not empty - skipped' % dst else: - if verbosity >=1: + if verbosity >= 1: print 'File %s already exists - skipped' % dst continue shutil.copytree(src, dst) dirs_copied += 1 - if verbosity >=1: + if verbosity >= 1: print '' def dir_name_acceptable(directory): @@ -213,3 +226,45 @@ 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. + """ + + 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 force == False: + print messages.CANNOT_OVERWRITE_EXISTING_DJANGO_PROJECT + 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 + -- cgit v1.2.3-1-g7c22 From 7a339c065c5f7b549d2e838d849459163514f807 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Thu, 20 Oct 2011 18:33:11 -0300 Subject: finished refactoring of the deployment script --- askbot/deployment/__init__.py | 88 +++++++++++++++++++++-------------------- askbot/deployment/messages.py | 8 ++++ askbot/deployment/path_utils.py | 25 ++++++++---- 3 files changed, 71 insertions(+), 50 deletions(-) diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index 1ddf24ca..f4844083 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -6,6 +6,7 @@ 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(): @@ -15,7 +16,7 @@ def askbot_setup(): or gives hints on how to add askbot to an existing Django project """ - parser = OptionParser(usage="%prog [options]") + parser = OptionParser(usage = "%prog [options]") parser.add_option( "-v", "--verbose", @@ -34,66 +35,65 @@ def askbot_setup(): parser.add_option( "-d", "--db-name", - dest="database_name", - default=None, - help="The database 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" + dest = "database_user", + default = None, + help = "The database user" ) parser.add_option( "-p", "--db-password", - dest="database_password", - default=None, - help="the database 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" + 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" + 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" + dest = "force", + action = 'store_true', + help = "Force overwrite settings.py file" ) - (options, args) = parser.parse_args() - #ask - if options.verbosity >= 1: - print messages.DEPLOY_PREAMBLE - - directory = path_utils.clean_directory(options.dir_name) - if options.verbosity >= 1 and directory is None: - print messages.CANT_INSTALL_INTO_FILE % {'path':directory} - sys.exit(1) + try: + options = parser.parse_args()[0] + #ask + if options.verbosity >= 1: + print messages.DEPLOY_PREAMBLE - create_new = False #create new django project or not - while directory is None: - directory = get_install_directory(force = options.force) + directory = path_utils.clean_directory(options.dir_name) + while directory is None: + directory = path_utils.get_install_directory(force = options.force) - deploy_askbot(directory, create_new_project, options) + 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, create_new_project, options): +def deploy_askbot(directory, options): """function that creates django project files, all the neccessary directories for askbot, and the log file @@ -107,19 +107,21 @@ def deploy_askbot(directory, create_new_project, options): 'domain_name': options.domain_name, 'local_settings': options.local_settings, } - 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 - - path_utils.create_path(directory) + 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 - - create_new_project or options.force + create_new_project = bool(options.force) + else: + create_new_project = True + + path_utils.create_path(directory) path_utils.deploy_into( directory, diff --git a/askbot/deployment/messages.py b/askbot/deployment/messages.py index a108d927..44dde979 100644 --- a/askbot/deployment/messages.py +++ b/askbot/deployment/messages.py @@ -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)' @@ -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 806fa80c..d0b0a011 100644 --- a/askbot/deployment/path_utils.py +++ b/askbot/deployment/path_utils.py @@ -11,6 +11,7 @@ import re import glob import shutil import imp +from askbot.utils import console from askbot.deployment.template_loader import SettingsTemplate @@ -33,11 +34,19 @@ def split_at_break_point(directory): 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 ``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 @@ -68,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) @@ -137,14 +146,14 @@ 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, verbosity = 1, context = None): +def deploy_into(directory, new_project = False, verbosity = 1, context = None): """will copy necessary files into the directory """ assert(isinstance(new_project, bool)) if new_project: copy_files = ('__init__.py', 'manage.py', 'urls.py') blank_files = ('__init__.py', 'manage.py') - if verbosity >=1: + if verbosity >= 1: print 'Copying files: ' for file_name in copy_files: src = os.path.join(SOURCE_DIR, 'setup_templates', file_name) @@ -233,7 +242,7 @@ def get_install_directory(force = False): 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) @@ -248,8 +257,9 @@ def get_install_directory(force = False): if os.path.exists(directory): if path_is_clean_for_django(directory): if has_existing_django_project(directory): - if force == False: - print messages.CANNOT_OVERWRITE_EXISTING_DJANGO_PROJECT + if not force: + print messages.CANNOT_OVERWRITE_DJANGO_PROJECT % \ + {'directory': directory} return None else: print messages.format_msg_dir_unclean_django(directory) @@ -268,3 +278,4 @@ def get_install_directory(force = False): print messages.format_msg_bad_dir_name(directory) return None + return directory -- cgit v1.2.3-1-g7c22 From 1aa50bbe284c2fbc092636f6d114e1a76760f01e Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Fri, 21 Oct 2011 10:13:14 -0300 Subject: changed celery broker setting name --- askbot/setup_templates/settings.py | 4 ++-- askbot/setup_templates/settings.py.mustache | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/askbot/setup_templates/settings.py b/askbot/setup_templates/settings.py index 83fe9997..dcdcb8a4 100644 --- a/askbot/setup_templates/settings.py +++ b/askbot/setup_templates/settings.py @@ -208,11 +208,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 index 18f9ac94..82d42377 100644 --- a/askbot/setup_templates/settings.py.mustache +++ b/askbot/setup_templates/settings.py.mustache @@ -207,7 +207,7 @@ 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 -- cgit v1.2.3-1-g7c22 From e709b7bf9a63b3abd6912e57c9ded21eeab99ebb Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Fri, 21 Oct 2011 16:59:38 -0300 Subject: temporal commit --- askbot/skins/common/templates/widgets/search_bar.html | 10 +++++++--- askbot/skins/default/media/style/style.css | 12 +++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/askbot/skins/common/templates/widgets/search_bar.html b/askbot/skins/common/templates/widgets/search_bar.html index 5efe3860..7cc76ec4 100644 --- a/askbot/skins/common/templates/widgets/search_bar.html +++ b/askbot/skins/common/templates/widgets/search_bar.html @@ -21,10 +21,14 @@ {% endif %} {# class was searchInput #} Date: Sat, 22 Oct 2011 11:09:52 -0300 Subject: added test for the celery setup --- askbot/startup_procedures.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/askbot/startup_procedures.py b/askbot/startup_procedures.py index 94d9b852..08b91e7a 100644 --- a/askbot/startup_procedures.py +++ b/askbot/startup_procedures.py @@ -184,6 +184,14 @@ def test_template_loader(): "in the TEMPLATE_LOADERS of your settings.py file" ) +def test_celery(): + """Tests celery settings""" + if hasattr(django_settings, 'BROKER_BACKEND'): + raise ImproperlyConfigured(PREAMBLE + \ + "\nPlease rename setting BROKER_BACKEND to BROKER_TRANSPORT\n" + "in your settings.py file" + ) + def run_startup_tests(): """function that runs all startup tests, mainly checking settings config so far @@ -197,6 +205,7 @@ def run_startup_tests(): test_i18n() test_postgres() test_middleware() + test_celery() @transaction.commit_manually def run(): -- cgit v1.2.3-1-g7c22 From a554391ad4ce8ab9c9349f509b950a06479fdfcc Mon Sep 17 00:00:00 2001 From: Byron Date: Sun, 23 Oct 2011 11:31:27 -0600 Subject: Some changes in question sidebar --- askbot/skins/default/media/style/style.css | 26 ++++++++++++++++++- .../skins/default/templates/question/sidebar.html | 29 +++------------------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 23972142..e5c38294 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -451,7 +451,7 @@ h1 { width: 950px; } -/* ----- Sidebar Widgets Box, check main_page/sidebar.html ----- */ +/* ----- Sidebar Widgets Box, check main_page/sidebar.html or question/sidebar.html ----- */ .box { background: #fff; @@ -540,6 +540,30 @@ h1 { background:url(../images/small-button-blue.png) repeat-x bottom; } } + +/* widgets for question template */ + + a.follow{ + background: url(../images/medium-button.png) top repeat-x; + height:34px; + line-height:34px; + text-align:center; + border:0; + font-family:@yanone; + color:@button-label; + font-weight:normal; + font-size:21px; + margin-top:3px; + display:block; + width:150px; + .rounded-corners(4px); + .box-shadow(1px, 1px, 2px, #636363); + } + a.follow:hover{ + text-decoration:none; + background: url(../images/medium-button.png) bottom repeat-x; + .text-shadow(0px, 1px, 0px, #c6d9dd); + } } diff --git a/askbot/skins/default/templates/question/sidebar.html b/askbot/skins/default/templates/question/sidebar.html index ab3a9ace..61339b08 100644 --- a/askbot/skins/default/templates/question/sidebar.html +++ b/askbot/skins/default/templates/question/sidebar.html @@ -1,9 +1,9 @@ {% import "macros.html" as macros %} {{ settings.SIDEBAR_QUESTION_HEADER }} -
          -

          {% trans %}Question tools{% endtrans %}

          +
          +

          {% trans %}Question tools{% endtrans %}

          {% if favorited %} -
          {% trans %}Following{% endtrans %}
          {% trans %}Unfollow{% endtrans %}
          @@ -38,28 +38,7 @@
          {% cache 0 "questions_tags" questions_tags question.id language_code %} -{% if settings.SIDEBAR_QUESTION_SHOW_TAGS %} -
          -
          -

          - {% trans %}Question tags{% endtrans %}: -

          - -
          -{% endif %} + {% if settings.SIDEBAR_QUESTION_SHOW_META %}
          -- cgit v1.2.3-1-g7c22 From 362f3a6eb5f9577f91609b3e20893784aa58fa69 Mon Sep 17 00:00:00 2001 From: Byron Date: Sun, 23 Oct 2011 17:13:14 -0600 Subject: Finished style for sidebar elements on question template --- askbot/skins/default/media/style/lib_style.less | 2 +- askbot/skins/default/media/style/style.css | 137 +++++++++------------ .../skins/default/templates/question/sidebar.html | 10 +- .../templates/widgets/question_edit_tips.html | 4 + 4 files changed, 70 insertions(+), 83 deletions(-) diff --git a/askbot/skins/default/media/style/lib_style.less b/askbot/skins/default/media/style/lib_style.less index 34710137..cd8aa5d9 100644 --- a/askbot/skins/default/media/style/lib_style.less +++ b/askbot/skins/default/media/style/lib_style.less @@ -7,7 +7,7 @@ @question-link:#464646; @button-label:#4a757f; @section-title:#7ea9b3; -@info-text:#8d8d8d; +@info-text:#707070; @info-text-dark:#6b6b6b; /* Variables for fonts*/ diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index e5c38294..ded24542 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -490,7 +490,11 @@ h1 { } label { - color: #333; + color: @info-text; + font-size:15px; + display: block; + float: right; + width: 172px; } ul { @@ -541,9 +545,13 @@ h1 { } } + img.gravatar { + margin:1px; + } + /* widgets for question template */ - a.follow{ + a.followed, a.follow{ background: url(../images/medium-button.png) top repeat-x; height:34px; line-height:34px; @@ -555,22 +563,62 @@ h1 { font-size:21px; margin-top:3px; display:block; - width:150px; + width:120px; + text-decoration:none; .rounded-corners(4px); .box-shadow(1px, 1px, 2px, #636363); } - a.follow:hover{ + + 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: left; + } -img.gravatar { - margin:1px; } +.statsWidget p{ + color:@info-text; + font-size:16px; + border-bottom:#cccccc 1px solid; + + 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; + } +} /* tips and markdown help are widgets for ask template */ #tips{ @@ -594,6 +642,7 @@ img.gravatar { } } + /* ----- Sorting top Tab, check main_page/tab_bar.html ------*/ .tabBar { @@ -1310,11 +1359,13 @@ span.delete-icon:hover { float:none; clear:both; padding: 3px 0 0 1px; - font-size: 14px; + font-size: 15px; + width:110px; + } p.rss a { - padding-left: 18px; + font-family:@yanone; vertical-align: top; } } @@ -1435,16 +1486,6 @@ a:hover.medal { border-right: 1px solid #D1CA3D; } -.questions-related { - font-weight: 700; - word-wrap: break-word; -} - -.questions-related p { - line-height: 20px; - margin-bottom: 10px; - font-size: 100%; -} .question-status { margin-top: 10px; @@ -1468,56 +1509,6 @@ a:hover.medal { cursor: pointer; } -.vote-buttons .button{ - -moz-border-radius: 10px; - margin-top: 20px; - border-radius: 10px; - height: 20px; - width: 80px; - border-style: solid; - border-width: 1px; - padding: 8px; - float:left; -} - -.vote-buttons .followed{ - font-color: #000; - font-style:normal; - background: #cccccc; -} - -.vote-buttons .followed div{ - font-weight: normal; -} - -.vote-buttons .followed div.unfollow{ - display:none; -} - -.vote-buttons .followed:hover{ - color: #fff; - background: #8b0000; -} - -.vote-buttons .followed:hover div{ - display:none; -} - -.vote-buttons .followed:hover div.unfollow{ - display:inline; - font-weight: bold; -} - -.vote-buttons .follow{ - background: #cccccc; -} - -.vote-buttons .follow:hover{ - background: #234f32; - color: #fff; - font-weight: bold; -} - .vote-number { font-family: Arial; padding: 0px 0 3px 0; @@ -1545,14 +1536,6 @@ a:hover.medal { background: url(../images/vote-favorite-on.png) } -.favorite-number { - padding: 5px 0 0 10px; - font-size: 100%; - font-family: Arial; - font-weight: bold; - color: #777; - text-align: left; -} .notify-me { float: left; diff --git a/askbot/skins/default/templates/question/sidebar.html b/askbot/skins/default/templates/question/sidebar.html index 61339b08..d011d562 100644 --- a/askbot/skins/default/templates/question/sidebar.html +++ b/askbot/skins/default/templates/question/sidebar.html @@ -1,15 +1,15 @@ {% import "macros.html" as macros %} {{ settings.SIDEBAR_QUESTION_HEADER }} -
          +

          {% trans %}Question tools{% endtrans %}

          {% if favorited %} -
          {% else %} - @@ -41,9 +41,9 @@ {% if settings.SIDEBAR_QUESTION_SHOW_META %} -
          +
          -

          {% trans %}Stats:{% endtrans %}

          +

          {% trans %}Stats{% endtrans %}

          {% trans %}question asked{% endtrans %}: {{question.added_at|diff_date}}

          diff --git a/askbot/skins/default/templates/widgets/question_edit_tips.html b/askbot/skins/default/templates/widgets/question_edit_tips.html index b62c6338..1270687f 100644 --- a/askbot/skins/default/templates/widgets/question_edit_tips.html +++ b/askbot/skins/default/templates/widgets/question_edit_tips.html @@ -12,7 +12,9 @@

        @@ -53,7 +55,9 @@

    -- cgit v1.2.3-1-g7c22 From 3f945041578ed30fded3ef1a2b73edad1b6b0282 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Sun, 23 Oct 2011 23:53:26 -0300 Subject: added management command "send_accept_answer_reminders --- askbot/conf/email.py | 68 +++++++++++++----- askbot/const/__init__.py | 5 ++ askbot/doc/source/changelog.rst | 2 + askbot/doc/source/management-commands.rst | 5 ++ .../commands/send_accept_answer_reminders.py | 84 ++++++++++++++++++++++ .../commands/send_unanswered_question_reminders.py | 56 +++++---------- askbot/models/question.py | 42 +++++++++++ askbot/tests/email_alert_tests.py | 75 ++++++++++++++++--- askbot/utils/classes.py | 34 +++++++++ 9 files changed, 301 insertions(+), 70 deletions(-) create mode 100644 askbot/management/commands/send_accept_answer_reminders.py create mode 100644 askbot/utils/classes.py 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 ' ) ) ) @@ -179,6 +160,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, diff --git a/askbot/const/__init__.py b/askbot/const/__init__.py index 73c71800..84b87fb6 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')), ) diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst index b22839e0..ad01dc97 100644 --- a/askbot/doc/source/changelog.rst +++ b/askbot/doc/source/changelog.rst @@ -5,6 +5,8 @@ Development version (not yet published) --------------------------------------- * Show unused vote count (Tomasz Zielinski) * Categorized live settings (Evgeny) +* Added management command ``send_accept_answer_reminders`` (Evgeny) +* Improved the ``askbot-setup`` script (Adolfo, Evgeny) 0.7.26 (Current Version) ------------------------ diff --git a/askbot/doc/source/management-commands.rst b/askbot/doc/source/management-commands.rst index 1da3fdee..54b42b0a 100644 --- a/askbot/doc/source/management-commands.rst +++ b/askbot/doc/source/management-commands.rst @@ -111,6 +111,11 @@ Any configurable options, related to these commands are accessible via "Email" s | | of :ref:`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/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 = '

    ' + reminder_phrase + '

    ' + body_text += '
      ' + for question in final_question_list: + body_text += '
    • %s
    • ' \ + % ( + askbot_settings.APP_URL, + question.get_absolute_url(), + question.title + ) + body_text += '
    ' + + if DEBUG_THIS_COMMAND: + print "User: %s
    \nSubject:%s
    \nText: %s
    \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_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/models/question.py b/askbot/models/question.py index 0ddb5b08..682580e1 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -360,6 +360,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 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/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 -- cgit v1.2.3-1-g7c22 From 949410c1614f23dc70f9c0a40253597417c2eae8 Mon Sep 17 00:00:00 2001 From: Byron Date: Mon, 24 Oct 2011 01:17:59 -0600 Subject: progress in question template style --- .../common/templates/question/answer_controls.html | 6 +- .../templates/question/question_controls.html | 12 +- .../default/media/images/background-user-info.png | Bin 0 -> 361 bytes askbot/skins/default/media/images/close.png | Bin 0 -> 469 bytes askbot/skins/default/media/images/delete.png | Bin 0 -> 434 bytes askbot/skins/default/media/images/edit2.png | Bin 0 -> 498 bytes askbot/skins/default/media/images/flag.png | Bin 0 -> 515 bytes askbot/skins/default/media/images/retag.png | Bin 0 -> 474 bytes askbot/skins/default/media/style/style.css | 669 +++++++++++---------- askbot/skins/default/templates/macros.html | 2 +- .../default/templates/question/answer_card.html | 7 +- .../default/templates/question/answer_tab_bar.html | 18 +- .../default/templates/question/question_card.html | 40 +- 13 files changed, 398 insertions(+), 356 deletions(-) create mode 100644 askbot/skins/default/media/images/background-user-info.png create mode 100644 askbot/skins/default/media/images/close.png create mode 100644 askbot/skins/default/media/images/delete.png create mode 100644 askbot/skins/default/media/images/edit2.png create mode 100644 askbot/skins/default/media/images/flag.png create mode 100644 askbot/skins/default/media/images/retag.png diff --git a/askbot/skins/common/templates/question/answer_controls.html b/askbot/skins/common/templates/question/answer_controls.html index 4309e10c..87c39066 100644 --- a/askbot/skins/common/templates/question/answer_controls.html +++ b/askbot/skins/common/templates/question/answer_controls.html @@ -7,12 +7,12 @@ {% if request.user|can_edit_post(answer) %}{{ pipe() }} -{% trans %}edit{% endtrans %} +{% trans %}edit{% endtrans %} {% endif %} {% if request.user|can_flag_offensive(answer) %}{{ pipe() }} - {% trans %}flag offensive{% endtrans %} + {% trans %}flag offensive{% endtrans %} {% if request.user|can_see_offensive_flags(answer) %} {% if answer.offensive_flag_count > 0 %}({{ answer.offensive_flag_count }}){% endif %} {% endif %} @@ -21,7 +21,7 @@ {% if request.user|can_delete_post(answer) %}{{ pipe() }} {% spaceless %} - + {% if answer.deleted %}{% trans %}undelete{% endtrans %}{% else %}{% trans %}delete{% endtrans %}{% endif %} {% endspaceless %} diff --git a/askbot/skins/common/templates/question/question_controls.html b/askbot/skins/common/templates/question/question_controls.html index 257ce870..9de54526 100644 --- a/askbot/skins/common/templates/question/question_controls.html +++ b/askbot/skins/common/templates/question/question_controls.html @@ -1,31 +1,31 @@ {% set pipe=joiner('|') %} {% if request.user|can_edit_post(question) %}{{ pipe() }} - {% trans %}edit{% endtrans %} + {% trans %}edit{% endtrans %} {% endif %} {% if request.user|can_retag_question(question) %}{{ pipe() }} - {% trans %}retag{% endtrans %} + {% trans %}retag{% endtrans %} {% endif %} {% if question.closed %} {% if request.user|can_reopen_question(question) %}{{ pipe() }} - {% trans %}reopen{% endtrans %} + {% trans %}reopen{% endtrans %} {% endif %} {% else %} {% if request.user|can_close_question(question) %}{{ pipe() }} - {% trans %}close{% endtrans %} + {% trans %}close{% endtrans %} {% endif %} {% endif %} {% if request.user|can_flag_offensive(question) %}{{ pipe() }} - {% trans %}flag offensive{% endtrans %} + {% trans %}flag offensive{% endtrans %} {% if request.user|can_see_offensive_flags(question) %} {% if question.offensive_flag_count > 0 %}({{ question.offensive_flag_count }}){% endif %} {% endif %} {% endif %} {% if request.user|can_delete_post(question) %}{{ pipe() }} - {% if question.deleted %}{% trans %}undelete{% endtrans %}{% else %}{% trans %}delete{% endtrans %}{% endif %} + {% if question.deleted %}{% trans %}undelete{% endtrans %}{% else %}{% trans %}delete{% endtrans %}{% endif %} {% endif %} diff --git a/askbot/skins/default/media/images/background-user-info.png b/askbot/skins/default/media/images/background-user-info.png new file mode 100644 index 00000000..b681cb37 Binary files /dev/null and b/askbot/skins/default/media/images/background-user-info.png differ diff --git a/askbot/skins/default/media/images/close.png b/askbot/skins/default/media/images/close.png new file mode 100644 index 00000000..cfe209ff Binary files /dev/null and b/askbot/skins/default/media/images/close.png differ diff --git a/askbot/skins/default/media/images/delete.png b/askbot/skins/default/media/images/delete.png new file mode 100644 index 00000000..9263eae3 Binary files /dev/null and b/askbot/skins/default/media/images/delete.png differ diff --git a/askbot/skins/default/media/images/edit2.png b/askbot/skins/default/media/images/edit2.png new file mode 100644 index 00000000..f142a68c Binary files /dev/null and b/askbot/skins/default/media/images/edit2.png differ diff --git a/askbot/skins/default/media/images/flag.png b/askbot/skins/default/media/images/flag.png new file mode 100644 index 00000000..fc302335 Binary files /dev/null and b/askbot/skins/default/media/images/flag.png differ diff --git a/askbot/skins/default/media/images/retag.png b/askbot/skins/default/media/images/retag.png new file mode 100644 index 00000000..836c043c Binary files /dev/null and b/askbot/skins/default/media/images/retag.png differ diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index ded24542..5145d4ae 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -456,7 +456,7 @@ h1 { .box { background: #fff; padding: 4px 0px 10px 0px; - + width:200px; p { margin-bottom: 4px; @@ -595,7 +595,6 @@ h1 { color: #777; text-align: left; } - } .statsWidget p{ @@ -1368,48 +1367,374 @@ span.delete-icon:hover { font-family:@yanone; vertical-align: top; } -} -.question-body, .answer-body { - min-height: 39px; - line-height: 20px; - overflow: auto; - width: 660px; - font-family:@trebuchet; - color:#4b4b4b; + .question-content{ + float:right; + width:690px; + } + + #question-table{ + float:left; + border-top:#f0f0f0 1px solid; + } + + #question-table, + .answer-table { + margin: 6px 0 10px 0; + border-spacing: 0px; + width: 100%; + } + + .answer-table { + border-bottom: 1px solid #bbb; + clear: both; + } + + .answer-table td, + #question-table td { + width:30px; + vertical-align:top; + } + .question-body, .answer-body { + overflow: auto; + margin-top:10px; + font-family:@trebuchet; + color:#4b4b4b; + + p{ + margin-bottom:15px; + line-height:1.4; + font-size:13px; + } + } + + .question-body IMG, .answer-body IMG { + max-width: 600px; + } + + .post-update-info-container { + float: right; + width: 190px; + } + + .post-update-info { + background: #fff url(../images/background-user-info.png) repeat-x bottom; + float: right; + font-size: 9px; + font-family:@arial; + width: 173px; + 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:@trebuchet; + text-decoration: none; + height:18px; + display:block; + float:left; + line-height:18px; + margin-top:-2px; + margin-left:4px; + } + + a:hover { + background-color: #f5f0c9; + + } + .sep { + color: #ccc; + float:left; + 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; + } + } + .tabBar{ + width:100%; + } + + #questionCount{ + float:left; + font-family:@yanone; + line-height:15px; + } + + div.comments { + padding: 0; + } + + .comments .button { + color: black; + font-size: 11px; + background: #eeeeee; + padding: 3px; + cursor: pointer; + } + + .comment a { + background-color: inherit; + color: blue; + padding: 0; + } + + .comment a.author, a.author:hover { + background-color: inherit; + color: blue; + padding: 0; + } + + .comment a.author:hover { + text-decoration: underline; + } + + .comments { + font-size: 12px; + width: 650px; + clear: both; + } + + .comments .comment { + border-top: 1px dotted #cccccc; + margin: 0; + overflow: auto; + } + + .comments .content { + margin-bottom: 7px; + } + + .comments div.comment { + min-height: 25px; + } + + .comments div.comment:hover { + background-color: #eee; + } + + div.comment .comment-votes { + float: left; + width: 37px; + line-height: 130%; + padding: 6px 5px 6px 3px; + } + + div.comment .comment-body { + line-height: 140%; + margin: 3px 26px 0 46px; + padding: 5px 3px; + color: #666; + } + + div.comment .comment-body p{ + font-size:inherit; + margin-bottom: 3px; + padding: 0; + } + + div.comment .comment-delete { + float: right; + width: 14px; + line-height: 130%; + padding: 8px 6px; + } + + div.comment .upvote { + margin: 0px; + padding-right: 17px; + padding-top: 2px; + text-align: right; + height: 20px; + font-size: 13px; + font-weight: bold; + color: #777; + } + + div.comment .upvote.upvoted { + color: #d64000; + } + + div.comment .upvote.hover { + background: url(../images/go-up-grey.png) no-repeat; + background-position: right 1px; + } + + div.comment .upvote:hover { + background: url(../images/go-up-orange.png) no-repeat; + background-position: right 1px; + } + + .comments div.controls { + clear: both; + background: url(../images/gray-up-arrow-h18px.png) no-repeat; + width: 100%; + padding-left: 12px; + margin: 3px 0 20px 5px; + } + + .comments form.post-comments { + width: 560px; + margin: 3px 30px 4px 45px; + } + + .comments textarea { + display: block; + height: 42px; + width: 572px; + margin: 6px 0 5px 1px; + font-family: sans-serif; + outline: none; + overflow:auto; + font-size: 12px; + line-height: 140%; + padding-left:2px; + } + + .comments input { + margin-left: 10px; + margin-top: 1px; + vertical-align: top; + width: 100px; + } + + .comments .counter { + display: inline-block; + width: 245px; + vertical-align: top; + } + + .comments .controls a { + color: #888888; + padding: 0 3px 2px; + } + + .comments .controls a:hover { + background-color: #777777; + color: white; + text-decoration: none; + } + + .comments .help-text{ + float: right; + text-align:right; + color: gray; + margin-bottom: 0px; + margin-top: 0px; + line-height: 50%; + } } -.question-body p, .answer-body p{ - font-size:13px; +#questionTools { + font-size: 22px; + margin-top: 11px; + text-align: left; } -.question-body IMG, .answer-body IMG { - max-width: 600px; + + +.question-status { + margin-top: 10px; + margin-bottom:15px + padding: 20px; + background-color: #F5F5F5; + text-align: center; } +.question-status h3 { + font-size: 125%; +} -#question-table, -.answer-table { - margin: 2px 0 10px 0; - border-spacing: 0px; - width: 100%; +.vote-buttons { + float: left; + text-align: center; + padding-top: 2px; } -.answer-table { - border-bottom: 1px solid #bbb; - clear: both; +.vote-buttons IMG { + cursor: pointer; } -.answer-table td, -#question-table td { - width:30px; - vertical-align:top; +.vote-number { + font-family: Arial; + padding: 0px 0 3px 0; + font-size: 140%; + font-weight: bold; + color: #777; } -#questionTools { - font-size: 22px; - margin-top: 11px; +.vote-buttons .notify-sidebar { text-align: left; } +.vote-buttons .notify-sidebar label { + vertical-align: top; +} + +.question-img-upvote:hover { + background: url(../images/vote-arrow-up-on.png) +} + +.question-img-downvote:hover { + background: url(../images/vote-arrow-down-on.png) +} + +.question-img-favorite:hover { + background: url(../images/vote-favorite-on.png) +} + /* ----- Footer links , check blocks/footer.html----- */ @@ -1486,72 +1811,10 @@ a:hover.medal { border-right: 1px solid #D1CA3D; } - -.question-status { - margin-top: 10px; - margin-bottom:15px - padding: 20px; - background-color: #F5F5F5; - text-align: center; -} - -.question-status h3 { - font-size: 125%; -} - -.vote-buttons { - float: left; - text-align: center; - padding-top: 2px; -} - -.vote-buttons IMG { - cursor: pointer; -} - -.vote-number { - font-family: Arial; - padding: 0px 0 3px 0; - font-size: 140%; - font-weight: bold; - color: #777; -} - -.vote-buttons .notify-sidebar { - text-align: left; -} -.vote-buttons .notify-sidebar label { - vertical-align: top; -} - -.question-img-upvote:hover { - background: url(../images/vote-arrow-up-on.png) -} - -.question-img-downvote:hover { - background: url(../images/vote-arrow-down-on.png) -} - -.question-img-favorite:hover { - background: url(../images/vote-favorite-on.png) -} - - .notify-me { float: left; } -.offensive-flag a { - color: #777; - padding: 3px; - cursor: pointer; -} - -.offensive-flag a:hover { - background-color: #777; - text-decoration: none; - color: #fff; -} .linksopt a { color: #777; @@ -1565,158 +1828,6 @@ a:hover.medal { color: #fff; } -.post-controls a { - color: #777; - padding: 3px; - cursor: pointer; - border: none; - background: none; - text-decoration: none; -} - -.post-controls a:hover { - background-color: #777; - color: #fff; -} - -.post-controls .sep { - color: #ccc; -} - -.comments { - font-size: 12px; - width: 650px; - clear: both; -} - -.comments .comment { - border-top: 1px dotted #cccccc; - margin: 0; - overflow: auto; -} - -.comments .content { - margin-bottom: 7px; -} - -.comments div.comment { - min-height: 25px; -} - -.comments div.comment:hover { - background-color: #eee; -} - -div.comment .comment-votes { - float: left; - width: 37px; - line-height: 130%; - padding: 6px 5px 6px 3px; -} - -div.comment .comment-body { - line-height: 140%; - margin: 3px 26px 0 46px; - padding: 5px 3px; - color: #666; -} - -div.comment .comment-body p{ - font-size:inherit; - margin-bottom: 3px; - padding: 0; -} - -div.comment .comment-delete { - float: right; - width: 14px; - line-height: 130%; - padding: 8px 6px; -} - -div.comment .upvote { - margin: 0px; - padding-right: 17px; - padding-top: 2px; - text-align: right; - height: 20px; - font-size: 13px; - font-weight: bold; - color: #777; -} - -div.comment .upvote.upvoted { - color: #d64000; -} - -div.comment .upvote.hover { - background: url(../images/go-up-grey.png) no-repeat; - background-position: right 1px; -} - -div.comment .upvote:hover { - background: url(../images/go-up-orange.png) no-repeat; - background-position: right 1px; -} - -.comments div.controls { - clear: both; - background: url(../images/gray-up-arrow-h18px.png) no-repeat; - width: 100%; - padding-left: 12px; - margin: 3px 0 20px 5px; -} - -.comments form.post-comments { - width: 560px; - margin: 3px 30px 4px 45px; -} - -.comments textarea { - display: block; - height: 42px; - width: 572px; - margin: 6px 0 5px 1px; - font-family: sans-serif; - outline: none; - overflow:auto; - font-size: 12px; - line-height: 140%; - padding-left:2px; -} - -.comments input { - margin-left: 10px; - margin-top: 1px; - vertical-align: top; - width: 100px; -} - -.comments .counter { - display: inline-block; - width: 245px; - vertical-align: top; -} - -.comments .controls a { - color: #888888; - padding: 0 3px 2px; -} - -.comments .controls a:hover { - background-color: #777777; - color: white; - text-decoration: none; -} - -.comments .help-text{ - float: right; - text-align:right; - color: gray; - margin-bottom: 0px; - margin-top: 0px; - line-height: 50%; -} span.text-counter { margin-right: 20px; @@ -1732,33 +1843,6 @@ p.form-item { margin: 0px; } -div.comments { - padding: 0; -} - -.comments .button { - color: black; - font-size: 11px; - background: #eeeeee; - padding: 3px; - cursor: pointer; -} - -.comment a { - background-color: inherit; - color: blue; - padding: 0; -} - -.comment a.author, a.author:hover { - background-color: inherit; - color: blue; - padding: 0; -} - -.comment a.author:hover { - text-decoration: underline; -} .accepted-answer { background-color: #EBFFE6; @@ -1808,8 +1892,6 @@ div.comments { } - - /* openid styles */ .form-row { line-height: 25px; @@ -2464,18 +2546,6 @@ ul.form-horizontal-rows li input { vertical-align: top; } -.post-controls, .post-tags { - font-size: 11px; - line-height: 12px; - min-width: 200px; - padding-left: 5px; - margin-bottom: 5px; -} - -.post-controls { - clear: left; - float: left; -} ul.post-tags { margin-left: 7px; @@ -2494,37 +2564,6 @@ ul.post-retag { margin: 0 0 3px 0; } -.post-update-info-container { - float: right; - min-width: 85px; -} - -.post-update-info { - display: inline-block; - float: right; - font-size: 11px; - width: 190px; - margin-bottom: 5px; - line-height: 14px -} - -.post-update-info p { - line-height: 13px; - font-size: 11px; - margin: 0 0 2px 1px; - padding: 0; -} - -.post-update-info .gravatar { - float: left; - margin-right: 4px; -} - - -.post-update-info p.tip { - color: #444; -} - #tagSelector { padding-bottom: 2px; margin-bottom: 0; diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index c13595f4..c90458a1 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -49,7 +49,7 @@ poor design of the data or methods on data objects #} {% endif %} {{post.added_at|diff_date}}

    - {% trans %}this post is marked as community wiki{% endtrans %}
    +
    + {% include "question/answer_author_info.html" %} +
    {{ answer.html }}
    {% include "question/answer_controls.html" %}
    -
    - {% include "question/answer_author_info.html" %} -
    + {% include "question/answer_comments.html" %}
    diff --git a/askbot/skins/default/templates/question/answer_tab_bar.html b/askbot/skins/default/templates/question/answer_tab_bar.html index 227a9f81..ebb4dec5 100644 --- a/askbot/skins/default/templates/question/answer_tab_bar.html +++ b/askbot/skins/default/templates/question/answer_tab_bar.html @@ -1,12 +1,16 @@
    -

    - {% trans counter=answers|length %} - {{counter}} Answer: - {% pluralize %} - {{counter}} Answers: - {% endtrans %} -

    +

    + {% trans counter=answers|length %} + {{counter}} Answer + {% pluralize %} + {{counter}} Answers + {% endtrans %} +

    + + + Sort by » + {% trans %}oldest answers{% endtrans %} diff --git a/askbot/skins/default/templates/question/question_card.html b/askbot/skins/default/templates/question/question_card.html index 9364d3fd..b1fa1743 100644 --- a/askbot/skins/default/templates/question/question_card.html +++ b/askbot/skins/default/templates/question/question_card.html @@ -1,24 +1,22 @@ -

    {{ question.get_question_title() }}

    -{% include "question/question_tags.html" %} - - - - - -
    -
    - {% include "question/question_vote_buttons.html"%} - {% include "question/share_buttons.html"%} -
    -
    -
    - {{question.html}} -
    -
    - {% include "question/question_controls.html" %} -
    +
    + {% include "question/question_vote_buttons.html"%} + {% include "question/share_buttons.html"%} +
    +
    + +

    {{ question.get_question_title() }}

    + {% include "question/question_tags.html" %} +
    +
    {% include "question/question_author_info.html" %}
    - {% include "question/question_comments.html" %} -
    + {{question.html}} +
    +
    + {% include "question/question_controls.html" %} +
    + {% include "question/question_comments.html" %} +
    + +
    -- cgit v1.2.3-1-g7c22 From cfa983321297e0aaa425e5bfedde56effb76c247 Mon Sep 17 00:00:00 2001 From: Byron Date: Tue, 25 Oct 2011 00:52:53 -0600 Subject: Style for comments form and comment list, on question template --- .../templates/question/question_vote_buttons.html | 12 +- .../default/media/images/comment-background.png | Bin 0 -> 250 bytes askbot/skins/default/media/images/comment.png | Bin 0 -> 606 bytes .../default/media/images/small-button-cancel.png | Bin 0 -> 211 bytes .../default/media/images/vote-arrow-down-new.png | Bin 0 -> 1458 bytes .../media/images/vote-arrow-down-on-new.png | Bin 0 -> 980 bytes .../default/media/images/vote-arrow-up-new.png | Bin 0 -> 979 bytes .../default/media/images/vote-arrow-up-on-new.png | Bin 0 -> 1029 bytes askbot/skins/default/media/style/style.css | 337 ++++++++++++--------- .../default/templates/question/question_card.html | 1 + 10 files changed, 194 insertions(+), 156 deletions(-) create mode 100644 askbot/skins/default/media/images/comment-background.png create mode 100644 askbot/skins/default/media/images/comment.png create mode 100644 askbot/skins/default/media/images/small-button-cancel.png create mode 100644 askbot/skins/default/media/images/vote-arrow-down-new.png create mode 100644 askbot/skins/default/media/images/vote-arrow-down-on-new.png create mode 100644 askbot/skins/default/media/images/vote-arrow-up-new.png create mode 100644 askbot/skins/default/media/images/vote-arrow-up-on-new.png diff --git a/askbot/skins/common/templates/question/question_vote_buttons.html b/askbot/skins/common/templates/question/question_vote_buttons.html index b3db504f..5403c0f8 100644 --- a/askbot/skins/common/templates/question/question_vote_buttons.html +++ b/askbot/skins/common/templates/question/question_vote_buttons.html @@ -1,9 +1,9 @@ {% if question_vote %} {% trans %}i like this post (click again to cancel){% endtrans %} @@ -13,23 +13,23 @@ {% trans %}i dont like this post (click again to cancel){% endtrans %} {% else %} {% trans %}i like this post (click again to cancel){% endtrans %}
    {{ question.score }}
    {% trans %}i dont like this post (click again to cancel){% endtrans %} {% endif %} diff --git a/askbot/skins/default/media/images/comment-background.png b/askbot/skins/default/media/images/comment-background.png new file mode 100644 index 00000000..4299b847 Binary files /dev/null and b/askbot/skins/default/media/images/comment-background.png differ diff --git a/askbot/skins/default/media/images/comment.png b/askbot/skins/default/media/images/comment.png new file mode 100644 index 00000000..9dcc4c66 Binary files /dev/null and b/askbot/skins/default/media/images/comment.png differ diff --git a/askbot/skins/default/media/images/small-button-cancel.png b/askbot/skins/default/media/images/small-button-cancel.png new file mode 100644 index 00000000..79a87497 Binary files /dev/null and b/askbot/skins/default/media/images/small-button-cancel.png differ diff --git a/askbot/skins/default/media/images/vote-arrow-down-new.png b/askbot/skins/default/media/images/vote-arrow-down-new.png new file mode 100644 index 00000000..f2a28aea Binary files /dev/null and b/askbot/skins/default/media/images/vote-arrow-down-new.png differ diff --git a/askbot/skins/default/media/images/vote-arrow-down-on-new.png b/askbot/skins/default/media/images/vote-arrow-down-on-new.png new file mode 100644 index 00000000..2127bf7d Binary files /dev/null and b/askbot/skins/default/media/images/vote-arrow-down-on-new.png differ diff --git a/askbot/skins/default/media/images/vote-arrow-up-new.png b/askbot/skins/default/media/images/vote-arrow-up-new.png new file mode 100644 index 00000000..cb9ea8b6 Binary files /dev/null and b/askbot/skins/default/media/images/vote-arrow-up-new.png differ diff --git a/askbot/skins/default/media/images/vote-arrow-up-on-new.png b/askbot/skins/default/media/images/vote-arrow-up-on-new.png new file mode 100644 index 00000000..ef895206 Binary files /dev/null and b/askbot/skins/default/media/images/vote-arrow-up-on-new.png differ diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 5145d4ae..a6934629 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1347,6 +1347,10 @@ span.delete-icon:hover { .question-page{ + h1{ + padding-top:0px; + } + h1 a{ color:@question-link; font-size:30px; @@ -1514,169 +1518,214 @@ span.delete-icon:hover { font-family:@yanone; line-height:15px; } - - div.comments { - padding: 0; + .question-img-upvote:hover { + background: url(../images/vote-arrow-up-on-new.png) } - .comments .button { - color: black; - font-size: 11px; - background: #eeeeee; - padding: 3px; - cursor: pointer; + .question-img-downvote:hover { + background: url(../images/vote-arrow-down-on-new.png) } - .comment a { - background-color: inherit; - color: blue; - padding: 0; + .question-img-favorite:hover { + background: url(../images/vote-favorite-on.png) } - - .comment a.author, a.author:hover { - background-color: inherit; - color: blue; + div.comments { padding: 0; } - - .comment a.author:hover { - text-decoration: underline; + #comment-title{ + font-weight:bold; + font-size:23px; + color:@section-title; + width:200px; + float:left; } - .comments { - font-size: 12px; - width: 650px; + font-size: 12px; clear: both; - } - - .comments .comment { - border-top: 1px dotted #cccccc; - margin: 0; - overflow: auto; - } - - .comments .content { - margin-bottom: 7px; - } - - .comments div.comment { - min-height: 25px; - } - - .comments div.comment:hover { - background-color: #eee; - } - - div.comment .comment-votes { - float: left; - width: 37px; - line-height: 130%; - padding: 6px 5px 6px 3px; - } + + div.controls { + clear: both; + float:left; + width: 100%; + margin: 3px 0 20px 5px; + } + + .controls a { + color: #988e4c; + padding: 0 3px 2px 22px; + font-family:@trebuchet; + font-size:13px; + background:url(../images/comment.png) no-repeat center left; + } - div.comment .comment-body { - line-height: 140%; - margin: 3px 26px 0 46px; - padding: 5px 3px; - color: #666; - } + .controls a:hover { + background-color: #f5f0c9; + text-decoration: none; + } - div.comment .comment-body p{ - font-size:inherit; - margin-bottom: 3px; - padding: 0; - } + .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; + } - div.comment .comment-delete { - float: right; - width: 14px; - line-height: 130%; - padding: 8px 6px; - } + textarea { + height: 42px; + width:100%; + margin: 12px 0 5px 1px; + font-family: @trebuchet; + outline: none; + overflow:auto; + font-size: 12px; + line-height: 140%; + padding-left:2px; + padding-top:4px; + border:#cce6ec 3px solid; + } - div.comment .upvote { - margin: 0px; - padding-right: 17px; - padding-top: 2px; - text-align: right; - height: 20px; - font-size: 13px; - font-weight: bold; - color: #777; - } + 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:@trebuchet; + float:right; + text-align:right; + } + .comment { + border-bottom: 1px solid #edeeeb; + margin: 0; + margin-top:8px; + padding-bottom:4px; + overflow: auto; + font-family:@trebuchet; + 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; + } - div.comment .upvote.upvoted { - color: #d64000; - } + 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; + } - div.comment .upvote.hover { - background: url(../images/go-up-grey.png) no-repeat; - background-position: right 1px; - } + .comment-body { + line-height: 140%; + margin: 3px 26px 0 46px; + padding: 5px 3px; + color: #666; + } - div.comment .upvote:hover { - background: url(../images/go-up-orange.png) no-repeat; - background-position: right 1px; - } + .comment-body p{ + font-size:inherit; + margin-bottom: 3px; + padding: 0; + } - .comments div.controls { - clear: both; - background: url(../images/gray-up-arrow-h18px.png) no-repeat; - width: 100%; - padding-left: 12px; - margin: 3px 0 20px 5px; - } + .comment-delete { + float: right; + width: 14px; + line-height: 130%; + padding: 8px 6px; + } - .comments form.post-comments { - width: 560px; - margin: 3px 30px 4px 45px; - } + .upvote { + margin: 0px; + padding-right: 17px; + padding-top: 2px; + text-align: right; + height: 20px; + font-size: 13px; + font-weight: bold; + color: #777; + } - .comments textarea { - display: block; - height: 42px; - width: 572px; - margin: 6px 0 5px 1px; - font-family: sans-serif; - outline: none; - overflow:auto; - font-size: 12px; - line-height: 140%; - padding-left:2px; - } - - .comments input { - margin-left: 10px; - margin-top: 1px; - vertical-align: top; - width: 100px; - } + .upvote.upvoted { + color: #d64000; + } - .comments .counter { - display: inline-block; - width: 245px; - vertical-align: top; - } + .upvote.hover { + background: url(../images/go-up-grey.png) no-repeat; + background-position: right 1px; + } - .comments .controls a { - color: #888888; - padding: 0 3px 2px; - } + .upvote:hover { + background: url(../images/go-up-orange.png) no-repeat; + background-position: right 1px; + } - .comments .controls a:hover { - background-color: #777777; - color: white; - text-decoration: none; + .help-text{ + float: right; + text-align:right; + color: gray; + margin-bottom: 0px; + margin-top: 0px; + line-height: 50%; + } } - .comments .help-text{ - float: right; - text-align:right; - color: gray; - margin-bottom: 0px; - margin-top: 0px; - line-height: 50%; - } } #questionTools { @@ -1723,18 +1772,6 @@ span.delete-icon:hover { vertical-align: top; } -.question-img-upvote:hover { - background: url(../images/vote-arrow-up-on.png) -} - -.question-img-downvote:hover { - background: url(../images/vote-arrow-down-on.png) -} - -.question-img-favorite:hover { - background: url(../images/vote-favorite-on.png) -} - /* ----- Footer links , check blocks/footer.html----- */ diff --git a/askbot/skins/default/templates/question/question_card.html b/askbot/skins/default/templates/question/question_card.html index b1fa1743..b5cde475 100644 --- a/askbot/skins/default/templates/question/question_card.html +++ b/askbot/skins/default/templates/question/question_card.html @@ -16,6 +16,7 @@
    {% include "question/question_controls.html" %}
    +

    Comments

    {% include "question/question_comments.html" %} -- cgit v1.2.3-1-g7c22 From 6b2ca2f6ea0b1e9674084d3f1206f6a701da0013 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 25 Oct 2011 11:19:19 -0300 Subject: fixed bug reported at http://askbot.org/en/question/689/ unable to install into distribution directory --- askbot/deployment/__init__.py | 5 ++++- askbot/deployment/path_utils.py | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/askbot/deployment/__init__.py b/askbot/deployment/__init__.py index f4844083..6f7a86f6 100644 --- a/askbot/deployment/__init__.py +++ b/askbot/deployment/__init__.py @@ -117,7 +117,10 @@ def deploy_askbot(directory, options): create_new_project = False if os.path.exists(directory): - create_new_project = bool(options.force) + if path_utils.has_existing_django_project(directory): + create_new_project = bool(options.force) + else: + create_new_project = True else: create_new_project = True diff --git a/askbot/deployment/path_utils.py b/askbot/deployment/path_utils.py index d0b0a011..e0704a96 100644 --- a/askbot/deployment/path_utils.py +++ b/askbot/deployment/path_utils.py @@ -90,6 +90,9 @@ def has_existing_django_project(directory): 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): -- cgit v1.2.3-1-g7c22 From 2ab7904ba1ce8011970aaff3c7a8e98ec0c4dc6b Mon Sep 17 00:00:00 2001 From: Byron Date: Tue, 25 Oct 2011 21:54:43 -0600 Subject: back to old vote buttons, will be change later --- .../common/templates/question/question_vote_buttons.html | 12 ++++++------ askbot/skins/default/media/style/style.css | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/askbot/skins/common/templates/question/question_vote_buttons.html b/askbot/skins/common/templates/question/question_vote_buttons.html index 5403c0f8..b3db504f 100644 --- a/askbot/skins/common/templates/question/question_vote_buttons.html +++ b/askbot/skins/common/templates/question/question_vote_buttons.html @@ -1,9 +1,9 @@ {% if question_vote %} {% trans %}i like this post (click again to cancel){% endtrans %} @@ -13,23 +13,23 @@ {% trans %}i dont like this post (click again to cancel){% endtrans %} {% else %} {% trans %}i like this post (click again to cancel){% endtrans %}
    {{ question.score }}
    {% trans %}i dont like this post (click again to cancel){% endtrans %} {% endif %} diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index a6934629..745f4a22 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1519,11 +1519,11 @@ span.delete-icon:hover { line-height:15px; } .question-img-upvote:hover { - background: url(../images/vote-arrow-up-on-new.png) + background: url(../images/vote-arrow-up-on.png) } .question-img-downvote:hover { - background: url(../images/vote-arrow-down-on-new.png) + background: url(../images/vote-arrow-down-on.png) } .question-img-favorite:hover { -- cgit v1.2.3-1-g7c22 From 1334d0dd4ca66da248f98cc2d8f1e8829005eb4b Mon Sep 17 00:00:00 2001 From: Byron Date: Wed, 26 Oct 2011 01:02:18 -0600 Subject: Style for Answers list and answer form in Question template --- .../common/templates/question/answer_controls.html | 2 +- askbot/skins/default/media/images/link.png | Bin 0 -> 601 bytes askbot/skins/default/media/style/style.css | 248 +++++++++++---------- .../default/templates/question/answer_card.html | 5 +- .../default/templates/question/answer_tab_bar.html | 1 - .../default/templates/question/question_card.html | 1 + 6 files changed, 137 insertions(+), 120 deletions(-) create mode 100644 askbot/skins/default/media/images/link.png diff --git a/askbot/skins/common/templates/question/answer_controls.html b/askbot/skins/common/templates/question/answer_controls.html index 87c39066..4d26ffb9 100644 --- a/askbot/skins/common/templates/question/answer_controls.html +++ b/askbot/skins/common/templates/question/answer_controls.html @@ -1,6 +1,6 @@ {% set pipe=joiner('|') %} {{ pipe() }} - {% trans %}permanent link{% endtrans %} diff --git a/askbot/skins/default/media/images/link.png b/askbot/skins/default/media/images/link.png new file mode 100644 index 00000000..6ad60f5e Binary files /dev/null and b/askbot/skins/default/media/images/link.png differ diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 745f4a22..0b5bc70f 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -438,6 +438,7 @@ h1 { width: 730px; float: left; position: relative; + padding-bottom:10px; } #ContentRight { @@ -1248,6 +1249,7 @@ span.delete-icon:hover { font-size: 15px; } +#fmanswer input.submit, .ask-page input.submit, .edit-question-page input.submit { float: left; @@ -1262,6 +1264,8 @@ span.delete-icon:hover { .rounded-corners(4px); .box-shadow(1px, 1px, 2px, #636363); } + +#fmanswer input.submit:hover, .ask-page input.submit:hover, .edit-question-page input.submit:hover{ text-decoration:none; @@ -1292,6 +1296,13 @@ span.delete-icon:hover { background-color: #F5F5F5; min-height: 20px; overflow: auto; + font-size:13px; + font-family:@trebuchet; + + p{ + font-size:13px; + margin-bottom:14px; + } } .wmd-preview pre { @@ -1371,10 +1382,11 @@ span.delete-icon:hover { font-family:@yanone; vertical-align: top; } - + .question-content{ float:right; width:690px; + margin-bottom:10px; } #question-table{ @@ -1384,19 +1396,19 @@ span.delete-icon:hover { #question-table, .answer-table { - margin: 6px 0 10px 0; + margin: 6px 0 0px 0; border-spacing: 0px; width: 100%; } .answer-table { - border-bottom: 1px solid #bbb; + border-bottom: 1px solid #D4D4D4; clear: both; } .answer-table td, #question-table td { - width:30px; + width:20px; vertical-align:top; } .question-body, .answer-body { @@ -1410,6 +1422,14 @@ span.delete-icon:hover { line-height:1.4; font-size:13px; } + + a { + color:@link; + } + + li { + margin-bottom:0.7em; + } } .question-body IMG, .answer-body IMG { @@ -1474,7 +1494,7 @@ span.delete-icon:hover { text-decoration: none; height:18px; display:block; - float:left; + float:right; line-height:18px; margin-top:-2px; margin-left:4px; @@ -1486,12 +1506,12 @@ span.delete-icon:hover { } .sep { color: #ccc; - float:left; + float:right; height:18px; font-size:18px; } } - .post-controls,.answer-controls{ + .post-controls, .answer-controls{ .question-delete{ background: url(../images/delete.png) no-repeat center left; padding-left:16px; @@ -1508,6 +1528,9 @@ span.delete-icon:hover { .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%; @@ -1725,54 +1748,117 @@ span.delete-icon:hover { 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: #F5F5F5; + text-align: center; + } -#questionTools { - font-size: 22px; - margin-top: 11px; - text-align: left; -} + .question-status h3 { + font-size: 125%; + } + .vote-buttons { + float: left; + text-align: center; + padding-top: 2px; + } -.question-status { - margin-top: 10px; - margin-bottom:15px - padding: 20px; - background-color: #F5F5F5; - text-align: center; -} + .vote-buttons IMG { + cursor: pointer; + } -.question-status h3 { - font-size: 125%; -} + .vote-number { + font-family: @yanone; + padding: 0px 0 5px 0; + font-size: 25px; + font-weight: bold; + color: #777; + } -.vote-buttons { - float: left; - text-align: center; - padding-top: 2px; -} + .vote-buttons .notify-sidebar { + text-align: left; + } + .vote-buttons .notify-sidebar label { + vertical-align: top; + } + .accepted-answer { + background-color: #f7fecc; + border-bottom-color: #9BD59B; + + .vote-buttons { + width:27px; + } + } -.vote-buttons IMG { - cursor: pointer; -} + .answer .post-update-info a{ + color:#444444; + } + + .accepted-answer .comments { + background-color: #f1f6d4; + } -.vote-number { - font-family: Arial; - padding: 0px 0 3px 0; - font-size: 140%; - font-weight: bold; - color: #777; -} + .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; + } + } + + .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; + + } -.vote-buttons .notify-sidebar { - text-align: left; -} -.vote-buttons .notify-sidebar label { - vertical-align: top; } + + /* ----- Footer links , check blocks/footer.html----- */ #ground { @@ -1853,19 +1939,6 @@ a:hover.medal { } -.linksopt a { - color: #777; - padding: 3px; - cursor: pointer; -} - -.linksopt a:hover { - background-color: #777; - text-decoration: none; - color: #fff; -} - - span.text-counter { margin-right: 20px; } @@ -1881,48 +1954,7 @@ p.form-item { } -.accepted-answer { - background-color: #EBFFE6; - border-bottom-color: #9BD59B; -} - -.accepted-answer .comments .button { - background-color: #CCFFBF; -} - -.accepted-answer .comments { - background-color: #CCFFBF; -} - -.answered { - background: #CCC; - color: #999; -} - -.answered-accepted { - background: #CCC; - color: #763333; -} - -.answered-by-owner { - background: #E9E9FF; -} - -.answered-by-owner .comments .button { - background-color: #E6ECFF; -} - -.answered-by-owner .comments { - background-color: #E6ECFF; -} - -.answered-accepted strong { - color: #E1E818; -} -.answer-img-accept:hover { - background: url(../images/vote-accepted-on.png) -} .deleted { background: #F4E7E7 none repeat scroll 0 0; @@ -2348,13 +2380,6 @@ a.offensive { display: inline; } -.message { - padding: 5px; - margin: 10px 0 10px 0; - background-color: #eee; - border: 1px solid #aaaaaa; -} - .message h1 { padding-top: 0px; font-size: 15px; @@ -2640,20 +2665,9 @@ p.signup_p { } /* a workaround to set link colors correctly */ -.answer-body a { - color:#0000ff; -} -.question-body a { - color:#0000ff; -} -.question-body li { - margin-bottom:0.7em; -} -.answer-body li { - margin-bottom:0.7em; -} + .wmd-preview a { - color:#0000ff; + color:@link; } .wmd-preview li { margin-bottom:0.7em; diff --git a/askbot/skins/default/templates/question/answer_card.html b/askbot/skins/default/templates/question/answer_card.html index f2786e54..f623294f 100644 --- a/askbot/skins/default/templates/question/answer_card.html +++ b/askbot/skins/default/templates/question/answer_card.html @@ -17,10 +17,13 @@ {{ answer.html }} +
    + {% include "question/answer_controls.html" %}
    - + +

    Comments

    {% include "question/answer_comments.html" %} diff --git a/askbot/skins/default/templates/question/answer_tab_bar.html b/askbot/skins/default/templates/question/answer_tab_bar.html index ebb4dec5..04584bbd 100644 --- a/askbot/skins/default/templates/question/answer_tab_bar.html +++ b/askbot/skins/default/templates/question/answer_tab_bar.html @@ -7,7 +7,6 @@ {% endtrans %}
    - Sort by » diff --git a/askbot/skins/default/templates/question/question_card.html b/askbot/skins/default/templates/question/question_card.html index b5cde475..215f6766 100644 --- a/askbot/skins/default/templates/question/question_card.html +++ b/askbot/skins/default/templates/question/question_card.html @@ -16,6 +16,7 @@
    {% include "question/question_controls.html" %}
    +

    Comments

    {% include "question/question_comments.html" %}
    -- cgit v1.2.3-1-g7c22 From 348c42303f03f193dacfbe792c88a13647a65af7 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Thu, 27 Oct 2011 15:51:04 -0300 Subject: moved post vote buttons to css background, simplified the vote button handler javascript --- askbot/models/meta.py | 4 +++ askbot/skins/common/media/js/post.js | 34 ++++++++----------- .../templates/question/answer_vote_buttons.html | 24 +++---------- .../templates/question/question_vote_buttons.html | 39 +++------------------- askbot/skins/default/media/style/style.css | 21 ++++++++++-- askbot/skins/default/templates/macros.html | 26 +++++++++++++++ askbot/views/readers.py | 26 +++++++-------- 7 files changed, 83 insertions(+), 91 deletions(-) diff --git a/askbot/models/meta.py b/askbot/models/meta.py index 9022a7ec..cbec7d33 100644 --- a/askbot/models/meta.py +++ b/askbot/models/meta.py @@ -49,6 +49,10 @@ class Vote(base.MetaContent, base.UserContent): def __unicode__(self): return '[%s] voted at %s: %s' %(self.user, self.voted_at, self.vote) + def __int__(self): + """1 if upvote -1 if downvote""" + return self.vote + def is_upvote(self): return self.vote == self.VOTE_UP diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js index 52772cc0..82f76bc8 100644 --- a/askbot/skins/common/media/js/post.js +++ b/askbot/skins/common/media/js/post.js @@ -321,27 +321,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); }; @@ -373,22 +373,13 @@ var Vote = function(){ return $(removeAnswerLinks); }; - 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")); - - // 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")); - } - else{ - $(getAnswerVoteUpButton(postId)).attr("src", mediaUrl("media/images/vote-arrow-up.png")); - $(getAnswerVoteDownButton(postId)).attr("src", mediaUrl("media/images/vote-arrow-down.png")); - } + var setVoteImage = function(voteType, undo, elem){ + elem.siblings('.post-vote').removeClass('on'); + if (undo){ + elem.removeClass('on'); + return; } + elem.addClass('on'); }; var setVoteNumber = function(object, number){ @@ -566,6 +557,7 @@ var Vote = function(){ } else { if (data.status == '1'){ + //cancel vote setVoteImage(voteType, true, object); } else { diff --git a/askbot/skins/common/templates/question/answer_vote_buttons.html b/askbot/skins/common/templates/question/answer_vote_buttons.html index bef26b75..841fe55a 100644 --- a/askbot/skins/common/templates/question/answer_vote_buttons.html +++ b/askbot/skins/common/templates/question/answer_vote_buttons.html @@ -1,22 +1,8 @@ -{% trans %}i like this answer (click again to cancel){% endtrans %} -
    - {{ answer.score }} -
    -{% trans %}i dont like this answer (click again to cancel){% endtrans %} +{{ macros.post_vote_buttons( + post = answer, + visitor_vote = user_answer_votes[answer.id] + ) +}} {% if request.user == question.author %} {% trans %}i like this post (click again to cancel){% endtrans %} -
    - {{ question.score }} -
    -{% trans %}i dont like this post (click again to cancel){% endtrans %} -{% else %} -{% trans %}i like this post (click again to cancel){% endtrans %} -
    - {{ question.score }} -
    -{% trans %}i dont like this post (click again to cancel){% endtrans %} -{% endif %} +{{ macros.post_vote_buttons( + post = question, + visitor_vote = user_question_vote) +}} diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 0b5bc70f..90674331 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1541,11 +1541,28 @@ span.delete-icon:hover { font-family:@yanone; line-height:15px; } - .question-img-upvote:hover { + + .question-img-upvote, .question-img-downvote, + .answer-img-upvote, .answer-img-downvote { + width: 25px; + height: 25px; + } + + .question-img-upvote, .answer-img-upvote { + background: url(../images/vote-arrow-up.png) + } + + .question-img-downvote, .answer-img-downvote { + background: url(../images/vote-arrow-down.png) + } + + .question-img-upvote:hover, .question-img-upvote.on, + .answer-img-upvote:hover, .answer-img-upvote.on { background: url(../images/vote-arrow-up-on.png) } - .question-img-downvote:hover { + .question-img-downvote:hover, .question-img-downvote.on, + .answer-img-downvote:hover, .answer-img-downvote.on { background: url(../images/vote-arrow-down-on.png) } diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index c90458a1..23111514 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -21,6 +21,32 @@ {%- endmacro -%} +{%- macro post_vote_buttons(post = None, visitor_vote = None) -%} +
    +
    {{ post.score }}
    +
    +{%- endmacro -%} + {%- macro post_contributor_avatar_and_credentials(post, user) -%} {% if post.is_anonymous %} {% trans %}anonymous user{% endtrans %} diff --git a/askbot/views/readers.py b/askbot/views/readers.py index eabef3c8..8df07874 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -428,13 +428,11 @@ def question(request, id):#refactor - long subroutine. display question body, an answers = answers.select_related(depth=1) user_answer_votes = {} - for answer in answers: - vote = answer.get_user_vote(request.user) - if vote is not None and not user_answer_votes.has_key(answer.id): - vote_value = -1 - if vote.is_upvote(): - vote_value = 1 - user_answer_votes[answer.id] = vote_value + if request.user.is_authenticated(): + for answer in answers: + vote = answer.get_user_vote(request.user) + if vote is not None and not answer.id in user_answer_votes: + user_answer_votes[answer.id] = int(vote) view_dic = {"latest":"-added_at", "oldest":"added_at", "votes":"-score" } orderby = view_dic[answer_sort_method] @@ -515,19 +513,19 @@ def question(request, id):#refactor - long subroutine. display question body, an paginator_context = extra_tags.cnprog_paginator(paginator_data) favorited = question.has_favorite_by_user(request.user) + user_question_vote = 0 if request.user.is_authenticated(): - question_vote = question.votes.select_related().filter(user=request.user) - else: - question_vote = None #is this correct? - if question_vote is not None and question_vote.count() > 0: - question_vote = question_vote[0] - + votes = question.votes.select_related().filter(user=request.user) + if votes.count() > 0: + user_question_vote = int(votes[0]) + else: + user_question_vote = 0 data = { 'page_class': 'question-page', 'active_tab': 'questions', 'question' : question, - 'question_vote' : question_vote, + 'user_question_vote' : user_question_vote, 'question_comment_count':question.comments.count(), 'answer' : AnswerForm(question,request.user), 'answers' : page_objects.object_list, -- cgit v1.2.3-1-g7c22 From 431e69b51055e799805f20d221f4e3c3a7575ea2 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Thu, 27 Oct 2011 16:13:04 -0300 Subject: changed table, tr and td elements in the answer_card.html to div - most functions seem to work, but did not test accept best answer --- askbot/skins/default/templates/question/answer_card.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/askbot/skins/default/templates/question/answer_card.html b/askbot/skins/default/templates/question/answer_card.html index f623294f..9b759a20 100644 --- a/askbot/skins/default/templates/question/answer_card.html +++ b/askbot/skins/default/templates/question/answer_card.html @@ -2,14 +2,14 @@
    - - - - - -
    +
    +
    +
    {% include "question/answer_vote_buttons.html" %}
    -
    + +
    @@ -26,7 +26,7 @@

    Comments

    {% include "question/answer_comments.html" %}
    -
    +
    + + -- cgit v1.2.3-1-g7c22 From a707ee16bde652462d8ed43e6ad10851e24cdfa6 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Thu, 27 Oct 2011 16:54:31 -0300 Subject: added title "Comments" to the post_comment_widget macro --- askbot/skins/default/templates/macros.html | 3 ++ .../default/templates/question/answer_card.html | 32 ++++++++-------------- .../default/templates/question/question_card.html | 2 -- 3 files changed, 14 insertions(+), 23 deletions(-) diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index 23111514..e9181ed7 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -326,6 +326,9 @@ for the purposes of the AJAX comment editor #} ) -%} {% spaceless %} + {% if post.comment_count > 0 %} +

    Comments

    + {% endif %} {% set widget_id = 'comments-for-' + post.post_type + '-' + post.id|string %}
    diff --git a/askbot/skins/default/templates/question/answer_card.html b/askbot/skins/default/templates/question/answer_card.html index 9b759a20..cbfb0a3e 100644 --- a/askbot/skins/default/templates/question/answer_card.html +++ b/askbot/skins/default/templates/question/answer_card.html @@ -3,30 +3,20 @@ id="answer-container-{{ answer.id }}" class="{{ macros.answer_classes(answer, question) }}">
    -
    -
    -
    - {% include "question/answer_vote_buttons.html" %} +
    + {% include "question/answer_vote_buttons.html" %} +
    +
    +
    +
    + {% include "question/answer_author_info.html" %}
    + {{ answer.html }}
    -
    -
    -
    -
    - {% include "question/answer_author_info.html" %} -
    - {{ answer.html }} -
    - -
    - - {% include "question/answer_controls.html" %} -
    - -

    Comments

    - {% include "question/answer_comments.html" %} -
    +
    + {% include "question/answer_controls.html" %}
    + {% include "question/answer_comments.html" %}
    diff --git a/askbot/skins/default/templates/question/question_card.html b/askbot/skins/default/templates/question/question_card.html index 215f6766..b1fa1743 100644 --- a/askbot/skins/default/templates/question/question_card.html +++ b/askbot/skins/default/templates/question/question_card.html @@ -16,8 +16,6 @@
    {% include "question/question_controls.html" %}
    - -

    Comments

    {% include "question/question_comments.html" %}
    -- cgit v1.2.3-1-g7c22 From 11fa160f164c4307cabcbcdf897ed6fd721a424d Mon Sep 17 00:00:00 2001 From: Byron Date: Fri, 28 Oct 2011 00:07:54 -0600 Subject: closed message and preview style --- .../templates/question/closed_question_info.html | 4 +-- askbot/skins/default/media/style/style.css | 29 +++++++++++++--------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/askbot/skins/common/templates/question/closed_question_info.html b/askbot/skins/common/templates/question/closed_question_info.html index db4b10ee..73ff4e47 100644 --- a/askbot/skins/common/templates/question/closed_question_info.html +++ b/askbot/skins/common/templates/question/closed_question_info.html @@ -1,5 +1,5 @@
    -

    {% trans close_reason=question.get_close_reason_display() %}The question has been closed for the following reason "{{ close_reason }}" by{% endtrans %} -{{ question.closed_by.username }} +

    {% trans close_reason=question.get_close_reason_display() %}The question has been closed for the following reason "{{ close_reason }}" by{% endtrans %} +{{ question.closed_by.username }}
    {% trans closed_at=question.closed_at %}close date {{closed_at}}{% endtrans %}

    diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 90674331..a5f9649e 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1300,8 +1300,9 @@ span.delete-icon:hover { font-family:@trebuchet; p{ - font-size:13px; - margin-bottom:14px; + margin-bottom:14px; + line-height:1.4; + font-size:14px; } } @@ -1418,9 +1419,9 @@ span.delete-icon:hover { color:#4b4b4b; p{ - margin-bottom:15px; + margin-bottom:14px; line-height:1.4; - font-size:13px; + font-size:14px; } a { @@ -1545,25 +1546,26 @@ span.delete-icon:hover { .question-img-upvote, .question-img-downvote, .answer-img-upvote, .answer-img-downvote { width: 25px; - height: 25px; + height: 20px; + cursor:pointer; } .question-img-upvote, .answer-img-upvote { - background: url(../images/vote-arrow-up.png) + background: url(../images/vote-arrow-up-new.png) no-repeat; } .question-img-downvote, .answer-img-downvote { - background: url(../images/vote-arrow-down.png) + 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.png) + 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.png) + background: url(../images/vote-arrow-down-on-new.png) no-repeat; } .question-img-favorite:hover { @@ -1773,14 +1775,17 @@ span.delete-icon:hover { .question-status { margin-top: 10px; - margin-bottom:15px + margin-bottom:15px; padding: 20px; - background-color: #F5F5F5; + background-color: #fef7cc; text-align: center; + border:#e1c04a 1px solid; } .question-status h3 { - font-size: 125%; + font-size: 20px; + color:@info-text; + font-weight:normal; } .vote-buttons { -- cgit v1.2.3-1-g7c22 From b5429ecf161380d8efe1d186554566d8d7e03793 Mon Sep 17 00:00:00 2001 From: Byron Date: Fri, 28 Oct 2011 01:09:33 -0600 Subject: Edit question page --- .../default/media/style/jquery.autocomplete.css | 7 ++- askbot/skins/default/media/style/style.css | 55 ++++++++++++++++++---- askbot/skins/default/templates/question_edit.html | 7 +-- .../skins/default/templates/widgets/ask_form.html | 10 ++-- 4 files changed, 59 insertions(+), 20 deletions(-) diff --git a/askbot/skins/default/media/style/jquery.autocomplete.css b/askbot/skins/default/media/style/jquery.autocomplete.css index b3d7b759..09b08192 100644 --- a/askbot/skins/default/media/style/jquery.autocomplete.css +++ b/askbot/skins/default/media/style/jquery.autocomplete.css @@ -4,8 +4,11 @@ .acResults { padding: 0px; border: 1px solid WindowFrame; - background-color: Window; + background-color: #fff; overflow: hidden; + -webkit-box-shadow: 0px 1px 1px #A7A7A7; + -moz-box-shadow: 0px 1px 1px #BFBFBF; + box-shadow: 0px 1px 1px #BFBFBF; } .acResults ul { @@ -23,7 +26,7 @@ display: block; width: 100%; font: menu; - font-size: 12px; + font-size: 14px; overflow: hidden; } diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index a5f9649e..fbf8d56c 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1169,7 +1169,18 @@ span.delete-icon:hover { padding-right: 15px; } -/* ----- Ask Question Form template----- */ +/* ----- Ask and Edit Question Form template----- */ + +.section-title{ + color:@section-title; + font-family:@yanone; + font-weight:bold; + font-size:24px; +} + +.ask-body { + padding-right: 10px; +} #fmask{ margin-bottom:30px; @@ -1198,7 +1209,7 @@ span.delete-icon:hover { } } -.ask-page{ +.ask-page, .edit-question-page{ div#question-list { float: none; @@ -1241,6 +1252,7 @@ span.delete-icon:hover { height:25px; padding-left:5px; width:395px; + font-size:14px; } } @@ -1263,6 +1275,7 @@ span.delete-icon:hover { margin-top:3px; .rounded-corners(4px); .box-shadow(1px, 1px, 2px, #636363); + margin-right:7px; } #fmanswer input.submit:hover, @@ -1341,9 +1354,9 @@ span.delete-icon:hover { .question-options { margin-top: 1px; - float: left; color: #666; line-height: 13px; + margin-bottom:5px; } .question-options label { vertical-align: text-bottom; @@ -1355,6 +1368,33 @@ span.delete-icon:hover { 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; + } +} + /* ----- Question template ----- */ .question-page{ @@ -1429,7 +1469,7 @@ span.delete-icon:hover { } li { - margin-bottom:0.7em; + margin-bottom:7px; } } @@ -2456,11 +2496,6 @@ button::-moz-focus-inner { *display: inline; } -.ask-body { - padding-right: 10px; -} - - .noscript { position: fixed; top: 0px; @@ -2692,7 +2727,7 @@ p.signup_p { color:@link; } .wmd-preview li { - margin-bottom:0.7em; + margin-bottom:7px; } .karma-summary { diff --git a/askbot/skins/default/templates/question_edit.html b/askbot/skins/default/templates/question_edit.html index 3cdcd8bb..47873e0e 100644 --- a/askbot/skins/default/templates/question_edit.html +++ b/askbot/skins/default/templates/question_edit.html @@ -6,7 +6,7 @@ {% endblock %} {% block content %} -

    {% trans %}Edit question{% endtrans %} [{% trans %}back{% endtrans %}]

    +
    {% trans %}Edit question{% endtrans %} [{% trans %}back{% endtrans %}]
    {% csrf_token %} {% if revision_form.revision.errors %}{{ revision_form.revision.errors.as_ul() }}{% endif %} @@ -24,8 +24,6 @@ ) }}
    -   -
    {% if settings.WIKI_ON and question.wiki == False %} {{ macros.checkbox_in_div(form.wiki) }} @@ -34,6 +32,9 @@ {{ macros.checkbox_in_div(form.reveal_identity) }} {% endif %}
    +   + +
    {% endblock %} diff --git a/askbot/skins/default/templates/widgets/ask_form.html b/askbot/skins/default/templates/widgets/ask_form.html index 4e3346b8..18196d93 100644 --- a/askbot/skins/default/templates/widgets/ask_form.html +++ b/askbot/skins/default/templates/widgets/ask_form.html @@ -30,11 +30,6 @@ mandatory_tags = mandatory_tags ) }} - {% if not request.user.is_authenticated() %} - - {% else %} - - {% endif %}
    {% if settings.WIKI_ON %} {{ macros.checkbox_in_div(form.wiki) }} @@ -43,5 +38,10 @@ {{ macros.checkbox_in_div(form.ask_anonymously) }} {% endif %}
    + {% if not request.user.is_authenticated() %} + + {% else %} + + {% endif %}
    -- cgit v1.2.3-1-g7c22 From cb08d9077cb80e6f5094a39096ad92997c59772e Mon Sep 17 00:00:00 2001 From: Daniel Mican Date: Fri, 28 Oct 2011 14:05:35 -0400 Subject: Added a user migration command, Have to make it take command line user_ids, and test it!! --- askbot/management/commands/migrate_user_account.py | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 askbot/management/commands/migrate_user_account.py diff --git a/askbot/management/commands/migrate_user_account.py b/askbot/management/commands/migrate_user_account.py new file mode 100644 index 00000000..008849fc --- /dev/null +++ b/askbot/management/commands/migrate_user_account.py @@ -0,0 +1,67 @@ +from django.core.management.base import NoArgsCommand +from django.db.models import get_model +from django.contrib.auth.models import User + + +class Command(NoArgsCommand): + def find_relations(self, **options): + rel = User._meta.get_all_related_objects() + print 'simple:' + for r in rel: + print r.model, r.field.name + print 'm2m:' + rel_m2m = User._meta.get_all_related_many_to_many_objects() + for r in rel_m2m: + print r.model, r.field.name + + def handle_noargs(self, **options): + from_id = 2 + to_id = 1 + + self.from_user = User.objects.get(id = from_id) + self.to_user = User.objects.get(id = to_id) + + # Process all foreign key Relationships + for rel in User._meta.get_all_related_objects(): + try: + self.process_field(rel.model, rel.field.name) + except: + if rel.field.name == 'UserAssociation': + print 'had problem with UserAssociation uniquiness' + elif rel.field.name == 'UserPasswordQueue': + print 'had problem with UserPasswordQueue uniquiness' + + #Get all the many_to_many items + #import ipdb; ipdb.set_trace() + for rel in User._meta.get_all_related_many_to_many_objects(): + self.process_m2m_field(rel.model, rel.field.name) + + + 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): + 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): + 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) -- cgit v1.2.3-1-g7c22 From 9fbedb7b9df717b4839505d184adf5e15c297d10 Mon Sep 17 00:00:00 2001 From: dm03514 Date: Sat, 29 Oct 2011 11:49:02 -0400 Subject: Added command line arguments and some info about the commmand, ran it through some manual tests nothing programmatic --- askbot/management/commands/migrate_user_account.py | 39 +++++++++------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/askbot/management/commands/migrate_user_account.py b/askbot/management/commands/migrate_user_account.py index 008849fc..0fdf4f14 100644 --- a/askbot/management/commands/migrate_user_account.py +++ b/askbot/management/commands/migrate_user_account.py @@ -1,42 +1,35 @@ -from django.core.management.base import NoArgsCommand +from django.core.management.base import NoArgsCommand, CommandError, BaseCommand from django.db.models import get_model from django.contrib.auth.models import User -class Command(NoArgsCommand): - def find_relations(self, **options): - rel = User._meta.get_all_related_objects() - print 'simple:' - for r in rel: - print r.model, r.field.name - print 'm2m:' - rel_m2m = User._meta.get_all_related_many_to_many_objects() - for r in rel_m2m: - print r.model, r.field.name +class Command(BaseCommand): + args = ' ' + help = 'Migrate an account and all information from a to a , deleting the ' - def handle_noargs(self, **options): - from_id = 2 - to_id = 1 + def parse_arguments(self, *arguments): + if len(arguments) != 2: + raise CommandError('Arguments are to ') + self.from_user = User.objects.get(id = arguments[0]) + self.to_user = User.objects.get(id = arguments[1]) - self.from_user = User.objects.get(id = from_id) - self.to_user = User.objects.get(id = to_id) + def handle(self, *arguments, **options): + self.parse_arguments(*arguments) - # Process all foreign key Relationships for rel in User._meta.get_all_related_objects(): try: self.process_field(rel.model, rel.field.name) - except: + except Exception, e: if rel.field.name == 'UserAssociation': - print 'had problem with UserAssociation uniquiness' + self.stdout.write('had problem with UserAssociation uniquiness') elif rel.field.name == 'UserPasswordQueue': - print 'had problem with UserPasswordQueue uniquiness' + self.stdout.write('had problem with UserPasswordQueue uniquiness') + else: + self.stdout.write('Recieved Error: %s' % (e)) - #Get all the many_to_many items - #import ipdb; ipdb.set_trace() for rel in User._meta.get_all_related_many_to_many_objects(): self.process_m2m_field(rel.model, rel.field.name) - 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 -- cgit v1.2.3-1-g7c22 From 47ace4332fff16351c36e4d38bfd3950a8d8c635 Mon Sep 17 00:00:00 2001 From: dm03514 Date: Sat, 29 Oct 2011 12:02:16 -0400 Subject: Removed Import, and debug. User Migration managment command Featur #110 --- askbot/management/commands/migrate_user_account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/askbot/management/commands/migrate_user_account.py b/askbot/management/commands/migrate_user_account.py index 0fdf4f14..eb53e2e3 100644 --- a/askbot/management/commands/migrate_user_account.py +++ b/askbot/management/commands/migrate_user_account.py @@ -1,4 +1,4 @@ -from django.core.management.base import NoArgsCommand, CommandError, BaseCommand +from django.core.management.base import CommandError, BaseCommand from django.db.models import get_model from django.contrib.auth.models import User -- cgit v1.2.3-1-g7c22 From de8a38206acf305cbcae145b234463e6efbc31e3 Mon Sep 17 00:00:00 2001 From: dm03514 Date: Sat, 29 Oct 2011 18:47:05 -0400 Subject: Feature 110, migrate_account User input is more explicit, added some test coverage. --- askbot/management/commands/migrate_user_account.py | 2 +- askbot/tests/management_command_tests.py | 23 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/askbot/management/commands/migrate_user_account.py b/askbot/management/commands/migrate_user_account.py index eb53e2e3..ed3ca5f8 100644 --- a/askbot/management/commands/migrate_user_account.py +++ b/askbot/management/commands/migrate_user_account.py @@ -1,6 +1,6 @@ from django.core.management.base import CommandError, BaseCommand from django.db.models import get_model -from django.contrib.auth.models import User +from askbot.models import User class Command(BaseCommand): diff --git a/askbot/tests/management_command_tests.py b/askbot/tests/management_command_tests.py index 9eb41cdf..756794f4 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_migrate_user_account(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('migrate_user_account', 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) -- cgit v1.2.3-1-g7c22 From f197112012da87776b3d70452b015693701031bd Mon Sep 17 00:00:00 2001 From: Byron Date: Sun, 30 Oct 2011 21:58:39 -0600 Subject: Style for login and people pages --- askbot/skins/common/media/jquery-openid/openid.css | 2 +- .../skins/common/templates/authopenid/logout.html | 2 +- .../skins/common/templates/authopenid/signin.html | 4 +- .../default/media/images/summary-background.png | Bin 291 -> 233 bytes askbot/skins/default/media/style/style.css | 147 ++++++++++++++------- askbot/skins/default/templates/users.html | 6 +- 6 files changed, 109 insertions(+), 52 deletions(-) diff --git a/askbot/skins/common/media/jquery-openid/openid.css b/askbot/skins/common/media/jquery-openid/openid.css index da541e45..e44e5478 100644 --- a/askbot/skins/common/media/jquery-openid/openid.css +++ b/askbot/skins/common/media/jquery-openid/openid.css @@ -1,4 +1,4 @@ -div#login-icons {margin:10px 0 0 0;padding:0} +div#login-icons {margin:10px 0 0 0;padding:10px;border:#eee 1px solid;} ul.login-icons {width: 450px; margin:0;padding:0;text-align:left; list-style-type:none; display:block;} ul.login-icons li {display:inline;} ul.large input {height: 40px; width: 90px;border:1px solid #ccc;margin:0 5px 5px 0;} diff --git a/askbot/skins/common/templates/authopenid/logout.html b/askbot/skins/common/templates/authopenid/logout.html index a07b78d1..1ac6705c 100644 --- a/askbot/skins/common/templates/authopenid/logout.html +++ b/askbot/skins/common/templates/authopenid/logout.html @@ -2,7 +2,7 @@ {% block title %}{% spaceless %}{% trans %}Logout{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -

    {% trans %}You have successfully logged out{% endtrans %}

    +

    {% trans %}You have successfully logged out{% endtrans %}

    {% if have_federated_login_methods %}

    {% trans %}However, you still may be logged in to your OpenID provider. Please logout of your provider if you wish to do so.{% endtrans %}

    {% if settings.FACEBOOK_KEY and settings.FACEBOOK_SECRET %} diff --git a/askbot/skins/common/templates/authopenid/signin.html b/askbot/skins/common/templates/authopenid/signin.html index f10d0cd0..4c894aa3 100644 --- a/askbot/skins/common/templates/authopenid/signin.html +++ b/askbot/skins/common/templates/authopenid/signin.html @@ -7,7 +7,7 @@ {% endblock %} {% block content %} {% if have_buttons or view_subtype == 'email_sent' %} -

    {{page_title}}

    +

    {{page_title}}

    {% endif %} {% if answer %}
    @@ -212,7 +212,7 @@ {% block sidebar %} {% if have_buttons %} -
    +

    {% trans %}Why use OpenID?{% endtrans %}

    • diff --git a/askbot/skins/default/media/images/summary-background.png b/askbot/skins/default/media/images/summary-background.png index 58c3855a..28a6a398 100644 Binary files a/askbot/skins/default/media/images/summary-background.png and b/askbot/skins/default/media/images/summary-background.png differ diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index fbf8d56c..7592da73 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -143,7 +143,7 @@ a:hover { h1 { font-size: 160%; - padding: 10px 0 5px 5px; + padding: 10px 0 5px 0px; } /* ----- Custom positions ----- */ @@ -504,9 +504,10 @@ h1 { li { list-style-type: disc; - font-size: 13px; + font-size: 16px; line-height: 20px; margin-bottom: 10px; + color:@info-text; } ul.tags { list-style: none; @@ -1918,8 +1919,106 @@ span.delete-icon:hover { } +/* -----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-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; +} /* ----- Footer links , check blocks/footer.html----- */ @@ -2088,32 +2187,6 @@ label.retag-error { padding: 10px; } -.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%; -} span.form-error { color: #990000; @@ -2424,24 +2497,6 @@ a.offensive { color: #999; } -.user { - padding: 5px; - line-height: 140%; - width: 170px; -} - -.user ul { - margin: 0; - list-style-type: none; -} - -.user .thumb { - clear: both; - float: left; - margin-right: 4px; - display: inline; -} - .message h1 { padding-top: 0px; font-size: 15px; diff --git a/askbot/skins/default/templates/users.html b/askbot/skins/default/templates/users.html index 1d7d02dd..0502a6e5 100644 --- a/askbot/skins/default/templates/users.html +++ b/askbot/skins/default/templates/users.html @@ -3,9 +3,10 @@ {% block title %}{% spaceless %}{% trans %}Users{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -
      -

      {% trans %}Users{% endtrans %}

      +

      {% trans %}Users{% endtrans %}

      +
      + {% trans %}Sort by »{% endtrans %} {% trans %}by username{% endtrans %}
      +

      {% if suser %} {% trans %}users matching query {{suser}}:{% endtrans %} -- cgit v1.2.3-1-g7c22 From a58c3be458d42d7a04bed0965df624872434568d Mon Sep 17 00:00:00 2001 From: Byron Date: Mon, 31 Oct 2011 00:51:32 -0600 Subject: style for badges, tags and profile templates --- askbot/skins/default/media/style/style.css | 260 ++++++++++++--------- askbot/skins/default/templates/badge.html | 16 +- askbot/skins/default/templates/badges.html | 4 +- askbot/skins/default/templates/tags.html | 15 +- .../skins/default/templates/user_profile/user.html | 8 +- .../templates/user_profile/user_favorites.html | 2 +- .../default/templates/user_profile/user_tabs.html | 3 +- .../default/templates/user_profile/user_votes.html | 4 +- 8 files changed, 178 insertions(+), 134 deletions(-) diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 7592da73..3df846bd 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1070,6 +1070,7 @@ ul.tags.marked-tags li, .tags-page ul.tags li, ul#ab-user-tags li { width: 160px; + margin:5px; } ul#related-tags li { @@ -1995,6 +1996,7 @@ span.delete-icon:hover { .tabBar-user{ width:375px; } + .user { padding: 5px; line-height: 140%; @@ -2020,6 +2022,153 @@ span.delete-icon:hover { 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:15px; + color:@info-text-dark; + .avatar img{ + border:#eee 1px solid; + padding:5px; + } + h2{ + padding:10px 0px 10px 0px; + } +} + +.user-details { + font-size: 15px; +} + +.user-about { + background-color: #EEEEEE; + height: 200px; + line-height: 20px; + overflow: auto; + padding: 10px; + width: 90%; + p{font-size:18px;} +} + +.user-info-table td{ + padding-bottom: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) +} + +.follow-toggle:hover { + background:url(../images/small-button-blue.png) repeat-x bottom; +} + +.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; +} + +.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); +} + /* ----- Footer links , check blocks/footer.html----- */ #ground { @@ -2070,31 +2219,6 @@ span.delete-icon:hover { } -/* badges */ -a.medal { - font-size: 14px; - line-height: 250%; - font-weight: 800; - 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; -} - .notify-me { float: left; } @@ -2284,18 +2408,6 @@ ins .post-tag { margin-top: 3px; } -.user-details { - font-size: 13px; -} - -.user-about { - background-color: #EEEEEE; - height: 200px; - line-height: 20px; - overflow: auto; - padding: 10px; - width: 90%; -} /* .favorites-count-off { @@ -2342,33 +2454,8 @@ ins .post-tag { float: left; } -.answer-summary { - display: block; - clear: both; - padding: 3px; -} -.answer-votes { - background-color: #EEEEEE; - color: #555555; - float: left; - font-family: Arial; - font-size: 110%; - font-weight: bold; - height: 15px; - padding: 4px 4px 5px; - text-align: center; - text-decoration: none; - width: 20px; - margin-right: 10px; -} -.vote-count { - font-family: Arial; - font-size: 160%; - font-weight: 700; - color: #777; -} /* todo: make these more semantic */ .user-action-1 { @@ -2987,52 +3074,3 @@ pre.prettyprint { padding: 3px; border: 0px solid #888; } .atn { color: #404; } .atv { color: #060; } } - -.follow-toggle { - border: 2px solid; - -moz-border-radius:5px; - -webkit-border-radius:5px; - border-radius: 5px; - height: auto; - width: 200px; - float:left; - padding: 0; - margin-right:100%; - margin-bottom: 10px; -} - -.follow-toggle .follow{ - font-color: #000; - font-style:normal; - background: #4cd46f; -} - -.follow-toggle .follow:hover{ - font-weight: bold; -} - -.follow-toggle .unfollow{ - background: #4cd46f; -} - -.follow-toggle .unfollow:hover{ - background: #d94849; -} - -.follow-toggle .unfollow div.unfollow-red{ - display:none; -} - -.follow-toggle .unfollow div.unfollow-green{ - background: #4cd46f; -} - -.follow-toggle .unfollow:hover div.unfollow-red{ - display:inline; - color:#fff; - font-weight:bold; -} - -.follow-toggle .unfollow:hover div.unfollow-green{ - display:none; -} diff --git a/askbot/skins/default/templates/badge.html b/askbot/skins/default/templates/badge.html index ee7f5360..d1f75617 100644 --- a/askbot/skins/default/templates/badge.html +++ b/askbot/skins/default/templates/badge.html @@ -1,9 +1,10 @@ {% extends "two_column_body.html" %} {% import "macros.html" as macros %} +{%from "macros.html" import gravatar %} {% block title %}{% spaceless %}{% trans name=badge.name %}{{name}}{% endtrans %} - {% trans %}Badge{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -

      {% trans name=badge.name %}Badge "{{name}}"{% endtrans %}

      +

      {% trans name=badge.name %}Badge "{{name}}"{% endtrans %}

       {% trans name=badge.name%}{{name}}{% endtrans %} {% trans description=badge.description %}{{description}}{% endtrans %}

      @@ -13,11 +14,16 @@ {% trans num_awardees=badge_recipients|length %}user received this badge:{% pluralize %}users received this badge:{% endtrans %}

      {% endif %}
      -
      +
      +
      {% for recipient in badge_recipients %} -

      {{ recipient.username }} - {{ macros.user_score_and_badge_summary(recipient) }} -

      +
      +
        +
      • {{ gravatar(recipient, 32) }}
      • +
      • {{recipient.username}}
      • +
      • {{ macros.user_score_and_badge_summary(recipient) }}
      • +
      +
      {% endfor %}
      {% endblock %} diff --git a/askbot/skins/default/templates/badges.html b/askbot/skins/default/templates/badges.html index bbd09951..08827da3 100644 --- a/askbot/skins/default/templates/badges.html +++ b/askbot/skins/default/templates/badges.html @@ -2,7 +2,7 @@ {% block title %}{% spaceless %}{% trans %}Badges summary{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -

      {% trans %}Badges{% endtrans %}

      +

      {% trans %}Badges{% endtrans %}

      {% trans %}Community gives you awards for your questions, answers and votes.{% endtrans %}
      {% trans %}Below is the list of available badges and number @@ -31,7 +31,7 @@ of times each type of badge has been awarded. Give us feedback at {{feedback_faq

      {% endblock %} {% block sidebar %} -
      +

      {% trans %}Community badges{% endtrans %}

       {% trans %}gold{% endtrans %} diff --git a/askbot/skins/default/templates/tags.html b/askbot/skins/default/templates/tags.html index 7d9026af..1cd4c4b9 100644 --- a/askbot/skins/default/templates/tags.html +++ b/askbot/skins/default/templates/tags.html @@ -4,14 +4,14 @@ {% block title %}{% spaceless %}{% trans %}Tag list{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -

      - {% if stag %} -

      {% trans %}Tags, matching "{{ stag }}"{% endtrans %}

      - {% else %} -

      {% trans %}Tag list{% endtrans %}

      - {% endif %} - +{% if stag %} +

      {% trans %}Tags, matching "{{ stag }}"{% endtrans %}

      +{% else %} +

      {% trans %}Tag list{% endtrans %}

      +{% endif %} +
      + {% trans %}Sort by »{% endtrans %} {% endfor %}
    +
    {{macros.paginator(paginator_context)}}
    diff --git a/askbot/skins/default/templates/user_profile/user.html b/askbot/skins/default/templates/user_profile/user.html index ad3d564b..6ec4bc3a 100644 --- a/askbot/skins/default/templates/user_profile/user.html +++ b/askbot/skins/default/templates/user_profile/user.html @@ -7,15 +7,13 @@ {% endblock %} {% block content %} -

    +

    {% spaceless %} - {% trans username=view_user.username %}{{username}}'s profile{% endtrans %} - {% block profilesection %}{% endblock %} - {% endspaceless %}

    -
    - {% include "user_profile/user_tabs.html" %} + {% include "user_profile/user_tabs.html" %} +
    {% block usercontent %} {% endblock %}
    diff --git a/askbot/skins/default/templates/user_profile/user_favorites.html b/askbot/skins/default/templates/user_profile/user_favorites.html index bb019c90..08c3c688 100644 --- a/askbot/skins/default/templates/user_profile/user_favorites.html +++ b/askbot/skins/default/templates/user_profile/user_favorites.html @@ -1,7 +1,7 @@ {% extends "user_profile/user.html" %} {% block profilesection %} - {% trans %}followed questions{% endtrans %} +

    {% trans %}followed questions{% endtrans %}

    {% endblock %} {% block usercontent %} {% include "user_profile/users_questions.html" %} diff --git a/askbot/skins/default/templates/user_profile/user_tabs.html b/askbot/skins/default/templates/user_profile/user_tabs.html index ad24a303..0c7c4599 100644 --- a/askbot/skins/default/templates/user_profile/user_tabs.html +++ b/askbot/skins/default/templates/user_profile/user_tabs.html @@ -1,5 +1,5 @@ -
    +
    +
    diff --git a/askbot/skins/default/templates/user_profile/user_votes.html b/askbot/skins/default/templates/user_profile/user_votes.html index d5e469ae..5111a580 100644 --- a/askbot/skins/default/templates/user_profile/user_votes.html +++ b/askbot/skins/default/templates/user_profile/user_votes.html @@ -10,9 +10,9 @@
    {{vote.voted_at|diff_date(True)}}
    {% if vote.vote==1 %} - + {% else %} - + {% endif %}
    -- cgit v1.2.3-1-g7c22 From 5c747860f1acaa42274a1c1802df1adde31c19a6 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 1 Nov 2011 17:40:30 -0300 Subject: added merge_users management command by Daniel Mican --- askbot/doc/source/changelog.rst | 1 + askbot/doc/source/contributors.rst | 1 + askbot/doc/source/management-commands.rst | 5 +- askbot/management/commands/merge_users.py | 57 ++++++++++++++++++++ askbot/management/commands/migrate_user_account.py | 60 ---------------------- askbot/tests/management_command_tests.py | 44 ++++++++-------- 6 files changed, 85 insertions(+), 83 deletions(-) create mode 100644 askbot/management/commands/merge_users.py delete mode 100644 askbot/management/commands/migrate_user_account.py diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst index ad01dc97..ca8c803b 100644 --- a/askbot/doc/source/changelog.rst +++ b/askbot/doc/source/changelog.rst @@ -7,6 +7,7 @@ Development version (not yet published) * Categorized live settings (Evgeny) * Added management command ``send_accept_answer_reminders`` (Evgeny) * Improved the ``askbot-setup`` script (Adolfo, Evgeny) +* Merge users management command (Daniel Mican) 0.7.26 (Current Version) ------------------------ diff --git a/askbot/doc/source/contributors.rst b/askbot/doc/source/contributors.rst index ac807193..d2dafb5a 100644 --- a/askbot/doc/source/contributors.rst +++ b/askbot/doc/source/contributors.rst @@ -18,6 +18,7 @@ Programming and documentation * `Jishnu `_ * `Hrishi `_ * Andrei Mamoutkine +* `Daniel Mican `_ * `Ramiro Morales `_ (with Machinalis) * `NoahY `_ * `Gael Pasgrimaud `_ (bearstech) diff --git a/askbot/doc/source/management-commands.rst b/askbot/doc/source/management-commands.rst index 54b42b0a..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 | Merges user accounts and all related data from one user | +| ` | 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 | +---------------------------------+-------------------------------------------------------------+ diff --git a/askbot/management/commands/merge_users.py b/askbot/management/commands/merge_users.py new file mode 100644 index 00000000..708f1614 --- /dev/null +++ b/askbot/management/commands/merge_users.py @@ -0,0 +1,57 @@ +from django.core.management.base import CommandError, BaseCommand +from askbot.models import User + + +class Command(BaseCommand): + args = ' ' + help = 'Merge an account and all information from a to a , deleting the ' + + def parse_arguments(self, *arguments): + if len(arguments) != 2: + raise CommandError('Arguments are to ') + 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, e: + self.stdout.write(u'Warning: %s' % e) + + for rel in User._meta.get_all_related_many_to_many_objects(): + self.process_m2m_field(rel.model, rel.field.name) + + 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/migrate_user_account.py b/askbot/management/commands/migrate_user_account.py deleted file mode 100644 index ed3ca5f8..00000000 --- a/askbot/management/commands/migrate_user_account.py +++ /dev/null @@ -1,60 +0,0 @@ -from django.core.management.base import CommandError, BaseCommand -from django.db.models import get_model -from askbot.models import User - - -class Command(BaseCommand): - args = ' ' - help = 'Migrate an account and all information from a to a , deleting the ' - - def parse_arguments(self, *arguments): - if len(arguments) != 2: - raise CommandError('Arguments are to ') - 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, e: - if rel.field.name == 'UserAssociation': - self.stdout.write('had problem with UserAssociation uniquiness') - elif rel.field.name == 'UserPasswordQueue': - self.stdout.write('had problem with UserPasswordQueue uniquiness') - else: - self.stdout.write('Recieved Error: %s' % (e)) - - for rel in User._meta.get_all_related_many_to_many_objects(): - self.process_m2m_field(rel.model, rel.field.name) - - 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): - 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): - 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/tests/management_command_tests.py b/askbot/tests/management_command_tests.py index 756794f4..001689c1 100644 --- a/askbot/tests/management_command_tests.py +++ b/askbot/tests/management_command_tests.py @@ -27,25 +27,25 @@ class ManagementCommandTests(AskbotTestCase): user = auth.authenticate(username = username, password = password) self.assertTrue(user is not None) - def test_migrate_user_account(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('migrate_user_account', 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) + 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) -- cgit v1.2.3-1-g7c22 From 710ebd587028a590f3fe9bd620b963f48a96b5ad Mon Sep 17 00:00:00 2001 From: Byron Date: Tue, 1 Nov 2011 23:19:02 -0600 Subject: Changing names of font variables to generic names --- askbot/skins/default/media/style/lib_style.less | 8 ++--- askbot/skins/default/media/style/style.css | 44 ++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/askbot/skins/default/media/style/lib_style.less b/askbot/skins/default/media/style/lib_style.less index cd8aa5d9..796420c6 100644 --- a/askbot/skins/default/media/style/lib_style.less +++ b/askbot/skins/default/media/style/lib_style.less @@ -12,10 +12,10 @@ /* Variables for fonts*/ -@trebuchet:"Trebuchet MS", sans-serif; -@georgia:Georgia, serif; -@yanone:'Yanone Kaffeesatz', sans-serif; -@arial:Arial; +@body-font:"Trebuchet MS", sans-serif; +@sort-font:Georgia, serif; +@main-font:'Yanone Kaffeesatz', sans-serif; +@secundary-font:Arial; /* Receive exactly positions for background Sprite */ diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 3df846bd..34f694b6 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -10,7 +10,7 @@ body { margin: 0; padding: 0; color: #000; - font-family: @yanone; + font-family: @main-font; } div { @@ -360,7 +360,7 @@ h1 { border:0px; color:#484848; padding-left:10px; - font-family:@trebuchet; + font-family:@body-font; vertical-align: middle; } @@ -559,7 +559,7 @@ h1 { line-height:34px; text-align:center; border:0; - font-family:@yanone; + font-family:@main-font; color:@button-label; font-weight:normal; font-size:21px; @@ -653,7 +653,7 @@ h1 { margin-bottom: 3px; margin-top: 3px; float:right; - font-family:@georgia; + font-family:@sort-font; font-size:16px; .rounded-corners(5px); } @@ -722,7 +722,7 @@ h1 { padding-top:3px; background:#fff url(../images/feed-icon-small.png) no-repeat center right; float:right; - font-family:@georgia; + font-family:@sort-font; font-size:16px; } @@ -806,7 +806,7 @@ ul#searchTags { .userinfo { text-align:right; line-height:16px; - font-family:@trebuchet; + font-family:@body-font; padding-right:4px; } @@ -832,7 +832,7 @@ ul#searchTags { .counts .item-count { padding:0px 5px 0px 5px; font-size: 25px; - font-family:@yanone; + font-family:@main-font; } .counts .votes div, @@ -946,7 +946,7 @@ ul#searchTags { background-color: #fff; color: #777; padding: 2px 4px 3px 4px; - font-family:@yanone; + font-family:@main-font; } a{ color:@section-title; @@ -1106,7 +1106,7 @@ ul#related-tags li { text-align: center; white-space: nowrap; vertical-align: middle; - font-family:@trebuchet; + font-family:@body-font; color:#717179; } .deletable-tag { @@ -1175,7 +1175,7 @@ span.delete-icon:hover { .section-title{ color:@section-title; - font-family:@yanone; + font-family:@main-font; font-weight:bold; font-size:24px; } @@ -1270,7 +1270,7 @@ span.delete-icon:hover { background: url(../images/medium-button.png) top repeat-x; height:34px; border:0; - font-family:@yanone; + font-family:@main-font; color:@button-label; font-weight:normal; font-size:21px; @@ -1312,7 +1312,7 @@ span.delete-icon:hover { min-height: 20px; overflow: auto; font-size:13px; - font-family:@trebuchet; + font-family:@body-font; p{ margin-bottom:14px; @@ -1422,7 +1422,7 @@ span.delete-icon:hover { } p.rss a { - font-family:@yanone; + font-family:@main-font; vertical-align: top; } @@ -1457,7 +1457,7 @@ span.delete-icon:hover { .question-body, .answer-body { overflow: auto; margin-top:10px; - font-family:@trebuchet; + font-family:@body-font; color:#4b4b4b; p{ @@ -1488,7 +1488,7 @@ span.delete-icon:hover { background: #fff url(../images/background-user-info.png) repeat-x bottom; float: right; font-size: 9px; - font-family:@arial; + font-family:@secundary-font; width: 173px; padding:4px; margin:0px 0px 5px 5px; @@ -1533,7 +1533,7 @@ span.delete-icon:hover { cursor: pointer; border: none; font-size:12px; - font-family:@trebuchet; + font-family:@body-font; text-decoration: none; height:18px; display:block; @@ -1581,7 +1581,7 @@ span.delete-icon:hover { #questionCount{ float:left; - font-family:@yanone; + font-family:@main-font; line-height:15px; } @@ -1637,7 +1637,7 @@ span.delete-icon:hover { .controls a { color: #988e4c; padding: 0 3px 2px 22px; - font-family:@trebuchet; + font-family:@body-font; font-size:13px; background:url(../images/comment.png) no-repeat center left; } @@ -1667,7 +1667,7 @@ span.delete-icon:hover { height: 42px; width:100%; margin: 12px 0 5px 1px; - font-family: @trebuchet; + font-family: @body-font; outline: none; overflow:auto; font-size: 12px; @@ -1708,7 +1708,7 @@ span.delete-icon:hover { float:right; color:#b6a475 !important; vertical-align: top; - font-family:@trebuchet; + font-family:@body-font; float:right; text-align:right; } @@ -1718,7 +1718,7 @@ span.delete-icon:hover { margin-top:8px; padding-bottom:4px; overflow: auto; - font-family:@trebuchet; + font-family:@body-font; font-size:11px; min-height: 25px; background:url(../images/comment-background.png) bottom repeat-x; @@ -1841,7 +1841,7 @@ span.delete-icon:hover { } .vote-number { - font-family: @yanone; + font-family: @main-font; padding: 0px 0 5px 0; font-size: 25px; font-weight: bold; -- cgit v1.2.3-1-g7c22 From c8c866cccf2b9db30f3c6eab7275c095806d43d8 Mon Sep 17 00:00:00 2001 From: Byron Date: Wed, 2 Nov 2011 01:02:01 -0600 Subject: Whitespace in sortbar, rss icon position and popup style --- askbot/skins/default/media/images/notification.png | Bin 0 -> 217 bytes askbot/skins/default/media/style/lib_style.less | 2 +- askbot/skins/default/media/style/style.css | 64 +++++++++++++++------ .../default/templates/question/answer_tab_bar.html | 2 +- 4 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 askbot/skins/default/media/images/notification.png diff --git a/askbot/skins/default/media/images/notification.png b/askbot/skins/default/media/images/notification.png new file mode 100644 index 00000000..c33ba699 Binary files /dev/null and b/askbot/skins/default/media/images/notification.png differ diff --git a/askbot/skins/default/media/style/lib_style.less b/askbot/skins/default/media/style/lib_style.less index 796420c6..6d3bfa34 100644 --- a/askbot/skins/default/media/style/lib_style.less +++ b/askbot/skins/default/media/style/lib_style.less @@ -15,7 +15,7 @@ @body-font:"Trebuchet MS", sans-serif; @sort-font:Georgia, serif; @main-font:'Yanone Kaffeesatz', sans-serif; -@secundary-font:Arial; +@secondary-font:Arial; /* Receive exactly positions for background Sprite */ diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 34f694b6..bfd2e162 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -151,6 +151,10 @@ h1 { .left{float:left} .right{float:right} .clean{clear:both} +.center{ + margin: 0 auto; + padding: 0; +} /* ----- Notify message bar , check blocks/system_messages.html ----- */ @@ -569,6 +573,7 @@ h1 { text-decoration:none; .rounded-corners(4px); .box-shadow(1px, 1px, 2px, #636363); + .center; } a.followed:hover, a.follow:hover{ @@ -1415,9 +1420,10 @@ span.delete-icon:hover { p.rss { float:none; clear:both; - padding: 3px 0 0 1px; + padding: 3px 0 0 22px; font-size: 15px; width:110px; + background-position:center left; } @@ -1488,7 +1494,7 @@ span.delete-icon:hover { background: #fff url(../images/background-user-info.png) repeat-x bottom; float: right; font-size: 9px; - font-family:@secundary-font; + font-family:@secondary-font; width: 173px; padding:4px; margin:0px 0px 5px 5px; @@ -1854,6 +1860,12 @@ span.delete-icon:hover { .vote-buttons .notify-sidebar label { vertical-align: top; } + + .tabBar-answer{ + margin-bottom:15px; + padding-left:15px; + } + .accepted-answer { background-color: #f7fecc; border-bottom-color: #9BD59B; @@ -2169,6 +2181,38 @@ a:hover.medal { .rounded-corners(4px); } +.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; + } + a { + color: #fb7321; + text-decoration: underline; + font-weight:bold; + } + +} + /* ----- Footer links , check blocks/footer.html----- */ #ground { @@ -2933,22 +2977,6 @@ p.signup_p { margin:0; } -.vote-notification { - z-index: 1; - cursor: pointer; - display: none; - position: absolute; - padding: 15px; - color: white; - background-color: darkred; - text-align: center; -} - -.vote-notification a { - color: white; - text-decoration: underline; -} - #responses { clear:both; line-height:18px; diff --git a/askbot/skins/default/templates/question/answer_tab_bar.html b/askbot/skins/default/templates/question/answer_tab_bar.html index 04584bbd..3bf0a2a0 100644 --- a/askbot/skins/default/templates/question/answer_tab_bar.html +++ b/askbot/skins/default/templates/question/answer_tab_bar.html @@ -1,4 +1,4 @@ -
    +

    {% trans counter=answers|length %} {{counter}} Answer -- cgit v1.2.3-1-g7c22 From 66923558aa12510fc41bf0d51c16bc6b0ff322e8 Mon Sep 17 00:00:00 2001 From: Tomasz Zielinski Date: Wed, 2 Nov 2011 16:02:02 +0100 Subject: Initial refactor of QuestionRevision&AnswerRevisions - extracted common part to ContentRevision --- ...sion_revision_type__add_field_answerrevision.py | 352 +++++++++++++++++++++ .../migrations/0047_set_proper_revision_types.py | 313 ++++++++++++++++++ askbot/models/answer.py | 21 +- askbot/models/base.py | 85 ++++- askbot/models/post.py | 7 + askbot/models/question.py | 42 +-- askbot/tests/badge_tests.py | 1 + askbot/views/readers.py | 1 + 8 files changed, 756 insertions(+), 66 deletions(-) create mode 100644 askbot/migrations/0046_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py create mode 100644 askbot/migrations/0047_set_proper_revision_types.py create mode 100644 askbot/models/post.py diff --git a/askbot/migrations/0046_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py b/askbot/migrations/0046_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py new file mode 100644 index 00000000..61ae0ee7 --- /dev/null +++ b/askbot/migrations/0046_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/0047_set_proper_revision_types.py b/askbot/migrations/0047_set_proper_revision_types.py new file mode 100644 index 00000000..3b55462e --- /dev/null +++ b/askbot/migrations/0047_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/models/answer.py b/askbot/models/answer.py index b9b28f89..03fd43c6 100644 --- a/askbot/models/answer.py +++ b/askbot/models/answer.py @@ -304,27 +304,10 @@ 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) + unique_together = ('answer', 'revision') + 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..b4492f0f 100644 --- a/askbot/models/base.py +++ b/askbot/models/base.py @@ -1,5 +1,6 @@ import datetime import cgi +from django.core.urlresolvers import reverse from django.db import models from django.utils.html import strip_tags from django.contrib.auth.models import User @@ -219,24 +220,96 @@ class ContentRevision(models.Model): """ Base class for QuestionRevision and AnswerRevision """ + QUESTION_REVISION_TEMPLATE_NO_TAGS = ( + '

    %(title)s

    \n' + '
    %(html)s
    \n' + ) + + QUESTION_REVISION = 1 + ANSWER_REVISION = 2 + REVISION_TYPE_CHOICES = ( + (QUESTION_REVISION, 'question'), + (ANSWER_REVISION, 'answer'), + ) + REVISION_TYPE_CHOICES_DICT = dict(REVISION_TYPE_CHOICES) + + revision_type = models.SmallIntegerField(choices=REVISION_TYPE_CHOICES) + 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() + # 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) + class Meta: abstract = True app_label = 'askbot' + ordering = ('-revision',) + + 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 save(self, **kwargs): + """Determines the revistion type and then looks up the next available revision number if not set.""" + + if not self.revision_type: + # HACK: determine revision_type based on class name - until we have a better way or until make a switch to PostRevision + # After `revision_type` is set, we can just use it + if self.__class__.__name__ == 'QuestionRevision': + self.revision_type = self.QUESTION_REVISION + elif self.__class__.__name__ == 'AnswerRevision': + self.revision_type = self.ANSWER_REVISION + + if not self.revision: + # TODO: Maybe use Max() aggregation? + # TODO: Handle IntegrityError if revision id is already occupied? + self.revision = self.parent().revisions.values_list('revision', flat=True)[0] + 1 + + super(ContentRevision, 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): - """should return html representation of - the revision - """ - raise NotImplementedError() + 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 - def get_snipet(self): - pass class AnonymousContent(models.Model): diff --git a/askbot/models/post.py b/askbot/models/post.py new file mode 100644 index 00000000..47f6bd34 --- /dev/null +++ b/askbot/models/post.py @@ -0,0 +1,7 @@ +from django.db import models + +class Post(models.Model): + pass + +class PostRevision(models.Model): + pass diff --git a/askbot/models/question.py b/askbot/models/question.py index 682580e1..8cf80464 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -1007,54 +1007,14 @@ class FavoriteQuestion(models.Model): def __unicode__(self): return '[%s] favorited at %s' %(self.user, self.added_at) -QUESTION_REVISION_TEMPLATE = ('

    %(title)s

    \n' - '
    %(html)s
    \n' - '
    %(tags)s
    ') -QUESTION_REVISION_TEMPLATE_NO_TAGS = ('

    %(title)s

    \n' - '
    %(html)s
    \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(['
    ' % tag - for tag in self.tagnames.split(' ')]), - } - else: - return QUESTION_REVISION_TEMPLATE_NO_TAGS % { - 'title': self.title, - 'html': sanitize_html(markdowner.convert(self.text)) - } + unique_together = ('question', 'revision') - 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/tests/badge_tests.py b/askbot/tests/badge_tests.py index fdb9d626..0c5a55db 100644 --- a/askbot/tests/badge_tests.py +++ b/askbot/tests/badge_tests.py @@ -413,6 +413,7 @@ class BadgeTests(AskbotTestCase): self.assert_have_badge('strunk-and-white', self.u2, 1) def test_organizer_badge(self): + #import ipdb; ipdb.set_trace() question = self.post_question(user = self.u1) self.u1.retag_question(question = question, tags = 'blah boom') self.assert_have_badge('organizer', self.u1, 1) diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 1739a4ef..d315bdf9 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -606,6 +606,7 @@ def revisions(request, id, object_name=None): post = get_object_or_404(models.get_model(object_name), id=id) revisions = list(post.revisions.all()) revisions.reverse() + #import ipdb; ipdb.set_trace() for i, revision in enumerate(revisions): revision.html = revision.as_html() if i == 0: -- cgit v1.2.3-1-g7c22 From 8af283777c10a5721324e9f698eb1ae8b9f7faa4 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Wed, 2 Nov 2011 15:28:03 -0300 Subject: changed to using short version of user credential widget in the post contributor info --- askbot/skins/default/templates/macros.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index e9181ed7..ea313592 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -457,7 +457,7 @@ answer {% if answer.accepted %}accepted-answer{% endif %} {% if answer.author_id {%- endmacro -%} {%- macro user_score_and_badge_summary(user) -%} - {%include "widgets/user_long_score_and_badge_summary.html"%} + {%include "widgets/user_score_and_badge_summary.html"%} {%- endmacro -%} {%- macro follow_toggle(follow, name, alias, id) -%} -- cgit v1.2.3-1-g7c22 From 5628c3daf6465f7766ea150bd4f3e46d5c7ac12d Mon Sep 17 00:00:00 2001 From: Byron Date: Wed, 2 Nov 2011 12:34:13 -0600 Subject: some aligments and border in popups --- askbot/skins/default/media/style/lib_style.less | 11 ++++++++++- askbot/skins/default/media/style/style.css | 14 +++++++++----- askbot/skins/default/templates/macros.html | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/askbot/skins/default/media/style/lib_style.less b/askbot/skins/default/media/style/lib_style.less index 6d3bfa34..e6d554b1 100644 --- a/askbot/skins/default/media/style/lib_style.less +++ b/askbot/skins/default/media/style/lib_style.less @@ -12,7 +12,7 @@ /* Variables for fonts*/ -@body-font:"Trebuchet MS", sans-serif; +@body-font:Arial; /* "Trebuchet MS", sans-serif;*/ @sort-font:Georgia, serif; @main-font:'Yanone Kaffeesatz', sans-serif; @secondary-font:Arial; @@ -44,3 +44,12 @@ -webkit-border-radius: @radio; -khtml-border-radius: @radio; } + +.rounded-corners-top(@radio:5px){ + border-top-right-radius:@radio; + border-top-left-radius:@radio; + -moz-border-radius-topright:@radio; + -moz-border-radius-topleft:@radio; + -webkit-border-top-left-radius:@radio; + -webkit-border-top-right-radius:@radio; +} diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index bfd2e162..239fc78b 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -600,7 +600,7 @@ h1 { font-family: Arial; font-weight: bold; color: #777; - text-align: left; + text-align:center; } } @@ -1420,11 +1420,11 @@ span.delete-icon:hover { p.rss { float:none; clear:both; - padding: 3px 0 0 22px; + padding: 3px 0 0 25px; font-size: 15px; width:110px; background-position:center left; - + margin-left:4px; } p.rss a { @@ -1470,6 +1470,7 @@ span.delete-icon:hover { margin-bottom:14px; line-height:1.4; font-size:14px; + padding:0px 5px 5px 0px; } a { @@ -1762,14 +1763,16 @@ span.delete-icon:hover { } .comment-body { - line-height: 140%; + line-height: 1.3; margin: 3px 26px 0 46px; padding: 5px 3px; color: #666; + font-size:13px; } .comment-body p{ - font-size:inherit; + font-size:13px; + line-height:1.3; margin-bottom: 3px; padding: 0; } @@ -2204,6 +2207,7 @@ a:hover.medal { border-top:#8e0000 1px solid; color:#fff; font-weight:normal; + .rounded-corners-top(4px); } a { color: #fb7321; diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index e9181ed7..e10b3381 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -286,7 +286,7 @@ for the purposes of the AJAX comment editor #} >{{comment.user.username}}  ({{comment.added_at|diff_date}}) {% if user|can_edit_comment(comment) %} - {% trans %}edit{% endtrans %} +  {% trans %}edit{% endtrans %} {% endif %}

    -- cgit v1.2.3-1-g7c22 From 677c0fc4747eaad2ee1a8ffdd1f6af864d289fd0 Mon Sep 17 00:00:00 2001 From: Byron Date: Wed, 2 Nov 2011 16:33:00 -0600 Subject: alignment of comments on answers --- askbot/skins/default/media/style/style.css | 24 ++++++++++++++++------ .../default/templates/question/answer_card.html | 8 +++++--- .../default/templates/question/answer_tab_bar.html | 1 + 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 239fc78b..849d97c5 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1447,12 +1447,14 @@ span.delete-icon:hover { .answer-table { margin: 6px 0 0px 0; border-spacing: 0px; - width: 100%; + width: 680px; + padding-right:3px; } .answer-table { + margin-top:0px; border-bottom: 1px solid #D4D4D4; - clear: both; + float:left; } .answer-table td, @@ -1488,7 +1490,7 @@ span.delete-icon:hover { .post-update-info-container { float: right; - width: 190px; + width: 175px; } .post-update-info { @@ -1496,7 +1498,7 @@ span.delete-icon:hover { float: right; font-size: 9px; font-family:@secondary-font; - width: 173px; + width: 158px; padding:4px; margin:0px 0px 5px 5px; line-height: 14px; @@ -1843,6 +1845,7 @@ span.delete-icon:hover { float: left; text-align: center; padding-top: 2px; + margin:3px 10px 0px 4px; } .vote-buttons IMG { @@ -1866,15 +1869,21 @@ span.delete-icon:hover { .tabBar-answer{ margin-bottom:15px; - padding-left:15px; + padding-left:7px; + width:723px; + } + .answer{ + .vote-buttons { + float:left; + } } - .accepted-answer { background-color: #f7fecc; border-bottom-color: #9BD59B; .vote-buttons { width:27px; + margin-right:10px; } } @@ -1909,6 +1918,9 @@ span.delete-icon:hover { .comments { background-color: #E6ECFF; } + .vote-buttons { + margin-right:10px; + } } .answer-img-accept:hover { diff --git a/askbot/skins/default/templates/question/answer_card.html b/askbot/skins/default/templates/question/answer_card.html index cbfb0a3e..15c88c0f 100644 --- a/askbot/skins/default/templates/question/answer_card.html +++ b/askbot/skins/default/templates/question/answer_card.html @@ -2,10 +2,11 @@
    +
    + {% include "question/answer_vote_buttons.html" %} +
    -
    - {% include "question/answer_vote_buttons.html" %} -
    +
    @@ -19,4 +20,5 @@ {% include "question/answer_comments.html" %}
    +
    diff --git a/askbot/skins/default/templates/question/answer_tab_bar.html b/askbot/skins/default/templates/question/answer_tab_bar.html index 3bf0a2a0..24042b4a 100644 --- a/askbot/skins/default/templates/question/answer_tab_bar.html +++ b/askbot/skins/default/templates/question/answer_tab_bar.html @@ -21,3 +21,4 @@ >{% trans %}popular answers{% endtrans %}
    +
    -- cgit v1.2.3-1-g7c22 From 2c2226f06e6d590d714afbfb60616b1d1291089e Mon Sep 17 00:00:00 2001 From: Byron Date: Wed, 2 Nov 2011 17:50:35 -0600 Subject: a little margin in vote buttons --- askbot/skins/default/media/style/style.css | 2 +- askbot/skins/default/templates/question/answer_card.html | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 849d97c5..83f0329d 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1845,7 +1845,7 @@ span.delete-icon:hover { float: left; text-align: center; padding-top: 2px; - margin:3px 10px 0px 4px; + margin:3px 10px 0px 3px; } .vote-buttons IMG { diff --git a/askbot/skins/default/templates/question/answer_card.html b/askbot/skins/default/templates/question/answer_card.html index 15c88c0f..1d7380c5 100644 --- a/askbot/skins/default/templates/question/answer_card.html +++ b/askbot/skins/default/templates/question/answer_card.html @@ -22,3 +22,4 @@
    +
    -- cgit v1.2.3-1-g7c22 From 3ade726a7982a0d454eaca0f44b3f52d8bdc6af5 Mon Sep 17 00:00:00 2001 From: Byron Date: Wed, 2 Nov 2011 22:50:02 -0600 Subject: new social icons --- askbot/skins/default/media/images/socialsprite.png | Bin 0 -> 3030 bytes askbot/skins/default/media/style/style.css | 50 ++++++++++++--------- 2 files changed, 30 insertions(+), 20 deletions(-) create mode 100644 askbot/skins/default/media/images/socialsprite.png diff --git a/askbot/skins/default/media/images/socialsprite.png b/askbot/skins/default/media/images/socialsprite.png new file mode 100644 index 00000000..8d01ed77 Binary files /dev/null and b/askbot/skins/default/media/images/socialsprite.png differ diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 83f0329d..d2eeb364 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1871,6 +1871,7 @@ span.delete-icon:hover { margin-bottom:15px; padding-left:7px; width:723px; + margin-top:10px; } .answer{ .vote-buttons { @@ -1947,6 +1948,34 @@ span.delete-icon:hover { } +.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, @@ -3066,26 +3095,7 @@ img.flag { vertical-align: text-bottom; } -.facebook-share.icon, .twitter-share.icon, .linkedin-share.icon, .identica-share.icon { - background: url(../images/sprite.png) no-repeat; - display:block; - text-indent:-100em; - height:25px; - width:25px; -} -.facebook-share.icon { - background-position: -25px 0px; -} -.identica-share.icon { - background-position: -85px 0px; -} -.twitter-share.icon { - margin-top:10px; - background-position: 0px 0px; -} -.linkedin-share.icon { - background-position: -55px 0px; -} + /* Pretty printing styles. Used with prettify.js. */ a.edit { -- cgit v1.2.3-1-g7c22 From 60fbbbefa82927bc3c2c2f18344037bdfa78495e Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Thu, 3 Nov 2011 18:59:47 -0300 Subject: made merge_users command not add multiple email subscription settings of the same type to the same user --- askbot/management/commands/merge_users.py | 9 +- .../0046_add_uniques_to_email_feed_settings.py | 306 +++++++++++++++++++++ askbot/models/user.py | 4 + 3 files changed, 316 insertions(+), 3 deletions(-) create mode 100644 askbot/migrations/0046_add_uniques_to_email_feed_settings.py diff --git a/askbot/management/commands/merge_users.py b/askbot/management/commands/merge_users.py index 708f1614..4691c4b3 100644 --- a/askbot/management/commands/merge_users.py +++ b/askbot/management/commands/merge_users.py @@ -18,11 +18,14 @@ class Command(BaseCommand): for rel in User._meta.get_all_related_objects(): try: self.process_field(rel.model, rel.field.name) - except Exception, e: - self.stdout.write(u'Warning: %s' % e) + except Exception, error: + self.stdout.write(u'Warning: %s\n' % error) for rel in User._meta.get_all_related_many_to_many_objects(): - self.process_m2m_field(rel.model, rel.field.name) + 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 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/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'" -- cgit v1.2.3-1-g7c22 From 26d6bb0a43439e2b07a41be0055f0676f21e17b5 Mon Sep 17 00:00:00 2001 From: Byron Date: Thu, 3 Nov 2011 23:40:52 -0600 Subject: leaving just one H1 tag on question page and a little fix on rss icon padding --- askbot/skins/default/media/style/style.css | 9 ++++++--- askbot/skins/default/templates/question/answer_tab_bar.html | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index d2eeb364..e2ff7c00 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -36,6 +36,7 @@ hr { input, select { vertical-align: middle; font-family: Trebuchet MS, "segoe ui", Helvetica, Tahoma, Verdana, MingLiu, PMingLiu, Arial, sans-serif; + margin-left:0px; } p { @@ -499,7 +500,7 @@ h1 { font-size:15px; display: block; float: right; - width: 172px; + width: 177px; } ul { @@ -1420,11 +1421,11 @@ span.delete-icon:hover { p.rss { float:none; clear:both; - padding: 3px 0 0 25px; + padding: 3px 0 0 23px; font-size: 15px; width:110px; background-position:center left; - margin-left:4px; + margin-left:0px !important; } p.rss a { @@ -2957,8 +2958,10 @@ p.signup_p { .wmd-preview a { color:@link; } + .wmd-preview li { margin-bottom:7px; + font-size:14px; } .karma-summary { 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 @@
    -

    +

    {% trans counter=answers|length %} {{counter}} Answer {% pluralize %} {{counter}} Answers {% endtrans %} -

    +
    Sort by » -- cgit v1.2.3-1-g7c22 From 409ea6e9b59e5ca811072bbebb741763a9503dde Mon Sep 17 00:00:00 2001 From: Tomasz Zielinski Date: Fri, 4 Nov 2011 19:11:37 +0100 Subject: Converted QuestionRevision&AnswerRevision to PostRevision, keeping them for now as proxy models --- askbot/migrations/0048_add_postrevision_model.py | 357 ++++++++++++++++++++ .../0049_move_qa_revisions_to_postrevision.py | 362 +++++++++++++++++++++ askbot/migrations/0050_proxify_qa_rev_models.py | 347 ++++++++++++++++++++ askbot/models/__init__.py | 3 + askbot/models/answer.py | 12 +- askbot/models/post.py | 19 +- askbot/models/question.py | 11 +- askbot/skins/default/templates/macros.html | 4 +- askbot/tests/badge_tests.py | 1 - askbot/views/readers.py | 1 - 10 files changed, 1097 insertions(+), 20 deletions(-) create mode 100644 askbot/migrations/0048_add_postrevision_model.py create mode 100644 askbot/migrations/0049_move_qa_revisions_to_postrevision.py create mode 100644 askbot/migrations/0050_proxify_qa_rev_models.py diff --git a/askbot/migrations/0048_add_postrevision_model.py b/askbot/migrations/0048_add_postrevision_model.py new file mode 100644 index 00000000..af2816aa --- /dev/null +++ b/askbot/migrations/0048_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/0049_move_qa_revisions_to_postrevision.py b/askbot/migrations/0049_move_qa_revisions_to_postrevision.py new file mode 100644 index 00000000..3067a87c --- /dev/null +++ b/askbot/migrations/0049_move_qa_revisions_to_postrevision.py @@ -0,0 +1,362 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +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 + ) + + def forwards(self, orm): + 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) + + # TODO: + # In the next migration (0050) QuestionRevision and AnswerRevision tables are dropped. + # So if there is anything else to migrate here, we have to figure that out before merging this to trunk. + + + 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/0050_proxify_qa_rev_models.py b/askbot/migrations/0050_proxify_qa_rev_models.py new file mode 100644 index 00000000..c4e37593 --- /dev/null +++ b/askbot/migrations/0050_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 e1677d9f..6e23c8f3 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -26,6 +26,7 @@ from askbot.models.answer import Answer, AnonymousAnswer, AnswerRevision 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 @@ -2652,6 +2653,8 @@ __all__ = [ 'AnswerRevision', 'AnonymousAnswer', + 'PostRevision', + 'Tag', 'Comment', 'Vote', diff --git a/askbot/models/answer.py b/askbot/models/answer.py index 03fd43c6..a694e737 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 @@ -300,13 +300,13 @@ class Answer(content.Content, DeletableContent): return self.html -class AnswerRevision(ContentRevision): +class AnswerRevision(PostRevision): """A revision of an Answer.""" - answer = models.ForeignKey('Answer', related_name='revisions') - class Meta(ContentRevision.Meta): - db_table = u'answer_revision' - unique_together = ('answer', 'revision') + class Meta: + app_label = 'askbot' + proxy = True + class AnonymousAnswer(AnonymousContent): diff --git a/askbot/models/post.py b/askbot/models/post.py index 47f6bd34..17f0eb2c 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -1,7 +1,18 @@ from django.db import models -class Post(models.Model): - pass +from askbot.models.base import ContentRevision -class PostRevision(models.Model): - pass +#class Post(models.Model): +# pass + +class PostRevision(ContentRevision): + answer = models.ForeignKey('askbot.Answer', related_name='revisions', null=True, blank=True) + question = models.ForeignKey('askbot.Question', related_name='revisions', null=True, blank=True) + + 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' diff --git a/askbot/models/question.py b/askbot/models/question.py index 8cf80464..c2145f73 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 @@ -1007,13 +1007,12 @@ class FavoriteQuestion(models.Model): def __unicode__(self): return '[%s] favorited at %s' %(self.user, self.added_at) -class QuestionRevision(ContentRevision): +class QuestionRevision(PostRevision): """A revision of a Question.""" - question = models.ForeignKey(Question, related_name='revisions') - class Meta(ContentRevision.Meta): - db_table = u'question_revision' - unique_together = ('question', 'revision') + class Meta: + app_label = 'askbot' + proxy = True class AnonymousQuestion(AnonymousContent): diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index b868be38..5c035611 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -272,7 +272,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' %} {{post.revised_at|diff_date}} {% else %} {{post.added_at|diff_date}} @@ -286,7 +286,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/tests/badge_tests.py b/askbot/tests/badge_tests.py index 0c5a55db..fdb9d626 100644 --- a/askbot/tests/badge_tests.py +++ b/askbot/tests/badge_tests.py @@ -413,7 +413,6 @@ class BadgeTests(AskbotTestCase): self.assert_have_badge('strunk-and-white', self.u2, 1) def test_organizer_badge(self): - #import ipdb; ipdb.set_trace() question = self.post_question(user = self.u1) self.u1.retag_question(question = question, tags = 'blah boom') self.assert_have_badge('organizer', self.u1, 1) diff --git a/askbot/views/readers.py b/askbot/views/readers.py index d315bdf9..1739a4ef 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -606,7 +606,6 @@ def revisions(request, id, object_name=None): post = get_object_or_404(models.get_model(object_name), id=id) revisions = list(post.revisions.all()) revisions.reverse() - #import ipdb; ipdb.set_trace() for i, revision in enumerate(revisions): revision.html = revision.as_html() if i == 0: -- cgit v1.2.3-1-g7c22 From f692b0847445359a9edfe10bd897607ee9bd05fc Mon Sep 17 00:00:00 2001 From: Vlad Bokov Date: Sat, 5 Nov 2011 06:45:46 +0700 Subject: Feature #134: time-based cache for anonymous only & tests --- askbot/setup_templates/settings.py | 1 + .../templates/question/answer_vote_buttons.html | 2 +- askbot/tests/db_api_tests.py | 35 ++++++++++++++++++++++ askbot/views/readers.py | 2 ++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/askbot/setup_templates/settings.py b/askbot/setup_templates/settings.py index a97402aa..3aead40f 100644 --- a/askbot/setup_templates/settings.py +++ b/askbot/setup_templates/settings.py @@ -176,6 +176,7 @@ 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' diff --git a/askbot/skins/common/templates/question/answer_vote_buttons.html b/askbot/skins/common/templates/question/answer_vote_buttons.html index 807f3ab8..1cdd5188 100644 --- a/askbot/skins/common/templates/question/answer_vote_buttons.html +++ b/askbot/skins/common/templates/question/answer_vote_buttons.html @@ -17,7 +17,7 @@ {% endif %} alt="{% trans %}i dont like this answer (click again to cancel){% endtrans %}" title="{% trans %}i dont like this answer (click again to cancel){% endtrans %}" /> -{% if request.user == question.author or 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_superuser()) %} 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/views/readers.py b/askbot/views/readers.py index eabef3c8..8d06c2be 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -23,6 +23,7 @@ from django.views.decorators import csrf 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 import askbot from askbot import exceptions @@ -349,6 +350,7 @@ 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) 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 -- cgit v1.2.3-1-g7c22 From 28710b54699b52867df147e4f5f63464bf1b371e Mon Sep 17 00:00:00 2001 From: Byron Date: Sun, 6 Nov 2011 00:46:35 -0600 Subject: Just leaving yanone font to important titles --- askbot/skins/default/media/style/style.css | 133 +++++++++++++++++++---------- askbot/skins/default/templates/about.html | 2 +- 2 files changed, 87 insertions(+), 48 deletions(-) diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index e2ff7c00..6ecea8de 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -10,7 +10,7 @@ body { margin: 0; padding: 0; color: #000; - font-family: @main-font; + font-family:@body-font; } div { @@ -43,7 +43,6 @@ p { font-size: 14px; line-height: 140%; margin-bottom: 6px; - padding-left: 5px; } a { @@ -53,12 +52,12 @@ a { } h2 { - font-size: 140%; + font-size: 21px; padding: 3px 0 3px 5px; } h3 { - font-size: 120%; + font-size: 19px; padding: 3px 0 3px 5px; } @@ -143,7 +142,7 @@ a:hover { } h1 { - font-size: 160%; + font-size: 24px; padding: 10px 0 5px 0px; } @@ -170,6 +169,7 @@ h1 { text-align: center; background-color: #f5dd69; border-top:#fff 1px solid; + font-family:@main-font; p { margin-top: 6px; @@ -201,6 +201,7 @@ h1 { #header { margin-top: 0px; background: @header-color; + font-family:@main-font; } .content-wrapper {/* wrapper positioning class */ @@ -308,6 +309,7 @@ h1 { border-bottom:#d3d3c2 1px solid; border-top:#fcfcfc 1px solid; margin-bottom:10px; + font-family:@main-font; #homeButton{ border-right:#afaf9e 1px solid; @@ -479,17 +481,19 @@ h1 { height:30px; line-height:30px; text-align:right; - font-size:24px; + 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; @@ -501,6 +505,7 @@ h1 { display: block; float: right; width: 177px; + font-family:@main-font; } ul { @@ -509,7 +514,7 @@ h1 { li { list-style-type: disc; - font-size: 16px; + font-size: 13px; line-height: 20px; margin-bottom: 10px; color:@info-text; @@ -538,13 +543,14 @@ h1 { color:@button-label; font-weight:bold; font-size:12px; - width:33px; + width:30px; height:27px; margin-top:-2px; cursor:pointer; .rounded-corners(4px); .text-shadow(0px,1px,0px,#E6F6FA); - .box-shadow(1px, 1px, 2px, #808080) + .box-shadow(1px, 1px, 2px, #808080); + } #interestingTagAdd:hover, #ignoredTagAdd:hover{ @@ -609,6 +615,7 @@ h1 { color:@info-text; font-size:16px; border-bottom:#cccccc 1px solid; + font-size:13px; strong{ float:right; @@ -625,13 +632,16 @@ h1 { 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:16px; + font-size:13px; list-style-image: url(../images/tips.png); } a{ @@ -642,7 +652,7 @@ h1 { #markdownHelp{ li{ color:@info-text; - font-size:16px; + font-size:13px; } a{ font-size:16px; @@ -746,6 +756,7 @@ h1 { float:left; margin-bottom:8px; padding-top:6px; + font-family:@main-font; } #listSearchTags{ @@ -753,6 +764,7 @@ h1 { margin-top:3px; color:@info-text; font-size:16px; + font-family:@main-font; } ul#searchTags { @@ -768,6 +780,7 @@ ul#searchTags { margin:5px 0 10px 0; padding:0px; float:left; + font-family:@main-font; a { text-decoration: underline; @@ -803,6 +816,7 @@ ul#searchTags { padding-left: 0; margin-bottom:8px; display:block; + font-family:@main-font; } a { @@ -833,6 +847,7 @@ ul#searchTags { .counts { float: right; margin: 4px 0 0 5px; + font-family:@main-font; } .counts .item-count { @@ -921,7 +936,7 @@ ul#searchTags { /* ----- Question list Paginator , check main_content/pager.html and macros/utils_macros.html----- */ .evenMore { - font-size: 16px; + font-size: 13px; color:@info-text; padding:15px 0px 10px 0px; clear:both; @@ -945,14 +960,13 @@ ul#searchTags { .paginator { padding: 5px 0 10px 0; - font-size:16px; + font-size:13px; .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; @@ -1202,9 +1216,9 @@ span.delete-icon:hover { p{ margin:0 0 5px 0; - font-size:16px; + font-size:14px; color:@info-text-dark; - line-height:1.2; + line-height:1.4; } .questionTitleInput { font-size: 24px; @@ -1224,11 +1238,14 @@ span.delete-icon:hover { border-bottom:#f0f0ec 1px solid; float:left; margin-bottom:10px; + a{ + line-height:30px; + } } div#question-list h2 { - font-size: 16px; + font-size: 13px; padding-bottom: 0; color:@link; border-top:#f0f0ec 1px solid; @@ -1252,7 +1269,7 @@ span.delete-icon:hover { } label{ color:@info-text-dark; - font-size:15px; + font-size:13px; } #id_tags{ @@ -1266,7 +1283,7 @@ span.delete-icon:hover { .title-desc { color: @info-text; - font-size: 15px; + font-size: 13px; } #fmanswer input.submit, @@ -1409,6 +1426,7 @@ span.delete-icon:hover { h1{ padding-top:0px; + font-family:@main-font; } h1 a{ @@ -1632,6 +1650,7 @@ span.delete-icon:hover { color:@section-title; width:200px; float:left; + font-family:@main-font; } .comments { font-size: 12px; @@ -1937,13 +1956,24 @@ span.delete-icon:hover { #fmanswer{ color:@info-text; - font-size:16px; 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: 10px 0 10px 0; + margin: 0px 0 10px 0; } @@ -1983,13 +2013,19 @@ span.delete-icon:hover { .meta, .users-page, { + font-size:14px; + line-height:1.4; + color:@info-text-dark; p{ - font-size:15px; + font-size:13px; color:@info-text; + line-height:1.3; + font-family:@body-font; } h2{ color:@info-text-dark; padding-left:0px; + font-size:16px; } } @@ -2136,11 +2172,15 @@ a:hover.medal { } h2{ padding:10px 0px 10px 0px; + font-family:@main-font; } } .user-details { - font-size: 15px; + font-size: 13px; + h3{ + font-size:16px; + } } .user-about { @@ -2150,11 +2190,7 @@ a:hover.medal { overflow: auto; padding: 10px; width: 90%; - p{font-size:18px;} -} - -.user-info-table td{ - padding-bottom:5px; + p{font-size:13px;} } .follow-toggle { @@ -2167,6 +2203,7 @@ a:hover.medal { 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); @@ -2197,6 +2234,22 @@ a:hover.medal { 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%; @@ -2226,6 +2279,8 @@ a:hover.medal { .rounded-corners(4px); } +/* ----- Red Popup notification ----- */ + .vote-notification { z-index: 1; cursor: pointer; @@ -2259,6 +2314,7 @@ a:hover.medal { } + /* ----- Footer links , check blocks/footer.html----- */ #ground { @@ -2268,6 +2324,7 @@ a:hover.medal { padding: 6px 0 0 0; background: @header-color; font-size:16px; + font-family:@main-font; p { margin-bottom:0; @@ -2481,24 +2538,6 @@ 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; @@ -2744,7 +2783,7 @@ button::-moz-focus-inner { } .big { - font-size: 15px; + font-size: 14px; } .strong { 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 @@ {% block title %}{% spaceless %}{% trans site_name=settings.APP_SHORT_NAME %}About {{site_name}}{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -

    {% trans site_name=settings.APP_SHORT_NAME %}About {{site_name}}{% endtrans %}

    +

    {% trans site_name=settings.APP_SHORT_NAME %}About {{site_name}}{% endtrans %}

    {{settings.FORUM_ABOUT}}
    -- cgit v1.2.3-1-g7c22 From ab5cd18f5a694f127a7f6fae566ca86c7097fd0b Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Sun, 6 Nov 2011 10:31:52 -0300 Subject: Added Vlad Bokov to the list of contribs --- askbot/doc/source/changelog.rst | 1 + askbot/doc/source/contributors.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst index b22839e0..0c05deb2 100644 --- a/askbot/doc/source/changelog.rst +++ b/askbot/doc/source/changelog.rst @@ -5,6 +5,7 @@ Development version (not yet published) --------------------------------------- * Show unused vote count (Tomasz Zielinski) * Categorized live settings (Evgeny) +* Anonymous caching of the question page (Vlad Bokov) 0.7.26 (Current Version) ------------------------ diff --git a/askbot/doc/source/contributors.rst b/askbot/doc/source/contributors.rst index ac807193..3e62af26 100644 --- a/askbot/doc/source/contributors.rst +++ b/askbot/doc/source/contributors.rst @@ -19,6 +19,7 @@ Programming and documentation * `Hrishi `_ * Andrei Mamoutkine * `Ramiro Morales `_ (with Machinalis) +* Vladimir Bokov * `NoahY `_ * `Gael Pasgrimaud `_ (bearstech) * `Arun SAG `_ -- cgit v1.2.3-1-g7c22 From 603ee601994bdc2202a772c81d77d82316a80408 Mon Sep 17 00:00:00 2001 From: Byron Date: Sun, 6 Nov 2011 23:57:41 -0600 Subject: flat pages style --- askbot/skins/default/media/style/lib_style.less | 2 +- askbot/skins/default/media/style/style.css | 44 +++++++++++++++++++++++-- askbot/skins/default/templates/faq.html | 1 + askbot/skins/default/templates/feedback.html | 4 +-- askbot/skins/default/templates/privacy.html | 4 +-- 5 files changed, 48 insertions(+), 7 deletions(-) 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 6ecea8de..dbd45398 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -2013,20 +2013,60 @@ span.delete-icon:hover { .meta, .users-page, { - font-size:14px; - line-height:1.4; + 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{ 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 %}
    +

    FAQ

    {{forum_faq}}
    {% 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 @@ {% block title %}{% spaceless %}{% trans %}Feedback{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -

    {% trans %}Give us your feedback!{% endtrans %}

    +

    {% trans %}Give us your feedback!{% endtrans %}

    {% csrf_token %} {% if user.is_authenticated() %}

    @@ -39,7 +39,7 @@ {{form.next}}

      - +
    {% endblock %} 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" %} {% block title %}{% spaceless %}{% trans %}Privacy policy{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -

    {% trans %}Privacy policy{% endtrans %}

    +

    {% trans %}Privacy policy{% endtrans %}

    {{settings.FORUM_PRIVACY}} {% endblock %} -- cgit v1.2.3-1-g7c22 From 92dcb01c874a02af86ba818dcb0ecdbd1256ebb0 Mon Sep 17 00:00:00 2001 From: Byron Date: Mon, 7 Nov 2011 01:17:39 -0600 Subject: profile page style --- askbot/skins/default/media/style/style.css | 117 ++++++++++++--------- .../skins/default/templates/user_profile/user.html | 2 +- .../templates/user_profile/user_reputation.html | 7 +- 3 files changed, 75 insertions(+), 51 deletions(-) diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index dbd45398..cdd9c854 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -456,7 +456,7 @@ h1 { #ContentFull { float: left; - width: 950px; + width: 960px; } /* ----- Sidebar Widgets Box, check main_page/sidebar.html or question/sidebar.html ----- */ @@ -2204,8 +2204,15 @@ a:hover.medal { } .user-profile-page{ - font-size:15px; + font-size:13px; + line-height:1.3; color:@info-text-dark; + + p{ + font-size:13px; + line-height:1.3; + color:@info-text-dark; + } .avatar img{ border:#eee 1px solid; padding:5px; @@ -2233,8 +2240,8 @@ a:hover.medal { p{font-size:13px;} } -.follow-toggle { - border:0; +.follow-toggle,.submit { + border:0 !important; color:@button-label; font-weight:bold; font-size:12px; @@ -2250,8 +2257,9 @@ a:hover.medal { .box-shadow(1px, 1px, 2px, #808080) } -.follow-toggle:hover { +.follow-toggle:hover, .submit:hover { background:url(../images/small-button-blue.png) repeat-x bottom; + text-decoration:none !important; } .follow-toggle .follow{ @@ -2319,6 +2327,63 @@ a:hover.medal { .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; +} + /* ----- Red Popup notification ----- */ .vote-notification { @@ -3043,48 +3108,6 @@ p.signup_p { 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; 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" %} {% 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 @@
    {% if view_user.id == user.id %} -

    {% trans %}Your karma change log.{% endtrans %}

    +

    {% trans %}Your karma change log.{% endtrans %}

    {% else %} -

    {% trans user_name=view_user.username %}{{user_name}}'s karma change log{% endtrans %}

    +

    {% trans user_name=view_user.username %}{{user_name}}'s karma change log{% endtrans %}

    {% endif %} {% for rep in reputation %}

    {{ rep.positive }} {{ rep.negative }} {{ rep.get_explanation_snippet() }} - ({{rep.reputed_at|diff_date}}) + ({{rep.reputed_at|diff_date}}) +

    {% endfor %}
    -- cgit v1.2.3-1-g7c22 From 8548f2b0bba227ae052d0009ddfc29262b185356 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Mon, 7 Nov 2011 12:03:13 -0300 Subject: merged model refactoring branch by Tomasz moved around the migrations a bit --- ...sion_revision_type__add_field_answerrevision.py | 352 -------------------- ...sion_revision_type__add_field_answerrevision.py | 352 ++++++++++++++++++++ .../migrations/0047_set_proper_revision_types.py | 313 ------------------ askbot/migrations/0048_add_postrevision_model.py | 357 -------------------- .../migrations/0048_set_proper_revision_types.py | 313 ++++++++++++++++++ askbot/migrations/0049_add_postrevision_model.py | 357 ++++++++++++++++++++ .../0049_move_qa_revisions_to_postrevision.py | 362 --------------------- .../0050_move_qa_revisions_to_postrevision.py | 362 +++++++++++++++++++++ askbot/migrations/0050_proxify_qa_rev_models.py | 347 -------------------- askbot/migrations/0051_proxify_qa_rev_models.py | 347 ++++++++++++++++++++ 10 files changed, 1731 insertions(+), 1731 deletions(-) delete mode 100644 askbot/migrations/0046_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py create mode 100644 askbot/migrations/0047_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py delete mode 100644 askbot/migrations/0047_set_proper_revision_types.py delete mode 100644 askbot/migrations/0048_add_postrevision_model.py create mode 100644 askbot/migrations/0048_set_proper_revision_types.py create mode 100644 askbot/migrations/0049_add_postrevision_model.py delete mode 100644 askbot/migrations/0049_move_qa_revisions_to_postrevision.py create mode 100644 askbot/migrations/0050_move_qa_revisions_to_postrevision.py delete mode 100644 askbot/migrations/0050_proxify_qa_rev_models.py create mode 100644 askbot/migrations/0051_proxify_qa_rev_models.py diff --git a/askbot/migrations/0046_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py b/askbot/migrations/0046_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py deleted file mode 100644 index 61ae0ee7..00000000 --- a/askbot/migrations/0046_auto__add_field_answerrevision_revision_type__add_field_answerrevision.py +++ /dev/null @@ -1,352 +0,0 @@ -# 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/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/0047_set_proper_revision_types.py b/askbot/migrations/0047_set_proper_revision_types.py deleted file mode 100644 index 3b55462e..00000000 --- a/askbot/migrations/0047_set_proper_revision_types.py +++ /dev/null @@ -1,313 +0,0 @@ -# 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/0048_add_postrevision_model.py b/askbot/migrations/0048_add_postrevision_model.py deleted file mode 100644 index af2816aa..00000000 --- a/askbot/migrations/0048_add_postrevision_model.py +++ /dev/null @@ -1,357 +0,0 @@ -# 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/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/0049_move_qa_revisions_to_postrevision.py b/askbot/migrations/0049_move_qa_revisions_to_postrevision.py deleted file mode 100644 index 3067a87c..00000000 --- a/askbot/migrations/0049_move_qa_revisions_to_postrevision.py +++ /dev/null @@ -1,362 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - -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 - ) - - def forwards(self, orm): - 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) - - # TODO: - # In the next migration (0050) QuestionRevision and AnswerRevision tables are dropped. - # So if there is anything else to migrate here, we have to figure that out before merging this to trunk. - - - 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/0050_move_qa_revisions_to_postrevision.py b/askbot/migrations/0050_move_qa_revisions_to_postrevision.py new file mode 100644 index 00000000..3067a87c --- /dev/null +++ b/askbot/migrations/0050_move_qa_revisions_to_postrevision.py @@ -0,0 +1,362 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +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 + ) + + def forwards(self, orm): + 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) + + # TODO: + # In the next migration (0050) QuestionRevision and AnswerRevision tables are dropped. + # So if there is anything else to migrate here, we have to figure that out before merging this to trunk. + + + 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/0050_proxify_qa_rev_models.py b/askbot/migrations/0050_proxify_qa_rev_models.py deleted file mode 100644 index c4e37593..00000000 --- a/askbot/migrations/0050_proxify_qa_rev_models.py +++ /dev/null @@ -1,347 +0,0 @@ -# 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/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'] -- cgit v1.2.3-1-g7c22 From 70ba6634b31b2f0be1abd8eb26d9eccf6144a377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radim=20=C5=98eh=C5=AF=C5=99ek?= Date: Mon, 7 Nov 2011 21:33:08 +0100 Subject: fixed language typos --- askbot/skins/default/templates/authopenid/email_validation.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/askbot/skins/default/templates/authopenid/email_validation.txt b/askbot/skins/default/templates/authopenid/email_validation.txt index 9c5baa8a..087ce844 100644 --- a/askbot/skins/default/templates/authopenid/email_validation.txt +++ b/askbot/skins/default/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 %} -- cgit v1.2.3-1-g7c22 From cbdc2d7fd1a0d9748e4f08462a343b15454c1b6f Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Mon, 7 Nov 2011 20:58:57 -0300 Subject: hopefully fixed the sphinx conf --- askbot/search/sphinx/sphinx.conf | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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 \ -- cgit v1.2.3-1-g7c22 From 761971c39e0ae517997868c582290076e969c4f2 Mon Sep 17 00:00:00 2001 From: Tomasz Zielinski Date: Tue, 8 Nov 2011 02:05:51 +0100 Subject: Removed QuestionRevision/AnswerRevision references from the codebase --- askbot/admin.py | 8 +- askbot/management/commands/send_email_alerts.py | 8 +- askbot/models/__init__.py | 6 +- askbot/models/answer.py | 11 +-- askbot/models/base.py | 102 +----------------------- askbot/models/post.py | 102 +++++++++++++++++++++++- askbot/models/question.py | 13 +-- askbot/views/users.py | 68 +++++++++------- askbot/views/writers.py | 4 +- 9 files changed, 154 insertions(+), 168 deletions(-) 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/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/models/__init__.py b/askbot/models/__init__.py index 6e23c8f3..807a29b7 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -19,10 +19,10 @@ 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 @@ -2644,13 +2644,11 @@ __all__ = [ 'signals', 'Question', - 'QuestionRevision', 'QuestionView', 'FavoriteQuestion', 'AnonymousQuestion', 'Answer', - 'AnswerRevision', 'AnonymousAnswer', 'PostRevision', diff --git a/askbot/models/answer.py b/askbot/models/answer.py index a694e737..cd9699ec 100644 --- a/askbot/models/answer.py +++ b/askbot/models/answer.py @@ -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,15 +300,6 @@ class Answer(content.Content, DeletableContent): return self.html -class AnswerRevision(PostRevision): - """A revision of an Answer.""" - - class Meta: - app_label = 'askbot' - proxy = True - - - class AnonymousAnswer(AnonymousContent): question = models.ForeignKey('Question', related_name='anonymous_answers') diff --git a/askbot/models/base.py b/askbot/models/base.py index b4492f0f..5ac2ac7a 100644 --- a/askbot/models/base.py +++ b/askbot/models/base.py @@ -1,18 +1,20 @@ import datetime import cgi -from django.core.urlresolvers import reverse +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): @@ -216,102 +218,6 @@ class DeletableContent(models.Model): app_label = 'askbot' -class ContentRevision(models.Model): - """ - Base class for QuestionRevision and AnswerRevision - """ - QUESTION_REVISION_TEMPLATE_NO_TAGS = ( - '

    %(title)s

    \n' - '
    %(html)s
    \n' - ) - - QUESTION_REVISION = 1 - ANSWER_REVISION = 2 - REVISION_TYPE_CHOICES = ( - (QUESTION_REVISION, 'question'), - (ANSWER_REVISION, 'answer'), - ) - REVISION_TYPE_CHOICES_DICT = dict(REVISION_TYPE_CHOICES) - - revision_type = models.SmallIntegerField(choices=REVISION_TYPE_CHOICES) - - 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() - - # 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) - - class Meta: - abstract = True - app_label = 'askbot' - ordering = ('-revision',) - - 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 save(self, **kwargs): - """Determines the revistion type and then looks up the next available revision number if not set.""" - - if not self.revision_type: - # HACK: determine revision_type based on class name - until we have a better way or until make a switch to PostRevision - # After `revision_type` is set, we can just use it - if self.__class__.__name__ == 'QuestionRevision': - self.revision_type = self.QUESTION_REVISION - elif self.__class__.__name__ == 'AnswerRevision': - self.revision_type = self.ANSWER_REVISION - - if not self.revision: - # TODO: Maybe use Max() aggregation? - # TODO: Handle IntegrityError if revision id is already occupied? - self.revision = self.parent().revisions.values_list('revision', flat=True)[0] + 1 - - super(ContentRevision, 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 - - - class AnonymousContent(models.Model): """ Base class for AnonymousQuestion and AnonymousAnswer diff --git a/askbot/models/post.py b/askbot/models/post.py index 17f0eb2c..c61e8877 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -1,14 +1,59 @@ from django.db import models -from askbot.models.base import ContentRevision +from askbot.utils import markup +from askbot.utils.html import sanitize_html #class Post(models.Model): # pass -class PostRevision(ContentRevision): +class PostRevisionManager(models.Manager): + def create_question_revision(self, *kargs, **kwargs): + kwargs['revision_type'] = self.model.QUESTION_REVISION + return self.create(*kargs, **kwargs) + + def create_answer_revision(self, *kargs, **kwargs): + kwargs['revision_type'] = self.model.ANSWER_REVISION + return 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 = ( + '

    %(title)s

    \n' + '
    %(html)s
    \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. @@ -16,3 +61,56 @@ class PostRevision(ContentRevision): 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 save(self, **kwargs): + """Determines the revistion type and then looks up the next available revision number if not set.""" + + if not self.revision: + # TODO: Maybe use Max() aggregation? + # TODO: Handle IntegrityError if revision id is already occupied? + self.revision = self.parent().revisions.values_list('revision', flat=True)[0] + 1 + + self.full_clean() # Make sure that everything is ok, in particular that `revision_type` and `revision` are set to valid values + + 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 c2145f73..7f38bd5c 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -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 @@ -760,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, @@ -838,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, @@ -1007,13 +1005,6 @@ class FavoriteQuestion(models.Model): def __unicode__(self): return '[%s] favorited at %s' %(self.user, self.added_at) -class QuestionRevision(PostRevision): - """A revision of a Question.""" - - class Meta: - app_label = 'askbot' - proxy = True - class AnonymousQuestion(AnonymousContent): """question that was asked before logging in diff --git a/askbot/views/users.py b/askbot/views/users.py index f1f29f71..09acad07 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,7 @@ 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..b7b7e96d 100644 --- a/askbot/views/writers.py +++ b/askbot/views/writers.py @@ -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 ) -- cgit v1.2.3-1-g7c22 From c5cf519f8fadcdae156743d9eb7efe2496bf4e97 Mon Sep 17 00:00:00 2001 From: Byron Date: Mon, 7 Nov 2011 23:01:48 -0600 Subject: Style for edit answer form and revision page --- askbot/skins/common/media/js/wmd/wmd.css | 2 +- askbot/skins/default/media/style/style.css | 153 +++++++++++---------- askbot/skins/default/templates/answer_edit.html | 11 +- askbot/skins/default/templates/revisions.html | 2 +- .../templates/widgets/answer_edit_tips.html | 14 +- 5 files changed, 96 insertions(+), 86 deletions(-) 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/default/media/style/style.css b/askbot/skins/default/media/style/style.css index cdd9c854..1305ed28 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1393,10 +1393,13 @@ span.delete-icon:hover { margin: 5px 0 5px 0; } -.edit-question-page{ +.edit-question-page, #fmedit{ + color:@info-text-dark; + #id_revision{ font-size:14px; - margin-top:10px; + margin-top:5px; + margin-bottom:5px; } #id_title{ font-size: 24px; @@ -2205,7 +2208,6 @@ a:hover.medal { .user-profile-page{ font-size:13px; - line-height:1.3; color:@info-text-dark; p{ @@ -2384,6 +2386,80 @@ a:hover.medal { 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 { @@ -2571,77 +2647,6 @@ span.form-error { 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; -} /* .favorites-count-off { 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 @@ {% endblock %} {% block content %} -

    +

    {% trans %}Edit answer{% endtrans %} [{% trans %}back{% endtrans %}]

    {% csrf_token %} -
    +
    {% if revision_form.revision.errors %}{{ revision_form.revision.errors.as_ul() }}{% endif %}
    {{ revision_form.revision }}
    {{ macros.edit_post(form) }} + {% if settings.WIKI_ON and answer.wiki == False %} + {{ macros.checkbox_in_div(form.wiki) }} + {% endif %}
     
    - {% if settings.WIKI_ON and answer.wiki == False %} - {{ macros.checkbox_in_div(form.wiki) }} - {% endif %} +
    {% endblock %} 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 @@ {% block title %}{% spaceless %}{% trans %}Revision history{% endtrans %}{% endspaceless %}{% endblock %} {% block content %} -

    +

    {% trans %}Revision history{% endtrans %} [{% trans %}back{% endtrans %}]

    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 @@ -
    +

    {% trans %}answer tips{% endtrans %}

    -
    -
      +
      +
      • {% trans %}please make your answer relevant to this community{% endtrans %}
      • @@ -16,12 +16,14 @@
    -
    +

    {% trans %}Markdown tips{% endtrans %}

      {% if settings.MARKUP_CODE_FRIENDLY or settings.ENABLE_MATHJAX %} @@ -57,7 +59,9 @@
    -- cgit v1.2.3-1-g7c22 From d36dae7fa4df940a91aab9816c9019aaa7f847ec Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 8 Nov 2011 15:51:36 -0300 Subject: fixed the unclosed img tag issue in the accept answer button --- askbot/skins/common/templates/question/answer_vote_buttons.html | 1 + 1 file changed, 1 insertion(+) diff --git a/askbot/skins/common/templates/question/answer_vote_buttons.html b/askbot/skins/common/templates/question/answer_vote_buttons.html index 2744e37d..3445b9b2 100644 --- a/askbot/skins/common/templates/question/answer_vote_buttons.html +++ b/askbot/skins/common/templates/question/answer_vote_buttons.html @@ -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 %} -- cgit v1.2.3-1-g7c22 From 686bea5bb73b769dc47284d4931be6814af73fdc Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 8 Nov 2011 16:37:02 -0300 Subject: added implementation of new skin to the changelog --- askbot/doc/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst index eb4c71c7..df4454b1 100644 --- a/askbot/doc/source/changelog.rst +++ b/askbot/doc/source/changelog.rst @@ -3,6 +3,7 @@ Changes in Askbot Development version (not yet published) --------------------------------------- +* Implemented new version of skin (Byron Corrales) * Show unused vote count (Tomasz Zielinski) * Categorized live settings (Evgeny) * Added management command ``send_accept_answer_reminders`` (Evgeny) -- cgit v1.2.3-1-g7c22 From 599fe9f2a6c603ebbb96c09e76b54c49aa64f501 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 8 Nov 2011 16:41:27 -0300 Subject: incremented version --- askbot/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/askbot/__init__.py b/askbot/__init__.py index 12e4f7d7..c69e532c 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, 27) #necessary for interoperability of django and coffin try: -- cgit v1.2.3-1-g7c22 From 92b0543ba011ea52829ec9aea837147b5cde8ab3 Mon Sep 17 00:00:00 2001 From: Tomasz Zielinski Date: Wed, 9 Nov 2011 14:18:17 +0100 Subject: Fixed migration 0050 so that Activities related to QuestionRevision&AnswerRevisions are not lost --- .../0050_move_qa_revisions_to_postrevision.py | 28 +++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/askbot/migrations/0050_move_qa_revisions_to_postrevision.py b/askbot/migrations/0050_move_qa_revisions_to_postrevision.py index 3067a87c..2ba427bb 100644 --- a/askbot/migrations/0050_move_qa_revisions_to_postrevision.py +++ b/askbot/migrations/0050_move_qa_revisions_to_postrevision.py @@ -1,8 +1,11 @@ # encoding: utf-8 import datetime + +from django.contrib.contenttypes import generic +from django.db import models + from south.db import db from south.v2 import DataMigration -from django.db import models class Migration(DataMigration): @@ -16,7 +19,7 @@ class Migration(DataMigration): 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( + post_revision = orm.PostRevision.objects.create( question=question, answer=answer, @@ -33,17 +36,30 @@ class Migration(DataMigration): is_anonymous=source_revision.is_anonymous ) + # Update the related activities + for activity in source_revision.activity_set.all(): + activity.content_object = post_revision + activity.save() + + def forwards(self, orm): + # Set up generic links + gfk = generic.GenericForeignKey('content_type', 'object_id') + gfk.contribute_to_class(orm.Activity, 'content_object') + + gr1 = generic.GenericRelation(orm.Activity) + gr1.contribute_to_class(orm.QuestionRevision, 'activity_set') + + gr2 = generic.GenericRelation(orm.Activity) + gr2.contribute_to_class(orm.AnswerRevision, 'activity_set') + + # 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) - # TODO: - # In the next migration (0050) QuestionRevision and AnswerRevision tables are dropped. - # So if there is anything else to migrate here, we have to figure that out before merging this to trunk. - def backwards(self, orm): "Write your backwards methods here." -- cgit v1.2.3-1-g7c22 From da93e5dde9b177bc361053c51caa20e15824d530 Mon Sep 17 00:00:00 2001 From: Tomasz Zielinski Date: Wed, 9 Nov 2011 19:21:44 +0100 Subject: Added misc tests; Fixed page load tests - still TODO: `./manage.py test askbot.PageLoadTestCase` works great, whereas `./manage.py test askbot` breaks inside PageLoadTestCase - on checking the template used - it looks on the surface like some Jinja2 monkey-patching problem --- askbot/tests/__init__.py | 1 + askbot/tests/misc_tests.py | 50 +++++++++++++++++++++++++++++++++++++++++ askbot/tests/page_load_tests.py | 28 ++++++++++++++++++++--- 3 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 askbot/tests/misc_tests.py diff --git a/askbot/tests/__init__.py b/askbot/tests/__init__.py index b06c2b06..76e32e41 100644 --- a/askbot/tests/__init__.py +++ b/askbot/tests/__init__.py @@ -11,3 +11,4 @@ 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 * 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..442b1bd7 100644 --- a/askbot/tests/page_load_tests.py +++ b/askbot/tests/page_load_tests.py @@ -25,9 +25,10 @@ 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, @@ -66,8 +67,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 -- cgit v1.2.3-1-g7c22 From 30d8e5e3e7b4bdb7e6ef57ae059c0551ba37544e Mon Sep 17 00:00:00 2001 From: Tomasz Zielinski Date: Wed, 9 Nov 2011 20:37:12 +0100 Subject: Added test for the new wikipost models (only PostRevision at the moment) --- askbot/models/post.py | 24 +++++++++++++----- askbot/tests/__init__.py | 1 + askbot/tests/post_model_tests.py | 55 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 askbot/tests/post_model_tests.py diff --git a/askbot/models/post.py b/askbot/models/post.py index c61e8877..d5c0c6df 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -1,4 +1,5 @@ from django.db import models +from django.core.exceptions import ValidationError from askbot.utils import markup from askbot.utils.html import sanitize_html @@ -7,13 +8,16 @@ from askbot.utils.html import sanitize_html # pass class PostRevisionManager(models.Manager): + 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 self.create(*kargs, **kwargs) + return super(PostRevisionManager, self).create(*kargs, **kwargs) def create_answer_revision(self, *kargs, **kwargs): kwargs['revision_type'] = self.model.ANSWER_REVISION - return self.create(*kargs, **kwargs) + return super(PostRevisionManager, self).create(*kargs, **kwargs) def question_revisions(self): return self.filter(revision_type=self.model.QUESTION_REVISION) @@ -74,15 +78,21 @@ class PostRevision(models.Model): elif self.is_answer_revision(): return self.answer - def save(self, **kwargs): - """Determines the revistion type and then looks up the next available revision number if not set.""" + 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? - # TODO: Handle IntegrityError if revision id is already occupied? + # TODO: Maybe use Max() aggregation? Or `revisions.count() + 1` self.revision = self.parent().revisions.values_list('revision', flat=True)[0] + 1 - self.full_clean() # Make sure that everything is ok, in particular that `revision_type` and `revision` are set to valid values + # 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) diff --git a/askbot/tests/__init__.py b/askbot/tests/__init__.py index 76e32e41..a9fa761b 100644 --- a/askbot/tests/__init__.py +++ b/askbot/tests/__init__.py @@ -12,3 +12,4 @@ 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/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()) -- cgit v1.2.3-1-g7c22 From 7c0533bae490449ad9180ed00e3ceb876a2fbda9 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Wed, 9 Nov 2011 17:03:14 -0300 Subject: fixed celery startup_procedure test --- askbot/startup_procedures.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/askbot/startup_procedures.py b/askbot/startup_procedures.py index 08b91e7a..5a7b6799 100644 --- a/askbot/startup_procedures.py +++ b/askbot/startup_procedures.py @@ -34,7 +34,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. """ @@ -91,8 +91,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,7 +112,7 @@ 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""" @@ -124,7 +124,7 @@ def test_i18n(): ) 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,25 +173,35 @@ 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""" - if hasattr(django_settings, 'BROKER_BACKEND'): + broker_backend = getattr(django_settings, 'BROKER_BACKEND', None) + broker_transport = getattr(django_settings, 'BROKER_TRANSPORT', None) + + if broker_backend != broker_transport: + raise ImproperlyConfigured(PREAMBLE + \ + "\nPlese check that BROKER_BACKEND and BROKER_TRANSPORT have \n" + "then same value in your settings.py file" + ) + + 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" ) + def run_startup_tests(): """function that runs all startup tests, mainly checking settings config so far -- cgit v1.2.3-1-g7c22 From be2267211fcfdb28b769552050225bf60343bf65 Mon Sep 17 00:00:00 2001 From: Tomasz Zielinski Date: Wed, 9 Nov 2011 21:07:38 +0100 Subject: Added minor TODO comment in PostRevisionManager --- askbot/models/post.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/askbot/models/post.py b/askbot/models/post.py index d5c0c6df..343ffd87 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -8,6 +8,9 @@ from askbot.utils.html import sanitize_html # 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 -- cgit v1.2.3-1-g7c22 From e9541d7227cb04edf4471ff70bb51b93f817ff48 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Wed, 9 Nov 2011 17:33:40 -0300 Subject: added CACHE_MIDDLEWARE_ANONYMOUS_ONLY setting and test, renamed BROKER_BACKEND setting and fixed a bug in the answer vote button template --- askbot/__init__.py | 2 +- askbot/setup_templates/settings.py | 2 +- askbot/setup_templates/settings.py.mustache | 3 ++- .../skins/common/templates/question/answer_vote_buttons.html | 2 +- askbot/startup_procedures.py | 10 ++++++++++ 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/askbot/__init__.py b/askbot/__init__.py index c69e532c..11954dda 100644 --- a/askbot/__init__.py +++ b/askbot/__init__.py @@ -9,7 +9,7 @@ import smtplib import sys import logging -VERSION = (0, 7, 27) +VERSION = (0, 7, 28) #necessary for interoperability of django and coffin try: diff --git a/askbot/setup_templates/settings.py b/askbot/setup_templates/settings.py index ca6d2ebb..52a047c5 100644 --- a/askbot/setup_templates/settings.py +++ b/askbot/setup_templates/settings.py @@ -209,7 +209,7 @@ 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 diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache index ad954734..f712a5cb 100644 --- a/askbot/setup_templates/settings.py.mustache +++ b/askbot/setup_templates/settings.py.mustache @@ -175,6 +175,7 @@ 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' @@ -207,7 +208,7 @@ 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 diff --git a/askbot/skins/common/templates/question/answer_vote_buttons.html b/askbot/skins/common/templates/question/answer_vote_buttons.html index 3445b9b2..e3072ae4 100644 --- a/askbot/skins/common/templates/question/answer_vote_buttons.html +++ b/askbot/skins/common/templates/question/answer_vote_buttons.html @@ -3,7 +3,7 @@ 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()) %} Date: Wed, 9 Nov 2011 18:21:08 -0300 Subject: modified the startup_procedures message --- askbot/startup_procedures.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/askbot/startup_procedures.py b/askbot/startup_procedures.py index 3d6c4165..c07f4cfb 100644 --- a/askbot/startup_procedures.py +++ b/askbot/startup_procedures.py @@ -191,8 +191,10 @@ def test_celery(): if broker_backend != broker_transport: raise ImproperlyConfigured(PREAMBLE + \ - "\nPlese check that BROKER_BACKEND and BROKER_TRANSPORT have \n" - "then same value in your settings.py file" + "\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'): -- cgit v1.2.3-1-g7c22 From 82e7b785a3ca9fb189dea94c18b408cd07106ee3 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Wed, 9 Nov 2011 18:30:31 -0300 Subject: one more fix to the startup procedure for celery and incremented revision again --- askbot/__init__.py | 2 +- askbot/startup_procedures.py | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/askbot/__init__.py b/askbot/__init__.py index 11954dda..1c822e05 100644 --- a/askbot/__init__.py +++ b/askbot/__init__.py @@ -9,7 +9,7 @@ import smtplib import sys import logging -VERSION = (0, 7, 28) +VERSION = (0, 7, 29) #necessary for interoperability of django and coffin try: diff --git a/askbot/startup_procedures.py b/askbot/startup_procedures.py index c07f4cfb..bf988881 100644 --- a/askbot/startup_procedures.py +++ b/askbot/startup_procedures.py @@ -185,10 +185,25 @@ def test_template_loader(): ) def test_celery(): - """Tests celery settings""" + """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" -- cgit v1.2.3-1-g7c22 From ebbdd21a16cb35978c2f057f8ba70764352f2721 Mon Sep 17 00:00:00 2001 From: Tomasz Zielinski Date: Fri, 11 Nov 2011 00:07:21 +0100 Subject: 0050 migration fix - removed generic relations` migration --- .../0050_move_qa_revisions_to_postrevision.py | 20 ++++---------------- askbot/models/post.py | 1 + 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/askbot/migrations/0050_move_qa_revisions_to_postrevision.py b/askbot/migrations/0050_move_qa_revisions_to_postrevision.py index 2ba427bb..36c46551 100644 --- a/askbot/migrations/0050_move_qa_revisions_to_postrevision.py +++ b/askbot/migrations/0050_move_qa_revisions_to_postrevision.py @@ -1,7 +1,6 @@ # encoding: utf-8 import datetime -from django.contrib.contenttypes import generic from django.db import models from south.db import db @@ -19,7 +18,7 @@ class Migration(DataMigration): if (question and source_revision.revision_type != 1) or (answer and source_revision.revision_type != 2): raise ValueError('Data problem! Check this manually') - post_revision = orm.PostRevision.objects.create( + orm.PostRevision.objects.create( question=question, answer=answer, @@ -36,23 +35,12 @@ class Migration(DataMigration): is_anonymous=source_revision.is_anonymous ) - # Update the related activities - for activity in source_revision.activity_set.all(): - activity.content_object = post_revision - activity.save() + # 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): - # Set up generic links - gfk = generic.GenericForeignKey('content_type', 'object_id') - gfk.contribute_to_class(orm.Activity, 'content_object') - - gr1 = generic.GenericRelation(orm.Activity) - gr1.contribute_to_class(orm.QuestionRevision, 'activity_set') - - gr2 = generic.GenericRelation(orm.Activity) - gr2.contribute_to_class(orm.AnswerRevision, 'activity_set') - # Process revisions for qr in orm.QuestionRevision.objects.all(): self.copy_revision(orm=orm, source_revision=qr) diff --git a/askbot/models/post.py b/askbot/models/post.py index 343ffd87..16352228 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -14,6 +14,7 @@ class PostRevisionManager(models.Manager): 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) -- cgit v1.2.3-1-g7c22 From 899b39f2a037f1be76e31a95d47622524387750b Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Fri, 11 Nov 2011 16:19:26 -0300 Subject: fixed german translation of to sign up with password --- askbot/locale/de/LC_MESSAGES/django.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/" -- cgit v1.2.3-1-g7c22 From 08d00bcada2552d479120197a4ab9f719f7b1f0b Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Fri, 11 Nov 2011 14:44:29 -0500 Subject: recompiled the translation messages --- askbot/locale/de/LC_MESSAGES/django.mo | Bin 50109 -> 17569 bytes askbot/locale/en/LC_MESSAGES/django.mo | Bin 20706 -> 20624 bytes askbot/locale/fi/LC_MESSAGES/django.mo | Bin 51493 -> 20906 bytes askbot/locale/fr/LC_MESSAGES/django.mo | Bin 88376 -> 49048 bytes askbot/locale/it/LC_MESSAGES/django.mo | Bin 82876 -> 43717 bytes askbot/locale/ja/LC_MESSAGES/django.mo | Bin 37520 -> 11979 bytes askbot/locale/ko/LC_MESSAGES/django.mo | Bin 19986 -> 4238 bytes askbot/locale/pt_BR/LC_MESSAGES/django.mo | Bin 8806 -> 8806 bytes askbot/locale/ro/LC_MESSAGES/django.mo | Bin 83286 -> 47222 bytes askbot/locale/ru/LC_MESSAGES/django.mo | Bin 129267 -> 77179 bytes askbot/locale/sr/LC_MESSAGES/django.mo | Bin 37548 -> 14675 bytes askbot/locale/tr/LC_MESSAGES/django.mo | Bin 54328 -> 30400 bytes askbot/locale/vi/LC_MESSAGES/django.mo | Bin 17130 -> 1823 bytes askbot/locale/zh-tw/LC_MESSAGES/django.mo | Bin 33183 -> 12403 bytes askbot/locale/zh_CN/LC_MESSAGES/django.mo | Bin 85081 -> 48998 bytes 15 files changed, 0 insertions(+), 0 deletions(-) diff --git a/askbot/locale/de/LC_MESSAGES/django.mo b/askbot/locale/de/LC_MESSAGES/django.mo index 668a17c4..e54c459f 100644 Binary files a/askbot/locale/de/LC_MESSAGES/django.mo and b/askbot/locale/de/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/en/LC_MESSAGES/django.mo b/askbot/locale/en/LC_MESSAGES/django.mo index 1f065123..e1f4a2e9 100644 Binary files a/askbot/locale/en/LC_MESSAGES/django.mo and b/askbot/locale/en/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/fi/LC_MESSAGES/django.mo b/askbot/locale/fi/LC_MESSAGES/django.mo index cbd57018..e4142187 100644 Binary files a/askbot/locale/fi/LC_MESSAGES/django.mo and b/askbot/locale/fi/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/fr/LC_MESSAGES/django.mo b/askbot/locale/fr/LC_MESSAGES/django.mo index 1fe00ef0..709cd9e9 100644 Binary files a/askbot/locale/fr/LC_MESSAGES/django.mo and b/askbot/locale/fr/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/it/LC_MESSAGES/django.mo b/askbot/locale/it/LC_MESSAGES/django.mo index 6cbc8fac..46ec86a8 100644 Binary files a/askbot/locale/it/LC_MESSAGES/django.mo and b/askbot/locale/it/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/ja/LC_MESSAGES/django.mo b/askbot/locale/ja/LC_MESSAGES/django.mo index efb75cc8..7f98e565 100644 Binary files a/askbot/locale/ja/LC_MESSAGES/django.mo and b/askbot/locale/ja/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/ko/LC_MESSAGES/django.mo b/askbot/locale/ko/LC_MESSAGES/django.mo index 5f175980..c117d238 100644 Binary files a/askbot/locale/ko/LC_MESSAGES/django.mo and b/askbot/locale/ko/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/pt_BR/LC_MESSAGES/django.mo b/askbot/locale/pt_BR/LC_MESSAGES/django.mo index 172807a7..2e17a8ef 100644 Binary files a/askbot/locale/pt_BR/LC_MESSAGES/django.mo and b/askbot/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/ro/LC_MESSAGES/django.mo b/askbot/locale/ro/LC_MESSAGES/django.mo index 7b66727a..33ff42f7 100644 Binary files a/askbot/locale/ro/LC_MESSAGES/django.mo and b/askbot/locale/ro/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/ru/LC_MESSAGES/django.mo b/askbot/locale/ru/LC_MESSAGES/django.mo index c41a06bf..4d01e193 100644 Binary files a/askbot/locale/ru/LC_MESSAGES/django.mo and b/askbot/locale/ru/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/sr/LC_MESSAGES/django.mo b/askbot/locale/sr/LC_MESSAGES/django.mo index 00cab4f5..3e3ca237 100644 Binary files a/askbot/locale/sr/LC_MESSAGES/django.mo and b/askbot/locale/sr/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/tr/LC_MESSAGES/django.mo b/askbot/locale/tr/LC_MESSAGES/django.mo index 5e511994..5f3f7a79 100644 Binary files a/askbot/locale/tr/LC_MESSAGES/django.mo and b/askbot/locale/tr/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/vi/LC_MESSAGES/django.mo b/askbot/locale/vi/LC_MESSAGES/django.mo index 4f175ad6..cb82d178 100644 Binary files a/askbot/locale/vi/LC_MESSAGES/django.mo and b/askbot/locale/vi/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/zh-tw/LC_MESSAGES/django.mo b/askbot/locale/zh-tw/LC_MESSAGES/django.mo index 9e398bb2..3a914dd3 100644 Binary files a/askbot/locale/zh-tw/LC_MESSAGES/django.mo and b/askbot/locale/zh-tw/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/zh_CN/LC_MESSAGES/django.mo b/askbot/locale/zh_CN/LC_MESSAGES/django.mo index 59fb0403..e0c7877e 100644 Binary files a/askbot/locale/zh_CN/LC_MESSAGES/django.mo and b/askbot/locale/zh_CN/LC_MESSAGES/django.mo differ -- cgit v1.2.3-1-g7c22 From e15cb4b43a36592cde42ec2ac4d181e857833ce7 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Mon, 14 Nov 2011 17:28:25 -0300 Subject: fixed bug reported in http://askbot.org/en/question/699/bug-in-parser --- askbot/skins/common/media/js/wmd/wmd.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/askbot/skins/common/media/js/wmd/wmd.js b/askbot/skins/common/media/js/wmd/wmd.js index bc3b5a0c..f5354fac 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; -- cgit v1.2.3-1-g7c22 From b9ea98deae2949b19f46af32034d48c2d1dbbe07 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 15 Nov 2011 11:54:56 -0300 Subject: added fancybox sources to the gitignore file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f4c8a613..66f819c8 100755 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ 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 -- cgit v1.2.3-1-g7c22 From 54c40830e3f93760debb53dd5fc5853d75e06818 Mon Sep 17 00:00:00 2001 From: Dejan Noveski Date: Tue, 15 Nov 2011 22:51:47 +0100 Subject: RSS feed made context sensitive --- askbot/feed.py | 20 +++++++++++++++----- .../skins/default/templates/main_page/tab_bar.html | 4 ++++ askbot/skins/old/templates/main_page/headline.html | 4 ++++ askbot/views/readers.py | 11 +++++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/askbot/feed.py b/askbot/feed.py index e0c69454..b71a3696 100644 --- a/askbot/feed.py +++ b/askbot/feed.py @@ -18,6 +18,7 @@ from django.utils.translation import ugettext as _ from django.core.exceptions import ObjectDoesNotExist from askbot.models import Question, Answer, Comment from askbot.conf import settings as askbot_settings +from askbot.search.state_manager import SearchState import itertools class RssIndividualQuestionFeed(Feed): @@ -137,11 +138,20 @@ class RssLastestQuestionsFeed(Feed): def items(self, item): """get questions for the feed """ - return Question.objects.filter( - deleted=False - ).order_by( - '-last_activity_at' - )[:30] + qs = Question.objects.filter(deleted=False) + query = self.request.GET.get("q", None) + tags = self.request.GET.getlist("tags") + + if query: + qs = qs.get_by_text_query(query) + + if tags: + for tag in tags: + qs = qs.filter(tags__name = tag) + + return qs.order_by('-last_activity_at') + + def main(): """main function for use as a script 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 %} {% trans %}RSS{% 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 @@

    ({% trans %}rss feed{% endtrans %})

    diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 4a12fe2c..eb81f963 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 @@ -223,6 +224,15 @@ def questions(request): reset_method_count += 1 if meta_data.get('author_name',None): reset_method_count += 1 + + rss_query_dict = QueryDict("").copy() + if search_state.query: + rss_query_dict.update({"q": search_state.query}) + if search_state.tags: + rss_query_dict.setlist("tags", search_state.tags) + + + context_feed_url = '/feeds/rss/?%s' % rss_query_dict.urlencode() template_data = { 'active_tab': 'questions', @@ -249,6 +259,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) -- cgit v1.2.3-1-g7c22 From ff17439076efd7abff617ddc5b96f4ee8f7ee340 Mon Sep 17 00:00:00 2001 From: Dejan Noveski Date: Tue, 15 Nov 2011 23:42:04 +0100 Subject: Updated live search to switch feed url, added comments - better code, removed unused import, querystring building moved further up to be used in AJAX response --- askbot/feed.py | 10 ++++++++-- askbot/skins/common/media/js/live_search.js | 7 +++++++ askbot/views/readers.py | 29 ++++++++++++++++++++--------- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/askbot/feed.py b/askbot/feed.py index b71a3696..20932f1a 100644 --- a/askbot/feed.py +++ b/askbot/feed.py @@ -18,7 +18,6 @@ from django.utils.translation import ugettext as _ from django.core.exceptions import ObjectDoesNotExist from askbot.models import Question, Answer, Comment from askbot.conf import settings as askbot_settings -from askbot.search.state_manager import SearchState import itertools class RssIndividualQuestionFeed(Feed): @@ -138,15 +137,22 @@ class RssLastestQuestionsFeed(Feed): def items(self, item): """get questions for the feed """ + #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: - for tag in 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') 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/views/readers.py b/askbot/views/readers.py index eb81f963..f352a166 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -125,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 @@ -171,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) @@ -225,14 +244,6 @@ def questions(request): if meta_data.get('author_name',None): reset_method_count += 1 - rss_query_dict = QueryDict("").copy() - if search_state.query: - rss_query_dict.update({"q": search_state.query}) - if search_state.tags: - rss_query_dict.setlist("tags", search_state.tags) - - - context_feed_url = '/feeds/rss/?%s' % rss_query_dict.urlencode() template_data = { 'active_tab': 'questions', -- cgit v1.2.3-1-g7c22 From 531a5c1e7ce3ccf42f31318adb02e85fd2e88dfa Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 15 Nov 2011 20:48:15 -0300 Subject: merged Dejans work on context-sensitive RSS url --- askbot/doc/source/changelog.rst | 1 + askbot/doc/source/contributors.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst index df4454b1..827afb95 100644 --- a/askbot/doc/source/changelog.rst +++ b/askbot/doc/source/changelog.rst @@ -3,6 +3,7 @@ Changes in Askbot Development version (not yet published) --------------------------------------- +* Context-sensitive RSS url (`Dejan Noveski `_) * Implemented new version of skin (Byron Corrales) * Show unused vote count (Tomasz Zielinski) * Categorized live settings (Evgeny) diff --git a/askbot/doc/source/contributors.rst b/askbot/doc/source/contributors.rst index 651f547f..e7450293 100644 --- a/askbot/doc/source/contributors.rst +++ b/askbot/doc/source/contributors.rst @@ -19,6 +19,7 @@ Programming and documentation * `Hrishi `_ * Andrei Mamoutkine * `Daniel Mican `_ +* `Dejan Noveski `_ * `Ramiro Morales `_ (with Machinalis) * Vladimir Bokov * `NoahY `_ -- cgit v1.2.3-1-g7c22 From d39849bc2e73d1c9cdcb07b12fe6fdf6d562e582 Mon Sep 17 00:00:00 2001 From: Alexander Werner Date: Wed, 16 Nov 2011 10:00:50 +0000 Subject: Fixed js bug reported in http://askbot.org/en/question/707/ - Doesn't break current behaviour of opening social sharing sites in popup - Fallback to opening in current window if popup fails works again --- askbot/skins/common/media/js/post.js | 2 +- askbot/skins/old/media/js/post.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js index 31d42803..0c01ab0f 100644 --- a/askbot/skins/common/media/js/post.js +++ b/askbot/skins/common/media/js/post.js @@ -1560,7 +1560,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/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; } } }); -- cgit v1.2.3-1-g7c22 From daf2458da6b2781688300c0854d2a127b3f25c2a Mon Sep 17 00:00:00 2001 From: Alexander Werner Date: Wed, 16 Nov 2011 10:05:01 +0000 Subject: Added directory entry for askbot/upfiles to .gitignore --- .gitignore | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 66f819c8..5d0da446 100755 --- a/.gitignore +++ b/.gitignore @@ -32,11 +32,7 @@ askbot/fixtures 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 -- cgit v1.2.3-1-g7c22 From 802f5e08ce04997286c0672383a43dd6229f925f Mon Sep 17 00:00:00 2001 From: Alexander Werner Date: Wed, 16 Nov 2011 10:18:37 +0000 Subject: Removed fixed width of .tabBar to show it at correct width when searching --- askbot/skins/default/media/style/style.css | 1 - 1 file changed, 1 deletion(-) diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index f6c5e18b..46b3ac00 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -667,7 +667,6 @@ h1 { .tabBar { background-color: #eff5f6; height: 30px; - width: 336px; margin-bottom: 3px; margin-top: 3px; float:right; -- cgit v1.2.3-1-g7c22 From 3fa142bbce0d084d159387ad2b861c217984411a Mon Sep 17 00:00:00 2001 From: Alexander Werner Date: Wed, 16 Nov 2011 14:18:21 +0000 Subject: Added ASKBOT_TRANSLATE_URL setting --- askbot/setup_templates/settings.py | 1 + askbot/setup_templates/settings.py.mustache | 1 + askbot/urls.py | 6 +++++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/askbot/setup_templates/settings.py b/askbot/setup_templates/settings.py index ed5c30da..ef24a82f 100644 --- a/askbot/setup_templates/settings.py +++ b/askbot/setup_templates/settings.py @@ -200,6 +200,7 @@ 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/')) #note - it is important that upload dir url is NOT translated!!! diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache index fa0b20d0..081f37fa 100644 --- a/askbot/setup_templates/settings.py.mustache +++ b/askbot/setup_templates/settings.py.mustache @@ -199,6 +199,7 @@ 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/')) #note - it is important that upload dir url is NOT translated!!! diff --git a/askbot/urls.py b/askbot/urls.py index 8c1e3c3a..ec10d3b5 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 -- cgit v1.2.3-1-g7c22 From 2278a0404e2d12dddd46b063f90c99f3b4857ffa Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Wed, 16 Nov 2011 11:58:49 -0300 Subject: added awermer to contributors list and updated changelog --- askbot/doc/source/changelog.rst | 3 +++ askbot/doc/source/contributors.rst | 1 + 2 files changed, 4 insertions(+) diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst index 827afb95..901a8529 100644 --- a/askbot/doc/source/changelog.rst +++ b/askbot/doc/source/changelog.rst @@ -11,6 +11,9 @@ Development version (not yet published) * 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) + 0.7.26 (Current Version) ------------------------ diff --git a/askbot/doc/source/contributors.rst b/askbot/doc/source/contributors.rst index e7450293..c2ba76b8 100644 --- a/askbot/doc/source/contributors.rst +++ b/askbot/doc/source/contributors.rst @@ -30,6 +30,7 @@ Programming and documentation * `Tomasz Zielinski `_ * `Tomasz Szynalski `_ * `Raghu Udiyar `_ +* Alexander Werner Translations ------------ -- cgit v1.2.3-1-g7c22 From 6512913355f0c7ca3471067ca4cae40bcbebb047 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Wed, 16 Nov 2011 14:44:15 -0300 Subject: Added less compiled css for production mode --- .../skins/common/templates/widgets/search_bar.html | 2 +- askbot/skins/default/media/style/style.css | 5119 ++++++++++---------- askbot/skins/default/media/style/style.less.css | 3251 +++++++++++++ .../templates/meta/html_head_stylesheets.html | 6 +- 4 files changed, 5698 insertions(+), 2680 deletions(-) create mode 100644 askbot/skins/default/media/style/style.less.css diff --git a/askbot/skins/common/templates/widgets/search_bar.html b/askbot/skins/common/templates/widgets/search_bar.html index 7cc76ec4..e4d2f488 100644 --- a/askbot/skins/common/templates/widgets/search_bar.html +++ b/askbot/skins/common/templates/widgets/search_bar.html @@ -28,7 +28,7 @@ {%elif request.user.is_authenticated()%} class="searchInputAuth" {%else%} - class="searchInputh" + class="searchInput" {% endif %} type="text" autocomplete="off" diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index 209894e3..f87ecd88 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -1,2664 +1,2480 @@ @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:@body-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; - margin-left:0px; + 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; + 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: 21px; - padding: 3px 0 3px 5px; + font-size: 21px; + padding: 3px 0 3px 5px; } - h3 { - font-size: 19px; - 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; } - .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: 24px; - 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; - font-family:@main-font; - - 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 { + 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; - font-family:@main-font; + 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; +} +#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 .searchInputAuth .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; } - -.content-wrapper {/* wrapper positioning class */ - width: 960px; - margin: auto; - position:relative; -} - -#logo img{ - padding: 5px 0px 5px 0px; - height: 75px; - width: auto; -} - -#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; + 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: 960px; + 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; - } -} - -.statsWidget p{ - color:@info-text; - font-size:16px; - border-bottom:#cccccc 1px solid; - font-size:13px; - - 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; - } - a{ - font-size:13px; - } + 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:13px; - 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:13px; - } - 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; - 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; - font-family:@main-font; +#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; } - -#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; + 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; - } + 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; - 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; - } - + 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: 13px; - 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: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; - } - + 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: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; - } + 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; } - -.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; + 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; } - #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; + 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; } - -.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; - - } - +.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, -{ - 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-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; + 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; } - -#award-list{ - .user{ - float:left; - margin:5px; - } -} - /* profile page */ - -.tabBar-profile{ - width:100%; - margin-bottom:15px; - float:left; +.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-profile-page { + font-size: 13px; + color: #525252; +} +.user-profile-page p { + font-size: 13px; + line-height: 1.3; + color: #525252; +} +.user-profile-page .avatar img { + border: #eee 1px solid; + padding: 5px; +} +.user-profile-page h2 { + padding: 10px 0px 10px 0px; + font-family: 'Yanone Kaffeesatz', sans-serif; } - .user-details { - font-size: 13px; - h3{ - font-size:16px; - } + font-size: 13px; } - -.user-about { - background-color: #EEEEEE; - height: 200px; - line-height: 20px; - overflow: auto; - padding: 10px; - width: 90%; - p{font-size:13px;} +.user-details h3 { + font-size: 16px; } - -.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) +.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; + 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 .follow { + font-color: #000; + font-style: normal; } - -.follow-toggle .unfollow div.unfollow-red{ - display:none; +.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-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-green { + display: none; } - .count { - font-family: @main-font; - font-size: 200%; - font-weight: 700; - color: #777 + font-family: 'Yanone Kaffeesatz', sans-serif; + font-size: 200%; + font-weight: 700; + color: #777777; } - .scoreNumber { - font-family: @main-font; - font-size: 35px; - font-weight: 800; - color: #777; - line-height: 40px; /*letter-spacing:0px*/ - margin-top: 3px; -} + font-family: 'Yanone Kaffeesatz', sans-serif; + 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; + 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; + padding: 5px; + font-size: 13px; } - .karma-summary h3 { - text-align: center; - font-weight: bold; - padding:5px; + text-align: center; + font-weight: bold; + padding: 5px; } - .karma-diagram { - width:477px; - height:300px; - float:left; - margin-right:10px; + 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;} + 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; - .rounded-corners(3px); + 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; - .rounded-corners(3px); + 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; +.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; - } + 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; + color: #C34719; } - ins .post-tag, ins p, ins { - background-color: #E6F0A2; + 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; - font-family:@main-font; - - 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; } - - /* .favorites-count-off { color: #919191; @@ -2672,580 +2488,527 @@ span.form-error { 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: 14px; + 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; - font-size:14px; + 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; + 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.css b/askbot/skins/default/media/style/style.less.css new file mode 100644 index 00000000..209894e3 --- /dev/null +++ b/askbot/skins/default/media/style/style.less.css @@ -0,0 +1,3251 @@ +@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; +} + +/* ----- 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 { + 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; +} + +#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; + } +} + +.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/meta/html_head_stylesheets.html b/askbot/skins/default/templates/meta/html_head_stylesheets.html index 9d5aebad..f64b1a3c 100644 --- a/askbot/skins/default/templates/meta/html_head_stylesheets.html +++ b/askbot/skins/default/templates/meta/html_head_stylesheets.html @@ -1,5 +1,9 @@ - +{%if settings.DEBUG %} + +{%else%} + +{%endif%} {{ skin.get_extra_css_link() }} {% if settings.USE_CUSTOM_CSS %} Date: Wed, 16 Nov 2011 15:10:26 -0300 Subject: deleted duplicate in changelog --- askbot/doc/source/changelog.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst index 369a5ceb..53c19816 100644 --- a/askbot/doc/source/changelog.rst +++ b/askbot/doc/source/changelog.rst @@ -7,7 +7,6 @@ Development version (not yet published) * Implemented new version of skin (Byron Corrales) * Show unused vote count (Tomasz Zielinski) * Categorized live settings (Evgeny) -* Anonymous caching of the question page (Vlad Bokov) * Merge users management command (Daniel Mican) * Added management command ``send_accept_answer_reminders`` (Evgeny) * Improved the ``askbot-setup`` script (Adolfo, Evgeny) -- cgit v1.2.3-1-g7c22 From 46faed1261a2491bd2e960d8a9faa665231a534b Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Wed, 16 Nov 2011 15:24:04 -0300 Subject: renamed style.less.css to style.less --- askbot/skins/default/media/style/style.less | 3251 ++++++++++++++++++++ askbot/skins/default/media/style/style.less.css | 3251 -------------------- .../templates/meta/html_head_stylesheets.html | 2 +- 3 files changed, 3252 insertions(+), 3252 deletions(-) create mode 100644 askbot/skins/default/media/style/style.less delete mode 100644 askbot/skins/default/media/style/style.less.css diff --git a/askbot/skins/default/media/style/style.less b/askbot/skins/default/media/style/style.less new file mode 100644 index 00000000..209894e3 --- /dev/null +++ b/askbot/skins/default/media/style/style.less @@ -0,0 +1,3251 @@ +@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; +} + +/* ----- 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 { + 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; +} + +#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; + } +} + +.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/media/style/style.less.css b/askbot/skins/default/media/style/style.less.css deleted file mode 100644 index 209894e3..00000000 --- a/askbot/skins/default/media/style/style.less.css +++ /dev/null @@ -1,3251 +0,0 @@ -@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; -} - -/* ----- 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 { - 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; -} - -#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; - } -} - -.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/meta/html_head_stylesheets.html b/askbot/skins/default/templates/meta/html_head_stylesheets.html index f64b1a3c..c3d6a4c4 100644 --- a/askbot/skins/default/templates/meta/html_head_stylesheets.html +++ b/askbot/skins/default/templates/meta/html_head_stylesheets.html @@ -1,5 +1,5 @@ {%if settings.DEBUG %} - + {%else%} -- cgit v1.2.3-1-g7c22 From a1773f4a71601295f0c6f9fbcff476a73dcc0623 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Wed, 16 Nov 2011 23:03:40 -0300 Subject: separated cache tests into new file and disabled misc tests, whose purpose is unclear --- askbot/tests/__init__.py | 3 ++- askbot/tests/cache_tests.py | 43 +++++++++++++++++++++++++++++++++++++++++++ askbot/tests/db_api_tests.py | 32 -------------------------------- askbot/views/users.py | 5 ++++- 4 files changed, 49 insertions(+), 34 deletions(-) create mode 100644 askbot/tests/cache_tests.py diff --git a/askbot/tests/__init__.py b/askbot/tests/__init__.py index a9fa761b..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,5 +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.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/views/users.py b/askbot/views/users.py index 09acad07..130f79a4 100644 --- a/askbot/views/users.py +++ b/askbot/views/users.py @@ -668,7 +668,10 @@ def user_recent(request, user, context): 'activity_type' ) for award in awards: - related_object_type = get_related_object_type_name(content_type_id=award['content_type_id'], object_id=award['object_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'], -- cgit v1.2.3-1-g7c22 From 446b757045a1bec42142de6b27de0921c3d4faa9 Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Thu, 17 Nov 2011 11:37:56 -0300 Subject: fixed vote buttons js --- askbot/skins/common/media/js/post.js | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js index fa4d11d4..ad33a929 100644 --- a/askbot/skins/common/media/js/post.js +++ b/askbot/skins/common/media/js/post.js @@ -322,27 +322,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); }; @@ -375,19 +375,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"); } } }; -- cgit v1.2.3-1-g7c22 From b26c49e8997bafc95b3a12e2dc0ebe4717b5951a Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Thu, 17 Nov 2011 11:46:22 -0300 Subject: fixed a bad condition that showed accepted arrow to everyone --- askbot/skins/common/templates/question/answer_vote_buttons.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/askbot/skins/common/templates/question/answer_vote_buttons.html b/askbot/skins/common/templates/question/answer_vote_buttons.html index e3072ae4..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_administrator()) %} +{% if request.user == question.author or (request.user.is_authenticated() and (request.user.is_moderator() or request.user.is_administrator())) %} {% 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 %} Date: Thu, 17 Nov 2011 12:07:38 -0300 Subject: fixed issues with url translation an ASKBOT_TRANSLATE_URL setting --- askbot/skins/default/templates/main_page/javascript.html | 5 +++++ askbot/skins/default/templates/question/javascript.html | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/askbot/skins/default/templates/main_page/javascript.html b/askbot/skins/default/templates/main_page/javascript.html index deef318c..03fae877 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 }}'; 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 %}'; -- cgit v1.2.3-1-g7c22 From cfa724080aaa7af99305e1a923d3ca5ccb424b9b Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Thu, 17 Nov 2011 12:11:32 -0300 Subject: updated changelog and added Rosandra to contributors --- askbot/doc/source/changelog.rst | 1 + askbot/doc/source/contributors.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst index 53c19816..0ada3395 100644 --- a/askbot/doc/source/changelog.rst +++ b/askbot/doc/source/changelog.rst @@ -14,6 +14,7 @@ Development version (not yet published) * 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) 0.7.26 (Current Version) diff --git a/askbot/doc/source/contributors.rst b/askbot/doc/source/contributors.rst index c2ba76b8..3d1303c1 100644 --- a/askbot/doc/source/contributors.rst +++ b/askbot/doc/source/contributors.rst @@ -31,6 +31,7 @@ Programming and documentation * `Tomasz Szynalski `_ * `Raghu Udiyar `_ * Alexander Werner +* Rosandra Cuello Suñol Translations ------------ -- cgit v1.2.3-1-g7c22 From 64c379f22c6228eafa292e83a4b3b441622fbe9f Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Thu, 17 Nov 2011 12:56:27 -0300 Subject: fixed css bug for search bar --- askbot/skins/default/media/style/style.css | 5 ++++- askbot/skins/default/media/style/style.less | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/askbot/skins/default/media/style/style.css b/askbot/skins/default/media/style/style.css index f87ecd88..cacc8782 100644 --- a/askbot/skins/default/media/style/style.css +++ b/askbot/skins/default/media/style/style.css @@ -335,7 +335,10 @@ h1 { height: 42px; margin: 6px 0px 0px 15px; } -#searchBar .searchInput, #searchBar .searchInputCancelable .searchInputAuth .searchInputCancelableAuth { +#searchBar .searchInput, +#searchBar .searchInputCancelable, +#searchBar .searchInputAuth, +#searchBar .searchInputCancelableAuth { font-size: 30px; height: 40px; font-weight: 300; diff --git a/askbot/skins/default/media/style/style.less b/askbot/skins/default/media/style/style.less index 209894e3..53ef8237 100644 --- a/askbot/skins/default/media/style/style.less +++ b/askbot/skins/default/media/style/style.less @@ -361,8 +361,8 @@ h1 { height:42px; margin:6px 0px 0px 15px; - .searchInput, .searchInputCancelable - .searchInputAuth .searchInputCancelableAuth { + .searchInput, .searchInputCancelable, + .searchInputAuth, .searchInputCancelableAuth { font-size: 30px; height: 40px; font-weight:300; -- cgit v1.2.3-1-g7c22 From fa863500d62b38196fa829545bd3ed39b6ea233e Mon Sep 17 00:00:00 2001 From: Adolfo Fitoria Date: Thu, 17 Nov 2011 15:41:30 -0300 Subject: Fixed a bug in question follow bug due to bad translation Changed message in template --- askbot/locale/en/LC_MESSAGES/djangojs.mo | Bin 2128 -> 2136 bytes askbot/locale/en/LC_MESSAGES/djangojs.po | 2 +- .../default/templates/main_page/nothing_found.html | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/askbot/locale/en/LC_MESSAGES/djangojs.mo b/askbot/locale/en/LC_MESSAGES/djangojs.mo index 2ff7a404..0e0ba6f8 100644 Binary files a/askbot/locale/en/LC_MESSAGES/djangojs.mo and b/askbot/locale/en/LC_MESSAGES/djangojs.mo differ diff --git a/askbot/locale/en/LC_MESSAGES/djangojs.po b/askbot/locale/en/LC_MESSAGES/djangojs.po index 783a1d82..692c0368 100644 --- a/askbot/locale/en/LC_MESSAGES/djangojs.po +++ b/askbot/locale/en/LC_MESSAGES/djangojs.po @@ -160,7 +160,7 @@ msgstr[1] "" #: skins/common/media/js/post.js:550 skins/default/media/js/post.js:549 #: skins/old/media/js/post.js:549 msgid "
    Following
    Unfollow
    " -msgstr "FollowingUnfollow" +msgstr "
    Following
    Unfollow
    " #: skins/common/media/js/post.js:612 msgid "undelete" 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 %}

    {% if query or search_tags or author_name %} -- cgit v1.2.3-1-g7c22 From 7122b65c2aba1e3831680503994de9b172e27125 Mon Sep 17 00:00:00 2001 From: dm03514 Date: Thu, 10 Nov 2011 23:17:24 -0500 Subject: Send Email Command Feature 131(cherry picked and pylinted) --- askbot/management/commands/send_email.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 askbot/management/commands/send_email.py 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 = '' + 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]], + ) -- cgit v1.2.3-1-g7c22 From 428249c34aecb67c59bbe87bfd1721b767dacfdb Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Sun, 20 Nov 2011 12:09:17 -0300 Subject: added some comments in view question --- askbot/views/readers.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/askbot/views/readers.py b/askbot/views/readers.py index f352a166..ec3ca57b 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -377,6 +377,7 @@ def question(request, id):#refactor - long subroutine. display question body, an """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) @@ -395,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: @@ -418,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: -- cgit v1.2.3-1-g7c22 From 83ee5035ad7667ec750a988436b80d9731c2de0c Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Sun, 20 Nov 2011 23:53:47 -0300 Subject: style changes and todo comments --- askbot/skins/common/media/js/post.js | 4 ++++ askbot/skins/common/templates/widgets/search_bar.html | 4 ++-- askbot/skins/default/media/style/style.less | 6 ++++++ askbot/skins/default/templates/base.html | 2 +- askbot/skins/default/templates/main_page/javascript.html | 6 +++--- askbot/skins/default/templates/meta/bottom_scripts.html | 4 +--- askbot/skins/default/templates/meta/html_head_javascript.html | 1 - askbot/skins/default/templates/meta/html_head_stylesheets.html | 6 +----- 8 files changed, 18 insertions(+), 15 deletions(-) diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js index ad33a929..6202347e 100644 --- a/askbot/skins/common/media/js/post.js +++ b/askbot/skins/common/media/js/post.js @@ -122,6 +122,7 @@ var CPValidator = function(){ }; }, getQuestionFormMessages: function(){ + //todo: here use pluralization function instead of replace return { tags: { required: " " + gettext('tags cannot be empty'), @@ -978,6 +979,9 @@ EditCommentForm.prototype.getCounterUpdater = function(){ length2 = Math.round(0.9*maxCommentLength); } + //todo: + //1) use class instead of color - move color def to css + //2) use pluralization and interpolation instead of string replacement var color = 'maroon'; if (length === 0){ var feedback = gettext('title minchars').replace('{0}', 10); diff --git a/askbot/skins/common/templates/widgets/search_bar.html b/askbot/skins/common/templates/widgets/search_bar.html index e4d2f488..d5a7859b 100644 --- a/askbot/skins/common/templates/widgets/search_bar.html +++ b/askbot/skins/common/templates/widgets/search_bar.html @@ -25,9 +25,9 @@ class="searchInputCancelableAuth" {% elif query %} class="searchInputCancelable" - {%elif request.user.is_authenticated()%} + {% elif request.user.is_authenticated() %} class="searchInputAuth" - {%else%} + {% else %} class="searchInput" {% endif %} type="text" diff --git a/askbot/skins/default/media/style/style.less b/askbot/skins/default/media/style/style.less index 53ef8237..c2d366dd 100644 --- a/askbot/skins/default/media/style/style.less +++ b/askbot/skins/default/media/style/style.less @@ -146,6 +146,12 @@ h1 { padding: 10px 0 5px 0px; } +/* ----- Extra space above for messages ----- */ + +body.user-messages { + margin-top: 2.4em; +} + /* ----- Custom positions ----- */ .left{float:left} 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 %} {% endspaceless %} - + {% 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/main_page/javascript.html b/askbot/skins/default/templates/main_page/javascript.html index 03fae877..e35113dd 100644 --- a/askbot/skins/default/templates/main_page/javascript.html +++ b/askbot/skins/default/templates/main_page/javascript.html @@ -34,13 +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 %} + {% 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%} + {% else %} askbot['urls']['question_url_template'] = scriptUrl + 'question/{{ "{{QuestionID}}/" }}'; askbot['urls']['user_url_template'] = scriptUrl + 'users/{{ "{{user_id}}" }}/{{ "{{slug}}" }}/'; - {%endif%} + {% endif %} askbot['messages']['name_of_anonymous_user'] = '{{ name_of_anonymous_user }}'; 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 %} > - - - + {% if settings.ENABLE_MATHJAX %} - {% 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 c3d6a4c4..4e3f173b 100644 --- a/askbot/skins/default/templates/meta/html_head_stylesheets.html +++ b/askbot/skins/default/templates/meta/html_head_stylesheets.html @@ -4,6 +4,7 @@ {%else%} {%endif%} + {{ skin.get_extra_css_link() }} {% if settings.USE_CUSTOM_CSS %} {% endif %} -{% if user_messages %} - -{% endif %} -- cgit v1.2.3-1-g7c22 From 2f56f6ee6cb9e7a78230b7fb3b4a6e5dd096ec70 Mon Sep 17 00:00:00 2001 From: Vlad Bokov Date: Tue, 22 Nov 2011 05:34:52 +0700 Subject: Feature #111: improvements in CLOSED MODE - drop from django.conf.settings - make a separate group - make all views except askbot-related work - tests --- askbot/conf/__init__.py | 1 + askbot/conf/access_control.py | 23 ++++ askbot/conf/login_providers.py | 21 +--- askbot/middleware/forum_mode.py | 25 ++++- askbot/setup_templates/settings.py | 1 - askbot/tests/page_load_tests.py | 166 ++++++++++++++++++++++------- askbot/tests/permission_assertion_tests.py | 25 ++++- askbot/tests/utils.py | 44 ++++++++ 8 files changed, 244 insertions(+), 62 deletions(-) create mode 100644 askbot/conf/access_control.py 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..88bedfed --- /dev/null +++ b/askbot/conf/access_control.py @@ -0,0 +1,23 @@ +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=_('Support mode where only registered users can access the forum'), + help_text=_('to activate this permanently use ASKBOT_CLOSED_FORUM_MODE ' + 'in your settings.py') + ) +) + + diff --git a/askbot/conf/login_providers.py b/askbot/conf/login_providers.py index da832a1d..b6073eea 100644 --- a/askbot/conf/login_providers.py +++ b/askbot/conf/login_providers.py @@ -56,22 +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 - ) -) - -settings.register( - livesettings.BooleanValue( - LOGIN_PROVIDERS, - 'ASKBOT_CLOSED_FORUM_MODE', - default = django_settings.ASKBOT_CLOSED_FORUM_MODE, - description=_('Support mode where only registered users can access the forum'), - help_text=_('to activate this permanently use ASKBOT_CLOSED_FORUM_MODE ' - 'in your settings.py') + 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/middleware/forum_mode.py b/askbot/middleware/forum_mode.py index ff99be49..874b5559 100644 --- a/askbot/middleware/forum_mode.py +++ b/askbot/middleware/forum_mode.py @@ -5,14 +5,31 @@ 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 not (request.path == settings.LOGIN_URL or - resolve(request.path).url_name in ['custom_css', 'custom_js', 'askbot_jsi18n', 'askbot_media', 'sitemap'])): - request.user.message_set.create(_('Please log in to use %s') % askbot_settings.APP_SHORT_NAME) + 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/setup_templates/settings.py b/askbot/setup_templates/settings.py index e8adc2ce..2f6a0f9b 100644 --- a/askbot/setup_templates/settings.py +++ b/askbot/setup_templates/settings.py @@ -209,7 +209,6 @@ LOGIN_URL = '/%s%s%s' % (ASKBOT_URL,_('account/'),_('signin/')) ASKBOT_UPLOADED_FILES_URL = '%s%s' % (ASKBOT_URL, 'upfiles/') ALLOW_UNICODE_SLUGS = False ASKBOT_USE_STACKEXCHANGE_URLS = False #mimic url scheme of stackexchange -ASKBOT_CLOSED_FORUM_MODE = False #Celery Settings BROKER_TRANSPORT = "djkombu.transport.DatabaseTransport" diff --git a/askbot/tests/page_load_tests.py b/askbot/tests/page_load_tests.py index 442b1bd7..285d8bc7 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( @@ -28,26 +33,35 @@ if CMAJOR == 0 and CMINOR == 3 and CMICRO < 4: import ipdb; ipdb.set_trace() patch_jinja2() + 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): @@ -99,168 +113,220 @@ class PageLoadTestCase(AskbotTestCase): 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_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}, ) @@ -268,72 +334,99 @@ class PageLoadTestCase(AskbotTestCase): '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) @@ -360,12 +453,13 @@ class PageLoadTestCase(AskbotTestCase): ) 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 56b85f9b..14680999 100644 --- a/askbot/tests/permission_assertion_tests.py +++ b/askbot/tests/permission_assertion_tests.py @@ -8,6 +8,8 @@ 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 @@ -1587,18 +1589,31 @@ class ClosedForumTests(utils.AskbotTestCase): self.question = self.post_question() self.test_url = reverse('question', kwargs={'id':self.question.id}) 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): - client = Client() - response = client.get(self.test_url) + 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_authentificated_access(self): - client = Client() - client.login(username=self.other_user.username, password=self.password) - response = client.get(self.test_url) + self.client.login(username=self.other_user.username, password=self.password) + response = self.client.get(self.test_url) self.assertEquals(response.status_code, 302) self.assertTrue(self.redirect_to not in response['Location']) self.assertTrue(self.test_url in response['Location']) 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 -- cgit v1.2.3-1-g7c22