From 9e9f6b0a71fca40b7a118acb4db37e45609fb5b8 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Sun, 13 Jun 2010 01:40:01 -0400 Subject: renamed main django app from forum to askbot --- .gitignore | 6 +- askbot/LICENSE | 14 + askbot/__init__.py | 14 + askbot/admin.py | 74 + askbot/auth.py | 550 +++ askbot/bin/dos2unix.sh | 12 + askbot/bin/rmpyc | 1 + askbot/conf/README | 5 + askbot/conf/__init__.py | 16 + askbot/conf/email.py | 69 + askbot/conf/external_keys.py | 93 + askbot/conf/flatpages.py | 37 + askbot/conf/forum_data_rules.py | 62 + askbot/conf/minimum_reputation.py | 148 + askbot/conf/reputation_changes.py | 149 + askbot/conf/settings_wrapper.py | 77 + askbot/conf/site_settings.py | 94 + askbot/conf/skin_counter_settings.py | 251 + askbot/conf/skin_general_settings.py | 38 + askbot/conf/user_settings.py | 30 + askbot/conf/vote_rules.py | 69 + askbot/const/__init__.py | 211 + askbot/const/message_keys.py | 19 + askbot/context.py | 34 + askbot/cron/README | 5 + askbot/cron/askbot_cron_job | 18 + askbot/deps/README | 2 + askbot/deps/__init__.py | 0 askbot/deps/django_authopenid/README | 5 + askbot/deps/django_authopenid/__init__.py | 40 + askbot/deps/django_authopenid/admin.py | 9 + askbot/deps/django_authopenid/forms.py | 322 ++ askbot/deps/django_authopenid/middleware.py | 28 + askbot/deps/django_authopenid/mimeparse.py | 160 + askbot/deps/django_authopenid/models.py | 80 + askbot/deps/django_authopenid/urls.py | 62 + askbot/deps/django_authopenid/util.py | 135 + askbot/deps/django_authopenid/views.py | 1192 +++++ askbot/deps/grapefruit.py | 1973 ++++++++ askbot/deps/livesettings/README | 4 + askbot/deps/livesettings/__init__.py | 16 + askbot/deps/livesettings/forms.py | 38 + askbot/deps/livesettings/functions.py | 247 + .../livesettings/locale/de/LC_MESSAGES/django.mo | Bin 0 -> 706 bytes .../livesettings/locale/de/LC_MESSAGES/django.po | 101 + .../livesettings/locale/en/LC_MESSAGES/django.mo | Bin 0 -> 367 bytes .../livesettings/locale/en/LC_MESSAGES/django.po | 100 + .../livesettings/locale/es/LC_MESSAGES/django.po | 0 .../livesettings/locale/fr/LC_MESSAGES/django.mo | Bin 0 -> 1621 bytes .../livesettings/locale/fr/LC_MESSAGES/django.po | 113 + .../livesettings/locale/he/LC_MESSAGES/django.mo | Bin 0 -> 1655 bytes .../livesettings/locale/he/LC_MESSAGES/django.po | 98 + .../livesettings/locale/it/LC_MESSAGES/django.mo | Bin 0 -> 1582 bytes .../livesettings/locale/it/LC_MESSAGES/django.po | 106 + .../livesettings/locale/ko/LC_MESSAGES/django.mo | Bin 0 -> 1128 bytes .../livesettings/locale/ko/LC_MESSAGES/django.po | 100 + .../livesettings/locale/pl/LC_MESSAGES/django.mo | Bin 0 -> 1470 bytes .../livesettings/locale/pl/LC_MESSAGES/django.po | 97 + .../locale/pt_BR/LC_MESSAGES/django.mo | Bin 0 -> 1208 bytes .../locale/pt_BR/LC_MESSAGES/django.po | 100 + .../livesettings/locale/ru/LC_MESSAGES/django.mo | Bin 0 -> 1178 bytes .../livesettings/locale/ru/LC_MESSAGES/django.po | 85 + .../livesettings/locale/sv/LC_MESSAGES/django.mo | Bin 0 -> 1481 bytes .../livesettings/locale/sv/LC_MESSAGES/django.po | 92 + .../livesettings/locale/tr/LC_MESSAGES/django.mo | Bin 0 -> 1242 bytes .../livesettings/locale/tr/LC_MESSAGES/django.po | 102 + askbot/deps/livesettings/models.py | 170 + askbot/deps/livesettings/overrides.py | 55 + askbot/deps/livesettings/signals.py | 3 + .../templates/livesettings/_admin_site_views.html | 15 + .../templates/livesettings/group_settings.html | 81 + .../templates/livesettings/site_settings.html | 101 + .../livesettings/templates/livesettings/text.txt | 1 + askbot/deps/livesettings/templatetags/__init__.py | 0 .../deps/livesettings/templatetags/config_tags.py | 91 + askbot/deps/livesettings/tests.py | 545 +++ askbot/deps/livesettings/urls.py | 7 + askbot/deps/livesettings/utils.py | 87 + askbot/deps/livesettings/values.py | 628 +++ askbot/deps/livesettings/views.py | 93 + askbot/doc/HOW_TO_DEBUG | 39 + askbot/doc/INSTALL | 291 ++ askbot/doc/INSTALL.pip | 31 + askbot/doc/INSTALL.webfaction | 345 ++ askbot/doc/ROADMAP.rst | 88 + askbot/doc/TODO.rst | 70 + askbot/doc/UPGRADE | 24 + askbot/doc/WISH_LIST | 55 + askbot/doc/askbot-requirements.txt | 9 + askbot/doc/scratch | 12 + askbot/feed.py | 63 + askbot/forms.py | 466 ++ askbot/importers/__init__.py | 0 askbot/importers/stackexchange/ANOMALIES | 14 + askbot/importers/stackexchange/README | 62 + askbot/importers/stackexchange/__init__.py | 0 .../importers/stackexchange/management/__init__.py | 0 .../stackexchange/management/commands/__init__.py | 0 .../management/commands/load_stackexchange.py | 799 ++++ askbot/importers/stackexchange/models.py | 266 ++ askbot/importers/stackexchange/parse_models.py | 225 + askbot/locale/de/LC_MESSAGES/django.mo | Bin 0 -> 80778 bytes askbot/locale/de/LC_MESSAGES/django.po | 4432 ++++++++++++++++++ askbot/locale/en/LC_MESSAGES/django.mo | Bin 0 -> 24140 bytes askbot/locale/en/LC_MESSAGES/django.po | 4803 ++++++++++++++++++++ askbot/locale/es/LC_MESSAGES/django.mo | Bin 0 -> 43243 bytes askbot/locale/es/LC_MESSAGES/django.po | 4358 ++++++++++++++++++ askbot/locale/ru/LC_MESSAGES/django.mo | Bin 0 -> 88811 bytes askbot/locale/ru/LC_MESSAGES/django.po | 4651 +++++++++++++++++++ askbot/locale/sr/LC_MESSAGES/django.mo | Bin 0 -> 56072 bytes askbot/locale/sr/LC_MESSAGES/django.po | 4213 +++++++++++++++++ askbot/locale/tr/LC_MESSAGES/django.mo | Bin 0 -> 52875 bytes askbot/locale/tr/LC_MESSAGES/django.po | 4391 ++++++++++++++++++ askbot/locale/vi/LC_MESSAGES/django.mo | Bin 0 -> 25588 bytes askbot/locale/vi/LC_MESSAGES/django.po | 4134 +++++++++++++++++ askbot/locale/zh-cn/LC_MESSAGES/django.mo | Bin 0 -> 24271 bytes askbot/locale/zh-cn/LC_MESSAGES/django.po | 4531 ++++++++++++++++++ askbot/management/__init__.py | 0 askbot/management/commands/__init__.py | 0 askbot/management/commands/base_command.py | 25 + askbot/management/commands/clean_award_badges.py | 59 + askbot/management/commands/message_to_everyone.py | 12 + askbot/management/commands/multi_award_badges.py | 293 ++ askbot/management/commands/once_award_badges.py | 357 ++ askbot/management/commands/pg_base_command.py | 35 + .../management/commands/pg_clean_award_badges.py | 59 + .../management/commands/pg_multi_award_badges.py | 348 ++ askbot/management/commands/pg_once_award_badges.py | 350 ++ askbot/management/commands/sample_command.py | 7 + askbot/management/commands/send_email_alerts.py | 477 ++ askbot/management/commands/subscribe_everyone.py | 33 + askbot/middleware/__init__.py | 0 askbot/middleware/anon_user.py | 36 + askbot/middleware/cancel.py | 15 + askbot/middleware/pagesize.py | 39 + askbot/middleware/spaceless.py | 15 + askbot/middleware/view_log.py | 72 + askbot/migrations/0001_initial.py | 1550 +++++++ ...t__chg_field_answer_html__add_field_question.py | 700 +++ ...orm_text_record_to_posts_for_fulltext_search.py | 687 +++ .../0004_install_full_text_indexes_for_mysql.py | 720 +++ askbot/migrations/0005_install_badges.py | 751 +++ ...bscription_setting_for_comments_and_mentions.py | 719 +++ askbot/migrations/0007_install_mentions_model.py | 708 +++ .../migrations/0008_add_html_field_to_comments.py | 708 +++ .../0009_calculate_html_field_for_comments.py | 854 ++++ .../0010_add_receiving_user_to_activity_model.py | 366 ++ .../0011_merge_mentions_into_activity.py | 724 +++ .../migrations/0012_delete_some_unused_models.py | 755 +++ .../migrations/0013_add_response_count__to_user.py | 322 ++ .../0014_rename_schema_from_forum_to_askbot.py | 611 +++ .../0015_rename_forum_contenttypes_to_askbot.py | 310 ++ askbot/migrations/__init__.py | 0 askbot/models/__init__.py | 696 +++ askbot/models/answer.py | 232 + askbot/models/base.py | 211 + askbot/models/content.py | 245 + askbot/models/meta.py | 211 + askbot/models/question.py | 655 +++ askbot/models/repute.py | 131 + askbot/models/signals.py | 23 + askbot/models/tag.py | 90 + askbot/models/user.py | 340 ++ askbot/search/README | 5 + askbot/search/__init__.py | 0 askbot/search/indexer.py | 9 + askbot/search/sphinx/README | 4 + askbot/search/sphinx/sphinx.conf | 127 + askbot/search/state_manager.py | 156 + askbot/settings.py | 67 + askbot/sitemap.py | 14 + askbot/skins/README | 22 + askbot/skins/__init__.py | 0 askbot/skins/common/media/README | 1 + askbot/skins/common/media/js/closure/README.rst | 9 + .../skins/common/media/js/closure/setup-closure.sh | 12 + .../default/media/images/blue-up-arrow-h18px.png | Bin 0 -> 593 bytes askbot/skins/default/media/images/box-arrow.gif | Bin 0 -> 69 bytes askbot/skins/default/media/images/bullet_green.gif | Bin 0 -> 64 bytes askbot/skins/default/media/images/cc-88x31.png | Bin 0 -> 5460 bytes askbot/skins/default/media/images/cc-wiki.png | Bin 0 -> 2333 bytes .../default/media/images/close-small-dark.png | Bin 0 -> 226 bytes .../default/media/images/close-small-hover.png | Bin 0 -> 337 bytes askbot/skins/default/media/images/close-small.png | Bin 0 -> 293 bytes askbot/skins/default/media/images/dash.gif | Bin 0 -> 44 bytes .../default/media/images/djangomade124x25_grey.gif | Bin 0 -> 2035 bytes askbot/skins/default/media/images/dot-g.gif | Bin 0 -> 61 bytes askbot/skins/default/media/images/dot-list.gif | Bin 0 -> 56 bytes askbot/skins/default/media/images/edit.png | Bin 0 -> 758 bytes .../default/media/images/expander-arrow-hide.gif | Bin 0 -> 126 bytes .../default/media/images/expander-arrow-show.gif | Bin 0 -> 135 bytes askbot/skins/default/media/images/favicon.gif | Bin 0 -> 898 bytes .../skins/default/media/images/feed-icon-small.png | Bin 0 -> 689 bytes .../default/media/images/gray-up-arrow-h18px.png | Bin 0 -> 383 bytes askbot/skins/default/media/images/grippie.png | Bin 0 -> 162 bytes askbot/skins/default/media/images/indicator.gif | Bin 0 -> 2545 bytes askbot/skins/default/media/images/logo.gif | Bin 0 -> 2272 bytes askbot/skins/default/media/images/logo.png | Bin 0 -> 5841 bytes askbot/skins/default/media/images/logo1.png | Bin 0 -> 2752 bytes askbot/skins/default/media/images/logo2.png | Bin 0 -> 2124 bytes .../default/media/images/mail-envelope-empty.png | Bin 0 -> 547 bytes .../default/media/images/mail-envelope-full.png | Bin 0 -> 482 bytes askbot/skins/default/media/images/medala.gif | Bin 0 -> 801 bytes askbot/skins/default/media/images/medala_on.gif | Bin 0 -> 957 bytes askbot/skins/default/media/images/new.gif | Bin 0 -> 635 bytes askbot/skins/default/media/images/nophoto.png | Bin 0 -> 696 bytes askbot/skins/default/media/images/openid.gif | Bin 0 -> 910 bytes askbot/skins/default/media/images/openid/aol.gif | Bin 0 -> 2205 bytes .../skins/default/media/images/openid/blogger.ico | Bin 0 -> 3638 bytes .../skins/default/media/images/openid/claimid.ico | Bin 0 -> 3638 bytes .../skins/default/media/images/openid/facebook.gif | Bin 0 -> 2075 bytes .../skins/default/media/images/openid/flickr.ico | Bin 0 -> 1150 bytes .../skins/default/media/images/openid/google.gif | Bin 0 -> 1596 bytes .../default/media/images/openid/livejournal.ico | Bin 0 -> 5222 bytes .../skins/default/media/images/openid/myopenid.ico | Bin 0 -> 2862 bytes .../media/images/openid/openid-inputicon.gif | Bin 0 -> 237 bytes .../skins/default/media/images/openid/openid.gif | Bin 0 -> 740 bytes .../default/media/images/openid/technorati.ico | Bin 0 -> 2294 bytes .../skins/default/media/images/openid/twitter.png | Bin 0 -> 3130 bytes .../skins/default/media/images/openid/verisign.ico | Bin 0 -> 4710 bytes .../skins/default/media/images/openid/vidoop.ico | Bin 0 -> 1406 bytes .../default/media/images/openid/wordpress.ico | Bin 0 -> 1150 bytes askbot/skins/default/media/images/openid/yahoo.gif | Bin 0 -> 1510 bytes askbot/skins/default/media/images/quest-bg.gif | Bin 0 -> 294 bytes .../default/media/images/vote-accepted-on.png | Bin 0 -> 1124 bytes .../skins/default/media/images/vote-accepted.png | Bin 0 -> 1058 bytes .../default/media/images/vote-arrow-down-on.png | Bin 0 -> 905 bytes .../skins/default/media/images/vote-arrow-down.png | Bin 0 -> 876 bytes .../default/media/images/vote-arrow-up-on.png | Bin 0 -> 906 bytes .../skins/default/media/images/vote-arrow-up.png | Bin 0 -> 843 bytes .../default/media/images/vote-favorite-off.png | Bin 0 -> 930 bytes .../default/media/images/vote-favorite-on.png | Bin 0 -> 1023 bytes .../default/media/jquery-openid/images/aol.gif | Bin 0 -> 2205 bytes .../media/jquery-openid/images/blogger-1.png | Bin 0 -> 432 bytes .../default/media/jquery-openid/images/blogger.ico | Bin 0 -> 3638 bytes .../media/jquery-openid/images/claimid-0.png | Bin 0 -> 629 bytes .../default/media/jquery-openid/images/claimid.ico | Bin 0 -> 3638 bytes .../media/jquery-openid/images/facebook.gif | Bin 0 -> 2075 bytes .../default/media/jquery-openid/images/flickr.ico | Bin 0 -> 1150 bytes .../default/media/jquery-openid/images/flickr.png | Bin 0 -> 426 bytes .../default/media/jquery-openid/images/google.gif | Bin 0 -> 1596 bytes .../media/jquery-openid/images/livejournal-1.png | Bin 0 -> 713 bytes .../media/jquery-openid/images/livejournal.ico | Bin 0 -> 5222 bytes .../media/jquery-openid/images/myopenid-2.png | Bin 0 -> 511 bytes .../media/jquery-openid/images/myopenid.ico | Bin 0 -> 2862 bytes .../jquery-openid/images/openid-inputicon.gif | Bin 0 -> 237 bytes .../default/media/jquery-openid/images/openid.gif | Bin 0 -> 740 bytes .../media/jquery-openid/images/openidico.png | Bin 0 -> 654 bytes .../media/jquery-openid/images/openidico16.png | Bin 0 -> 554 bytes .../media/jquery-openid/images/technorati-1.png | Bin 0 -> 606 bytes .../media/jquery-openid/images/technorati.ico | Bin 0 -> 2294 bytes .../media/jquery-openid/images/verisign-2.png | Bin 0 -> 859 bytes .../media/jquery-openid/images/verisign.ico | Bin 0 -> 4710 bytes .../default/media/jquery-openid/images/vidoop.ico | Bin 0 -> 1406 bytes .../default/media/jquery-openid/images/vidoop.png | Bin 0 -> 499 bytes .../media/jquery-openid/images/wordpress.ico | Bin 0 -> 1150 bytes .../media/jquery-openid/images/wordpress.png | Bin 0 -> 566 bytes .../default/media/jquery-openid/images/yahoo.gif | Bin 0 -> 1682 bytes .../default/media/jquery-openid/jquery.openid.js | 111 + .../skins/default/media/jquery-openid/openid.css | 79 + askbot/skins/default/media/js/com.cnprog.admin.js | 13 + askbot/skins/default/media/js/com.cnprog.editor.js | 68 + askbot/skins/default/media/js/com.cnprog.i18n.js | 225 + askbot/skins/default/media/js/com.cnprog.post.js | 690 +++ .../default/media/js/com.cnprog.tag_selector.js | 171 + askbot/skins/default/media/js/com.cnprog.utils.js | 132 + askbot/skins/default/media/js/compress.bat | 5 + askbot/skins/default/media/js/excanvas.min.js | 1 + askbot/skins/default/media/js/flot-build.bat | 3 + askbot/skins/default/media/js/jquery-1.2.6.js | 3549 +++++++++++++++ askbot/skins/default/media/js/jquery-1.2.6.min.js | 32 + .../default/media/js/jquery.ajaxfileupload.js | 195 + askbot/skins/default/media/js/jquery.flot.js | 2119 +++++++++ askbot/skins/default/media/js/jquery.flot.min.js | 1 + askbot/skins/default/media/js/jquery.form.js | 654 +++ askbot/skins/default/media/js/jquery.i18n.js | 133 + askbot/skins/default/media/js/jquery.openid.js | 176 + .../skins/default/media/js/jquery.validate.pack.js | 15 + askbot/skins/default/media/js/se_hilite.js | 1 + askbot/skins/default/media/js/se_hilite_src.js | 273 ++ .../default/media/js/wmd/images/wmd-buttons.png | Bin 0 -> 7465 bytes askbot/skins/default/media/js/wmd/showdown-min.js | 1 + askbot/skins/default/media/js/wmd/showdown.js | 1309 ++++++ askbot/skins/default/media/js/wmd/wmd-min.js | 1 + askbot/skins/default/media/js/wmd/wmd-test.html | 158 + askbot/skins/default/media/js/wmd/wmd.css | 129 + askbot/skins/default/media/js/wmd/wmd.js | 2388 ++++++++++ .../skins/default/media/js/yuicompressor-2.4.2.jar | Bin 0 -> 851219 bytes askbot/skins/default/media/style/auth.css | 48 + askbot/skins/default/media/style/default.css | 1754 +++++++ .../default/media/style/jquery.autocomplete.css | 49 + askbot/skins/default/media/style/openid.css | 45 + askbot/skins/default/media/style/prettify.css | 27 + askbot/skins/default/media/style/style.css | 2660 +++++++++++ askbot/skins/default/templates/404.html | 49 + askbot/skins/default/templates/500.html | 35 + askbot/skins/default/templates/about.html | 18 + .../skins/default/templates/account_settings.html | 45 + askbot/skins/default/templates/answer_edit.html | 85 + .../skins/default/templates/answer_edit_tips.html | 55 + askbot/skins/default/templates/ask.html | 136 + askbot/skins/default/templates/ask_form.html | 66 + .../default/templates/authopenid/changeemail.html | 88 + .../default/templates/authopenid/changeopenid.html | 35 + .../default/templates/authopenid/changepw.html | 18 + .../default/templates/authopenid/complete.html | 130 + .../default/templates/authopenid/confirm_email.txt | 13 + .../skins/default/templates/authopenid/delete.html | 39 + .../templates/authopenid/email_validation.txt | 15 + .../authopenid/external_legacy_login_info.html | 15 + .../default/templates/authopenid/failure.html | 14 + .../skins/default/templates/authopenid/sendpw.html | 26 + .../default/templates/authopenid/sendpw_email.txt | 9 + .../default/templates/authopenid/settings.html | 43 + .../skins/default/templates/authopenid/signin.html | 206 + .../skins/default/templates/authopenid/signup.html | 32 + .../skins/default/templates/authopenid/yadis.xrdf | 14 + askbot/skins/default/templates/badge.html | 37 + askbot/skins/default/templates/badges.html | 77 + askbot/skins/default/templates/base.html | 109 + askbot/skins/default/templates/base_content.html | 79 + askbot/skins/default/templates/book.html | 152 + askbot/skins/default/templates/close.html | 36 + .../templates/edit_user_email_feeds_form.html | 4 + askbot/skins/default/templates/email_base.html | 26 + askbot/skins/default/templates/faq.html | 138 + .../default/templates/fbconnect/xd_receiver.html | 10 + askbot/skins/default/templates/feedback.html | 55 + askbot/skins/default/templates/feedback_email.txt | 19 + .../default/templates/feeds/rss_description.html | 1 + .../skins/default/templates/feeds/rss_title.html | 1 + askbot/skins/default/templates/footer.html | 48 + askbot/skins/default/templates/header.html | 53 + askbot/skins/default/templates/input_bar.html | 45 + .../default/templates/instant_notification.html | 46 + askbot/skins/default/templates/logout.html | 23 + askbot/skins/default/templates/notarobot.html | 15 + askbot/skins/default/templates/pagesize.html | 27 + askbot/skins/default/templates/paginator.html | 38 + .../default/templates/post_contributor_info.html | 51 + askbot/skins/default/templates/privacy.html | 17 + askbot/skins/default/templates/question.html | 502 ++ .../default/templates/question_counter_widget.html | 47 + askbot/skins/default/templates/question_edit.html | 131 + .../default/templates/question_edit_tips.html | 53 + askbot/skins/default/templates/question_list.html | 23 + askbot/skins/default/templates/question_retag.html | 106 + .../templates/question_summary_list_roll.html | 55 + askbot/skins/default/templates/questions.html | 269 ++ askbot/skins/default/templates/reopen.html | 37 + .../skins/default/templates/revisions_answer.html | 83 + .../default/templates/revisions_question.html | 83 + askbot/skins/default/templates/tag_selector.html | 43 + askbot/skins/default/templates/tags.html | 68 + askbot/skins/default/templates/user.html | 42 + askbot/skins/default/templates/user_edit.html | 98 + .../templates/user_email_subscriptions.html | 26 + askbot/skins/default/templates/user_favorites.html | 8 + askbot/skins/default/templates/user_footer.html | 4 + askbot/skins/default/templates/user_info.html | 106 + askbot/skins/default/templates/user_recent.html | 27 + .../skins/default/templates/user_reputation.html | 44 + askbot/skins/default/templates/user_responses.html | 41 + askbot/skins/default/templates/user_stats.html | 104 + askbot/skins/default/templates/user_tabs.html | 32 + askbot/skins/default/templates/user_votes.html | 32 + askbot/skins/default/templates/users.html | 73 + .../skins/default/templates/users_questions.html | 47 + askbot/skins/loaders.py | 59 + askbot/skins/utils.py | 29 + askbot/sql_scripts/091111_upgrade_evgeny.sql | 1 + askbot/sql_scripts/091208_upgrade_evgeny.sql | 1 + askbot/sql_scripts/091208_upgrade_evgeny_1.sql | 1 + askbot/sql_scripts/100108_upgrade_ef.sql | 4 + askbot/sql_scripts/badges.sql | 37 + askbot/sql_scripts/cnprog.xml | 1498 ++++++ askbot/sql_scripts/cnprog_new_install.sql | 811 ++++ .../sql_scripts/cnprog_new_install_2009_02_28.sql | 456 ++ .../sql_scripts/cnprog_new_install_2009_03_31.sql | 891 ++++ .../sql_scripts/cnprog_new_install_2009_04_07.sql | 24 + .../sql_scripts/cnprog_new_install_2009_04_09.sql | 904 ++++ askbot/sql_scripts/drop-all-tables.sh | 4 + askbot/sql_scripts/drop-auth.sql | 8 + askbot/sql_scripts/pg_fts_install.sql | 38 + askbot/sql_scripts/update_2009_01_13_001.sql | 62 + askbot/sql_scripts/update_2009_01_13_002.sql | 1 + askbot/sql_scripts/update_2009_01_18_001.sql | 62 + askbot/sql_scripts/update_2009_01_24.sql | 2 + askbot/sql_scripts/update_2009_01_25_001.sql | 2 + askbot/sql_scripts/update_2009_02_26_001.sql | 19 + askbot/sql_scripts/update_2009_04_10_001.sql | 3 + askbot/sql_scripts/update_2009_07_05_EF.sql | 3 + askbot/sql_scripts/update_2009_12_24_001.sql | 5 + askbot/sql_scripts/update_2009_12_27_001.sql | 3 + askbot/sql_scripts/update_2009_12_27_002.sql | 1 + askbot/sql_scripts/update_2010_02_22.sql | 1 + askbot/templatetags/__init__.py | 0 askbot/templatetags/extra_filters.py | 113 + askbot/templatetags/extra_tags.py | 564 +++ askbot/templatetags/smart_if.py | 401 ++ askbot/tests.py | 870 ++++ askbot/upfiles/README | 2 + askbot/urls.py | 203 + askbot/user_messages/__init__.py | 36 + askbot/user_messages/context_processors.py | 54 + askbot/utils/__init__.py | 0 askbot/utils/cache.py | 92 + askbot/utils/colors.py | 24 + askbot/utils/decorators.py | 24 + askbot/utils/diff.py | 66 + askbot/utils/email.py | 21 + askbot/utils/forms.py | 176 + askbot/utils/functions.py | 45 + askbot/utils/html.py | 51 + askbot/utils/lists.py | 90 + askbot/utils/markup.py | 112 + askbot/utils/time.py | 4 + askbot/views/README | 12 + askbot/views/__init__.py | 8 + askbot/views/commands.py | 338 ++ askbot/views/meta.py | 95 + askbot/views/readers.py | 446 ++ askbot/views/users.py | 978 ++++ askbot/views/writers.py | 378 ++ forum/LICENSE | 14 - forum/__init__.py | 14 - forum/admin.py | 74 - forum/auth.py | 550 --- forum/bin/dos2unix.sh | 12 - forum/bin/rmpyc | 1 - forum/conf/README | 5 - forum/conf/__init__.py | 16 - forum/conf/email.py | 69 - forum/conf/external_keys.py | 93 - forum/conf/flatpages.py | 37 - forum/conf/forum_data_rules.py | 62 - forum/conf/minimum_reputation.py | 148 - forum/conf/reputation_changes.py | 149 - forum/conf/settings_wrapper.py | 77 - forum/conf/site_settings.py | 94 - forum/conf/skin_counter_settings.py | 251 - forum/conf/skin_general_settings.py | 38 - forum/conf/user_settings.py | 30 - forum/conf/vote_rules.py | 69 - forum/const/__init__.py | 211 - forum/const/message_keys.py | 19 - forum/context.py | 34 - forum/cron/README | 5 - forum/cron/askbot_cron_job | 18 - forum/deps/README | 2 - forum/deps/__init__.py | 0 forum/deps/django_authopenid/README | 5 - forum/deps/django_authopenid/__init__.py | 40 - forum/deps/django_authopenid/admin.py | 9 - forum/deps/django_authopenid/forms.py | 322 -- forum/deps/django_authopenid/middleware.py | 28 - forum/deps/django_authopenid/mimeparse.py | 160 - forum/deps/django_authopenid/models.py | 80 - forum/deps/django_authopenid/urls.py | 62 - forum/deps/django_authopenid/util.py | 135 - forum/deps/django_authopenid/views.py | 1192 ----- forum/deps/grapefruit.py | 1973 -------- forum/deps/livesettings/README | 4 - forum/deps/livesettings/__init__.py | 16 - forum/deps/livesettings/forms.py | 38 - forum/deps/livesettings/functions.py | 247 - .../livesettings/locale/de/LC_MESSAGES/django.mo | Bin 706 -> 0 bytes .../livesettings/locale/de/LC_MESSAGES/django.po | 101 - .../livesettings/locale/en/LC_MESSAGES/django.mo | Bin 367 -> 0 bytes .../livesettings/locale/en/LC_MESSAGES/django.po | 100 - .../livesettings/locale/es/LC_MESSAGES/django.po | 0 .../livesettings/locale/fr/LC_MESSAGES/django.mo | Bin 1621 -> 0 bytes .../livesettings/locale/fr/LC_MESSAGES/django.po | 113 - .../livesettings/locale/he/LC_MESSAGES/django.mo | Bin 1655 -> 0 bytes .../livesettings/locale/he/LC_MESSAGES/django.po | 98 - .../livesettings/locale/it/LC_MESSAGES/django.mo | Bin 1582 -> 0 bytes .../livesettings/locale/it/LC_MESSAGES/django.po | 106 - .../livesettings/locale/ko/LC_MESSAGES/django.mo | Bin 1128 -> 0 bytes .../livesettings/locale/ko/LC_MESSAGES/django.po | 100 - .../livesettings/locale/pl/LC_MESSAGES/django.mo | Bin 1470 -> 0 bytes .../livesettings/locale/pl/LC_MESSAGES/django.po | 97 - .../locale/pt_BR/LC_MESSAGES/django.mo | Bin 1208 -> 0 bytes .../locale/pt_BR/LC_MESSAGES/django.po | 100 - .../livesettings/locale/ru/LC_MESSAGES/django.mo | Bin 1178 -> 0 bytes .../livesettings/locale/ru/LC_MESSAGES/django.po | 85 - .../livesettings/locale/sv/LC_MESSAGES/django.mo | Bin 1481 -> 0 bytes .../livesettings/locale/sv/LC_MESSAGES/django.po | 92 - .../livesettings/locale/tr/LC_MESSAGES/django.mo | Bin 1242 -> 0 bytes .../livesettings/locale/tr/LC_MESSAGES/django.po | 102 - forum/deps/livesettings/models.py | 170 - forum/deps/livesettings/overrides.py | 55 - forum/deps/livesettings/signals.py | 3 - .../templates/livesettings/_admin_site_views.html | 15 - .../templates/livesettings/group_settings.html | 81 - .../templates/livesettings/site_settings.html | 101 - .../livesettings/templates/livesettings/text.txt | 1 - forum/deps/livesettings/templatetags/__init__.py | 0 .../deps/livesettings/templatetags/config_tags.py | 91 - forum/deps/livesettings/tests.py | 545 --- forum/deps/livesettings/urls.py | 7 - forum/deps/livesettings/utils.py | 87 - forum/deps/livesettings/values.py | 628 --- forum/deps/livesettings/views.py | 93 - forum/doc/HOW_TO_DEBUG | 39 - forum/doc/INSTALL | 291 -- forum/doc/INSTALL.pip | 31 - forum/doc/INSTALL.webfaction | 345 -- forum/doc/ROADMAP.rst | 88 - forum/doc/TODO.rst | 70 - forum/doc/UPGRADE | 24 - forum/doc/WISH_LIST | 55 - forum/doc/askbot-requirements.txt | 9 - forum/doc/scratch | 12 - forum/feed.py | 63 - forum/forms.py | 466 -- forum/importers/__init__.py | 0 forum/importers/stackexchange/ANOMALIES | 14 - forum/importers/stackexchange/README | 62 - forum/importers/stackexchange/__init__.py | 0 .../importers/stackexchange/management/__init__.py | 0 .../stackexchange/management/commands/__init__.py | 0 .../management/commands/load_stackexchange.py | 799 ---- forum/importers/stackexchange/models.py | 266 -- forum/importers/stackexchange/parse_models.py | 225 - forum/locale/de/LC_MESSAGES/django.mo | Bin 80778 -> 0 bytes forum/locale/de/LC_MESSAGES/django.po | 4432 ------------------ forum/locale/en/LC_MESSAGES/django.mo | Bin 24140 -> 0 bytes forum/locale/en/LC_MESSAGES/django.po | 4803 -------------------- forum/locale/es/LC_MESSAGES/django.mo | Bin 43243 -> 0 bytes forum/locale/es/LC_MESSAGES/django.po | 4358 ------------------ forum/locale/ru/LC_MESSAGES/django.mo | Bin 88811 -> 0 bytes forum/locale/ru/LC_MESSAGES/django.po | 4651 ------------------- forum/locale/sr/LC_MESSAGES/django.mo | Bin 56072 -> 0 bytes forum/locale/sr/LC_MESSAGES/django.po | 4213 ----------------- forum/locale/tr/LC_MESSAGES/django.mo | Bin 52875 -> 0 bytes forum/locale/tr/LC_MESSAGES/django.po | 4391 ------------------ forum/locale/vi/LC_MESSAGES/django.mo | Bin 25588 -> 0 bytes forum/locale/vi/LC_MESSAGES/django.po | 4134 ----------------- forum/locale/zh-cn/LC_MESSAGES/django.mo | Bin 24271 -> 0 bytes forum/locale/zh-cn/LC_MESSAGES/django.po | 4531 ------------------ forum/management/__init__.py | 0 forum/management/commands/__init__.py | 0 forum/management/commands/base_command.py | 25 - forum/management/commands/clean_award_badges.py | 59 - forum/management/commands/message_to_everyone.py | 12 - forum/management/commands/multi_award_badges.py | 293 -- forum/management/commands/once_award_badges.py | 357 -- forum/management/commands/pg_base_command.py | 35 - forum/management/commands/pg_clean_award_badges.py | 59 - forum/management/commands/pg_multi_award_badges.py | 348 -- forum/management/commands/pg_once_award_badges.py | 350 -- forum/management/commands/sample_command.py | 7 - forum/management/commands/send_email_alerts.py | 477 -- forum/management/commands/subscribe_everyone.py | 33 - forum/middleware/__init__.py | 0 forum/middleware/anon_user.py | 36 - forum/middleware/cancel.py | 15 - forum/middleware/pagesize.py | 39 - forum/middleware/spaceless.py | 15 - forum/middleware/view_log.py | 72 - forum/migrations/0001_initial.py | 780 ---- ...t__chg_field_answer_html__add_field_question.py | 368 -- ...orm_text_record_to_posts_for_fulltext_search.py | 354 -- .../0004_install_full_text_indexes_for_mysql.py | 389 -- forum/migrations/0005_install_badges.py | 417 -- ...bscription_setting_for_comments_and_mentions.py | 383 -- forum/migrations/0007_install_mentions_model.py | 367 -- .../migrations/0008_add_html_field_to_comments.py | 365 -- .../0009_calculate_html_field_for_comments.py | 508 --- .../0010_add_receiving_user_to_activity_model.py | 366 -- .../0011_merge_mentions_into_activity.py | 376 -- forum/migrations/0012_delete_some_unused_models.py | 391 -- .../migrations/0013_add_response_count__to_user.py | 322 -- forum/migrations/__init__.py | 0 forum/models/__init__.py | 696 --- forum/models/answer.py | 232 - forum/models/base.py | 211 - forum/models/content.py | 245 - forum/models/meta.py | 211 - forum/models/question.py | 655 --- forum/models/repute.py | 131 - forum/models/signals.py | 23 - forum/models/tag.py | 90 - forum/models/user.py | 340 -- forum/search/README | 5 - forum/search/__init__.py | 0 forum/search/indexer.py | 9 - forum/search/sphinx/README | 4 - forum/search/sphinx/sphinx.conf | 127 - forum/search/state_manager.py | 156 - forum/settings.py | 67 - forum/sitemap.py | 14 - forum/skins/README | 22 - forum/skins/__init__.py | 0 forum/skins/common/media/README | 1 - forum/skins/common/media/js/closure/README.rst | 9 - .../skins/common/media/js/closure/setup-closure.sh | 12 - .../default/media/images/blue-up-arrow-h18px.png | Bin 593 -> 0 bytes forum/skins/default/media/images/box-arrow.gif | Bin 69 -> 0 bytes forum/skins/default/media/images/bullet_green.gif | Bin 64 -> 0 bytes forum/skins/default/media/images/cc-88x31.png | Bin 5460 -> 0 bytes forum/skins/default/media/images/cc-wiki.png | Bin 2333 -> 0 bytes .../default/media/images/close-small-dark.png | Bin 226 -> 0 bytes .../default/media/images/close-small-hover.png | Bin 337 -> 0 bytes forum/skins/default/media/images/close-small.png | Bin 293 -> 0 bytes forum/skins/default/media/images/dash.gif | Bin 44 -> 0 bytes .../default/media/images/djangomade124x25_grey.gif | Bin 2035 -> 0 bytes forum/skins/default/media/images/dot-g.gif | Bin 61 -> 0 bytes forum/skins/default/media/images/dot-list.gif | Bin 56 -> 0 bytes forum/skins/default/media/images/edit.png | Bin 758 -> 0 bytes .../default/media/images/expander-arrow-hide.gif | Bin 126 -> 0 bytes .../default/media/images/expander-arrow-show.gif | Bin 135 -> 0 bytes forum/skins/default/media/images/favicon.gif | Bin 898 -> 0 bytes .../skins/default/media/images/feed-icon-small.png | Bin 689 -> 0 bytes .../default/media/images/gray-up-arrow-h18px.png | Bin 383 -> 0 bytes forum/skins/default/media/images/grippie.png | Bin 162 -> 0 bytes forum/skins/default/media/images/indicator.gif | Bin 2545 -> 0 bytes forum/skins/default/media/images/logo.gif | Bin 2272 -> 0 bytes forum/skins/default/media/images/logo.png | Bin 5841 -> 0 bytes forum/skins/default/media/images/logo1.png | Bin 2752 -> 0 bytes forum/skins/default/media/images/logo2.png | Bin 2124 -> 0 bytes .../default/media/images/mail-envelope-empty.png | Bin 547 -> 0 bytes .../default/media/images/mail-envelope-full.png | Bin 482 -> 0 bytes forum/skins/default/media/images/medala.gif | Bin 801 -> 0 bytes forum/skins/default/media/images/medala_on.gif | Bin 957 -> 0 bytes forum/skins/default/media/images/new.gif | Bin 635 -> 0 bytes forum/skins/default/media/images/nophoto.png | Bin 696 -> 0 bytes forum/skins/default/media/images/openid.gif | Bin 910 -> 0 bytes forum/skins/default/media/images/openid/aol.gif | Bin 2205 -> 0 bytes .../skins/default/media/images/openid/blogger.ico | Bin 3638 -> 0 bytes .../skins/default/media/images/openid/claimid.ico | Bin 3638 -> 0 bytes .../skins/default/media/images/openid/facebook.gif | Bin 2075 -> 0 bytes forum/skins/default/media/images/openid/flickr.ico | Bin 1150 -> 0 bytes forum/skins/default/media/images/openid/google.gif | Bin 1596 -> 0 bytes .../default/media/images/openid/livejournal.ico | Bin 5222 -> 0 bytes .../skins/default/media/images/openid/myopenid.ico | Bin 2862 -> 0 bytes .../media/images/openid/openid-inputicon.gif | Bin 237 -> 0 bytes forum/skins/default/media/images/openid/openid.gif | Bin 740 -> 0 bytes .../default/media/images/openid/technorati.ico | Bin 2294 -> 0 bytes .../skins/default/media/images/openid/twitter.png | Bin 3130 -> 0 bytes .../skins/default/media/images/openid/verisign.ico | Bin 4710 -> 0 bytes forum/skins/default/media/images/openid/vidoop.ico | Bin 1406 -> 0 bytes .../default/media/images/openid/wordpress.ico | Bin 1150 -> 0 bytes forum/skins/default/media/images/openid/yahoo.gif | Bin 1510 -> 0 bytes forum/skins/default/media/images/quest-bg.gif | Bin 294 -> 0 bytes .../default/media/images/vote-accepted-on.png | Bin 1124 -> 0 bytes forum/skins/default/media/images/vote-accepted.png | Bin 1058 -> 0 bytes .../default/media/images/vote-arrow-down-on.png | Bin 905 -> 0 bytes .../skins/default/media/images/vote-arrow-down.png | Bin 876 -> 0 bytes .../default/media/images/vote-arrow-up-on.png | Bin 906 -> 0 bytes forum/skins/default/media/images/vote-arrow-up.png | Bin 843 -> 0 bytes .../default/media/images/vote-favorite-off.png | Bin 930 -> 0 bytes .../default/media/images/vote-favorite-on.png | Bin 1023 -> 0 bytes .../default/media/jquery-openid/images/aol.gif | Bin 2205 -> 0 bytes .../media/jquery-openid/images/blogger-1.png | Bin 432 -> 0 bytes .../default/media/jquery-openid/images/blogger.ico | Bin 3638 -> 0 bytes .../media/jquery-openid/images/claimid-0.png | Bin 629 -> 0 bytes .../default/media/jquery-openid/images/claimid.ico | Bin 3638 -> 0 bytes .../media/jquery-openid/images/facebook.gif | Bin 2075 -> 0 bytes .../default/media/jquery-openid/images/flickr.ico | Bin 1150 -> 0 bytes .../default/media/jquery-openid/images/flickr.png | Bin 426 -> 0 bytes .../default/media/jquery-openid/images/google.gif | Bin 1596 -> 0 bytes .../media/jquery-openid/images/livejournal-1.png | Bin 713 -> 0 bytes .../media/jquery-openid/images/livejournal.ico | Bin 5222 -> 0 bytes .../media/jquery-openid/images/myopenid-2.png | Bin 511 -> 0 bytes .../media/jquery-openid/images/myopenid.ico | Bin 2862 -> 0 bytes .../jquery-openid/images/openid-inputicon.gif | Bin 237 -> 0 bytes .../default/media/jquery-openid/images/openid.gif | Bin 740 -> 0 bytes .../media/jquery-openid/images/openidico.png | Bin 654 -> 0 bytes .../media/jquery-openid/images/openidico16.png | Bin 554 -> 0 bytes .../media/jquery-openid/images/technorati-1.png | Bin 606 -> 0 bytes .../media/jquery-openid/images/technorati.ico | Bin 2294 -> 0 bytes .../media/jquery-openid/images/verisign-2.png | Bin 859 -> 0 bytes .../media/jquery-openid/images/verisign.ico | Bin 4710 -> 0 bytes .../default/media/jquery-openid/images/vidoop.ico | Bin 1406 -> 0 bytes .../default/media/jquery-openid/images/vidoop.png | Bin 499 -> 0 bytes .../media/jquery-openid/images/wordpress.ico | Bin 1150 -> 0 bytes .../media/jquery-openid/images/wordpress.png | Bin 566 -> 0 bytes .../default/media/jquery-openid/images/yahoo.gif | Bin 1682 -> 0 bytes .../default/media/jquery-openid/jquery.openid.js | 111 - forum/skins/default/media/jquery-openid/openid.css | 79 - forum/skins/default/media/js/com.cnprog.admin.js | 13 - forum/skins/default/media/js/com.cnprog.editor.js | 68 - forum/skins/default/media/js/com.cnprog.i18n.js | 225 - forum/skins/default/media/js/com.cnprog.post.js | 690 --- .../default/media/js/com.cnprog.tag_selector.js | 171 - forum/skins/default/media/js/com.cnprog.utils.js | 132 - forum/skins/default/media/js/compress.bat | 5 - forum/skins/default/media/js/excanvas.min.js | 1 - forum/skins/default/media/js/flot-build.bat | 3 - forum/skins/default/media/js/jquery-1.2.6.js | 3549 --------------- forum/skins/default/media/js/jquery-1.2.6.min.js | 32 - .../default/media/js/jquery.ajaxfileupload.js | 195 - forum/skins/default/media/js/jquery.flot.js | 2119 --------- forum/skins/default/media/js/jquery.flot.min.js | 1 - forum/skins/default/media/js/jquery.form.js | 654 --- forum/skins/default/media/js/jquery.i18n.js | 133 - forum/skins/default/media/js/jquery.openid.js | 176 - .../skins/default/media/js/jquery.validate.pack.js | 15 - forum/skins/default/media/js/se_hilite.js | 1 - forum/skins/default/media/js/se_hilite_src.js | 273 -- .../default/media/js/wmd/images/wmd-buttons.png | Bin 7465 -> 0 bytes forum/skins/default/media/js/wmd/showdown-min.js | 1 - forum/skins/default/media/js/wmd/showdown.js | 1309 ------ forum/skins/default/media/js/wmd/wmd-min.js | 1 - forum/skins/default/media/js/wmd/wmd-test.html | 158 - forum/skins/default/media/js/wmd/wmd.css | 129 - forum/skins/default/media/js/wmd/wmd.js | 2388 ---------- .../skins/default/media/js/yuicompressor-2.4.2.jar | Bin 851219 -> 0 bytes forum/skins/default/media/style/auth.css | 48 - forum/skins/default/media/style/default.css | 1754 ------- .../default/media/style/jquery.autocomplete.css | 49 - forum/skins/default/media/style/openid.css | 45 - forum/skins/default/media/style/prettify.css | 27 - forum/skins/default/media/style/style.css | 2660 ----------- forum/skins/default/templates/404.html | 49 - forum/skins/default/templates/500.html | 35 - forum/skins/default/templates/about.html | 18 - .../skins/default/templates/account_settings.html | 45 - forum/skins/default/templates/answer_edit.html | 85 - .../skins/default/templates/answer_edit_tips.html | 55 - forum/skins/default/templates/ask.html | 136 - forum/skins/default/templates/ask_form.html | 66 - .../default/templates/authopenid/changeemail.html | 88 - .../default/templates/authopenid/changeopenid.html | 35 - .../default/templates/authopenid/changepw.html | 18 - .../default/templates/authopenid/complete.html | 130 - .../default/templates/authopenid/confirm_email.txt | 13 - .../skins/default/templates/authopenid/delete.html | 39 - .../templates/authopenid/email_validation.txt | 15 - .../authopenid/external_legacy_login_info.html | 15 - .../default/templates/authopenid/failure.html | 14 - .../skins/default/templates/authopenid/sendpw.html | 26 - .../default/templates/authopenid/sendpw_email.txt | 9 - .../default/templates/authopenid/settings.html | 43 - .../skins/default/templates/authopenid/signin.html | 206 - .../skins/default/templates/authopenid/signup.html | 32 - .../skins/default/templates/authopenid/yadis.xrdf | 14 - forum/skins/default/templates/badge.html | 37 - forum/skins/default/templates/badges.html | 77 - forum/skins/default/templates/base.html | 109 - forum/skins/default/templates/base_content.html | 79 - forum/skins/default/templates/book.html | 152 - forum/skins/default/templates/close.html | 36 - .../templates/edit_user_email_feeds_form.html | 4 - forum/skins/default/templates/email_base.html | 26 - forum/skins/default/templates/faq.html | 138 - .../default/templates/fbconnect/xd_receiver.html | 10 - forum/skins/default/templates/feedback.html | 55 - forum/skins/default/templates/feedback_email.txt | 19 - .../default/templates/feeds/rss_description.html | 1 - forum/skins/default/templates/feeds/rss_title.html | 1 - forum/skins/default/templates/footer.html | 48 - forum/skins/default/templates/header.html | 53 - forum/skins/default/templates/input_bar.html | 45 - .../default/templates/instant_notification.html | 46 - forum/skins/default/templates/logout.html | 23 - forum/skins/default/templates/notarobot.html | 15 - forum/skins/default/templates/pagesize.html | 27 - forum/skins/default/templates/paginator.html | 38 - .../default/templates/post_contributor_info.html | 51 - forum/skins/default/templates/privacy.html | 17 - forum/skins/default/templates/question.html | 502 -- .../default/templates/question_counter_widget.html | 47 - forum/skins/default/templates/question_edit.html | 131 - .../default/templates/question_edit_tips.html | 53 - forum/skins/default/templates/question_list.html | 23 - forum/skins/default/templates/question_retag.html | 106 - .../templates/question_summary_list_roll.html | 55 - forum/skins/default/templates/questions.html | 269 -- forum/skins/default/templates/reopen.html | 37 - .../skins/default/templates/revisions_answer.html | 83 - .../default/templates/revisions_question.html | 83 - forum/skins/default/templates/tag_selector.html | 43 - forum/skins/default/templates/tags.html | 68 - forum/skins/default/templates/user.html | 42 - forum/skins/default/templates/user_edit.html | 98 - .../templates/user_email_subscriptions.html | 26 - forum/skins/default/templates/user_favorites.html | 8 - forum/skins/default/templates/user_footer.html | 4 - forum/skins/default/templates/user_info.html | 106 - forum/skins/default/templates/user_recent.html | 27 - forum/skins/default/templates/user_reputation.html | 44 - forum/skins/default/templates/user_responses.html | 41 - forum/skins/default/templates/user_stats.html | 104 - forum/skins/default/templates/user_tabs.html | 32 - forum/skins/default/templates/user_votes.html | 32 - forum/skins/default/templates/users.html | 73 - forum/skins/default/templates/users_questions.html | 47 - forum/skins/loaders.py | 59 - forum/skins/utils.py | 29 - forum/sql_scripts/091111_upgrade_evgeny.sql | 1 - forum/sql_scripts/091208_upgrade_evgeny.sql | 1 - forum/sql_scripts/091208_upgrade_evgeny_1.sql | 1 - forum/sql_scripts/100108_upgrade_ef.sql | 4 - forum/sql_scripts/badges.sql | 37 - forum/sql_scripts/cnprog.xml | 1498 ------ forum/sql_scripts/cnprog_new_install.sql | 811 ---- .../sql_scripts/cnprog_new_install_2009_02_28.sql | 456 -- .../sql_scripts/cnprog_new_install_2009_03_31.sql | 891 ---- .../sql_scripts/cnprog_new_install_2009_04_07.sql | 24 - .../sql_scripts/cnprog_new_install_2009_04_09.sql | 904 ---- forum/sql_scripts/drop-all-tables.sh | 4 - forum/sql_scripts/drop-auth.sql | 8 - forum/sql_scripts/pg_fts_install.sql | 38 - forum/sql_scripts/update_2009_01_13_001.sql | 62 - forum/sql_scripts/update_2009_01_13_002.sql | 1 - forum/sql_scripts/update_2009_01_18_001.sql | 62 - forum/sql_scripts/update_2009_01_24.sql | 2 - forum/sql_scripts/update_2009_01_25_001.sql | 2 - forum/sql_scripts/update_2009_02_26_001.sql | 19 - forum/sql_scripts/update_2009_04_10_001.sql | 3 - forum/sql_scripts/update_2009_07_05_EF.sql | 3 - forum/sql_scripts/update_2009_12_24_001.sql | 5 - forum/sql_scripts/update_2009_12_27_001.sql | 3 - forum/sql_scripts/update_2009_12_27_002.sql | 1 - forum/sql_scripts/update_2010_02_22.sql | 1 - forum/templatetags/__init__.py | 0 forum/templatetags/extra_filters.py | 113 - forum/templatetags/extra_tags.py | 564 --- forum/templatetags/smart_if.py | 401 -- forum/tests.py | 870 ---- forum/upfiles/README | 2 - forum/urls.py | 203 - forum/user_messages/__init__.py | 36 - forum/user_messages/context_processors.py | 54 - forum/utils/__init__.py | 0 forum/utils/cache.py | 92 - forum/utils/colors.py | 24 - forum/utils/decorators.py | 24 - forum/utils/diff.py | 66 - forum/utils/email.py | 21 - forum/utils/forms.py | 176 - forum/utils/functions.py | 45 - forum/utils/html.py | 51 - forum/utils/lists.py | 90 - forum/utils/markup.py | 112 - forum/utils/time.py | 4 - forum/views/README | 12 - forum/views/__init__.py | 8 - forum/views/commands.py | 338 -- forum/views/meta.py | 95 - forum/views/readers.py | 446 -- forum/views/users.py | 978 ---- forum/views/writers.py | 378 -- settings.py | 36 +- urls.py | 2 +- 847 files changed, 95570 insertions(+), 90471 deletions(-) create mode 100644 askbot/LICENSE create mode 100644 askbot/__init__.py create mode 100644 askbot/admin.py create mode 100644 askbot/auth.py create mode 100644 askbot/bin/dos2unix.sh create mode 100755 askbot/bin/rmpyc create mode 100644 askbot/conf/README create mode 100644 askbot/conf/__init__.py create mode 100644 askbot/conf/email.py create mode 100644 askbot/conf/external_keys.py create mode 100644 askbot/conf/flatpages.py create mode 100644 askbot/conf/forum_data_rules.py create mode 100644 askbot/conf/minimum_reputation.py create mode 100644 askbot/conf/reputation_changes.py create mode 100644 askbot/conf/settings_wrapper.py create mode 100644 askbot/conf/site_settings.py create mode 100644 askbot/conf/skin_counter_settings.py create mode 100644 askbot/conf/skin_general_settings.py create mode 100644 askbot/conf/user_settings.py create mode 100644 askbot/conf/vote_rules.py create mode 100644 askbot/const/__init__.py create mode 100644 askbot/const/message_keys.py create mode 100644 askbot/context.py create mode 100644 askbot/cron/README create mode 100644 askbot/cron/askbot_cron_job create mode 100644 askbot/deps/README create mode 100644 askbot/deps/__init__.py create mode 100644 askbot/deps/django_authopenid/README create mode 100644 askbot/deps/django_authopenid/__init__.py create mode 100644 askbot/deps/django_authopenid/admin.py create mode 100644 askbot/deps/django_authopenid/forms.py create mode 100644 askbot/deps/django_authopenid/middleware.py create mode 100644 askbot/deps/django_authopenid/mimeparse.py create mode 100644 askbot/deps/django_authopenid/models.py create mode 100644 askbot/deps/django_authopenid/urls.py create mode 100644 askbot/deps/django_authopenid/util.py create mode 100644 askbot/deps/django_authopenid/views.py create mode 100644 askbot/deps/grapefruit.py create mode 100644 askbot/deps/livesettings/README create mode 100644 askbot/deps/livesettings/__init__.py create mode 100644 askbot/deps/livesettings/forms.py create mode 100644 askbot/deps/livesettings/functions.py create mode 100644 askbot/deps/livesettings/locale/de/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/de/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/en/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/en/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/es/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/fr/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/fr/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/he/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/he/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/it/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/it/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/ko/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/ko/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/pl/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/pl/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/ru/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/ru/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/sv/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/sv/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/locale/tr/LC_MESSAGES/django.mo create mode 100644 askbot/deps/livesettings/locale/tr/LC_MESSAGES/django.po create mode 100644 askbot/deps/livesettings/models.py create mode 100644 askbot/deps/livesettings/overrides.py create mode 100644 askbot/deps/livesettings/signals.py create mode 100644 askbot/deps/livesettings/templates/livesettings/_admin_site_views.html create mode 100644 askbot/deps/livesettings/templates/livesettings/group_settings.html create mode 100644 askbot/deps/livesettings/templates/livesettings/site_settings.html create mode 100644 askbot/deps/livesettings/templates/livesettings/text.txt create mode 100644 askbot/deps/livesettings/templatetags/__init__.py create mode 100644 askbot/deps/livesettings/templatetags/config_tags.py create mode 100644 askbot/deps/livesettings/tests.py create mode 100644 askbot/deps/livesettings/urls.py create mode 100644 askbot/deps/livesettings/utils.py create mode 100644 askbot/deps/livesettings/values.py create mode 100644 askbot/deps/livesettings/views.py create mode 100644 askbot/doc/HOW_TO_DEBUG create mode 100644 askbot/doc/INSTALL create mode 100644 askbot/doc/INSTALL.pip create mode 100644 askbot/doc/INSTALL.webfaction create mode 100644 askbot/doc/ROADMAP.rst create mode 100644 askbot/doc/TODO.rst create mode 100644 askbot/doc/UPGRADE create mode 100644 askbot/doc/WISH_LIST create mode 100644 askbot/doc/askbot-requirements.txt create mode 100644 askbot/doc/scratch create mode 100644 askbot/feed.py create mode 100644 askbot/forms.py create mode 100644 askbot/importers/__init__.py create mode 100644 askbot/importers/stackexchange/ANOMALIES create mode 100644 askbot/importers/stackexchange/README create mode 100644 askbot/importers/stackexchange/__init__.py create mode 100644 askbot/importers/stackexchange/management/__init__.py create mode 100644 askbot/importers/stackexchange/management/commands/__init__.py create mode 100644 askbot/importers/stackexchange/management/commands/load_stackexchange.py create mode 100644 askbot/importers/stackexchange/models.py create mode 100644 askbot/importers/stackexchange/parse_models.py create mode 100644 askbot/locale/de/LC_MESSAGES/django.mo create mode 100644 askbot/locale/de/LC_MESSAGES/django.po create mode 100644 askbot/locale/en/LC_MESSAGES/django.mo create mode 100644 askbot/locale/en/LC_MESSAGES/django.po create mode 100644 askbot/locale/es/LC_MESSAGES/django.mo create mode 100644 askbot/locale/es/LC_MESSAGES/django.po create mode 100644 askbot/locale/ru/LC_MESSAGES/django.mo create mode 100644 askbot/locale/ru/LC_MESSAGES/django.po create mode 100644 askbot/locale/sr/LC_MESSAGES/django.mo create mode 100644 askbot/locale/sr/LC_MESSAGES/django.po create mode 100644 askbot/locale/tr/LC_MESSAGES/django.mo create mode 100644 askbot/locale/tr/LC_MESSAGES/django.po create mode 100644 askbot/locale/vi/LC_MESSAGES/django.mo create mode 100644 askbot/locale/vi/LC_MESSAGES/django.po create mode 100644 askbot/locale/zh-cn/LC_MESSAGES/django.mo create mode 100644 askbot/locale/zh-cn/LC_MESSAGES/django.po create mode 100644 askbot/management/__init__.py create mode 100644 askbot/management/commands/__init__.py create mode 100644 askbot/management/commands/base_command.py create mode 100644 askbot/management/commands/clean_award_badges.py create mode 100644 askbot/management/commands/message_to_everyone.py create mode 100644 askbot/management/commands/multi_award_badges.py create mode 100644 askbot/management/commands/once_award_badges.py create mode 100644 askbot/management/commands/pg_base_command.py create mode 100644 askbot/management/commands/pg_clean_award_badges.py create mode 100644 askbot/management/commands/pg_multi_award_badges.py create mode 100644 askbot/management/commands/pg_once_award_badges.py create mode 100644 askbot/management/commands/sample_command.py create mode 100644 askbot/management/commands/send_email_alerts.py create mode 100644 askbot/management/commands/subscribe_everyone.py create mode 100644 askbot/middleware/__init__.py create mode 100644 askbot/middleware/anon_user.py create mode 100644 askbot/middleware/cancel.py create mode 100644 askbot/middleware/pagesize.py create mode 100644 askbot/middleware/spaceless.py create mode 100644 askbot/middleware/view_log.py create mode 100644 askbot/migrations/0001_initial.py create mode 100644 askbot/migrations/0002_auto__add_field_answer_text__chg_field_answer_html__add_field_question.py create mode 100644 askbot/migrations/0003_copy_denorm_text_record_to_posts_for_fulltext_search.py create mode 100644 askbot/migrations/0004_install_full_text_indexes_for_mysql.py create mode 100644 askbot/migrations/0005_install_badges.py create mode 100644 askbot/migrations/0006_add_subscription_setting_for_comments_and_mentions.py create mode 100644 askbot/migrations/0007_install_mentions_model.py create mode 100644 askbot/migrations/0008_add_html_field_to_comments.py create mode 100644 askbot/migrations/0009_calculate_html_field_for_comments.py create mode 100644 askbot/migrations/0010_add_receiving_user_to_activity_model.py create mode 100644 askbot/migrations/0011_merge_mentions_into_activity.py create mode 100644 askbot/migrations/0012_delete_some_unused_models.py create mode 100644 askbot/migrations/0013_add_response_count__to_user.py create mode 100644 askbot/migrations/0014_rename_schema_from_forum_to_askbot.py create mode 100644 askbot/migrations/0015_rename_forum_contenttypes_to_askbot.py create mode 100644 askbot/migrations/__init__.py create mode 100644 askbot/models/__init__.py create mode 100644 askbot/models/answer.py create mode 100644 askbot/models/base.py create mode 100644 askbot/models/content.py create mode 100644 askbot/models/meta.py create mode 100644 askbot/models/question.py create mode 100644 askbot/models/repute.py create mode 100644 askbot/models/signals.py create mode 100644 askbot/models/tag.py create mode 100644 askbot/models/user.py create mode 100644 askbot/search/README create mode 100644 askbot/search/__init__.py create mode 100644 askbot/search/indexer.py create mode 100644 askbot/search/sphinx/README create mode 100644 askbot/search/sphinx/sphinx.conf create mode 100644 askbot/search/state_manager.py create mode 100644 askbot/settings.py create mode 100644 askbot/sitemap.py create mode 100755 askbot/skins/README create mode 100644 askbot/skins/__init__.py create mode 100755 askbot/skins/common/media/README create mode 100644 askbot/skins/common/media/js/closure/README.rst create mode 100644 askbot/skins/common/media/js/closure/setup-closure.sh create mode 100755 askbot/skins/default/media/images/blue-up-arrow-h18px.png create mode 100755 askbot/skins/default/media/images/box-arrow.gif create mode 100755 askbot/skins/default/media/images/bullet_green.gif create mode 100755 askbot/skins/default/media/images/cc-88x31.png create mode 100755 askbot/skins/default/media/images/cc-wiki.png create mode 100755 askbot/skins/default/media/images/close-small-dark.png create mode 100755 askbot/skins/default/media/images/close-small-hover.png create mode 100755 askbot/skins/default/media/images/close-small.png create mode 100755 askbot/skins/default/media/images/dash.gif create mode 100755 askbot/skins/default/media/images/djangomade124x25_grey.gif create mode 100755 askbot/skins/default/media/images/dot-g.gif create mode 100755 askbot/skins/default/media/images/dot-list.gif create mode 100755 askbot/skins/default/media/images/edit.png create mode 100755 askbot/skins/default/media/images/expander-arrow-hide.gif create mode 100755 askbot/skins/default/media/images/expander-arrow-show.gif create mode 100644 askbot/skins/default/media/images/favicon.gif create mode 100755 askbot/skins/default/media/images/feed-icon-small.png create mode 100755 askbot/skins/default/media/images/gray-up-arrow-h18px.png create mode 100755 askbot/skins/default/media/images/grippie.png create mode 100755 askbot/skins/default/media/images/indicator.gif create mode 100644 askbot/skins/default/media/images/logo.gif create mode 100644 askbot/skins/default/media/images/logo.png create mode 100755 askbot/skins/default/media/images/logo1.png create mode 100755 askbot/skins/default/media/images/logo2.png create mode 100644 askbot/skins/default/media/images/mail-envelope-empty.png create mode 100644 askbot/skins/default/media/images/mail-envelope-full.png create mode 100755 askbot/skins/default/media/images/medala.gif create mode 100755 askbot/skins/default/media/images/medala_on.gif create mode 100755 askbot/skins/default/media/images/new.gif create mode 100755 askbot/skins/default/media/images/nophoto.png create mode 100755 askbot/skins/default/media/images/openid.gif create mode 100755 askbot/skins/default/media/images/openid/aol.gif create mode 100755 askbot/skins/default/media/images/openid/blogger.ico create mode 100755 askbot/skins/default/media/images/openid/claimid.ico create mode 100755 askbot/skins/default/media/images/openid/facebook.gif create mode 100755 askbot/skins/default/media/images/openid/flickr.ico create mode 100755 askbot/skins/default/media/images/openid/google.gif create mode 100755 askbot/skins/default/media/images/openid/livejournal.ico create mode 100755 askbot/skins/default/media/images/openid/myopenid.ico create mode 100755 askbot/skins/default/media/images/openid/openid-inputicon.gif create mode 100755 askbot/skins/default/media/images/openid/openid.gif create mode 100755 askbot/skins/default/media/images/openid/technorati.ico create mode 100755 askbot/skins/default/media/images/openid/twitter.png create mode 100755 askbot/skins/default/media/images/openid/verisign.ico create mode 100755 askbot/skins/default/media/images/openid/vidoop.ico create mode 100755 askbot/skins/default/media/images/openid/wordpress.ico create mode 100755 askbot/skins/default/media/images/openid/yahoo.gif create mode 100755 askbot/skins/default/media/images/quest-bg.gif create mode 100755 askbot/skins/default/media/images/vote-accepted-on.png create mode 100755 askbot/skins/default/media/images/vote-accepted.png create mode 100755 askbot/skins/default/media/images/vote-arrow-down-on.png create mode 100755 askbot/skins/default/media/images/vote-arrow-down.png create mode 100755 askbot/skins/default/media/images/vote-arrow-up-on.png create mode 100755 askbot/skins/default/media/images/vote-arrow-up.png create mode 100755 askbot/skins/default/media/images/vote-favorite-off.png create mode 100755 askbot/skins/default/media/images/vote-favorite-on.png create mode 100755 askbot/skins/default/media/jquery-openid/images/aol.gif create mode 100755 askbot/skins/default/media/jquery-openid/images/blogger-1.png create mode 100755 askbot/skins/default/media/jquery-openid/images/blogger.ico create mode 100755 askbot/skins/default/media/jquery-openid/images/claimid-0.png create mode 100755 askbot/skins/default/media/jquery-openid/images/claimid.ico create mode 100755 askbot/skins/default/media/jquery-openid/images/facebook.gif create mode 100755 askbot/skins/default/media/jquery-openid/images/flickr.ico create mode 100755 askbot/skins/default/media/jquery-openid/images/flickr.png create mode 100755 askbot/skins/default/media/jquery-openid/images/google.gif create mode 100755 askbot/skins/default/media/jquery-openid/images/livejournal-1.png create mode 100755 askbot/skins/default/media/jquery-openid/images/livejournal.ico create mode 100755 askbot/skins/default/media/jquery-openid/images/myopenid-2.png create mode 100755 askbot/skins/default/media/jquery-openid/images/myopenid.ico create mode 100755 askbot/skins/default/media/jquery-openid/images/openid-inputicon.gif create mode 100755 askbot/skins/default/media/jquery-openid/images/openid.gif create mode 100755 askbot/skins/default/media/jquery-openid/images/openidico.png create mode 100755 askbot/skins/default/media/jquery-openid/images/openidico16.png create mode 100755 askbot/skins/default/media/jquery-openid/images/technorati-1.png create mode 100755 askbot/skins/default/media/jquery-openid/images/technorati.ico create mode 100755 askbot/skins/default/media/jquery-openid/images/verisign-2.png create mode 100755 askbot/skins/default/media/jquery-openid/images/verisign.ico create mode 100755 askbot/skins/default/media/jquery-openid/images/vidoop.ico create mode 100755 askbot/skins/default/media/jquery-openid/images/vidoop.png create mode 100755 askbot/skins/default/media/jquery-openid/images/wordpress.ico create mode 100755 askbot/skins/default/media/jquery-openid/images/wordpress.png create mode 100755 askbot/skins/default/media/jquery-openid/images/yahoo.gif create mode 100755 askbot/skins/default/media/jquery-openid/jquery.openid.js create mode 100755 askbot/skins/default/media/jquery-openid/openid.css create mode 100644 askbot/skins/default/media/js/com.cnprog.admin.js create mode 100644 askbot/skins/default/media/js/com.cnprog.editor.js create mode 100644 askbot/skins/default/media/js/com.cnprog.i18n.js create mode 100755 askbot/skins/default/media/js/com.cnprog.post.js create mode 100644 askbot/skins/default/media/js/com.cnprog.tag_selector.js create mode 100644 askbot/skins/default/media/js/com.cnprog.utils.js create mode 100755 askbot/skins/default/media/js/compress.bat create mode 100644 askbot/skins/default/media/js/excanvas.min.js create mode 100755 askbot/skins/default/media/js/flot-build.bat create mode 100644 askbot/skins/default/media/js/jquery-1.2.6.js create mode 100644 askbot/skins/default/media/js/jquery-1.2.6.min.js create mode 100644 askbot/skins/default/media/js/jquery.ajaxfileupload.js create mode 100644 askbot/skins/default/media/js/jquery.flot.js create mode 100644 askbot/skins/default/media/js/jquery.flot.min.js create mode 100644 askbot/skins/default/media/js/jquery.form.js create mode 100644 askbot/skins/default/media/js/jquery.i18n.js create mode 100644 askbot/skins/default/media/js/jquery.openid.js create mode 100644 askbot/skins/default/media/js/jquery.validate.pack.js create mode 100644 askbot/skins/default/media/js/se_hilite.js create mode 100644 askbot/skins/default/media/js/se_hilite_src.js create mode 100755 askbot/skins/default/media/js/wmd/images/wmd-buttons.png create mode 100755 askbot/skins/default/media/js/wmd/showdown-min.js create mode 100755 askbot/skins/default/media/js/wmd/showdown.js create mode 100755 askbot/skins/default/media/js/wmd/wmd-min.js create mode 100755 askbot/skins/default/media/js/wmd/wmd-test.html create mode 100755 askbot/skins/default/media/js/wmd/wmd.css create mode 100755 askbot/skins/default/media/js/wmd/wmd.js create mode 100755 askbot/skins/default/media/js/yuicompressor-2.4.2.jar create mode 100755 askbot/skins/default/media/style/auth.css create mode 100755 askbot/skins/default/media/style/default.css create mode 100755 askbot/skins/default/media/style/jquery.autocomplete.css create mode 100755 askbot/skins/default/media/style/openid.css create mode 100755 askbot/skins/default/media/style/prettify.css create mode 100755 askbot/skins/default/media/style/style.css create mode 100644 askbot/skins/default/templates/404.html create mode 100644 askbot/skins/default/templates/500.html create mode 100644 askbot/skins/default/templates/about.html create mode 100644 askbot/skins/default/templates/account_settings.html create mode 100644 askbot/skins/default/templates/answer_edit.html create mode 100644 askbot/skins/default/templates/answer_edit_tips.html create mode 100644 askbot/skins/default/templates/ask.html create mode 100644 askbot/skins/default/templates/ask_form.html create mode 100644 askbot/skins/default/templates/authopenid/changeemail.html create mode 100644 askbot/skins/default/templates/authopenid/changeopenid.html create mode 100644 askbot/skins/default/templates/authopenid/changepw.html create mode 100644 askbot/skins/default/templates/authopenid/complete.html create mode 100644 askbot/skins/default/templates/authopenid/confirm_email.txt create mode 100644 askbot/skins/default/templates/authopenid/delete.html create mode 100644 askbot/skins/default/templates/authopenid/email_validation.txt create mode 100644 askbot/skins/default/templates/authopenid/external_legacy_login_info.html create mode 100644 askbot/skins/default/templates/authopenid/failure.html create mode 100644 askbot/skins/default/templates/authopenid/sendpw.html create mode 100644 askbot/skins/default/templates/authopenid/sendpw_email.txt create mode 100644 askbot/skins/default/templates/authopenid/settings.html create mode 100755 askbot/skins/default/templates/authopenid/signin.html create mode 100644 askbot/skins/default/templates/authopenid/signup.html create mode 100644 askbot/skins/default/templates/authopenid/yadis.xrdf create mode 100644 askbot/skins/default/templates/badge.html create mode 100644 askbot/skins/default/templates/badges.html create mode 100644 askbot/skins/default/templates/base.html create mode 100644 askbot/skins/default/templates/base_content.html create mode 100644 askbot/skins/default/templates/book.html create mode 100644 askbot/skins/default/templates/close.html create mode 100644 askbot/skins/default/templates/edit_user_email_feeds_form.html create mode 100644 askbot/skins/default/templates/email_base.html create mode 100644 askbot/skins/default/templates/faq.html create mode 100755 askbot/skins/default/templates/fbconnect/xd_receiver.html create mode 100644 askbot/skins/default/templates/feedback.html create mode 100644 askbot/skins/default/templates/feedback_email.txt create mode 100755 askbot/skins/default/templates/feeds/rss_description.html create mode 100755 askbot/skins/default/templates/feeds/rss_title.html create mode 100644 askbot/skins/default/templates/footer.html create mode 100644 askbot/skins/default/templates/header.html create mode 100644 askbot/skins/default/templates/input_bar.html create mode 100644 askbot/skins/default/templates/instant_notification.html create mode 100644 askbot/skins/default/templates/logout.html create mode 100644 askbot/skins/default/templates/notarobot.html create mode 100644 askbot/skins/default/templates/pagesize.html create mode 100644 askbot/skins/default/templates/paginator.html create mode 100644 askbot/skins/default/templates/post_contributor_info.html create mode 100644 askbot/skins/default/templates/privacy.html create mode 100644 askbot/skins/default/templates/question.html create mode 100644 askbot/skins/default/templates/question_counter_widget.html create mode 100644 askbot/skins/default/templates/question_edit.html create mode 100644 askbot/skins/default/templates/question_edit_tips.html create mode 100644 askbot/skins/default/templates/question_list.html create mode 100644 askbot/skins/default/templates/question_retag.html create mode 100644 askbot/skins/default/templates/question_summary_list_roll.html create mode 100644 askbot/skins/default/templates/questions.html create mode 100644 askbot/skins/default/templates/reopen.html create mode 100644 askbot/skins/default/templates/revisions_answer.html create mode 100644 askbot/skins/default/templates/revisions_question.html create mode 100644 askbot/skins/default/templates/tag_selector.html create mode 100644 askbot/skins/default/templates/tags.html create mode 100644 askbot/skins/default/templates/user.html create mode 100644 askbot/skins/default/templates/user_edit.html create mode 100644 askbot/skins/default/templates/user_email_subscriptions.html create mode 100644 askbot/skins/default/templates/user_favorites.html create mode 100644 askbot/skins/default/templates/user_footer.html create mode 100644 askbot/skins/default/templates/user_info.html create mode 100644 askbot/skins/default/templates/user_recent.html create mode 100644 askbot/skins/default/templates/user_reputation.html create mode 100644 askbot/skins/default/templates/user_responses.html create mode 100644 askbot/skins/default/templates/user_stats.html create mode 100644 askbot/skins/default/templates/user_tabs.html create mode 100644 askbot/skins/default/templates/user_votes.html create mode 100644 askbot/skins/default/templates/users.html create mode 100644 askbot/skins/default/templates/users_questions.html create mode 100644 askbot/skins/loaders.py create mode 100644 askbot/skins/utils.py create mode 100644 askbot/sql_scripts/091111_upgrade_evgeny.sql create mode 100644 askbot/sql_scripts/091208_upgrade_evgeny.sql create mode 100644 askbot/sql_scripts/091208_upgrade_evgeny_1.sql create mode 100644 askbot/sql_scripts/100108_upgrade_ef.sql create mode 100644 askbot/sql_scripts/badges.sql create mode 100644 askbot/sql_scripts/cnprog.xml create mode 100644 askbot/sql_scripts/cnprog_new_install.sql create mode 100644 askbot/sql_scripts/cnprog_new_install_2009_02_28.sql create mode 100644 askbot/sql_scripts/cnprog_new_install_2009_03_31.sql create mode 100644 askbot/sql_scripts/cnprog_new_install_2009_04_07.sql create mode 100644 askbot/sql_scripts/cnprog_new_install_2009_04_09.sql create mode 100644 askbot/sql_scripts/drop-all-tables.sh create mode 100644 askbot/sql_scripts/drop-auth.sql create mode 100644 askbot/sql_scripts/pg_fts_install.sql create mode 100644 askbot/sql_scripts/update_2009_01_13_001.sql create mode 100644 askbot/sql_scripts/update_2009_01_13_002.sql create mode 100644 askbot/sql_scripts/update_2009_01_18_001.sql create mode 100644 askbot/sql_scripts/update_2009_01_24.sql create mode 100644 askbot/sql_scripts/update_2009_01_25_001.sql create mode 100644 askbot/sql_scripts/update_2009_02_26_001.sql create mode 100644 askbot/sql_scripts/update_2009_04_10_001.sql create mode 100644 askbot/sql_scripts/update_2009_07_05_EF.sql create mode 100644 askbot/sql_scripts/update_2009_12_24_001.sql create mode 100644 askbot/sql_scripts/update_2009_12_27_001.sql create mode 100644 askbot/sql_scripts/update_2009_12_27_002.sql create mode 100644 askbot/sql_scripts/update_2010_02_22.sql create mode 100644 askbot/templatetags/__init__.py create mode 100644 askbot/templatetags/extra_filters.py create mode 100644 askbot/templatetags/extra_tags.py create mode 100644 askbot/templatetags/smart_if.py create mode 100644 askbot/tests.py create mode 100755 askbot/upfiles/README create mode 100644 askbot/urls.py create mode 100644 askbot/user_messages/__init__.py create mode 100644 askbot/user_messages/context_processors.py create mode 100644 askbot/utils/__init__.py create mode 100644 askbot/utils/cache.py create mode 100644 askbot/utils/colors.py create mode 100644 askbot/utils/decorators.py create mode 100644 askbot/utils/diff.py create mode 100644 askbot/utils/email.py create mode 100644 askbot/utils/forms.py create mode 100644 askbot/utils/functions.py create mode 100644 askbot/utils/html.py create mode 100644 askbot/utils/lists.py create mode 100644 askbot/utils/markup.py create mode 100644 askbot/utils/time.py create mode 100755 askbot/views/README create mode 100644 askbot/views/__init__.py create mode 100644 askbot/views/commands.py create mode 100644 askbot/views/meta.py create mode 100644 askbot/views/readers.py create mode 100644 askbot/views/users.py create mode 100644 askbot/views/writers.py delete mode 100644 forum/LICENSE delete mode 100644 forum/__init__.py delete mode 100644 forum/admin.py delete mode 100644 forum/auth.py delete mode 100644 forum/bin/dos2unix.sh delete mode 100755 forum/bin/rmpyc delete mode 100644 forum/conf/README delete mode 100644 forum/conf/__init__.py delete mode 100644 forum/conf/email.py delete mode 100644 forum/conf/external_keys.py delete mode 100644 forum/conf/flatpages.py delete mode 100644 forum/conf/forum_data_rules.py delete mode 100644 forum/conf/minimum_reputation.py delete mode 100644 forum/conf/reputation_changes.py delete mode 100644 forum/conf/settings_wrapper.py delete mode 100644 forum/conf/site_settings.py delete mode 100644 forum/conf/skin_counter_settings.py delete mode 100644 forum/conf/skin_general_settings.py delete mode 100644 forum/conf/user_settings.py delete mode 100644 forum/conf/vote_rules.py delete mode 100644 forum/const/__init__.py delete mode 100644 forum/const/message_keys.py delete mode 100644 forum/context.py delete mode 100644 forum/cron/README delete mode 100644 forum/cron/askbot_cron_job delete mode 100644 forum/deps/README delete mode 100644 forum/deps/__init__.py delete mode 100644 forum/deps/django_authopenid/README delete mode 100644 forum/deps/django_authopenid/__init__.py delete mode 100644 forum/deps/django_authopenid/admin.py delete mode 100644 forum/deps/django_authopenid/forms.py delete mode 100644 forum/deps/django_authopenid/middleware.py delete mode 100644 forum/deps/django_authopenid/mimeparse.py delete mode 100644 forum/deps/django_authopenid/models.py delete mode 100644 forum/deps/django_authopenid/urls.py delete mode 100644 forum/deps/django_authopenid/util.py delete mode 100644 forum/deps/django_authopenid/views.py delete mode 100644 forum/deps/grapefruit.py delete mode 100644 forum/deps/livesettings/README delete mode 100644 forum/deps/livesettings/__init__.py delete mode 100644 forum/deps/livesettings/forms.py delete mode 100644 forum/deps/livesettings/functions.py delete mode 100644 forum/deps/livesettings/locale/de/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/de/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/en/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/en/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/es/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/fr/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/fr/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/he/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/he/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/it/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/it/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/ko/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/ko/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/pl/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/pl/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/ru/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/ru/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/sv/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/sv/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/locale/tr/LC_MESSAGES/django.mo delete mode 100644 forum/deps/livesettings/locale/tr/LC_MESSAGES/django.po delete mode 100644 forum/deps/livesettings/models.py delete mode 100644 forum/deps/livesettings/overrides.py delete mode 100644 forum/deps/livesettings/signals.py delete mode 100644 forum/deps/livesettings/templates/livesettings/_admin_site_views.html delete mode 100644 forum/deps/livesettings/templates/livesettings/group_settings.html delete mode 100644 forum/deps/livesettings/templates/livesettings/site_settings.html delete mode 100644 forum/deps/livesettings/templates/livesettings/text.txt delete mode 100644 forum/deps/livesettings/templatetags/__init__.py delete mode 100644 forum/deps/livesettings/templatetags/config_tags.py delete mode 100644 forum/deps/livesettings/tests.py delete mode 100644 forum/deps/livesettings/urls.py delete mode 100644 forum/deps/livesettings/utils.py delete mode 100644 forum/deps/livesettings/values.py delete mode 100644 forum/deps/livesettings/views.py delete mode 100644 forum/doc/HOW_TO_DEBUG delete mode 100644 forum/doc/INSTALL delete mode 100644 forum/doc/INSTALL.pip delete mode 100644 forum/doc/INSTALL.webfaction delete mode 100644 forum/doc/ROADMAP.rst delete mode 100644 forum/doc/TODO.rst delete mode 100644 forum/doc/UPGRADE delete mode 100644 forum/doc/WISH_LIST delete mode 100644 forum/doc/askbot-requirements.txt delete mode 100644 forum/doc/scratch delete mode 100644 forum/feed.py delete mode 100644 forum/forms.py delete mode 100644 forum/importers/__init__.py delete mode 100644 forum/importers/stackexchange/ANOMALIES delete mode 100644 forum/importers/stackexchange/README delete mode 100644 forum/importers/stackexchange/__init__.py delete mode 100644 forum/importers/stackexchange/management/__init__.py delete mode 100644 forum/importers/stackexchange/management/commands/__init__.py delete mode 100644 forum/importers/stackexchange/management/commands/load_stackexchange.py delete mode 100644 forum/importers/stackexchange/models.py delete mode 100644 forum/importers/stackexchange/parse_models.py delete mode 100644 forum/locale/de/LC_MESSAGES/django.mo delete mode 100644 forum/locale/de/LC_MESSAGES/django.po delete mode 100644 forum/locale/en/LC_MESSAGES/django.mo delete mode 100644 forum/locale/en/LC_MESSAGES/django.po delete mode 100644 forum/locale/es/LC_MESSAGES/django.mo delete mode 100644 forum/locale/es/LC_MESSAGES/django.po delete mode 100644 forum/locale/ru/LC_MESSAGES/django.mo delete mode 100644 forum/locale/ru/LC_MESSAGES/django.po delete mode 100644 forum/locale/sr/LC_MESSAGES/django.mo delete mode 100644 forum/locale/sr/LC_MESSAGES/django.po delete mode 100644 forum/locale/tr/LC_MESSAGES/django.mo delete mode 100644 forum/locale/tr/LC_MESSAGES/django.po delete mode 100644 forum/locale/vi/LC_MESSAGES/django.mo delete mode 100644 forum/locale/vi/LC_MESSAGES/django.po delete mode 100644 forum/locale/zh-cn/LC_MESSAGES/django.mo delete mode 100644 forum/locale/zh-cn/LC_MESSAGES/django.po delete mode 100644 forum/management/__init__.py delete mode 100644 forum/management/commands/__init__.py delete mode 100644 forum/management/commands/base_command.py delete mode 100644 forum/management/commands/clean_award_badges.py delete mode 100644 forum/management/commands/message_to_everyone.py delete mode 100644 forum/management/commands/multi_award_badges.py delete mode 100644 forum/management/commands/once_award_badges.py delete mode 100644 forum/management/commands/pg_base_command.py delete mode 100644 forum/management/commands/pg_clean_award_badges.py delete mode 100644 forum/management/commands/pg_multi_award_badges.py delete mode 100644 forum/management/commands/pg_once_award_badges.py delete mode 100644 forum/management/commands/sample_command.py delete mode 100644 forum/management/commands/send_email_alerts.py delete mode 100644 forum/management/commands/subscribe_everyone.py delete mode 100644 forum/middleware/__init__.py delete mode 100644 forum/middleware/anon_user.py delete mode 100644 forum/middleware/cancel.py delete mode 100644 forum/middleware/pagesize.py delete mode 100644 forum/middleware/spaceless.py delete mode 100644 forum/middleware/view_log.py delete mode 100644 forum/migrations/0001_initial.py delete mode 100644 forum/migrations/0002_auto__add_field_answer_text__chg_field_answer_html__add_field_question.py delete mode 100644 forum/migrations/0003_copy_denorm_text_record_to_posts_for_fulltext_search.py delete mode 100644 forum/migrations/0004_install_full_text_indexes_for_mysql.py delete mode 100644 forum/migrations/0005_install_badges.py delete mode 100644 forum/migrations/0006_add_subscription_setting_for_comments_and_mentions.py delete mode 100644 forum/migrations/0007_install_mentions_model.py delete mode 100644 forum/migrations/0008_add_html_field_to_comments.py delete mode 100644 forum/migrations/0009_calculate_html_field_for_comments.py delete mode 100644 forum/migrations/0010_add_receiving_user_to_activity_model.py delete mode 100644 forum/migrations/0011_merge_mentions_into_activity.py delete mode 100644 forum/migrations/0012_delete_some_unused_models.py delete mode 100644 forum/migrations/0013_add_response_count__to_user.py delete mode 100644 forum/migrations/__init__.py delete mode 100644 forum/models/__init__.py delete mode 100644 forum/models/answer.py delete mode 100644 forum/models/base.py delete mode 100644 forum/models/content.py delete mode 100644 forum/models/meta.py delete mode 100644 forum/models/question.py delete mode 100644 forum/models/repute.py delete mode 100644 forum/models/signals.py delete mode 100644 forum/models/tag.py delete mode 100644 forum/models/user.py delete mode 100644 forum/search/README delete mode 100644 forum/search/__init__.py delete mode 100644 forum/search/indexer.py delete mode 100644 forum/search/sphinx/README delete mode 100644 forum/search/sphinx/sphinx.conf delete mode 100644 forum/search/state_manager.py delete mode 100644 forum/settings.py delete mode 100644 forum/sitemap.py delete mode 100755 forum/skins/README delete mode 100644 forum/skins/__init__.py delete mode 100755 forum/skins/common/media/README delete mode 100644 forum/skins/common/media/js/closure/README.rst delete mode 100644 forum/skins/common/media/js/closure/setup-closure.sh delete mode 100755 forum/skins/default/media/images/blue-up-arrow-h18px.png delete mode 100755 forum/skins/default/media/images/box-arrow.gif delete mode 100755 forum/skins/default/media/images/bullet_green.gif delete mode 100755 forum/skins/default/media/images/cc-88x31.png delete mode 100755 forum/skins/default/media/images/cc-wiki.png delete mode 100755 forum/skins/default/media/images/close-small-dark.png delete mode 100755 forum/skins/default/media/images/close-small-hover.png delete mode 100755 forum/skins/default/media/images/close-small.png delete mode 100755 forum/skins/default/media/images/dash.gif delete mode 100755 forum/skins/default/media/images/djangomade124x25_grey.gif delete mode 100755 forum/skins/default/media/images/dot-g.gif delete mode 100755 forum/skins/default/media/images/dot-list.gif delete mode 100755 forum/skins/default/media/images/edit.png delete mode 100755 forum/skins/default/media/images/expander-arrow-hide.gif delete mode 100755 forum/skins/default/media/images/expander-arrow-show.gif delete mode 100644 forum/skins/default/media/images/favicon.gif delete mode 100755 forum/skins/default/media/images/feed-icon-small.png delete mode 100755 forum/skins/default/media/images/gray-up-arrow-h18px.png delete mode 100755 forum/skins/default/media/images/grippie.png delete mode 100755 forum/skins/default/media/images/indicator.gif delete mode 100644 forum/skins/default/media/images/logo.gif delete mode 100644 forum/skins/default/media/images/logo.png delete mode 100755 forum/skins/default/media/images/logo1.png delete mode 100755 forum/skins/default/media/images/logo2.png delete mode 100644 forum/skins/default/media/images/mail-envelope-empty.png delete mode 100644 forum/skins/default/media/images/mail-envelope-full.png delete mode 100755 forum/skins/default/media/images/medala.gif delete mode 100755 forum/skins/default/media/images/medala_on.gif delete mode 100755 forum/skins/default/media/images/new.gif delete mode 100755 forum/skins/default/media/images/nophoto.png delete mode 100755 forum/skins/default/media/images/openid.gif delete mode 100755 forum/skins/default/media/images/openid/aol.gif delete mode 100755 forum/skins/default/media/images/openid/blogger.ico delete mode 100755 forum/skins/default/media/images/openid/claimid.ico delete mode 100755 forum/skins/default/media/images/openid/facebook.gif delete mode 100755 forum/skins/default/media/images/openid/flickr.ico delete mode 100755 forum/skins/default/media/images/openid/google.gif delete mode 100755 forum/skins/default/media/images/openid/livejournal.ico delete mode 100755 forum/skins/default/media/images/openid/myopenid.ico delete mode 100755 forum/skins/default/media/images/openid/openid-inputicon.gif delete mode 100755 forum/skins/default/media/images/openid/openid.gif delete mode 100755 forum/skins/default/media/images/openid/technorati.ico delete mode 100755 forum/skins/default/media/images/openid/twitter.png delete mode 100755 forum/skins/default/media/images/openid/verisign.ico delete mode 100755 forum/skins/default/media/images/openid/vidoop.ico delete mode 100755 forum/skins/default/media/images/openid/wordpress.ico delete mode 100755 forum/skins/default/media/images/openid/yahoo.gif delete mode 100755 forum/skins/default/media/images/quest-bg.gif delete mode 100755 forum/skins/default/media/images/vote-accepted-on.png delete mode 100755 forum/skins/default/media/images/vote-accepted.png delete mode 100755 forum/skins/default/media/images/vote-arrow-down-on.png delete mode 100755 forum/skins/default/media/images/vote-arrow-down.png delete mode 100755 forum/skins/default/media/images/vote-arrow-up-on.png delete mode 100755 forum/skins/default/media/images/vote-arrow-up.png delete mode 100755 forum/skins/default/media/images/vote-favorite-off.png delete mode 100755 forum/skins/default/media/images/vote-favorite-on.png delete mode 100755 forum/skins/default/media/jquery-openid/images/aol.gif delete mode 100755 forum/skins/default/media/jquery-openid/images/blogger-1.png delete mode 100755 forum/skins/default/media/jquery-openid/images/blogger.ico delete mode 100755 forum/skins/default/media/jquery-openid/images/claimid-0.png delete mode 100755 forum/skins/default/media/jquery-openid/images/claimid.ico delete mode 100755 forum/skins/default/media/jquery-openid/images/facebook.gif delete mode 100755 forum/skins/default/media/jquery-openid/images/flickr.ico delete mode 100755 forum/skins/default/media/jquery-openid/images/flickr.png delete mode 100755 forum/skins/default/media/jquery-openid/images/google.gif delete mode 100755 forum/skins/default/media/jquery-openid/images/livejournal-1.png delete mode 100755 forum/skins/default/media/jquery-openid/images/livejournal.ico delete mode 100755 forum/skins/default/media/jquery-openid/images/myopenid-2.png delete mode 100755 forum/skins/default/media/jquery-openid/images/myopenid.ico delete mode 100755 forum/skins/default/media/jquery-openid/images/openid-inputicon.gif delete mode 100755 forum/skins/default/media/jquery-openid/images/openid.gif delete mode 100755 forum/skins/default/media/jquery-openid/images/openidico.png delete mode 100755 forum/skins/default/media/jquery-openid/images/openidico16.png delete mode 100755 forum/skins/default/media/jquery-openid/images/technorati-1.png delete mode 100755 forum/skins/default/media/jquery-openid/images/technorati.ico delete mode 100755 forum/skins/default/media/jquery-openid/images/verisign-2.png delete mode 100755 forum/skins/default/media/jquery-openid/images/verisign.ico delete mode 100755 forum/skins/default/media/jquery-openid/images/vidoop.ico delete mode 100755 forum/skins/default/media/jquery-openid/images/vidoop.png delete mode 100755 forum/skins/default/media/jquery-openid/images/wordpress.ico delete mode 100755 forum/skins/default/media/jquery-openid/images/wordpress.png delete mode 100755 forum/skins/default/media/jquery-openid/images/yahoo.gif delete mode 100755 forum/skins/default/media/jquery-openid/jquery.openid.js delete mode 100755 forum/skins/default/media/jquery-openid/openid.css delete mode 100644 forum/skins/default/media/js/com.cnprog.admin.js delete mode 100644 forum/skins/default/media/js/com.cnprog.editor.js delete mode 100644 forum/skins/default/media/js/com.cnprog.i18n.js delete mode 100755 forum/skins/default/media/js/com.cnprog.post.js delete mode 100644 forum/skins/default/media/js/com.cnprog.tag_selector.js delete mode 100644 forum/skins/default/media/js/com.cnprog.utils.js delete mode 100755 forum/skins/default/media/js/compress.bat delete mode 100644 forum/skins/default/media/js/excanvas.min.js delete mode 100755 forum/skins/default/media/js/flot-build.bat delete mode 100644 forum/skins/default/media/js/jquery-1.2.6.js delete mode 100644 forum/skins/default/media/js/jquery-1.2.6.min.js delete mode 100644 forum/skins/default/media/js/jquery.ajaxfileupload.js delete mode 100644 forum/skins/default/media/js/jquery.flot.js delete mode 100644 forum/skins/default/media/js/jquery.flot.min.js delete mode 100644 forum/skins/default/media/js/jquery.form.js delete mode 100644 forum/skins/default/media/js/jquery.i18n.js delete mode 100644 forum/skins/default/media/js/jquery.openid.js delete mode 100644 forum/skins/default/media/js/jquery.validate.pack.js delete mode 100644 forum/skins/default/media/js/se_hilite.js delete mode 100644 forum/skins/default/media/js/se_hilite_src.js delete mode 100755 forum/skins/default/media/js/wmd/images/wmd-buttons.png delete mode 100755 forum/skins/default/media/js/wmd/showdown-min.js delete mode 100755 forum/skins/default/media/js/wmd/showdown.js delete mode 100755 forum/skins/default/media/js/wmd/wmd-min.js delete mode 100755 forum/skins/default/media/js/wmd/wmd-test.html delete mode 100755 forum/skins/default/media/js/wmd/wmd.css delete mode 100755 forum/skins/default/media/js/wmd/wmd.js delete mode 100755 forum/skins/default/media/js/yuicompressor-2.4.2.jar delete mode 100755 forum/skins/default/media/style/auth.css delete mode 100755 forum/skins/default/media/style/default.css delete mode 100755 forum/skins/default/media/style/jquery.autocomplete.css delete mode 100755 forum/skins/default/media/style/openid.css delete mode 100755 forum/skins/default/media/style/prettify.css delete mode 100755 forum/skins/default/media/style/style.css delete mode 100644 forum/skins/default/templates/404.html delete mode 100644 forum/skins/default/templates/500.html delete mode 100644 forum/skins/default/templates/about.html delete mode 100644 forum/skins/default/templates/account_settings.html delete mode 100644 forum/skins/default/templates/answer_edit.html delete mode 100644 forum/skins/default/templates/answer_edit_tips.html delete mode 100644 forum/skins/default/templates/ask.html delete mode 100644 forum/skins/default/templates/ask_form.html delete mode 100644 forum/skins/default/templates/authopenid/changeemail.html delete mode 100644 forum/skins/default/templates/authopenid/changeopenid.html delete mode 100644 forum/skins/default/templates/authopenid/changepw.html delete mode 100644 forum/skins/default/templates/authopenid/complete.html delete mode 100644 forum/skins/default/templates/authopenid/confirm_email.txt delete mode 100644 forum/skins/default/templates/authopenid/delete.html delete mode 100644 forum/skins/default/templates/authopenid/email_validation.txt delete mode 100644 forum/skins/default/templates/authopenid/external_legacy_login_info.html delete mode 100644 forum/skins/default/templates/authopenid/failure.html delete mode 100644 forum/skins/default/templates/authopenid/sendpw.html delete mode 100644 forum/skins/default/templates/authopenid/sendpw_email.txt delete mode 100644 forum/skins/default/templates/authopenid/settings.html delete mode 100755 forum/skins/default/templates/authopenid/signin.html delete mode 100644 forum/skins/default/templates/authopenid/signup.html delete mode 100644 forum/skins/default/templates/authopenid/yadis.xrdf delete mode 100644 forum/skins/default/templates/badge.html delete mode 100644 forum/skins/default/templates/badges.html delete mode 100644 forum/skins/default/templates/base.html delete mode 100644 forum/skins/default/templates/base_content.html delete mode 100644 forum/skins/default/templates/book.html delete mode 100644 forum/skins/default/templates/close.html delete mode 100644 forum/skins/default/templates/edit_user_email_feeds_form.html delete mode 100644 forum/skins/default/templates/email_base.html delete mode 100644 forum/skins/default/templates/faq.html delete mode 100755 forum/skins/default/templates/fbconnect/xd_receiver.html delete mode 100644 forum/skins/default/templates/feedback.html delete mode 100644 forum/skins/default/templates/feedback_email.txt delete mode 100755 forum/skins/default/templates/feeds/rss_description.html delete mode 100755 forum/skins/default/templates/feeds/rss_title.html delete mode 100644 forum/skins/default/templates/footer.html delete mode 100644 forum/skins/default/templates/header.html delete mode 100644 forum/skins/default/templates/input_bar.html delete mode 100644 forum/skins/default/templates/instant_notification.html delete mode 100644 forum/skins/default/templates/logout.html delete mode 100644 forum/skins/default/templates/notarobot.html delete mode 100644 forum/skins/default/templates/pagesize.html delete mode 100644 forum/skins/default/templates/paginator.html delete mode 100644 forum/skins/default/templates/post_contributor_info.html delete mode 100644 forum/skins/default/templates/privacy.html delete mode 100644 forum/skins/default/templates/question.html delete mode 100644 forum/skins/default/templates/question_counter_widget.html delete mode 100644 forum/skins/default/templates/question_edit.html delete mode 100644 forum/skins/default/templates/question_edit_tips.html delete mode 100644 forum/skins/default/templates/question_list.html delete mode 100644 forum/skins/default/templates/question_retag.html delete mode 100644 forum/skins/default/templates/question_summary_list_roll.html delete mode 100644 forum/skins/default/templates/questions.html delete mode 100644 forum/skins/default/templates/reopen.html delete mode 100644 forum/skins/default/templates/revisions_answer.html delete mode 100644 forum/skins/default/templates/revisions_question.html delete mode 100644 forum/skins/default/templates/tag_selector.html delete mode 100644 forum/skins/default/templates/tags.html delete mode 100644 forum/skins/default/templates/user.html delete mode 100644 forum/skins/default/templates/user_edit.html delete mode 100644 forum/skins/default/templates/user_email_subscriptions.html delete mode 100644 forum/skins/default/templates/user_favorites.html delete mode 100644 forum/skins/default/templates/user_footer.html delete mode 100644 forum/skins/default/templates/user_info.html delete mode 100644 forum/skins/default/templates/user_recent.html delete mode 100644 forum/skins/default/templates/user_reputation.html delete mode 100644 forum/skins/default/templates/user_responses.html delete mode 100644 forum/skins/default/templates/user_stats.html delete mode 100644 forum/skins/default/templates/user_tabs.html delete mode 100644 forum/skins/default/templates/user_votes.html delete mode 100644 forum/skins/default/templates/users.html delete mode 100644 forum/skins/default/templates/users_questions.html delete mode 100644 forum/skins/loaders.py delete mode 100644 forum/skins/utils.py delete mode 100644 forum/sql_scripts/091111_upgrade_evgeny.sql delete mode 100644 forum/sql_scripts/091208_upgrade_evgeny.sql delete mode 100644 forum/sql_scripts/091208_upgrade_evgeny_1.sql delete mode 100644 forum/sql_scripts/100108_upgrade_ef.sql delete mode 100644 forum/sql_scripts/badges.sql delete mode 100644 forum/sql_scripts/cnprog.xml delete mode 100644 forum/sql_scripts/cnprog_new_install.sql delete mode 100644 forum/sql_scripts/cnprog_new_install_2009_02_28.sql delete mode 100644 forum/sql_scripts/cnprog_new_install_2009_03_31.sql delete mode 100644 forum/sql_scripts/cnprog_new_install_2009_04_07.sql delete mode 100644 forum/sql_scripts/cnprog_new_install_2009_04_09.sql delete mode 100644 forum/sql_scripts/drop-all-tables.sh delete mode 100644 forum/sql_scripts/drop-auth.sql delete mode 100644 forum/sql_scripts/pg_fts_install.sql delete mode 100644 forum/sql_scripts/update_2009_01_13_001.sql delete mode 100644 forum/sql_scripts/update_2009_01_13_002.sql delete mode 100644 forum/sql_scripts/update_2009_01_18_001.sql delete mode 100644 forum/sql_scripts/update_2009_01_24.sql delete mode 100644 forum/sql_scripts/update_2009_01_25_001.sql delete mode 100644 forum/sql_scripts/update_2009_02_26_001.sql delete mode 100644 forum/sql_scripts/update_2009_04_10_001.sql delete mode 100644 forum/sql_scripts/update_2009_07_05_EF.sql delete mode 100644 forum/sql_scripts/update_2009_12_24_001.sql delete mode 100644 forum/sql_scripts/update_2009_12_27_001.sql delete mode 100644 forum/sql_scripts/update_2009_12_27_002.sql delete mode 100644 forum/sql_scripts/update_2010_02_22.sql delete mode 100644 forum/templatetags/__init__.py delete mode 100644 forum/templatetags/extra_filters.py delete mode 100644 forum/templatetags/extra_tags.py delete mode 100644 forum/templatetags/smart_if.py delete mode 100644 forum/tests.py delete mode 100755 forum/upfiles/README delete mode 100644 forum/urls.py delete mode 100644 forum/user_messages/__init__.py delete mode 100644 forum/user_messages/context_processors.py delete mode 100644 forum/utils/__init__.py delete mode 100644 forum/utils/cache.py delete mode 100644 forum/utils/colors.py delete mode 100644 forum/utils/decorators.py delete mode 100644 forum/utils/diff.py delete mode 100644 forum/utils/email.py delete mode 100644 forum/utils/forms.py delete mode 100644 forum/utils/functions.py delete mode 100644 forum/utils/html.py delete mode 100644 forum/utils/lists.py delete mode 100644 forum/utils/markup.py delete mode 100644 forum/utils/time.py delete mode 100755 forum/views/README delete mode 100644 forum/views/__init__.py delete mode 100644 forum/views/commands.py delete mode 100644 forum/views/meta.py delete mode 100644 forum/views/readers.py delete mode 100644 forum/views/users.py delete mode 100644 forum/views/writers.py diff --git a/.gitignore b/.gitignore index 2f2899a3..96e12b0a 100755 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,6 @@ pip-log.txt *.zip tmp/* load -forum/skins/default/media/js/flot -forum/skins/common/media/js/closure/google-closure -forum/fixtures +askbot/skins/default/media/js/flot +askbot/skins/common/media/js/closure/google-closure +askbot/fixtures diff --git a/askbot/LICENSE b/askbot/LICENSE new file mode 100644 index 00000000..803781c5 --- /dev/null +++ b/askbot/LICENSE @@ -0,0 +1,14 @@ +Copyright (C) 2009. Chen Gang + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/askbot/__init__.py b/askbot/__init__.py new file mode 100644 index 00000000..90c491d8 --- /dev/null +++ b/askbot/__init__.py @@ -0,0 +1,14 @@ +"""aksbot askbot module +""" +__all__ = [ + 'admin', + 'auth', + 'const', + 'feed', + 'forms', + 'managers', + 'models', + 'sitemap', + 'urls', + 'views' +] diff --git a/askbot/admin.py b/askbot/admin.py new file mode 100644 index 00000000..1ecfa3aa --- /dev/null +++ b/askbot/admin.py @@ -0,0 +1,74 @@ +""" +linking of askbot modules to admin interface +""" +# -*- coding: utf-8 -*- +from django.contrib import admin +from askbot import models + +class AnonymousQuestionAdmin(admin.ModelAdmin): + """AnonymousQuestion admin class""" + +class QuestionAdmin(admin.ModelAdmin): + """Question admin class""" + +class TagAdmin(admin.ModelAdmin): + """Tag admin class""" + +class Answerdmin(admin.ModelAdmin): + """Answer admin class""" + +class CommentAdmin(admin.ModelAdmin): + """ admin class""" + +class VoteAdmin(admin.ModelAdmin): + """ admin class""" + +class FlaggedItemAdmin(admin.ModelAdmin): + """ admin class""" + +class FavoriteQuestionAdmin(admin.ModelAdmin): + """ admin class""" + +class QuestionRevisionAdmin(admin.ModelAdmin): + """ admin class""" + +class AnswerRevisionAdmin(admin.ModelAdmin): + """ admin class""" + +class AwardAdmin(admin.ModelAdmin): + """ admin class""" + +class BadgeAdmin(admin.ModelAdmin): + """ admin class""" + +class ReputeAdmin(admin.ModelAdmin): + """ admin class""" + +class ActivityAdmin(admin.ModelAdmin): + """ admin class""" + +#class BookAdmin(admin.ModelAdmin): +# """ admin class""" + +#class BookAuthorInfoAdmin(admin.ModelAdmin): +# """ admin class""" + +#class BookAuthorRssAdmin(admin.ModelAdmin): +# """ admin class""" + +admin.site.register(models.Question, QuestionAdmin) +admin.site.register(models.Tag, TagAdmin) +admin.site.register(models.Answer, Answerdmin) +admin.site.register(models.Comment, CommentAdmin) +admin.site.register(models.Vote, VoteAdmin) +admin.site.register(models.FlaggedItem, FlaggedItemAdmin) +admin.site.register(models.FavoriteQuestion, FavoriteQuestionAdmin) +admin.site.register(models.QuestionRevision, QuestionRevisionAdmin) +admin.site.register(models.AnswerRevision, AnswerRevisionAdmin) +admin.site.register(models.Badge, BadgeAdmin) +admin.site.register(models.Award, AwardAdmin) +admin.site.register(models.Repute, ReputeAdmin) +admin.site.register(models.Activity, ActivityAdmin) +#admin.site.register(Book, BookAdmin) +#admin.site.register(BookAuthorInfo, BookAuthorInfoAdmin) +#admin.site.register(BookAuthorRss, BookAuthorRssAdmin) diff --git a/askbot/auth.py b/askbot/auth.py new file mode 100644 index 00000000..55a1633f --- /dev/null +++ b/askbot/auth.py @@ -0,0 +1,550 @@ +""" +Authorisation related functions. + +The actions a User is authorised to perform are dependent on their reputation +and superuser status. +""" +import datetime +from django.utils.translation import ugettext as _ +from django.db import transaction +from askbot.models import Repute +from askbot.models import Question +from askbot.models import Answer +from askbot.models import signals +import logging + +from askbot.conf import settings as askbot_settings + +def can_moderate_users(user): + return user.is_superuser + +def can_vote_up(user): + """Determines if a User can vote Questions and Answers up.""" + return user.is_authenticated() and ( + user.reputation >= askbot_settings.MIN_REP_TO_VOTE_UP or + user.is_superuser) + +def can_flag_offensive(user): + """Determines if a User can flag Questions and Answers as offensive.""" + return user.is_authenticated() and ( + user.reputation >= askbot_settings.MIN_REP_TO_FLAG_OFFENSIVE or + user.is_superuser) + +def can_add_comments(user, subject): + """Determines if a User can add comments to Questions and Answers.""" + if user.is_authenticated(): + if user.id == subject.author.id: + return True + if user.reputation >= askbot_settings.MIN_REP_TO_LEAVE_COMMENTS: + return True + if user.is_superuser: + return True + if isinstance(subject, Answer): + if subject.question.author.id == user.id: + return True + return False + +def can_vote_down(user): + """Determines if a User can vote Questions and Answers down.""" + if user.is_authenticated(): + if user.reputation >= askbot_settings.MIN_REP_TO_VOTE_DOWN: + return True + if user.is_superuser: + return True + return False + +def can_retag_questions(user): + """Determines if a User can retag Questions.""" + if user.is_authenticated(): + if user.reputation >= askbot_settings.MIN_REP_TO_RETAG_OTHERS_QUESTIONS: + if user.reputation < askbot_settings.MIN_REP_TO_EDIT_OTHERS_POSTS: + return True + if user.is_superuser: + return True + return False + +def can_edit_post(user, post): + """Determines if a User can edit the given Question or Answer.""" + if user.is_authenticated(): + if user.id == post.author_id: + return True + if post.wiki: + if user.reputation >= askbot_settings.MIN_REP_TO_EDIT_WIKI: + return True + if user.reputation >= askbot_settings.MIN_REP_TO_EDIT_OTHERS_POSTS: + return True + if user.is_superuser: + return True + return False + +def can_delete_comment(user, comment): + """Determines if a User can delete the given Comment.""" + return user.is_authenticated() and ( + user.id == comment.user_id or + user.reputation >= askbot_settings.MIN_REP_TO_DELETE_OTHERS_COMMENTS or + user.is_superuser) + +def can_view_offensive_flags(user): + """Determines if a User can view offensive flag counts.""" + return user.is_authenticated() and ( + user.reputation >= askbot_settings.MIN_REP_TO_VIEW_OFFENSIVE_FLAGS or + user.is_superuser) + +def can_close_question(user, question): + """Determines if a User can close the given Question.""" + return user.is_authenticated() and ( + (user.id == question.author_id and + user.reputation >= askbot_settings.MIN_REP_TO_CLOSE_OWN_QUESTIONS) or + user.reputation >= askbot_settings.MIN_REP_TO_CLOSE_OTHERS_QUESTIONS or + user.is_superuser) + +def can_lock_posts(user): + """Determines if a User can lock Questions or Answers.""" + return user.is_authenticated() and ( + user.reputation >= askbot_settings.MIN_REP_TO_LOCK_POSTS or + user.is_superuser) + +def can_follow_url(user): + """Determines if the URL link can be followed by Google search engine.""" + return user.reputation >= askbot_settings.MIN_REP_TO_DISABLE_URL_NOFOLLOW + +def can_accept_answer(user, question, answer): + if user.is_superuser: + return True + if user.is_authenticated(): + if question.author != answer.author and question.author == user: + return True + return False + +# now only support to reopen own question except superuser +def can_reopen_question(user, question): + if user.is_superuser: + return True + if user.is_authenticated() and user.id == question.author_id: + if user.reputation >= askbot_settings.MIN_REP_TO_REOPEN_OWN_QUESTIONS: + return True + return False + +def can_delete_post(user, post): + if user.is_superuser: + return True + elif user.is_authenticated() and user == post.author: + if isinstance(post, Answer): + return True + elif isinstance(post, Question): + answers = post.answers.all() + for answer in answers: + if user != answer.author and answer.deleted == False: + return False + return True + else: + return False + else: + return False + +def can_view_deleted_post(user, post): + return user.is_superuser + +# user preferences view permissions +def is_user_self(request_user, target_user): + return (request_user.is_authenticated() and request_user == target_user) + +def can_view_user_votes(request_user, target_user): + return (request_user.is_authenticated() and request_user == target_user) + +def can_view_user_preferences(request_user, target_user): + return (request_user.is_authenticated() and request_user == target_user) + +def can_view_user_edit(request_user, target_user): + return (request_user.is_authenticated() and request_user == target_user) + +def can_upload_files(request_user): + if request_user.is_superuser: + return True + if request_user.is_authenticated(): + if request_user.reputation >= askbot_settings.MIN_REP_TO_UPLOAD_FILES: + return True + return False + +########################################### +## actions and reputation changes event +########################################### +def calculate_reputation(origin, offset): + result = int(origin) + int(offset) + if (result > 0): + return result + else: + return 1 + +@transaction.commit_on_success +def onFlaggedItem(item, post, user, timestamp=None): + if timestamp is None: + timestamp = datetime.datetime.now() + + item.save() + post.offensive_flag_count = post.offensive_flag_count + 1 + post.save() + + post.author.reputation = calculate_reputation( + post.author.reputation, + askbot_settings.REP_LOSS_FOR_RECEIVING_DOWNVOTE + ) + post.author.save() + + question = post + if isinstance(post, Answer): + question = post.question + + reputation = Repute( + user=post.author, + negative=askbot_settings.REP_LOSS_FOR_RECEIVING_DOWNVOTE, + question=question, reputed_at=timestamp, + reputation_type=-4, + reputation=post.author.reputation + ) + reputation.save() + + #todo: These should be updated to work on same revisions. + if post.offensive_flag_count == askbot_settings.MIN_FLAGS_TO_HIDE_POST: + post.author.reputation = \ + calculate_reputation( + post.author.reputation, + askbot_settings.REP_LOSS_FOR_RECEIVING_THREE_FLAGS_PER_REVISION + ) + + post.author.save() + + reputation = Repute( + user=post.author, + negative=\ + askbot_settings.REP_LOSS_FOR_RECEIVING_THREE_FLAGS_PER_REVISION, + question=question, + reputed_at=timestamp, + reputation_type=-6, + reputation=post.author.reputation + ) + reputation.save() + + elif post.offensive_flag_count == askbot_settings.MIN_FLAGS_TO_DELETE_POST: + post.author.reputation = \ + calculate_reputation( + post.author.reputation, + askbot_settings.REP_LOSS_FOR_RECEIVING_FIVE_FLAGS_PER_REVISION + ) + + post.author.save() + + reputation = Repute( + user=post.author, + negative=\ + askbot_settings.REP_LOSS_FOR_RECEIVING_FIVE_FLAGS_PER_REVISION, + question=question, + reputed_at=timestamp, + reputation_type=-7, + reputation=post.author.reputation + ) + reputation.save() + + post.deleted = True + #post.deleted_at = timestamp + #post.deleted_by = Admin + post.save() + signals.mark_offensive.send( + sender=post.__class__, + instance=post, + mark_by=user + ) + +@transaction.commit_on_success +def onAnswerAccept(answer, user, timestamp=None): + if timestamp is None: + timestamp = datetime.datetime.now() + + answer.accepted = True + answer.accepted_at = timestamp + answer.question.answer_accepted = True + answer.save() + answer.question.save() + + answer.author.reputation = calculate_reputation( + answer.author.reputation, + askbot_settings.REP_GAIN_FOR_RECEIVING_ANSWER_ACCEPTANCE + ) + answer.author.save() + reputation = Repute(user=answer.author, + positive=askbot_settings.REP_GAIN_FOR_RECEIVING_ANSWER_ACCEPTANCE, + question=answer.question, + reputed_at=timestamp, + reputation_type=2, + reputation=answer.author.reputation) + reputation.save() + + user.reputation = calculate_reputation(user.reputation, + askbot_settings.REP_GAIN_FOR_ACCEPTING_ANSWER) + user.save() + reputation = Repute(user=user, + positive=askbot_settings.REP_GAIN_FOR_ACCEPTING_ANSWER, + question=answer.question, + reputed_at=timestamp, + reputation_type=3, + reputation=user.reputation) + reputation.save() + +@transaction.commit_on_success +def onAnswerAcceptCanceled(answer, user, timestamp=None): + if timestamp is None: + timestamp = datetime.datetime.now() + answer.accepted = False + answer.accepted_at = None + answer.question.answer_accepted = False + answer.save() + answer.question.save() + + answer.author.reputation = calculate_reputation( + answer.author.reputation, + askbot_settings.REP_LOSS_FOR_RECEIVING_CANCELATION_OF_ANSWER_ACCEPTANCE + ) + answer.author.save() + reputation = Repute( + user=answer.author, + negative=\ + askbot_settings.REP_LOSS_FOR_RECEIVING_CANCELATION_OF_ANSWER_ACCEPTANCE, + question=answer.question, + reputed_at=timestamp, + reputation_type=-2, + reputation=answer.author.reputation + ) + reputation.save() + + user.reputation = calculate_reputation(user.reputation, + askbot_settings.REP_LOSS_FOR_CANCELING_ANSWER_ACCEPTANCE) + user.save() + reputation = Repute(user=user, + negative=askbot_settings.REP_LOSS_FOR_CANCELING_ANSWER_ACCEPTANCE, + question=answer.question, + reputed_at=timestamp, + reputation_type=-1, + reputation=user.reputation) + reputation.save() + +@transaction.commit_on_success +def onUpVoted(vote, post, user, timestamp=None): + if timestamp is None: + timestamp = datetime.datetime.now() + vote.save() + + post.vote_up_count = int(post.vote_up_count) + 1 + post.score = int(post.score) + 1 + post.save() + + if not post.wiki: + author = post.author + todays_rep_gain = Repute.objects.get_reputation_by_upvoted_today(author) + if todays_rep_gain < askbot_settings.MAX_REP_GAIN_PER_USER_PER_DAY: + author.reputation = calculate_reputation(author.reputation, + askbot_settings.REP_GAIN_FOR_RECEIVING_UPVOTE) + author.save() + + question = post + if isinstance(post, Answer): + question = post.question + + reputation = Repute(user=author, + positive=askbot_settings.REP_GAIN_FOR_RECEIVING_UPVOTE, + question=question, + reputed_at=timestamp, + reputation_type=1, + reputation=author.reputation) + reputation.save() + +@transaction.commit_on_success +def onUpVotedCanceled(vote, post, user, timestamp=None): + if timestamp is None: + timestamp = datetime.datetime.now() + vote.delete() + + post.vote_up_count = int(post.vote_up_count) - 1 + if post.vote_up_count < 0: + post.vote_up_count = 0 + post.score = int(post.score) - 1 + post.save() + + if not post.wiki: + author = post.author + author.reputation = \ + calculate_reputation( + author.reputation, + askbot_settings.REP_LOSS_FOR_RECEIVING_UPVOTE_CANCELATION + ) + author.save() + + question = post + if isinstance(post, Answer): + question = post.question + + reputation = Repute( + user=author, + negative=askbot_settings.REP_LOSS_FOR_RECEIVING_UPVOTE_CANCELATION, + question=question, + reputed_at=timestamp, + reputation_type=-8, + reputation=author.reputation + ) + reputation.save() + +@transaction.commit_on_success +def onDownVoted(vote, post, user, timestamp=None): + if timestamp is None: + timestamp = datetime.datetime.now() + vote.save() + + post.vote_down_count = int(post.vote_down_count) + 1 + post.score = int(post.score) - 1 + post.save() + + if not post.wiki: + author = post.author + author.reputation = calculate_reputation( + author.reputation, + askbot_settings.REP_LOSS_FOR_DOWNVOTING + ) + author.save() + + question = post + if isinstance(post, Answer): + question = post.question + + reputation = Repute(user=author, + negative=askbot_settings.REP_LOSS_FOR_DOWNVOTING, + question=question, + reputed_at=timestamp, + reputation_type=-3, + reputation=author.reputation) + reputation.save() + + user.reputation = calculate_reputation( + user.reputation, + askbot_settings.REP_LOSS_FOR_RECEIVING_DOWNVOTE + ) + user.save() + + reputation = Repute(user=user, + negative=askbot_settings.REP_LOSS_FOR_RECEIVING_DOWNVOTE, + question=question, + reputed_at=timestamp, + reputation_type=-5, + reputation=user.reputation) + reputation.save() + +@transaction.commit_on_success +def onDownVotedCanceled(vote, post, user, timestamp=None): + if timestamp is None: + timestamp = datetime.datetime.now() + vote.delete() + + post.vote_down_count = int(post.vote_down_count) - 1 + if post.vote_down_count < 0: + post.vote_down_count = 0 + post.score = post.score + 1 + post.save() + + if not post.wiki: + author = post.author + author.reputation = calculate_reputation( + author.reputation, + askbot_settings.REP_GAIN_FOR_RECEIVING_DOWNVOTE_CANCELATION + ) + author.save() + + question = post + if isinstance(post, Answer): + question = post.question + + reputation = Repute(user=author, + positive=\ + askbot_settings.REP_GAIN_FOR_RECEIVING_DOWNVOTE_CANCELATION, + question=question, + reputed_at=timestamp, + reputation_type=4, + reputation=author.reputation + ) + reputation.save() + + user.reputation = calculate_reputation(user.reputation, + askbot_settings.REP_GAIN_FOR_CANCELING_DOWNVOTE) + user.save() + + reputation = Repute(user=user, + positive=askbot_settings.REP_GAIN_FOR_CANCELING_DOWNVOTE, + question=question, + reputed_at=timestamp, + reputation_type=5, + reputation=user.reputation) + reputation.save() + +#here timestamp is not used, I guess added for consistency +def onDeleteCanceled(post, user, timestamp=None): + post.deleted = False + post.deleted_by = None + post.deleted_at = None + post.save() + logging.debug('now restoring something') + if isinstance(post, Answer): + logging.debug( + 'updated answer count on undelete, have %d' \ + % post.question.answer_count + ) + Question.objects.update_answer_count(post.question) + elif isinstance(post, Question): + for tag in list(post.tags.all()): + if tag.used_count == 1 and tag.deleted: + tag.deleted = False + tag.deleted_by = None + tag.deleted_at = None + tag.save() + +def onDeleted(post, user, timestamp=None): + if timestamp is None: + timestamp = datetime.datetime.now() + post.deleted = True + post.deleted_by = user + post.deleted_at = timestamp + post.save() + + if isinstance(post, Question): + for tag in list(post.tags.all()): + if tag.used_count == 1: + tag.deleted = True + tag.deleted_by = user + tag.deleted_at = timestamp + else: + tag.used_count = tag.used_count - 1 + tag.save() + + answers = post.answers.all() + if user == post.author: + if len(answers) > 0: + msg = _( + 'Your question and all of it\'s answers have been deleted' + ) + else: + msg = _('Your question has been deleted') + else: + if len(answers) > 0: + msg = _( + 'The question and all of it\'s answers have been deleted' + ) + else: + msg = _('The question has been deleted') + user.message_set.create(message=msg) + logging.debug('posted a message %s' % msg) + for answer in answers: + onDeleted(answer, user) + elif isinstance(post, Answer): + Question.objects.update_answer_count(post.question) + logging.debug('updated answer count to %d' % post.question.answer_count) + signals.delete_post_or_answer.send( + sender=post.__class__, + instance=post, + delete_by=user + ) diff --git a/askbot/bin/dos2unix.sh b/askbot/bin/dos2unix.sh new file mode 100644 index 00000000..2864426a --- /dev/null +++ b/askbot/bin/dos2unix.sh @@ -0,0 +1,12 @@ +#please take care not to dos2unix anything in your .git directory +#because that will probably break your repo +dos2unix `find . -name '*.py'` +dos2unix `find . -name '*.po'` +dos2unix `find . -name '*.js'` +dos2unix `find . -name '*.css'` +dos2unix `find . -name '*.txt'` +dos2unix `find ./sphinx -type f` +dos2unix `find ./cron -type f` +dos2unix settings_local.py.dist +dos2unix README +dos2unix INSTALL diff --git a/askbot/bin/rmpyc b/askbot/bin/rmpyc new file mode 100755 index 00000000..014575f6 --- /dev/null +++ b/askbot/bin/rmpyc @@ -0,0 +1 @@ +rm `find . -name '*.pyc'` diff --git a/askbot/conf/README b/askbot/conf/README new file mode 100644 index 00000000..4dd62329 --- /dev/null +++ b/askbot/conf/README @@ -0,0 +1,5 @@ +this directory contains +forum site configurations for livesettings + +they need to be imported in models so made this a part of +models module diff --git a/askbot/conf/__init__.py b/askbot/conf/__init__.py new file mode 100644 index 00000000..de52c601 --- /dev/null +++ b/askbot/conf/__init__.py @@ -0,0 +1,16 @@ +#import these to compile code and install values +import askbot.conf.minimum_reputation +import askbot.conf.vote_rules +import askbot.conf.reputation_changes +import askbot.conf.email +import askbot.conf.forum_data_rules +import askbot.conf.flatpages +import askbot.conf.site_settings +import askbot.conf.external_keys +import askbot.conf.skin_counter_settings +import askbot.conf.skin_general_settings +import askbot.conf.user_settings + +#import main settings object +from askbot.conf.settings_wrapper import settings + diff --git a/askbot/conf/email.py b/askbot/conf/email.py new file mode 100644 index 00000000..defe86b8 --- /dev/null +++ b/askbot/conf/email.py @@ -0,0 +1,69 @@ +""" +Email related settings +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, IntegerValue, BooleanValue +from askbot.deps.livesettings import StringValue +from django.utils.translation import ugettext as _ +from askbot import const + +EMAIL = ConfigurationGroup( + 'EMAIL', + _('Email and email alert settings'), + ) + +settings.register( + IntegerValue( + EMAIL, + 'MAX_ALERTS_PER_EMAIL', + default=7, + description=_('Maximum number of news entries in an email alert') + ) +) + +settings.register( + 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 askbot (per person tag filter applies) ' + 'and posts mentioning the user and comment responses' + ) + ) +) + +settings.register( + BooleanValue( + EMAIL, + 'EMAIL_VALIDATION', + default=False, + hidden=True, + description=_('Require email verification before allowing to post'), + help_text=_('Active email verification is done by sending a verification key in email') + ) +) + +settings.register( + BooleanValue( + EMAIL, + 'EMAIL_UNIQUE', + default=True, + description=_('Allow only one account per email address') + ) +) + +settings.register( + StringValue( + EMAIL, + 'ANONYMOUS_USER_EMAIL', + default='anonymous@askbot.org', + description=_('Fake email for anonymous user'), + help_text=_('Use this setting to control gravatar for email-less user') + ) +) diff --git a/askbot/conf/external_keys.py b/askbot/conf/external_keys.py new file mode 100644 index 00000000..667a997f --- /dev/null +++ b/askbot/conf/external_keys.py @@ -0,0 +1,93 @@ +""" +External service key settings +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, StringValue +from django.utils.translation import ugettext as _ +from django.conf import settings as django_settings + +EXTERNAL_KEYS = ConfigurationGroup( + 'EXTERNAL_KEYS', + _('Keys to connect the site with external services like Facebook, etc.') + ) + +settings.register( + StringValue( + EXTERNAL_KEYS, + 'GOOGLE_SITEMAP_CODE', + description=_('Google site verification key'), + help_text=_( + 'This key helps google index your site ' + 'please obtain is at ' + '' + 'google webmasters tools site' + ) % {'google_webmasters_tools_url': + 'https://www.google.com/webmasters/tools/home?hl=' \ + + django_settings.LANGUAGE_CODE} + ) +) + +settings.register( + StringValue( + EXTERNAL_KEYS, + 'GOOGLE_ANALYTICS_KEY', + description=_('Google Analytics key'), + help_text=_( + 'Obtain is at ' + 'Google Analytics site, if you ' + 'wish to use Google Analytics to monitor ' + 'your site' + ) % {'ga_site':'http://www.google.com/intl/%s/analytics/' \ + % django_settings.LANGUAGE_CODE } + ) +) + +settings.register( + StringValue( + EXTERNAL_KEYS, + 'RECAPTCHA_PRIVATE_KEY', + description=_('Recaptcha private key') + ' - does not work yet', + hidden=True, + help_text=_( + 'Recaptcha is a tool that helps distinguish ' + 'real people from annoying spam robots. ' + 'Please get this and a public key at ' + 'the recaptcha.net' + ) + ) +) + +settings.register( + StringValue( + EXTERNAL_KEYS, + 'RECAPTCHA_PUBLIC_KEY', + hidden=True, + description=_('Recaptcha public key') + ' - does not work yet' + ) +) + +settings.register( + StringValue( + EXTERNAL_KEYS, + 'FB_API_KEY', + description=_('Facebook public API key') + ' - does not work yet', + hidden=True, + help_text=_( + 'Facebook API key and Facebook secret ' + 'allow to use Facebook Connect login method ' + 'at your site. Please obtain these keys ' + 'at ' + 'facebook create app site' + ) + ) + +) + +settings.register( + StringValue( + EXTERNAL_KEYS, + 'FB_SECRET', + hidden=True, + description=_('Facebook secret key') + ' - does not work yet' + ) +) diff --git a/askbot/conf/flatpages.py b/askbot/conf/flatpages.py new file mode 100644 index 00000000..f53694f3 --- /dev/null +++ b/askbot/conf/flatpages.py @@ -0,0 +1,37 @@ +""" +Q&A askbot flatpages (about, etc.) +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, LongStringValue +from django.utils.translation import ugettext as _ + +FLATPAGES = ConfigurationGroup( + 'FLATPAGES', + _('Flatpages - about, privacy policy, etc.') + ) + +settings.register( + LongStringValue( + FLATPAGES, + 'FORUM_ABOUT', + description=_('Text the Q&A askbot About page (html format)'), + help_text=\ + _( + 'Save, then ' + 'use HTML validator on the "about" page to check your input.' + ) + ) +) + +settings.register( + LongStringValue( + FLATPAGES, + 'FORUM_PRIVACY', + description=_('Text the Q&A askbot Privacy Policy (html format)'), + help_text=\ + _( + 'Save, then ' + 'use HTML validator on the "privacy" page to check your input.' + ) + ) +) diff --git a/askbot/conf/forum_data_rules.py b/askbot/conf/forum_data_rules.py new file mode 100644 index 00000000..58fedf5a --- /dev/null +++ b/askbot/conf/forum_data_rules.py @@ -0,0 +1,62 @@ +""" +Settings for askbot data display and entry +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, BooleanValue, IntegerValue +from askbot.deps.livesettings import StringValue +from django.utils.translation import ugettext as _ +from askbot import const + +FORUM_DATA_RULES = ConfigurationGroup( + 'FORUM_DATA_RULES', + _('Settings for askbot data entry and display') + ) + +settings.register( + BooleanValue( + FORUM_DATA_RULES, + 'WIKI_ON', + default=True, + description=_('Check to enable community wiki feature') + ) +) + +settings.register( + IntegerValue( + FORUM_DATA_RULES, + 'MAX_TAG_LENGTH', + default=20, + description=_('Maximum length of tag (number of characters)') + ) +) + +settings.register( + IntegerValue( + FORUM_DATA_RULES, + 'MAX_TAGS_PER_POST', + default=5, + description=_('Maximum number of tags per question') + ) +) + +#todo: looks like there is a bug in askbot.deps.livesettings +#that does not allow Integer values with defaults and choices +settings.register( + StringValue( + FORUM_DATA_RULES, + 'DEFAULT_QUESTIONS_PAGE_SIZE', + choices=const.PAGE_SIZE_CHOICES, + default='30', + description=_('Number of questions to list by default') + ) +) + +settings.register( + StringValue( + FORUM_DATA_RULES, + 'UNANSWERED_QUESTION_MEANING', + choices=const.UNANSWERED_QUESTION_MEANING_CHOICES, + default='NO_ACCEPTED_ANSWERS', + description=_('What should "unanswered question" mean?') + ) +) diff --git a/askbot/conf/minimum_reputation.py b/askbot/conf/minimum_reputation.py new file mode 100644 index 00000000..d7044911 --- /dev/null +++ b/askbot/conf/minimum_reputation.py @@ -0,0 +1,148 @@ +""" +Settings for minimum reputation required for +a variety of actions on the askbot askbot +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, IntegerValue +from django.utils.translation import ugettext as _ + +MIN_REP = ConfigurationGroup( + 'MIN_REP', + _('Minimum reputation required to perform actions'), + ordering=0 + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_VOTE_UP', + default=15, + description=_('Upvote') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_VOTE_DOWN', + default=100, + description=_('Downvote') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_FLAG_OFFENSIVE', + default=15, + description=_('Flag offensive') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_LEAVE_COMMENTS', + default=50, + description=_('Leave comments') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_DELETE_OTHERS_COMMENTS', + default=2000, + description=_('Delete comments posted by others') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_UPLOAD_FILES', + default=60, + description=_('Upload files') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_CLOSE_OWN_QUESTIONS', + default=250, + description=_('Close own questions'), + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_RETAG_OTHERS_QUESTIONS', + default=500, + description=_('Retag questions posted by other people') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_REOPEN_OWN_QUESTIONS', + default=500, + description=_('Reopen own questions') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_EDIT_WIKI', + default=750, + description=_('Edit community wiki posts') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_EDIT_OTHERS_POSTS', + default=2000, + description=_('Edit posts authored by other people') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_VIEW_OFFENSIVE_FLAGS', + default=2000, + description=_('View offensive flags') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_DISABLE_URL_NOFOLLOW', + default=2000, + description=_('Disable nofollow directive on links') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_CLOSE_OTHERS_QUESTIONS', + default=2000, + description=_('Close questions asked by others') + ) + ) + +settings.register( + IntegerValue( + MIN_REP, + 'MIN_REP_TO_LOCK_POSTS', + default=4000, + description=_('Lock posts') + ) + ) diff --git a/askbot/conf/reputation_changes.py b/askbot/conf/reputation_changes.py new file mode 100644 index 00000000..46214d57 --- /dev/null +++ b/askbot/conf/reputation_changes.py @@ -0,0 +1,149 @@ +""" +Settings for reputation changes that apply to +user in response to various actions by the same +users or others +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, IntegerValue +from django.utils.translation import ugettext as _ + +REP_CHANGES = ConfigurationGroup( + 'REP_CHANGES', + _('Reputaion loss and gain rules'), + ordering=2 + ) + +settings.register( + IntegerValue( + REP_CHANGES, + 'MAX_REP_GAIN_PER_USER_PER_DAY', + default=200, + description=_('Maximum daily reputation gain per user') + ) +) + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_GAIN_FOR_RECEIVING_UPVOTE', + default=10, + description=_('Gain for receiving an upvote') + ) +) + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_GAIN_FOR_RECEIVING_ANSWER_ACCEPTANCE', + default=15, + description=_('Gain for the author of accepted answer') + ) +) + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_GAIN_FOR_ACCEPTING_ANSWER', + default=2, + description=_('Gain for accepting best answer') + ) +) + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_GAIN_FOR_RECEIVING_DOWNVOTE_CANCELATION', + default=2, + description=_('Gain for post owner on canceled downvote') + ) +) + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_GAIN_FOR_CANCELING_DOWNVOTE', + default=1, + description=_('Gain for voter on canceling downvote') + ) +) +#'gain_by_canceling_downvote', + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_LOSS_FOR_CANCELING_ANSWER_ACCEPTANCE', + default=-2, + description=_('Loss for voter for canceling of answer acceptance') + ) +) +#'lose_by_canceling_accepted_answer', + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_LOSS_FOR_RECEIVING_CANCELATION_OF_ANSWER_ACCEPTANCE', + default=-5, + description=_('Loss for author whose answer was "un-accepted"') + ) +) +#'lose_by_accepted_answer_cancled', + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_LOSS_FOR_DOWNVOTING', + default=-2, + description=_('Loss for giving a downvote') + ) +) +#'lose_by_downvoted', + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_LOSS_FOR_RECEIVING_FLAG', + default=-2, + description=_('Loss for owner of post that was flagged offensive') + ) +) +#'lose_by_flagged', + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_LOSS_FOR_RECEIVING_DOWNVOTE', + default=-1, + description=_('Loss for owner of post that was downvoted') + ) +) +#'lose_by_downvoting', + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_LOSS_FOR_RECEIVING_THREE_FLAGS_PER_REVISION', + default=-30, + description=_('Loss for owner of post that was flagged 3 times per same revision') + ) +) +#'lose_by_flagged_lastrevision_3_times', + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_LOSS_FOR_RECEIVING_FIVE_FLAGS_PER_REVISION', + default=-100, + description=_('Loss for owner of post that was flagged 5 times per same revision') + ) +) +#'lose_by_flagged_lastrevision_5_times', + +settings.register( + IntegerValue( + REP_CHANGES, + 'REP_LOSS_FOR_RECEIVING_UPVOTE_CANCELATION', + default=-10, + description=_('Loss for post owner when upvote is canceled') + ) +) +#'lose_by_upvote_canceled', diff --git a/askbot/conf/settings_wrapper.py b/askbot/conf/settings_wrapper.py new file mode 100644 index 00000000..2dbf9b74 --- /dev/null +++ b/askbot/conf/settings_wrapper.py @@ -0,0 +1,77 @@ +""" +Definition of a Singleton wrapper class for askbot.deps.livesettings +with interface similar to django.conf.settings +that is each setting has unique key and is accessible +via dotted lookup. + +for example to lookup value of setting BLAH you would do + +from askbot.conf import settings as askbot_settings + +askbot_settings.BLAH + +NOTE that at the moment there is distinction between settings +(django settings) and askbot_settings (forum.deps.livesettings) + +the value will be taken from askbot.deps.livesettings database or cache +note that during compilation phase database is not accessible +for the most part, so actual values are reliably available only +at run time + +askbot.deps.livesettings is a module developed for satchmo project +""" +from askbot.deps.livesettings import SortedDotDict, config_register + +class ConfigSettings(object): + """A very simple Singleton wrapper for settings + a limitation is that all settings names using this class + must be distinct, even though they might belong + to different settings groups + """ + __instance = None + + def __init__(self): + """assigns SortedDotDict to self.__instance if not set""" + if ConfigSettings.__instance == None: + ConfigSettings.__instance = SortedDotDict() + self.__dict__['_ConfigSettings__instance'] = ConfigSettings.__instance + self.__ordering_index = {} + + def __getattr__(self, key): + """value lookup returns the actual value of setting + not the object - this way only very minimal modifications + will be required in code to convert an app + depending on django.conf.settings to askbot.deps.livesettings + """ + return getattr(self.__instance, key).value + + def register(self, value): + """registers the setting + value must be a subclass of askbot.deps.livesettings.Value + """ + key = value.key + group_key = value.group.key + + ordering = self.__ordering_index.get(group_key, None) + if ordering: + ordering += 1 + value.ordering = ordering + else: + ordering = 1 + value.ordering = ordering + self.__ordering_index[group_key] = ordering + + if key in self.__instance: + raise Exception('setting %s is already registered' % key) + else: + self.__instance[key] = config_register(value) + + def as_dict(self): + out = dict() + for key in self.__instance.keys(): + #todo: this is odd that I could not use self.__instance.items() mapping here + out[key] = self.__instance[key].value + return out + +#settings instance to be used elsewhere in the project +settings = ConfigSettings() diff --git a/askbot/conf/site_settings.py b/askbot/conf/site_settings.py new file mode 100644 index 00000000..8bd4590a --- /dev/null +++ b/askbot/conf/site_settings.py @@ -0,0 +1,94 @@ +""" +Q&A website settings - title, desctiption, basic urls +keywords +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, StringValue +from django.utils.translation import ugettext as _ +from django.utils.html import escape +from askbot import const + +QA_SITE_SETTINGS = ConfigurationGroup( + 'QA_SITE_SETTINGS', + _('Q&A askbot website parameters and urls') + ) + +settings.register( + StringValue( + QA_SITE_SETTINGS, + 'APP_TITLE', + default=u'ASKBOT: Open Source Q&A Forum', + description=_('Site title for the Q&A askbot') + ) +) + +settings.register( + StringValue( + QA_SITE_SETTINGS, + 'APP_KEYWORDS', + default=u'ASKBOT,CNPROG,askbot,community', + description=_('Comma separated list of Q&A site keywords') + ) +) + +settings.register( + StringValue( + QA_SITE_SETTINGS, + 'APP_COPYRIGHT', + default='Copyright ASKBOT, 2010. Some rights reserved under creative commons license.', + description=_('Copyright message to show in the footer') + ) +) + +settings.register( + StringValue( + QA_SITE_SETTINGS, + 'APP_DESCRIPTION', + default='Open source question and answer askbot written in Python and Django', + description=_('Site description for the search engines') + ) +) + +settings.register( + StringValue( + QA_SITE_SETTINGS, + 'APP_SHORT_NAME', + default=_('Askbot'), + hidden=True, + description=_('Short name for your Q&A askbot') + ) +) + +settings.register( + StringValue( + QA_SITE_SETTINGS, + 'APP_URL', + default='http://askbot.org', + description=_('Base URL for your Q&A askbot, must start with http or https'), + ) +) + +settings.register( + StringValue( + QA_SITE_SETTINGS, + 'GREETING_URL', + default='/' + _('faq/'),#cannot reverse url here, unfortunately, must be absolute also + hidden=True, + description=_('Link shown in the greeting message shown to the anonymous user'), + help_text=_('If you change this url from the default - ' + 'then you will also probably want to adjust translation of ' + 'the following string: ') + '"' + + escape(const.GREETING_FOR_ANONYMOUS_USER + '"' + ' You can find this string in your locale django.po file' + ) + ) +) + +settings.register( + StringValue( + QA_SITE_SETTINGS, + 'FEEDBACK_SITE_URL', + description=_('Feedback site URL'), + help_text=_('If left empty, a simple internal feedback form will be used instead') + ) +) diff --git a/askbot/conf/skin_counter_settings.py b/askbot/conf/skin_counter_settings.py new file mode 100644 index 00000000..d7037693 --- /dev/null +++ b/askbot/conf/skin_counter_settings.py @@ -0,0 +1,251 @@ +""" +Skin settings to color view, vote and answer counters +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, IntegerValue, StringValue +from django.utils.translation import ugettext as _ +from askbot.deps.grapefruit import Color + +SKIN_COUNTER_SETTINGS = ConfigurationGroup( + 'SKIN_COUNTER_SETTINGS', + _('Skin: view, vote and answer counters') + ) + +settings.register( + IntegerValue( + SKIN_COUNTER_SETTINGS, + 'VOTE_COUNTER_EXPECTED_MAXIMUM', + default=3, + description=_('Vote counter value to give "full color"') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VOTE_COUNTER_EMPTY_BG', + default='white', + description=_('Background color for votes = 0'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VOTE_COUNTER_EMPTY_FG', + default='gray', + description=_('Foreground color for votes = 0'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VOTE_COUNTER_MIN_BG', + default='white', + description=_('Background color for votes = 1'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VOTE_COUNTER_MIN_FG', + default='black', + description=_('Foreground color for votes = 1'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VOTE_COUNTER_MAX_BG', + default='#a9d0f5', + description=_('Background color for votes = MAX'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VOTE_COUNTER_MAX_FG', + default=Color.NewFromHtml( + settings.COLORS_VOTE_COUNTER_MAX_BG + ).DarkerColor(0.7).html, + description=_('Foreground color for votes = MAX'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + IntegerValue( + SKIN_COUNTER_SETTINGS, + 'VIEW_COUNTER_EXPECTED_MAXIMUM', + default=100, + description=_('View counter value to give "full color"') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VIEW_COUNTER_EMPTY_BG', + default='gray', + description=_('Background color for views = 0'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VIEW_COUNTER_EMPTY_FG', + default='white', + description=_('Foreground color for views = 0'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VIEW_COUNTER_MIN_BG', + default='#D0F5A9', + description=_('Background color for views = 1'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VIEW_COUNTER_MIN_FG', + default=Color.NewFromHtml( + settings.COLORS_VIEW_COUNTER_MIN_BG + ).DarkerColor(0.6).html, + description=_('Foreground color for views = 1'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VIEW_COUNTER_MAX_BG', + default='#FF8000', + description=_('Background color for views = MAX'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_VIEW_COUNTER_MAX_FG', + default=Color.NewFromHtml( + settings.COLORS_VIEW_COUNTER_MAX_BG + ).DarkerColor(0.7).html, + description=_('Foreground color for views = MAX'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + IntegerValue( + SKIN_COUNTER_SETTINGS, + 'ANSWER_COUNTER_EXPECTED_MAXIMUM', + default=4, + description=_('Answer counter value to give "full color"') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_ANSWER_COUNTER_EMPTY_BG', + default=Color.NewFromHtml('#a40000').Blend( + Color.NewFromHtml('white'),0.8 + ).html, + description=_('Background color for answers = 0'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_ANSWER_COUNTER_EMPTY_FG', + default='yellow', + description=_('Foreground color for answers = 0'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_ANSWER_COUNTER_MIN_BG', + default='#AEB404', + description=_('Background color for answers = 1'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_ANSWER_COUNTER_MIN_FG', + default='white', + description=_('Foreground color for answers = 1'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_ANSWER_COUNTER_MAX_BG', + default=Color.NewFromHtml('#61380B').Blend( + Color.NewFromHtml('white'),0.75 + ).html, + description=_('Background color for answers = MAX'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_ANSWER_COUNTER_MAX_FG', + default='#ffff00', + description=_('Foreground color for answers = MAX'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_ANSWER_COUNTER_ACCEPTED_BG', + default=Color.NewFromHtml('darkgreen').Blend( + Color.NewFromHtml('white'),0.8 + ).html, + description=_('Background color for accepted'), + help_text=_('HTML color name of hex value') + ) +) + +settings.register( + StringValue( + SKIN_COUNTER_SETTINGS, + 'COLORS_ANSWER_COUNTER_ACCEPTED_FG', + default='#D0F5A9', + description=_('Foreground color for accepted answer'), + help_text=_('HTML color name of hex value') + ) +) diff --git a/askbot/conf/skin_general_settings.py b/askbot/conf/skin_general_settings.py new file mode 100644 index 00000000..b96f3424 --- /dev/null +++ b/askbot/conf/skin_general_settings.py @@ -0,0 +1,38 @@ +""" +General skin settings +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, StringValue, IntegerValue +from django.utils.translation import ugettext as _ +from askbot.skins.utils import get_skin_choices + +GENERAL_SKIN_SETTINGS = ConfigurationGroup( + 'GENERAL_SKIN_SETTINGS', + _('Skin: general settings'), + ) + +settings.register( + StringValue( + GENERAL_SKIN_SETTINGS, + 'ASKBOT_DEFAULT_SKIN', + default='default', + choices=get_skin_choices(), + description=_('Select skin'), + ) +) + +settings.register( + IntegerValue( + GENERAL_SKIN_SETTINGS, + 'MEDIA_RESOURCE_REVISION', + default=1, + description=_('Skin media revision number'), + help_text=_( + 'Increment this number when you change ' + 'image in skin media or stylesheet. ' + 'This helps avoid showing your users ' + 'outdated images from their browser cache.' + ) + ) +) + diff --git a/askbot/conf/user_settings.py b/askbot/conf/user_settings.py new file mode 100644 index 00000000..9add71b1 --- /dev/null +++ b/askbot/conf/user_settings.py @@ -0,0 +1,30 @@ +""" +User policy settings +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, BooleanValue, IntegerValue +from django.utils.translation import ugettext as _ + +USER_SETTINGS = ConfigurationGroup( + 'USER_SETTINGS', + _('User policy settings') + ) + +settings.register( + BooleanValue( + USER_SETTINGS, + 'EDITABLE_SCREEN_NAME', + default=True, + description=_('Allow editing user screen name') + ) +) + +settings.register( + IntegerValue( + USER_SETTINGS, + 'MIN_USERNAME_LENGTH', + hidden=True, + default=1, + description=_('Minimum allowed length for screen name') + ) +) diff --git a/askbot/conf/vote_rules.py b/askbot/conf/vote_rules.py new file mode 100644 index 00000000..a8b7d5f5 --- /dev/null +++ b/askbot/conf/vote_rules.py @@ -0,0 +1,69 @@ +""" +Forum configuration settings detailing rules on votes +and offensive flags. + +For example number of times a person can vote each day, etc. +""" +from askbot.conf.settings_wrapper import settings +from askbot.deps.livesettings import ConfigurationGroup, IntegerValue +from django.utils.translation import ugettext as _ + +VOTE_RULES = ConfigurationGroup( + 'VOTE_RULES', + _('Limits applicable to votes and moderation flags'), + ordering=1, + ) + +settings.register( + IntegerValue( + VOTE_RULES, + 'MAX_VOTES_PER_USER_PER_DAY', + default=30, + description=_('Number of votes a user can cast per day') + ) +) + +settings.register( + IntegerValue( + VOTE_RULES, + 'MAX_FLAGS_PER_USER_PER_DAY', + default=5, + description=_('Maximum number of flags per user per day') + ) +) + +settings.register( + IntegerValue( + VOTE_RULES, + 'VOTES_LEFT_WARNING_THRESHOLD', + default=5, + description=_('Threshold for warning about remaining daily votes') + ) +) + +settings.register( + IntegerValue( + VOTE_RULES, + 'MAX_DAYS_TO_CANCEL_VOTE', + default=1, + description=_('Number of days to allow canceling votes') + ) +) + +settings.register( + IntegerValue( + VOTE_RULES, + 'MIN_FLAGS_TO_HIDE_POST', + default=3, + description=_('Number of flags required to automatically hide posts') + ) +) + +settings.register( + IntegerValue( + VOTE_RULES, + 'MIN_FLAGS_TO_DELETE_POST', + default=5, + description=_('Number of flags required to automatically delete posts') + ) +) diff --git a/askbot/const/__init__.py b/askbot/const/__init__.py new file mode 100644 index 00000000..e813a4d8 --- /dev/null +++ b/askbot/const/__init__.py @@ -0,0 +1,211 @@ +# encoding:utf-8 +from django.utils.translation import ugettext as _ +import re +""" +All constants could be used in other modules +For reasons that models, views can't have unicode text in this project, all unicode text go here. +""" +CLOSE_REASONS = ( + (1, _('duplicate question')), + (2, _('question is off-topic or not relevant')), + (3, _('too subjective and argumentative')), + (4, _('not a real question')), + (5, _('the question is answered, right answer was accepted')), + (6, _('question is not relevant or outdated')), + (7, _('question contains offensive or malicious remarks')), + (8, _('spam or advertising')), + (9, _('too localized')), +) + +TYPE_REPUTATION = ( + (1, 'gain_by_upvoted'), + (2, 'gain_by_answer_accepted'), + (3, 'gain_by_accepting_answer'), + (4, 'gain_by_downvote_canceled'), + (5, 'gain_by_canceling_downvote'), + (-1, 'lose_by_canceling_accepted_answer'), + (-2, 'lose_by_accepted_answer_cancled'), + (-3, 'lose_by_downvoted'), + (-4, 'lose_by_flagged'), + (-5, 'lose_by_downvoting'), + (-6, 'lose_by_flagged_lastrevision_3_times'), + (-7, 'lose_by_flagged_lastrevision_5_times'), + (-8, 'lose_by_upvote_canceled'), +) + +#do not translate these!!! +POST_SORT_METHODS = ( + ('latest', _('newest')), + ('oldest', _('oldest')), + ('active', _('active')), + ('inactive', _('inactive')), + ('hottest', _('hottest')), + ('coldest', _('coldest')), + ('mostvoted', _('most voted')), + ('leastvoted', _('least voted')), + ('relevant', _('relevance')), + ) +#todo: add assertion here that all sort methods are unique +#because they are keys to the hash used in implementations of Q.run_advanced_search + +DEFAULT_POST_SORT_METHOD = 'active' +POST_SCOPE_LIST = ( + ('all', _('all')), + ('unanswered', _('unanswered')), + ('favorite', _('favorite')), + ) +DEFAULT_POST_SCOPE = 'all' +PAGE_SIZE_CHOICES = (('10', '10',), ('30', '30',), ('50', '50',),) +#todo: remove this duplication +QUESTIONS_PER_PAGE_USER_CHOICES = ( + (10, u'10'), + (30, u'30'), + (50, u'50'), +) + +UNANSWERED_QUESTION_MEANING_CHOICES = ( + ('NO_ANSWERS', _('Question has no answers')), + ('NO_ACCEPTED_ANSWERS', _('Question has no accepted answers')), +) +#todo: implement this +# ('NO_UPVOTED_ANSWERS',), +#) + +#todo: +#this probably needs to be language-specific +#and selectable/changeable from the admin interface +#however it will be hard to expect that people will type +#correct regexes - plus this must be an anchored regex +#to do full string match +TAG_REGEX = r'^[a-z0-9\+\.\-]+$' +TAG_SPLIT_REGEX = r'[ ,]+' + +TYPE_ACTIVITY_ASK_QUESTION=1 +TYPE_ACTIVITY_ANSWER=2 +TYPE_ACTIVITY_COMMENT_QUESTION=3 +TYPE_ACTIVITY_COMMENT_ANSWER=4 +TYPE_ACTIVITY_UPDATE_QUESTION=5 +TYPE_ACTIVITY_UPDATE_ANSWER=6 +TYPE_ACTIVITY_PRIZE=7 +TYPE_ACTIVITY_MARK_ANSWER=8 +TYPE_ACTIVITY_VOTE_UP=9 +TYPE_ACTIVITY_VOTE_DOWN=10 +TYPE_ACTIVITY_CANCEL_VOTE=11 +TYPE_ACTIVITY_DELETE_QUESTION=12 +TYPE_ACTIVITY_DELETE_ANSWER=13 +TYPE_ACTIVITY_MARK_OFFENSIVE=14 +TYPE_ACTIVITY_UPDATE_TAGS=15 +TYPE_ACTIVITY_FAVORITE=16 +TYPE_ACTIVITY_USER_FULL_UPDATED = 17 +TYPE_ACTIVITY_EMAIL_UPDATE_SENT = 18 +TYPE_ACTIVITY_MENTION = 19 +#TYPE_ACTIVITY_EDIT_QUESTION=17 +#TYPE_ACTIVITY_EDIT_ANSWER=18 + +#todo: rename this to TYPE_ACTIVITY_CHOICES +TYPE_ACTIVITY = ( + (TYPE_ACTIVITY_ASK_QUESTION, _('asked a question')), + (TYPE_ACTIVITY_ANSWER, _('answered a question')), + (TYPE_ACTIVITY_COMMENT_QUESTION, _('commented question')), + (TYPE_ACTIVITY_COMMENT_ANSWER, _('commented answer')), + (TYPE_ACTIVITY_UPDATE_QUESTION, _('edited question')), + (TYPE_ACTIVITY_UPDATE_ANSWER, _('edited answer')), + (TYPE_ACTIVITY_PRIZE, _('received award')), + (TYPE_ACTIVITY_MARK_ANSWER, _('marked best answer')), + (TYPE_ACTIVITY_VOTE_UP, _('upvoted')), + (TYPE_ACTIVITY_VOTE_DOWN, _('downvoted')), + (TYPE_ACTIVITY_CANCEL_VOTE, _('canceled vote')), + (TYPE_ACTIVITY_DELETE_QUESTION, _('deleted question')), + (TYPE_ACTIVITY_DELETE_ANSWER, _('deleted answer')), + (TYPE_ACTIVITY_MARK_OFFENSIVE, _('marked offensive')), + (TYPE_ACTIVITY_UPDATE_TAGS, _('updated tags')), + (TYPE_ACTIVITY_FAVORITE, _('selected favorite')), + (TYPE_ACTIVITY_USER_FULL_UPDATED, _('completed user profile')), + (TYPE_ACTIVITY_EMAIL_UPDATE_SENT, _('email update sent to user')), + (TYPE_ACTIVITY_MENTION, _('mentioned in the post')), +) + + +#MENTION activity is added implicitly, unfortunately +RESPONSE_ACTIVITY_TYPES_FOR_INSTANT_NOTIFICATIONS = ( + TYPE_ACTIVITY_COMMENT_QUESTION, + TYPE_ACTIVITY_COMMENT_ANSWER, + TYPE_ACTIVITY_UPDATE_ANSWER, + TYPE_ACTIVITY_UPDATE_QUESTION, + TYPE_ACTIVITY_ANSWER, + TYPE_ACTIVITY_ASK_QUESTION, +) + + +#the same as for instant notifications for now +#MENTION activity is added implicitly, unfortunately +RESPONSE_ACTIVITY_TYPES_FOR_DISPLAY = ( + TYPE_ACTIVITY_ANSWER, + TYPE_ACTIVITY_ASK_QUESTION, + TYPE_ACTIVITY_COMMENT_QUESTION, + TYPE_ACTIVITY_COMMENT_ANSWER, + TYPE_ACTIVITY_UPDATE_ANSWER, + TYPE_ACTIVITY_UPDATE_QUESTION, +# TYPE_ACTIVITY_PRIZE, +# TYPE_ACTIVITY_MARK_ANSWER, +# TYPE_ACTIVITY_VOTE_UP, +# TYPE_ACTIVITY_VOTE_DOWN, +# TYPE_ACTIVITY_CANCEL_VOTE, +# TYPE_ACTIVITY_DELETE_QUESTION, +# TYPE_ACTIVITY_DELETE_ANSWER, +# TYPE_ACTIVITY_MARK_OFFENSIVE, +# TYPE_ACTIVITY_FAVORITE, +) + + +RESPONSE_ACTIVITY_TYPE_MAP_FOR_TEMPLATES = { + TYPE_ACTIVITY_COMMENT_QUESTION: 'question_comment', + TYPE_ACTIVITY_COMMENT_ANSWER: 'answer_comment', + TYPE_ACTIVITY_UPDATE_ANSWER: 'answer_update', + TYPE_ACTIVITY_UPDATE_QUESTION: 'question_update', + TYPE_ACTIVITY_ANSWER: 'new_answer', + TYPE_ACTIVITY_ASK_QUESTION: 'new_question', + } + +assert( + set(RESPONSE_ACTIVITY_TYPES_FOR_INSTANT_NOTIFICATIONS) \ + == set(RESPONSE_ACTIVITY_TYPE_MAP_FOR_TEMPLATES.keys()) +) + +TYPE_RESPONSE = { + 'QUESTION_ANSWERED' : _('question_answered'), + 'QUESTION_COMMENTED': _('question_commented'), + 'ANSWER_COMMENTED' : _('answer_commented'), + 'ANSWER_ACCEPTED' : _('answer_accepted'), +} + +POST_STATUS = { + 'closed' : _('[closed]'), + 'deleted' : _('[deleted]'), + 'default_version' : _('initial version'), + 'retagged' : _('retagged'), +} + +#how to filter questions by tags in email digests? +TAG_EMAIL_FILTER_CHOICES = ( + ('ignored', _('exclude ignored tags')), + ('interesting',_('allow only selected tags')) +) + +NOTIFICATION_DELIVERY_SCHEDULE_CHOICES= ( + ('i',_('instantly')), + ('d',_('daily')), + ('w',_('weekly')), + ('n',_('no email')), + ) + +USERS_PAGE_SIZE = 28#todo: move it to settings? +USERNAME_REGEX_STRING = r'^[\w ]+$' + +#chars that can go before or after @mention +TWITTER_STYLE_MENTION_TERMINATION_CHARS = '\n ;,.!?<>' + +COMMENT_HARD_MAX_LENGTH = 2048 + +#an exception import * because that file has only strings +from askbot.const.message_keys import * diff --git a/askbot/const/message_keys.py b/askbot/const/message_keys.py new file mode 100644 index 00000000..f7f8e8e3 --- /dev/null +++ b/askbot/const/message_keys.py @@ -0,0 +1,19 @@ +""" +This file must hold keys for translatable messages +that are used as variables +it is important that a dummy _() function is used here +this way message key will be pulled into django.po +and can still be used as a variable in python files +""" +_ = lambda v:v + +#NOTE: all strings must be explicitly put into this dictionary, +#because you don't want to import _ from here with import * +__all__ = ['GREETING_FOR_ANONYMOUS_USER', ] + +#this variable is shown in settings, because +#the url within is configurable, the default is reverse('faq') +#if user changes url they will have to be able to fix the +#message translation too +GREETING_FOR_ANONYMOUS_USER = \ + _('First time here? Check out the FAQ!') diff --git a/askbot/context.py b/askbot/context.py new file mode 100644 index 00000000..3d246dd2 --- /dev/null +++ b/askbot/context.py @@ -0,0 +1,34 @@ +from django.conf import settings +from askbot.conf import settings as askbot_settings +def application_settings(context): + my_settings = askbot_settings.as_dict() + my_settings['LANGUAGE_CODE'] = settings.LANGUAGE_CODE + my_settings['FORUM_SCRIPT_ALIAS'] = settings.FORUM_SCRIPT_ALIAS + #print '\n'.join(sorted(my_settings.keys())) + return {'settings':my_settings} + +def auth_processor(request): + """ + Returns context variables required by apps that use Django's authentication + system. + + If there is no 'user' attribute in the request, uses AnonymousUser (from + django.contrib.auth). + """ + if hasattr(request, 'user'): + user = request.user + if user.is_authenticated(): + messages = user.message_set.all() + else: + messages = None + else: + from django.contrib.auth.models import AnonymousUser + user = AnonymousUser() + messages = None + + from django.core.context_processors import PermWrapper + return { + 'user': user, + 'messages': messages, + 'perms': PermWrapper(user), + } diff --git a/askbot/cron/README b/askbot/cron/README new file mode 100644 index 00000000..d5573150 --- /dev/null +++ b/askbot/cron/README @@ -0,0 +1,5 @@ +this directory contains sample commands to be executed +by cron + +files with names ending "virtuanenv" should work under Python virtualenv system +other files - with standard unix setup diff --git a/askbot/cron/askbot_cron_job b/askbot/cron/askbot_cron_job new file mode 100644 index 00000000..71910f27 --- /dev/null +++ b/askbot/cron/askbot_cron_job @@ -0,0 +1,18 @@ +#!/bin/sh +# this is a cron job for askbot that includes all +# commands that need to be run periodically +# please find introduction to cron here: +# http://www.unixgeeks.org/security/newbie/unix/cron-1.html +# +# if you prefer, you can split this file into several + +PROJECT_PARENT_DIR=/path/to/dir_containing_askbot_site +PROJECT_DIR_NAME=askbot_site + +export PYTHONPATH=$PROJECT_PARENT_DIR:$PYTHONPATH +PROJECT_ROOT=$PYTHONPATH/$PROJECT_NAME + +#these are actual commands that are to be run +python $PROJECT_ROOT/manage.py send_email_alerts +python $PROJECT_ROOT/manage.py once_award_badges +python $PROJECT_ROOT/manage.py multi_award_badges diff --git a/askbot/deps/README b/askbot/deps/README new file mode 100644 index 00000000..2dfee4dd --- /dev/null +++ b/askbot/deps/README @@ -0,0 +1,2 @@ +any python modules that are not accessible +through easy_install, but are necessary for the askbot forum diff --git a/askbot/deps/__init__.py b/askbot/deps/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/deps/django_authopenid/README b/askbot/deps/django_authopenid/README new file mode 100644 index 00000000..67c33d60 --- /dev/null +++ b/askbot/deps/django_authopenid/README @@ -0,0 +1,5 @@ +this is a forked version of django-authopenid module +specifically for askbot forum project. + +most likely it is not useful for anything else and +in fact will be phased out in askbot as well diff --git a/askbot/deps/django_authopenid/__init__.py b/askbot/deps/django_authopenid/__init__.py new file mode 100644 index 00000000..ff040ed7 --- /dev/null +++ b/askbot/deps/django_authopenid/__init__.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2007, 2008, Benoît Chesneau +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# * notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# * notice, this list of conditions and the following disclaimer in the +# * documentation and/or other materials provided with the +# * distribution. Neither the name of the nor the names +# * of its contributors may be used to endorse or promote products +# * derived from this software without specific prior written +# * permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +""" +Django authentification application to *with openid using django auth contrib/. + +This application allow a user to connect to you website with : + * legacy account : username/password + * openid url +""" + +__version__ = "0.9.4" diff --git a/askbot/deps/django_authopenid/admin.py b/askbot/deps/django_authopenid/admin.py new file mode 100644 index 00000000..38bb85c3 --- /dev/null +++ b/askbot/deps/django_authopenid/admin.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from django.contrib import admin +from askbot.deps.django_authopenid.models import UserAssociation + + +class UserAssociationAdmin(admin.ModelAdmin): + """User association admin class""" +admin.site.register(UserAssociation, UserAssociationAdmin) \ No newline at end of file diff --git a/askbot/deps/django_authopenid/forms.py b/askbot/deps/django_authopenid/forms.py new file mode 100644 index 00000000..8a997c2d --- /dev/null +++ b/askbot/deps/django_authopenid/forms.py @@ -0,0 +1,322 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2007, 2008, Benoît Chesneau +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# * notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# * notice, this list of conditions and the following disclaimer in the +# * documentation and/or other materials provided with the +# * distribution. Neither the name of the nor the names +# * of its contributors may be used to endorse or promote products +# * derived from this software without specific prior written +# * permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +from django import forms +from django.contrib.auth.models import User +from django.contrib.auth import authenticate +from django.utils.translation import ugettext as _ +from django.conf import settings +from askbot.conf import settings as askbot_settings +import types +import re +from django.utils.safestring import mark_safe +from recaptcha_django import ReCaptchaField +from askbot.utils.forms import NextUrlField, UserNameField, UserEmailField, SetPasswordForm +EXTERNAL_LOGIN_APP = settings.LOAD_EXTERNAL_LOGIN_APP() + +# needed for some linux distributions like debian +try: + from openid.yadis import xri +except ImportError: + from yadis import xri + +from askbot.utils.forms import clean_next +from askbot.deps.django_authopenid.models import ExternalLoginData + +__all__ = ['OpenidSigninForm', 'ClassicLoginForm', 'OpenidVerifyForm', + 'OpenidRegisterForm', 'ClassicRegisterForm', 'ChangePasswordForm', + 'ChangeEmailForm', 'EmailPasswordForm', 'DeleteForm', + 'ChangeOpenidForm'] + +class OpenidSigninForm(forms.Form): + """ signin form """ + openid_url = forms.CharField(max_length=255, widget=forms.widgets.TextInput(attrs={'class': 'openid-login-input', 'size':80})) + next = NextUrlField() + + def clean_openid_url(self): + """ test if openid is accepted """ + if 'openid_url' in self.cleaned_data: + openid_url = self.cleaned_data['openid_url'] + if xri.identifierScheme(openid_url) == 'XRI' and getattr( + settings, 'OPENID_DISALLOW_INAMES', False + ): + raise forms.ValidationError(_('i-names are not supported')) + return self.cleaned_data['openid_url'] + +class ClassicLoginForm(forms.Form): + """ legacy account signin form """ + next = NextUrlField() + username = UserNameField(required=False,skip_clean=True) + password = forms.CharField(max_length=128, + widget=forms.widgets.PasswordInput(attrs={'class':'required login'}), + required=False) + + def __init__(self, data=None, files=None, auto_id='id_%s', + prefix=None, initial=None): + super(ClassicLoginForm, self).__init__(data, files, auto_id, + prefix, initial) + self.user_cache = None + + def _clean_nonempty_field(self,field): + value = None + if field in self.cleaned_data: + value = str(self.cleaned_data[field]).strip() + if value == '': + value = None + self.cleaned_data[field] = value + return value + + def clean_username(self): + return self._clean_nonempty_field('username') + + def clean_password(self): + return self._clean_nonempty_field('password') + + def clean(self): + """ + this clean function actually cleans username and password + + test if password is valid for this username + this is really the "authenticate" function + also openid_auth is not an authentication backend + since it's written in a way that does not comply with + the Django convention + """ + + error_list = [] + username = self.cleaned_data['username'] + password = self.cleaned_data['password'] + + self.user_cache = None + if username and password: + if settings.USE_EXTERNAL_LEGACY_LOGIN == True: + pw_ok = False + try: + pw_ok = EXTERNAL_LOGIN_APP.api.check_password(username,password) + except forms.ValidationError, e: + error_list.extend(e.messages) + if pw_ok: + external_user = ExternalLoginData.objects.get(external_username=username) + if external_user.user == None: + return self.cleaned_data + user = external_user.user + openid_logins = user.userassociation_set.all() + + if len(openid_logins) > 0: + msg1 = _('Account with this name already exists on the askbot') + msg2 = _('can\'t have two logins to the same account yet, sorry.') + error_list.append(msg1) + error_list.append(msg2) + self._errors['__all__'] = forms.util.ErrorList(error_list) + return self.cleaned_data + else: + #synchronize password with external login + user.set_password(password) + user.save() + #this auth will always succeed + self.user_cache = authenticate(username=user.username,\ + password=password) + else: + #keep self.user_cache == None + #nothing to do, error message will be set below + pass + else: + self.user_cache = authenticate(username=username, password=password) + + if self.user_cache is None: + del self.cleaned_data['username'] + del self.cleaned_data['password'] + error_list.insert(0,(_("Please enter valid username and password " + "(both are case-sensitive)."))) + elif self.user_cache.is_active == False: + error_list.append(_("This account is inactive.")) + if len(error_list) > 0: + error_list.insert(0,_('Login failed.')) + elif password == None and username == None: + error_list.append(_('Please enter username and password')) + elif password == None: + error_list.append(_('Please enter your password')) + elif username == None: + error_list.append(_('Please enter user name')) + if len(error_list) > 0: + self._errors['__all__'] = forms.util.ErrorList(error_list) + return self.cleaned_data + + def get_user(self): + """ get authenticated user """ + return self.user_cache + + +class OpenidRegisterForm(forms.Form): + """ openid signin form """ + next = NextUrlField() + username = UserNameField() + email = UserEmailField() + +class OpenidVerifyForm(forms.Form): + """ openid verify form (associate an openid with an account) """ + next = NextUrlField() + username = UserNameField(must_exist=True) + password = forms.CharField(max_length=128, + widget=forms.widgets.PasswordInput(attrs={'class':'required login'})) + + def __init__(self, data=None, files=None, auto_id='id_%s', + prefix=None, initial=None): + super(OpenidVerifyForm, self).__init__(data, files, auto_id, + prefix, initial) + self.user_cache = None + + def clean_password(self): + """ test if password is valid for this user """ + if 'username' in self.cleaned_data and \ + 'password' in self.cleaned_data: + self.user_cache = authenticate( + username = self.cleaned_data['username'], + password = self.cleaned_data['password'] + ) + if self.user_cache is None: + raise forms.ValidationError(_("Please enter a valid \ + username and password. Note that both fields are \ + case-sensitive.")) + elif self.user_cache.is_active == False: + raise forms.ValidationError(_("This account is inactive.")) + return self.cleaned_data['password'] + + def get_user(self): + """ get authenticated user """ + return self.user_cache + +class ClassicRegisterForm(SetPasswordForm): + """ legacy registration form """ + + next = NextUrlField() + username = UserNameField() + email = UserEmailField() + #fields password1 and password2 are inherited + recaptcha = ReCaptchaField() + +class ChangePasswordForm(SetPasswordForm): + """ change password form """ + oldpw = forms.CharField(widget=forms.PasswordInput(attrs={'class':'required'}), + label=mark_safe(_('Current password'))) + + def __init__(self, data=None, user=None, *args, **kwargs): + if user is None: + raise TypeError("Keyword argument 'user' must be supplied") + super(ChangePasswordForm, self).__init__(data, *args, **kwargs) + self.user = user + + def clean_oldpw(self): + """ test old password """ + if not self.user.check_password(self.cleaned_data['oldpw']): + raise forms.ValidationError(_("Old password is incorrect. \ + Please enter the correct password.")) + return self.cleaned_data['oldpw'] + +class ChangeEmailForm(forms.Form): + """ change email form """ + email = UserEmailField(skip_clean=True) + + def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, \ + initial=None, user=None): + super(ChangeEmailForm, self).__init__(data, files, auto_id, + prefix, initial) + self.user = user + + def clean_email(self): + """ check if email don't exist """ + if 'email' in self.cleaned_data: + if askbot_settings.EMAIL_UNIQUE == True: + try: + user = User.objects.get(email = self.cleaned_data['email']) + if self.user and self.user == user: + return self.cleaned_data['email'] + except User.DoesNotExist: + return self.cleaned_data['email'] + except User.MultipleObjectsReturned: + raise forms.ValidationError(u'There is already more than one \ + account registered with that e-mail address. Please try \ + another.') + raise forms.ValidationError(u'This email is already registered \ + in our database. Please choose another.') + else: + return self.cleaned_data['email'] + +class ChangeopenidForm(forms.Form): + """ change openid form """ + openid_url = forms.CharField(max_length=255, + widget=forms.TextInput(attrs={'class': "required" })) + + def __init__(self, data=None, user=None, *args, **kwargs): + if user is None: + raise TypeError("Keyword argument 'user' must be supplied") + super(ChangeopenidForm, self).__init__(data, *args, **kwargs) + self.user = user + +class DeleteForm(forms.Form): + """ confirm form to delete an account """ + confirm = forms.CharField(widget=forms.CheckboxInput(attrs={'class':'required'})) + password = forms.CharField(widget=forms.PasswordInput(attrs={'class':'required'})) + + def __init__(self, data=None, files=None, auto_id='id_%s', + prefix=None, initial=None, user=None): + super(DeleteForm, self).__init__(data, files, auto_id, prefix, initial) + self.test_openid = False + self.user = user + + def clean_password(self): + """ check if we have to test a legacy account or not """ + if 'password' in self.cleaned_data: + if not self.user.check_password(self.cleaned_data['password']): + self.test_openid = True + return self.cleaned_data['password'] + + +class EmailPasswordForm(forms.Form): + """ send new password form """ + username = UserNameField(skip_clean=True,label=mark_safe(_('Your user name (required)'))) + + def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, + initial=None): + super(EmailPasswordForm, self).__init__(data, files, auto_id, + prefix, initial) + self.user_cache = None + + def clean_username(self): + """ get user for this username """ + if 'username' in self.cleaned_data: + try: + self.user_cache = User.objects.get( + username = self.cleaned_data['username']) + except: + raise forms.ValidationError(_("Incorrect username.")) + return self.cleaned_data['username'] diff --git a/askbot/deps/django_authopenid/middleware.py b/askbot/deps/django_authopenid/middleware.py new file mode 100644 index 00000000..2101813c --- /dev/null +++ b/askbot/deps/django_authopenid/middleware.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from askbot.deps.django_authopenid import mimeparse +from django.http import HttpResponseRedirect +from django.core.urlresolvers import reverse +from django.conf import settings +import logging + +__all__ = ["OpenIDMiddleware"] + +class OpenIDMiddleware(object): + """ + Populate request.openid. This comes either from cookie or from + session, depending on the presence of OPENID_USE_SESSIONS. + """ + def process_request(self, request): + request.openid = request.session.get('openid', None) + logging.debug('openid in session is: %s' % str(request.openid)) + + def process_response(self, request, response): + if response.status_code != 200 or len(response.content) < 200: + return response + path = request.get_full_path() + if path == "/" and request.META.has_key('HTTP_ACCEPT') and \ + mimeparse.best_match(['text/html', 'application/xrds+xml'], + request.META['HTTP_ACCEPT']) == 'application/xrds+xml': + logging.debug('redirecting to yadis_xrdf:%s' % reverse('yadis_xrdf')) + return HttpResponseRedirect(reverse('yadis_xrdf')) + return response diff --git a/askbot/deps/django_authopenid/mimeparse.py b/askbot/deps/django_authopenid/mimeparse.py new file mode 100644 index 00000000..ab02eab0 --- /dev/null +++ b/askbot/deps/django_authopenid/mimeparse.py @@ -0,0 +1,160 @@ +"""MIME-Type Parser + +This module provides basic functions for handling mime-types. It can handle +matching mime-types against a list of media-ranges. See section 14.1 of +the HTTP specification [RFC 2616] for a complete explaination. + + http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1 + +Contents: + - parse_mime_type(): Parses a mime-type into it's component parts. + - parse_media_range(): Media-ranges are mime-types with wild-cards and a 'q' quality parameter. + - quality(): Determines the quality ('q') of a mime-type when compared against a list of media-ranges. + - quality_parsed(): Just like quality() except the second parameter must be pre-parsed. + - best_match(): Choose the mime-type with the highest quality ('q') from a list of candidates. +""" + +__version__ = "0.1.1" +__author__ = 'Joe Gregorio' +__email__ = "joe@bitworking.org" +__credits__ = "" + +def parse_mime_type(mime_type): + """Carves up a mime_type and returns a tuple of the + (type, subtype, params) where 'params' is a dictionary + of all the parameters for the media range. + For example, the media range 'application/xhtml;q=0.5' would + get parsed into: + + ('application', 'xhtml', {'q', '0.5'}) + """ + parts = mime_type.split(";") + params = dict([tuple([s.strip() for s in param.split("=")])\ + for param in parts[1:] ]) + (type, subtype) = parts[0].split("/") + return (type.strip(), subtype.strip(), params) + +def parse_media_range(range): + """Carves up a media range and returns a tuple of the + (type, subtype, params) where 'params' is a dictionary + of all the parameters for the media range. + For example, the media range 'application/*;q=0.5' would + get parsed into: + + ('application', '*', {'q', '0.5'}) + + In addition this function also guarantees that there + is a value for 'q' in the params dictionary, filling it + in with a proper default if necessary. + """ + (type, subtype, params) = parse_mime_type(range) + if not params.has_key('q') or not params['q'] or \ + not float(params['q']) or float(params['q']) > 1\ + or float(params['q']) < 0: + params['q'] = '1' + return (type, subtype, params) + +def quality_parsed(mime_type, parsed_ranges): + """Find the best match for a given mime_type against + a list of media_ranges that have already been + parsed by parse_media_range(). Returns the + 'q' quality parameter of the best match, 0 if no + match was found. This function bahaves the same as quality() + except that 'parsed_ranges' must be a list of + parsed media ranges. """ + best_fitness = -1 + best_match = "" + best_fit_q = 0 + (target_type, target_subtype, target_params) =\ + parse_media_range(mime_type) + for (type, subtype, params) in parsed_ranges: + param_matches = reduce(lambda x, y: x+y, [1 for (key, value) in \ + target_params.iteritems() if key != 'q' and \ + params.has_key(key) and value == params[key]], 0) + if (type == target_type or type == '*' or target_type == '*') and \ + (subtype == target_subtype or subtype == '*' or target_subtype == '*'): + fitness = (type == target_type) and 100 or 0 + fitness += (subtype == target_subtype) and 10 or 0 + fitness += param_matches + if fitness > best_fitness: + best_fitness = fitness + best_fit_q = params['q'] + + return float(best_fit_q) + +def quality(mime_type, ranges): + """Returns the quality 'q' of a mime_type when compared + against the media-ranges in ranges. For example: + + >>> quality('text/html','text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5') + 0.7 + + """ + parsed_ranges = [parse_media_range(r) for r in ranges.split(",")] + return quality_parsed(mime_type, parsed_ranges) + +def best_match(supported, header): + """Takes a list of supported mime-types and finds the best + match for all the media-ranges listed in header. The value of + header must be a string that conforms to the format of the + HTTP Accept: header. The value of 'supported' is a list of + mime-types. + + >>> best_match(['application/xbel+xml', 'text/xml'], 'text/*;q=0.5,*/*; q=0.1') + 'text/xml' + """ + parsed_header = [parse_media_range(r) for r in header.split(",")] + weighted_matches = [(quality_parsed(mime_type, parsed_header), mime_type)\ + for mime_type in supported] + weighted_matches.sort() + return weighted_matches[-1][0] and weighted_matches[-1][1] or '' + +if __name__ == "__main__": + import unittest + + class TestMimeParsing(unittest.TestCase): + + def test_parse_media_range(self): + self.assert_(('application', 'xml', {'q': '1'}) == parse_media_range('application/xml;q=1')) + self.assertEqual(('application', 'xml', {'q': '1'}), parse_media_range('application/xml')) + self.assertEqual(('application', 'xml', {'q': '1'}), parse_media_range('application/xml;q=')) + self.assertEqual(('application', 'xml', {'q': '1'}), parse_media_range('application/xml ; q=')) + self.assertEqual(('application', 'xml', {'q': '1', 'b': 'other'}), parse_media_range('application/xml ; q=1;b=other')) + self.assertEqual(('application', 'xml', {'q': '1', 'b': 'other'}), parse_media_range('application/xml ; q=2;b=other')) + + def test_rfc_2616_example(self): + accept = "text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5" + self.assertEqual(1, quality("text/html;level=1", accept)) + self.assertEqual(0.7, quality("text/html", accept)) + self.assertEqual(0.3, quality("text/plain", accept)) + self.assertEqual(0.5, quality("image/jpeg", accept)) + self.assertEqual(0.4, quality("text/html;level=2", accept)) + self.assertEqual(0.7, quality("text/html;level=3", accept)) + + def test_best_match(self): + mime_types_supported = ['application/xbel+xml', 'application/xml'] + # direct match + self.assertEqual(best_match(mime_types_supported, 'application/xbel+xml'), 'application/xbel+xml') + # direct match with a q parameter + self.assertEqual(best_match(mime_types_supported, 'application/xbel+xml; q=1'), 'application/xbel+xml') + # direct match of our second choice with a q parameter + self.assertEqual(best_match(mime_types_supported, 'application/xml; q=1'), 'application/xml') + # match using a subtype wildcard + self.assertEqual(best_match(mime_types_supported, 'application/*; q=1'), 'application/xml') + # match using a type wildcard + self.assertEqual(best_match(mime_types_supported, '*/*'), 'application/xml') + + mime_types_supported = ['application/xbel+xml', 'text/xml'] + # match using a type versus a lower weighted subtype + self.assertEqual(best_match(mime_types_supported, 'text/*;q=0.5,*/*; q=0.1'), 'text/xml') + # fail to match anything + self.assertEqual(best_match(mime_types_supported, 'text/html,application/atom+xml; q=0.9'), '') + + def test_support_wildcards(self): + mime_types_supported = ['image/*', 'application/xml'] + # match using a type wildcard + self.assertEqual(best_match(mime_types_supported, 'image/png'), 'image/*') + # match using a wildcard for both requested and supported + self.assertEqual(best_match(mime_types_supported, 'image/*'), 'image/*') + + unittest.main() \ No newline at end of file diff --git a/askbot/deps/django_authopenid/models.py b/askbot/deps/django_authopenid/models.py new file mode 100644 index 00000000..a12c2fec --- /dev/null +++ b/askbot/deps/django_authopenid/models.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +from django.conf import settings +from django.contrib.auth.models import User +from django.db import models + +import hashlib, random, sys, os, time + +__all__ = ['Nonce', 'Association', 'UserAssociation', + 'UserPasswordQueueManager', 'UserPasswordQueue'] + +class Nonce(models.Model): + """ openid nonce """ + server_url = models.CharField(max_length=255) + timestamp = models.IntegerField() + salt = models.CharField(max_length=40) + + def __unicode__(self): + return u"Nonce: %s" % self.id + + +class Association(models.Model): + """ association openid url and lifetime """ + server_url = models.TextField(max_length=2047) + handle = models.CharField(max_length=255) + secret = models.TextField(max_length=255) # Stored base64 encoded + issued = models.IntegerField() + lifetime = models.IntegerField() + assoc_type = models.TextField(max_length=64) + + def __unicode__(self): + return u"Association: %s, %s" % (self.server_url, self.handle) + +class UserAssociation(models.Model): + """ + model to manage association between openid and user + """ + openid_url = models.CharField(blank=False, max_length=255) + user = models.ForeignKey(User, unique=True) + + def __unicode__(self): + return "Openid %s with user %s" % (self.openid_url, self.user) + +class UserPasswordQueueManager(models.Manager): + """ manager for UserPasswordQueue object """ + def get_new_confirm_key(self): + "Returns key that isn't being used." + # The random module is seeded when this Apache child is created. + # Use SECRET_KEY as added salt. + while 1: + confirm_key = hashlib.md5("%s%s%s%s" % ( + random.randint(0, sys.maxint - 1), os.getpid(), + time.time(), settings.SECRET_KEY)).hexdigest() + try: + self.get(confirm_key=confirm_key) + except self.model.DoesNotExist: + break + return confirm_key + + +class UserPasswordQueue(models.Model): + """ + model for new password queue. + """ + user = models.ForeignKey(User, unique=True) + new_password = models.CharField(max_length=30) + confirm_key = models.CharField(max_length=40) + + objects = UserPasswordQueueManager() + + def __unicode__(self): + return self.user.username + +class ExternalLoginData(models.Model): + """this class was added by Evgeny to associate + external authentication user with django user + probably it just does not belong here... (EF) + """ + external_username = models.CharField(max_length=40, unique=True, null=False) + external_session_data = models.TextField() + user = models.ForeignKey(User, null=True) diff --git a/askbot/deps/django_authopenid/urls.py b/askbot/deps/django_authopenid/urls.py new file mode 100644 index 00000000..b4293031 --- /dev/null +++ b/askbot/deps/django_authopenid/urls.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +from django.conf.urls.defaults import patterns, url +from django.utils.translation import ugettext as _ +from django.conf import settings + +#print 'stuff to import %s' % settings.EXTERNAL_LOGIN_APP.__name__ + '.views' +#try: +# settings.EXTERNAL_LOGIN_APP = __import__('mediawiki.views') +#print 'stuff to import %s' % settings.EXTERNAL_LOGIN_APP.__name__ + '.views' +#try: +# print 'imported fine' +# print settings.EXTERNAL_LOGIN_APP.__dict__.keys() +#except: +# print 'dammit!' +#from mediawiki.views import signup_view +#settings.EXTERNAL_LOGIN_APP.views.signup_view() + +#print settings.EXTERNAL_LOGIN_APP.__dict__.keys() +urlpatterns = patterns('askbot.deps.django_authopenid.views', + # yadis rdf + url(r'^yadis.xrdf$', 'xrdf', name='yadis_xrdf'), + # manage account registration + url(r'^%s$' % _('signin/'), 'signin', name='user_signin'), + url(r'^%s%s$' % (_('signin/'),_('newquestion/')), 'signin', kwargs = {'newquestion':True}, name='user_signin_new_question'), + url(r'^%s%s$' % (_('signin/'),_('newanswer/')), 'signin', kwargs = {'newanswer':True}, name='user_signin_new_answer'), + url(r'^%s$' % _('signout/'), 'signout', name='user_signout'), + url(r'^%s%s$' % (_('signin/'), _('complete/')), 'complete_signin', + name='user_complete_signin'), + url(r'^%s$' % _('register/'), 'register', name='user_register'), + url(r'^%s$' % _('signup/'), 'signup', name='user_signup'), + #disable current sendpw function + url(r'^%s$' % _('sendpw/'), 'sendpw', name='user_sendpw'), + url(r'^%s%s$' % (_('password/'), _('confirm/')), 'confirmchangepw', name='user_confirmchangepw'), + + # manage account settings + url(r'^$', 'account_settings', name='user_account_settings'), + url(r'^%s$' % _('password/'), 'changepw', name='user_changepw'), + url(r'^%s%s$' % (_('email/'),_('validate/')), 'changeemail', name='user_validateemail',kwargs = {'action':'validate'}), + url(r'^%s%s$' % (_('email/'), _('change/')), 'changeemail', name='user_changeemail'), + url(r'^%s%s$' % (_('email/'), _('sendkey/')), 'send_email_key', name='send_email_key'), + url(r'^%s%s(?P\d+)/(?P[\dabcdef]{32})/$' % (_('email/'), _('verify/')), 'verifyemail', name='user_verifyemail'), + url(r'^%s$' % _('openid/'), 'changeopenid', name='user_changeopenid'), + url(r'^%s$' % _('delete/'), 'delete', name='user_delete'), +) + +#todo move these out of this file completely +if settings.USE_EXTERNAL_LEGACY_LOGIN: + from askbot.forms import NotARobotForm + EXTERNAL_LOGIN_APP = settings.LOAD_EXTERNAL_LOGIN_APP() + urlpatterns += patterns('', + url('^%s$' % _('external-login/forgot-password/'),\ + 'askbot.deps.django_authopenid.views.external_legacy_login_info', \ + name='user_external_legacy_login_issues'), + url('^%s$' % _('external-login/signup/'), \ + EXTERNAL_LOGIN_APP.views.signup,\ + name='user_external_legacy_login_signup'), +# url('^%s$' % _('external-login/signup/'), \ +# EXTERNAL_LOGIN_APP.forms.RegisterFormWizard( \ +# [EXTERNAL_LOGIN_APP.forms.RegisterForm, \ +# NotARobotForm]),\ +# name='user_external_legacy_login_signup'), + ) diff --git a/askbot/deps/django_authopenid/util.py b/askbot/deps/django_authopenid/util.py new file mode 100644 index 00000000..7de38d79 --- /dev/null +++ b/askbot/deps/django_authopenid/util.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- +from openid.store.interface import OpenIDStore +from openid.association import Association as OIDAssociation +from openid.extensions import sreg +import openid.store + +from django.db.models.query import Q +from django.conf import settings +from django.core.urlresolvers import reverse + +# needed for some linux distributions like debian +try: + from openid.yadis import xri +except: + from yadis import xri + +import time, base64, hashlib, operator, logging +from askbot.utils.forms import clean_next, get_next_url + +from models import Association, Nonce + +__all__ = ['OpenID', 'DjangoOpenIDStore', 'from_openid_response', 'clean_next'] + +class OpenID: + def __init__(self, openid_, issued, attrs=None, sreg_=None): + logging.debug('init janrain openid object') + self.openid = openid_ + self.issued = issued + self.attrs = attrs or {} + self.sreg = sreg_ or {} + self.is_iname = (xri.identifierScheme(openid_) == 'XRI') + + def __repr__(self): + return '' % self.openid + + def __str__(self): + return self.openid + +class DjangoOpenIDStore(OpenIDStore): + def __init__(self): + self.max_nonce_age = 6 * 60 * 60 # Six hours + + def storeAssociation(self, server_url, association): + assoc = Association( + server_url = server_url, + handle = association.handle, + secret = base64.encodestring(association.secret), + issued = association.issued, + lifetime = association.issued, + assoc_type = association.assoc_type + ) + assoc.save() + + def getAssociation(self, server_url, handle=None): + assocs = [] + if handle is not None: + assocs = Association.objects.filter( + server_url = server_url, handle = handle + ) + else: + assocs = Association.objects.filter( + server_url = server_url + ) + if not assocs: + return None + associations = [] + for assoc in assocs: + association = OIDAssociation( + assoc.handle, base64.decodestring(assoc.secret), assoc.issued, + assoc.lifetime, assoc.assoc_type + ) + if association.getExpiresIn() == 0: + self.removeAssociation(server_url, assoc.handle) + else: + associations.append((association.issued, association)) + if not associations: + return None + return associations[-1][1] + + def removeAssociation(self, server_url, handle): + assocs = list(Association.objects.filter( + server_url = server_url, handle = handle + )) + assocs_exist = len(assocs) > 0 + for assoc in assocs: + assoc.delete() + return assocs_exist + + def useNonce(self, server_url, timestamp, salt): + if abs(timestamp - time.time()) > openid.store.nonce.SKEW: + return False + + query = [ + Q(server_url__exact=server_url), + Q(timestamp__exact=timestamp), + Q(salt__exact=salt), + ] + try: + ononce = Nonce.objects.get(reduce(operator.and_, query)) + except Nonce.DoesNotExist: + ononce = Nonce( + server_url=server_url, + timestamp=timestamp, + salt=salt + ) + ononce.save() + return True + + ononce.delete() + + return False + + def cleanupNonce(self): + Nonce.objects.filter(timestamp nor the names +# * of its contributors may be used to endorse or promote products +# * derived from this software without specific prior written +# * permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from django.http import HttpResponseRedirect, get_host, Http404, \ + HttpResponseServerError +from django.shortcuts import render_to_response +from django.template import RequestContext, loader, Context +from django.conf import settings +from askbot.conf import settings as askbot_settings +from django.contrib.auth.models import User +from django.contrib.auth.decorators import login_required +from django.contrib.auth import authenticate +from django.core.urlresolvers import reverse +from django.utils.encoding import smart_unicode +from django.utils.html import escape +from django.utils.translation import ugettext as _ +from django.utils.http import urlquote_plus +from django.utils.safestring import mark_safe +from django.core.mail import send_mail +from django.views.defaults import server_error + +from openid.consumer.consumer import Consumer, \ + SUCCESS, CANCEL, FAILURE, SETUP_NEEDED +from openid.consumer.discover import DiscoveryFailure +from openid.extensions import sreg +# needed for some linux distributions like debian +try: + from openid.yadis import xri +except ImportError: + from yadis import xri + +import re +import urllib + +from askbot.forms import SimpleEmailSubscribeForm +from askbot.deps.django_authopenid.util import OpenID, DjangoOpenIDStore, from_openid_response +from askbot.deps.django_authopenid.models import UserAssociation, UserPasswordQueue, ExternalLoginData +from askbot.deps.django_authopenid.forms import OpenidSigninForm, ClassicLoginForm, OpenidRegisterForm, \ + OpenidVerifyForm, ClassicRegisterForm, ChangePasswordForm, ChangeEmailForm, \ + ChangeopenidForm, DeleteForm, EmailPasswordForm +import logging +from askbot.utils.forms import get_next_url + +EXTERNAL_LOGIN_APP = settings.LOAD_EXTERNAL_LOGIN_APP() + +#todo: decouple from askbot +def login(request,user): + from django.contrib.auth import login as _login + from askbot.models import signals + + if settings.USE_EXTERNAL_LEGACY_LOGIN == True: + EXTERNAL_LOGIN_APP.api.login(request,user) + + #1) get old session key + session_key = request.session.session_key + #2) get old search state + search_state = None + if 'search_state' in request.session: + search_state = request.session['search_state'] + + #3) login and get new session key + _login(request,user) + #4) transfer search_state to new session if found + if search_state: + search_state.set_logged_in() + request.session['search_state'] = search_state + #5) send signal with old session key as argument + logging.debug('logged in user %s with session key %s' % (user.username, session_key)) + #todo: move to auth app + signals.user_logged_in.send(user=user,session_key=session_key,sender=None) + +#todo: uncouple this from askbot +def logout(request): + from django.contrib.auth import logout as _logout#for login I've added wrapper below - called login + if 'search_state' in request.session: + request.session['search_state'].set_logged_out() + request.session.modified = True + _logout(request) + if settings.USE_EXTERNAL_LEGACY_LOGIN == True: + EXTERNAL_LOGIN_APP.api.logout(request) + +def get_url_host(request): + if request.is_secure(): + protocol = 'https' + else: + protocol = 'http' + host = escape(get_host(request)) + return '%s://%s' % (protocol, host) + +def get_full_url(request): + return get_url_host(request) + request.get_full_path() + +def ask_openid(request, openid_url, redirect_to, on_failure=None, + sreg_request=None): + """ basic function to ask openid and return response """ + request.encoding = 'UTF-8' + on_failure = on_failure or signin_failure + + trust_root = getattr( + settings, 'OPENID_TRUST_ROOT', get_url_host(request) + '/' + ) + if xri.identifierScheme(openid_url) == 'XRI' and getattr( + settings, 'OPENID_DISALLOW_INAMES', False + ): + msg = _("i-names are not supported") + logging.debug('openid failed becaise i-names are not supported') + return on_failure(request, msg) + consumer = Consumer(request.session, DjangoOpenIDStore()) + try: + auth_request = consumer.begin(openid_url) + except DiscoveryFailure: + msg = _(u"OpenID %(openid_url)s is invalid" % {'openid_url':openid_url}) + logging.debug(msg) + return on_failure(request, msg) + + logging.debug('openid seemed to work') + if sreg_request: + logging.debug('adding sreg_request - wtf it is?') + auth_request.addExtension(sreg_request) + redirect_url = auth_request.redirectURL(trust_root, redirect_to) + logging.debug('redirecting to %s' % redirect_url) + return HttpResponseRedirect(redirect_url) + +def complete(request, on_success=None, on_failure=None, return_to=None): + """ complete openid signin """ + on_success = on_success or default_on_success + on_failure = on_failure or default_on_failure + + logging.debug('in askbot.deps.django_authopenid.complete') + + consumer = Consumer(request.session, DjangoOpenIDStore()) + # make sure params are encoded in utf8 + params = dict((k,smart_unicode(v)) for k, v in request.GET.items()) + openid_response = consumer.complete(params, return_to) + + if openid_response.status == SUCCESS: + logging.debug('SUCCESS') + return on_success(request, openid_response.identity_url, + openid_response) + elif openid_response.status == CANCEL: + logging.debug('CANCEL') + return on_failure(request, 'The request was canceled') + elif openid_response.status == FAILURE: + logging.debug('FAILURE') + return on_failure(request, openid_response.message) + elif openid_response.status == SETUP_NEEDED: + logging.debug('SETUP NEEDED') + return on_failure(request, 'Setup needed') + else: + logging.debug('BAD OPENID STATUS') + assert False, "Bad openid status: %s" % openid_response.status + +def default_on_success(request, identity_url, openid_response): + """ default action on openid signin success """ + logging.debug('') + request.session['openid'] = from_openid_response(openid_response) + logging.debug('performing default action on openid success %s' % get_next_url(request)) + return HttpResponseRedirect(get_next_url(request)) + +def default_on_failure(request, message): + """ default failure action on signin """ + logging.debug('default openid failure action') + return render_to_response('openid_failure.html', { + 'message': message + }) + + +def not_authenticated(func): + """ decorator that redirect user to next page if + he is already logged.""" + def decorated(request, *args, **kwargs): + if request.user.is_authenticated(): + return HttpResponseRedirect(get_next_url(request)) + return func(request, *args, **kwargs) + return decorated + +@not_authenticated +def signin(request,newquestion=False,newanswer=False): + """ + signin page. It manages the legacy authentification (user/password) + and openid authentification + + url: /signin/ + + template : authopenid/signin.htm + """ + logging.debug('in signin view') + request.encoding = 'UTF-8' + on_failure = signin_failure + email_feeds_form = SimpleEmailSubscribeForm() + next = get_next_url(request) + form_signin = OpenidSigninForm(initial={'next':next}) + form_auth = ClassicLoginForm(initial={'next':next}) + + if request.method == 'POST': + #'blogin' - password login + if 'blogin' in request.POST.keys(): + logging.debug('processing classic login form submission') + form_auth = ClassicLoginForm(request.POST) + if form_auth.is_valid(): + #have login and password and need to login through external website + if settings.USE_EXTERNAL_LEGACY_LOGIN == True: + username = form_auth.cleaned_data['username'] + password = form_auth.cleaned_data['password'] + next = form_auth.cleaned_data['next'] + if form_auth.get_user() == None: + #need to create internal user + + #1) save login and password temporarily in session + request.session['external_username'] = username + request.session['external_password'] = password + + #2) try to extract user email and nickname from external service + email = EXTERNAL_LOGIN_APP.api.get_email(username,password) + screen_name = EXTERNAL_LOGIN_APP.api.get_screen_name(username,password) + + #3) see if username clashes with some existing user + #if so, we have to prompt the user to pick a different name + username_taken = User.is_username_taken(screen_name) + + email_feeds_form = SimpleEmailSubscribeForm() + form_data = {'username':screen_name,'email':email,'next':next} + form = OpenidRegisterForm(initial=form_data) + template_data = {'form1':form,'username':screen_name,\ + 'email_feeds_form':email_feeds_form,\ + 'provider':mark_safe(settings.EXTERNAL_LEGACY_LOGIN_PROVIDER_NAME),\ + 'login_type':'legacy',\ + 'gravatar_faq_url':reverse('faq') + '#gravatar',\ + 'external_login_name_is_taken':username_taken} + return render_to_response('authopenid/complete.html',template_data,\ + context_instance=RequestContext(request)) + else: + #user existed, external password is ok + user = form_auth.get_user() + login(request,user) + response = HttpResponseRedirect(get_next_url(request)) + EXTERNAL_LOGIN_APP.api.set_login_cookies(response,user) + return response + else: + #regular password authentication + user = form_auth.get_user() + login(request, user) + return HttpResponseRedirect(get_next_url(request)) + + elif 'bnewaccount' in request.POST.keys(): + logging.debug('processing classic (login/password) create account form submission') + #register externally logged in password user with a new local account + if settings.USE_EXTERNAL_LEGACY_LOGIN == True: + form = OpenidRegisterForm(request.POST) + email_feeds_form = SimpleEmailSubscribeForm(request.POST) + form1_is_valid = form.is_valid() + form2_is_valid = email_feeds_form.is_valid() + if form1_is_valid and form2_is_valid: + #create the user + username = form.cleaned_data['username'] + password = request.session.get('external_password',None) + email = form.cleaned_data['email'] + if password and username: + User.objects.create_user(username,email,password) + user = authenticate(username=username,password=password) + EXTERNAL_LOGIN_APP.api.connect_local_user_to_external_user(user,username,password) + external_username = request.session['external_username'] + eld = ExternalLoginData.objects.get(external_username=external_username) + eld.user = user + eld.save() + login(request,user) + email_feeds_form.save(user) + del request.session['external_username'] + del request.session['external_password'] + response = HttpResponseRedirect(reverse('index')) + EXTERNAL_LOGIN_APP.api.set_login_cookies(response, user) + return response + else: + if password: + del request.session['external_username'] + if username: + del request.session['external_password'] + return HttpResponseServerError() + else: + username = request.POST.get('username',None) + provider = mark_safe(settings.EXTERNAL_LEGACY_LOGIN_PROVIDER_NAME) + username_taken = User.is_username_taken(username) + data = {'login_type':'legacy','form1':form,'username':username,\ + 'email_feeds_form':email_feeds_form,'provider':provider,\ + 'gravatar_faq_url':reverse('faq') + '#gravatar',\ + 'external_login_name_is_taken':username_taken} + return render_to_response('authopenid/complete.html',data, + context_instance=RequestContext(request)) + else: + raise Http404 + + elif 'bsignin' in request.POST.keys() or 'openid_username' in request.POST.keys(): + logging.debug('processing signin with openid submission') + form_signin = OpenidSigninForm(request.POST) + if form_signin.is_valid(): + logging.debug('OpenidSigninForm is valid') + next = form_signin.cleaned_data['next'] + sreg_req = sreg.SRegRequest(optional=['nickname', 'email']) + redirect_to = "%s%s?%s" % ( + get_url_host(request), + reverse('user_complete_signin'), + urllib.urlencode({'next':next}) + ) + return ask_openid(request, + form_signin.cleaned_data['openid_url'], + redirect_to, + on_failure=signin_failure, + sreg_request=sreg_req) + else: + logging.debug('OpenidSigninForm is NOT valid! -> redisplay login view') + + #if request is GET + if request.method == 'GET': + logging.debug('request method was GET') + question = None + if newquestion == True: + from askbot.models import AnonymousQuestion as AQ + session_key = request.session.session_key + logging.debug('retrieving anonymously posted question associated with session %s' % session_key) + qlist = AQ.objects.filter(session_key=session_key).order_by('-added_at') + if len(qlist) > 0: + question = qlist[0] + answer = None + if newanswer == True: + from askbot.models import AnonymousAnswer as AA + session_key = request.session.session_key + logging.debug('retrieving posted answer associated with session %s' % session_key) + alist = AA.objects.filter(session_key=session_key).order_by('-added_at') + if len(alist) > 0: + answer = alist[0] + + logging.debug('showing signin view') + return render_to_response('authopenid/signin.html', { + 'question':question, + 'answer':answer, + 'form1': form_auth, + 'form2': form_signin, + 'msg': request.GET.get('msg',''), + 'sendpw_url': reverse('user_sendpw'), + 'fb_api_key': askbot_settings.FB_API_KEY, + }, context_instance=RequestContext(request)) + +def complete_signin(request): + """ in case of complete signin with openid """ + logging.debug('')#blank log just for the trace + return complete(request, signin_success, signin_failure, + get_url_host(request) + reverse('user_complete_signin')) + +def signin_success(request, identity_url, openid_response): + """ + openid signin success. + + If the openid is already registered, the user is redirected to + url set par next or in settings with OPENID_REDIRECT_NEXT variable. + If none of these urls are set user is redirectd to /. + + if openid isn't registered user is redirected to register page. + """ + + logging.debug('') + openid_ = from_openid_response(openid_response) #create janrain OpenID object + request.session['openid'] = openid_ + try: + logging.debug('trying to get user associated with this openid...') + rel = UserAssociation.objects.get(openid_url__exact = str(openid_)) + logging.debug('success') + except: + logging.debug('failed --> try to register brand new user') + # try to register this new user + return register(request) + user_ = rel.user + if user_.is_active: + user_.backend = "django.contrib.auth.backends.ModelBackend" + logging.debug('user is active --> attached django auth ModelBackend --> calling login') + login(request, user_) + logging.debug('success') + else: + logging.debug('user is inactive, do not log them in') + logging.debug('redirecting to %s' % get_next_url(request)) + return HttpResponseRedirect(get_next_url(request)) + +def is_association_exist(openid_url): + """ test if an openid is already in database """ + is_exist = True + try: + uassoc = UserAssociation.objects.get(openid_url__exact = openid_url) + except: + is_exist = False + logging.debug(str(is_exist)) + return is_exist + +@not_authenticated +def register(request): + """ + register an openid. + + If user is already a member he can associate its openid with + its account. + + A new account could also be created and automaticaly associated + to the openid. + + url : /complete/ + + template : authopenid/complete.html + """ + + logging.debug('') + openid_ = request.session.get('openid', None) + next = get_next_url(request) + if not openid_: + logging.debug('oops, no openid in session --> go back to signin') + return HttpResponseRedirect(reverse('user_signin') + '?next=%s' % next) + + nickname = openid_.sreg.get('nickname', '') + email = openid_.sreg.get('email', '') + form1 = OpenidRegisterForm(initial={ + 'next': next, + 'username': nickname, + 'email': email, + }) + form2 = OpenidVerifyForm(initial={ + 'next': next, + 'username': nickname, + }) + email_feeds_form = SimpleEmailSubscribeForm() + + user_ = None + is_redirect = False + logging.debug('request method is %s' % request.method) + if request.method == 'POST': + if 'bnewaccount' in request.POST.keys(): + logging.debug('trying to create new account associated with openid') + form1 = OpenidRegisterForm(request.POST) + email_feeds_form = SimpleEmailSubscribeForm(request.POST) + if not form1.is_valid(): + logging.debug('OpenidRegisterForm is INVALID') + elif not email_feeds_form.is_valid(): + logging.debug('SimpleEmailSubscribeForm is INVALID') + else: + logging.debug('OpenidRegisterForm and SimpleEmailSubscribeForm are valid') + next = form1.cleaned_data['next'] + is_redirect = True + logging.debug('creatng new django user %s ...' % form1.cleaned_data['username']) + tmp_pwd = User.objects.make_random_password() + user_ = User.objects.create_user(form1.cleaned_data['username'], + form1.cleaned_data['email'], tmp_pwd) + + user_.set_unusable_password() + # make association with openid + logging.debug('creating new openid user association %s <--> %s' \ + % (user_.username, str(openid_))) + uassoc = UserAssociation(openid_url=str(openid_), user_id=user_.id) + uassoc.save() + + # login + user_.backend = "django.contrib.auth.backends.ModelBackend" + logging.debug('logging the user in') + login(request, user_) + logging.debug('saving email feed settings') + email_feeds_form.save(user_) + elif 'bverify' in request.POST.keys(): + logging.debug('processing OpenidVerify form') + form2 = OpenidVerifyForm(request.POST) + if form2.is_valid(): + logging.debug('form is valid') + is_redirect = True + next = form2.cleaned_data['next'] + user_ = form2.get_user() + logging.debug('creating new openid user association %s <--> %s' \ + % (user_.username, str(openid_))) + uassoc = UserAssociation(openid_url=str(openid_), + user_id=user_.id) + uassoc.save() + logging.debug('logging the user in') + login(request, user_) + + #check if we need to post a question that was added anonymously + #this needs to be a function call becase this is also done + #if user just logged in and did not need to create the new account + + if user_ != None: + if askbot_settings.EMAIL_VALIDATION == True: + logging.debug('sending email validation') + send_new_email_key(user_,nomessage=True) + output = validation_email_sent(request) + set_email_validation_message(user_) #message set after generating view + return output + if user_.is_authenticated(): + logging.debug('success, send user to main page') + return HttpResponseRedirect(reverse('index')) + else: + logging.debug('have really strange error') + raise Exception('openid login failed')#should not ever get here + + openid_str = str(openid_) + bits = openid_str.split('/') + base_url = bits[2] #assume this is base url + url_bits = base_url.split('.') + provider_name = url_bits[-2].lower() + + providers = {'yahoo':'Yahoo!', + 'flickr':'flickr™', + 'google':'Google™', + 'aol':'AOL', + 'myopenid':'MyOpenID', + } + if provider_name not in providers: + provider_logo = provider_name + logging.error('openid provider named "%s" has no pretty customized logo' % provider_name) + else: + provider_logo = providers[provider_name] + + logging.debug('printing authopenid/complete.html output') + return render_to_response('authopenid/complete.html', { + 'form1': form1, + 'form2': form2, + 'email_feeds_form': email_feeds_form, + 'provider':mark_safe(provider_logo), + 'username': nickname, + 'email': email, + 'login_type':'openid', + 'gravatar_faq_url':reverse('faq') + '#gravatar', + }, context_instance=RequestContext(request)) + +def signin_failure(request, message): + """ + falure with openid signin. Go back to signin page. + + template : "authopenid/signin.html" + """ + logging.debug('') + next = get_next_url(request) + form_signin = OpenidSigninForm(initial={'next': next}) + form_auth = ClassicLoginForm(initial={'next': next}) + + return render_to_response('authopenid/signin.html', { + 'msg': message, + 'form1': form_auth, + 'form2': form_signin, + }, context_instance=RequestContext(request)) + +@not_authenticated +def signup(request): + """ + signup page. Create a legacy account + + url : /signup/" + + templates: authopenid/signup.html, authopenid/confirm_email.txt + """ + logging.debug('') + if settings.USE_EXTERNAL_LEGACY_LOGIN == True: + logging.debug('handling external legacy login registration') + return HttpResponseRedirect(reverse('user_external_legacy_login_signup')) + next = get_next_url(request) + logging.debug('request method was %s' % request.method) + if request.method == 'POST': + form = ClassicRegisterForm(request.POST) + email_feeds_form = SimpleEmailSubscribeForm(request.POST) + + #validation outside if to remember form values + logging.debug('validating classic register form') + form1_is_valid = form.is_valid() + logging.debug('classic register form validated') + form2_is_valid = email_feeds_form.is_valid() + logging.debug('email feeds form validated') + if form1_is_valid and form2_is_valid: + logging.debug('both forms are valid') + next = form.cleaned_data['next'] + username = form.cleaned_data['username'] + password = form.cleaned_data['password1'] + email = form.cleaned_data['email'] + + user_ = User.objects.create_user( username,email,password ) + logging.debug('new user %s created' % username) + if settings.USE_EXTERNAL_LEGACY_LOGIN == True: + EXTERNAL_LOGIN_APP.api.create_user(username,email,password) + + user_.backend = "django.contrib.auth.backends.ModelBackend" + login(request, user_) + logging.debug('new user logged in') + email_feeds_form.save(user_) + logging.debug('email feeds form saved') + + # send email + subject = _("Welcome email subject line") + message_template = loader.get_template( + 'authopenid/confirm_email.txt' + ) + message_context = Context({ + 'signup_url': askbot_settings.APP_URL + reverse('user_signin'), + 'username': username, + 'password': password, + }) + message = message_template.render(message_context) + send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, + [user_.email]) + logging.debug('new user with login and password created, confirmation email sent!') + return HttpResponseRedirect(next) + else: + logging.debug('create classic account forms were invalid') + else: + form = ClassicRegisterForm(initial={'next':next}) + email_feeds_form = SimpleEmailSubscribeForm() + logging.debug('printing legacy signup form') + return render_to_response('authopenid/signup.html', { + 'form': form, + 'email_feeds_form': email_feeds_form + }, context_instance=RequestContext(request)) + #what if request is not posted? + +@login_required +def signout(request): + """ + signout from the website. Remove openid from session and kill it. + + url : /signout/" + """ + logging.debug('') + try: + logging.debug('deleting openid session var') + del request.session['openid'] + except KeyError: + logging.debug('failed') + pass + logout(request) + logging.debug('user logged out') + return HttpResponseRedirect(get_next_url(request)) + +def xrdf(request): + url_host = get_url_host(request) + logging.debug('what does this do??') + return_to = [ + "%s%s" % (url_host, reverse('user_complete_signin')) + ] + return render_to_response('authopenid/yadis.xrdf', { + 'return_to': return_to + }, context_instance=RequestContext(request)) + +@login_required +def account_settings(request): + """ + index pages to changes some basic account settings : + - change password + - change email + - associate a new openid + - delete account + + url : / + + template : authopenid/settings.html + """ + logging.debug('') + msg = request.GET.get('msg', '') + is_openid = True + + try: + uassoc = UserAssociation.objects.get( + user__username__exact=request.user.username + ) + except: + is_openid = False + + + return render_to_response('authopenid/settings.html', { + 'msg': msg, + 'is_openid': is_openid + }, context_instance=RequestContext(request)) + +@login_required +def changepw(request): + """ + change password view. + + url : /changepw/ + template: authopenid/changepw.html + """ + logging.debug('') + user_ = request.user + + if user_.has_usable_password(): + if settings.USE_EXTERNAL_LEGACY_LOGIN == True: + return HttpResponseRedirect(reverse('user_external_legacy_login_issues')) + else: + raise Http404 + + if request.POST: + form = ChangePasswordForm(request.POST, user=user_) + if form.is_valid(): + user_.set_password(form.cleaned_data['password1']) + user_.save() + msg = _("Password changed.") + redirect = "%s?msg=%s" % ( + reverse('user_account_settings'), + urlquote_plus(msg)) + return HttpResponseRedirect(redirect) + else: + form = ChangePasswordForm(user=user_) + + return render_to_response('authopenid/changepw.html', {'form': form }, + context_instance=RequestContext(request)) + +def find_email_validation_messages(user): + msg_text = _('your email needs to be validated see %(details_url)s') \ + % {'details_url':reverse('faq') + '#validate'} + return user.message_set.filter(message__exact=msg_text) + +def set_email_validation_message(user): + messages = find_email_validation_messages(user) + msg_text = _('your email needs to be validated see %(details_url)s') \ + % {'details_url':reverse('faq') + '#validate'} + if len(messages) == 0: + user.message_set.create(message=msg_text) + +def clear_email_validation_message(user): + messages = find_email_validation_messages(user) + messages.delete() + +def set_new_email(user, new_email, nomessage=False): + if new_email != user.email: + user.email = new_email + user.email_isvalid = False + user.save() + if askbot_settings.EMAIL_VALIDATION == True: + send_new_email_key(user,nomessage=nomessage) + +def _send_email_key(user): + """private function. sends email containing validation key + to user's email address + """ + subject = _("Email verification subject line") + message_template = loader.get_template('authopenid/email_validation.txt') + import settings + message_context = Context({ + 'validation_link': askbot_settings.APP_URL + reverse('user_verifyemail', kwargs={'id':user.id,'key':user.email_key}) + }) + message = message_template.render(message_context) + send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [user.email]) + +def send_new_email_key(user,nomessage=False): + import random + random.seed() + user.email_key = '%032x' % random.getrandbits(128) + user.save() + _send_email_key(user) + if nomessage==False: + set_email_validation_message(user) + +@login_required +def send_email_key(request): + """ + url = /email/sendkey/ + + view that is shown right after sending email key + email sending is called internally + + raises 404 if email validation is off + if current email is valid shows 'key_not_sent' view of + authopenid/changeemail.html template + """ + + if askbot_settings.EMAIL_VALIDATION == True: + if request.user.email_isvalid: + return render_to_response('authopenid/changeemail.html', + { 'email': request.user.email, + 'action_type': 'key_not_sent', + 'change_link': reverse('user_changeemail')}, + context_instance=RequestContext(request) + ) + else: + send_new_email_key(request.user) + return validation_email_sent(request) + else: + raise Http404 + + +#internal server view used as return value by other views +def validation_email_sent(request): + logging.debug('') + return render_to_response('authopenid/changeemail.html', + { 'email': request.user.email, + 'change_email_url': reverse('user_changeemail'), + 'action_type': 'validate', }, + context_instance=RequestContext(request)) + +def verifyemail(request,id=None,key=None): + """ + view that is shown when user clicks email validation link + url = /email/verify/{{user.id}}/{{user.email_key}}/ + """ + logging.debug('') + if askbot.settings.EMAIL_VALIDATION == True: + user = User.objects.get(id=id) + if user: + if user.email_key == key: + user.email_isvalid = True + clear_email_validation_message(user) + user.save() + return render_to_response('authopenid/changeemail.html', { + 'action_type': 'validation_complete', + }, context_instance=RequestContext(request)) + else: + logging.error('hmm, no user found for email validation message - foul play?') + raise Http404 + +@login_required +def changeemail(request, action='change'): + """ + changeemail view. requires openid with request type GET + + url: /email/* + + template : authopenid/changeemail.html + """ + logging.debug('') + msg = request.GET.get('msg', None) + extension_args = {} + user_ = request.user + + if request.POST: + if 'cancel' in request.POST: + msg = _('your email was not changed') + request.user.message_set.create(message=msg) + return HttpResponseRedirect(get_next_url(request)) + form = ChangeEmailForm(request.POST, user=user_) + if form.is_valid(): + new_email = form.cleaned_data['email'] + if new_email != user_.email: + if askbot_settings.EMAIL_VALIDATION == True: + action = 'validate' + else: + action = 'done_novalidate' + set_new_email(user_, new_email,nomessage=True) + else: + action = 'keep' + + elif not request.POST and 'openid.mode' in request.GET: + redirect_to = get_url_host(request) + reverse('user_changeemail') + return complete(request, emailopenid_success, + emailopenid_failure, redirect_to) + else: + form = ChangeEmailForm(initial={'email': user_.email}, + user=user_) + + output = render_to_response('authopenid/changeemail.html', { + 'form': form, + 'email': user_.email, + 'action_type': action, + 'gravatar_faq_url': reverse('faq') + '#gravatar', + 'change_email_url': reverse('user_changeemail'), + 'msg': msg + }, context_instance=RequestContext(request)) + + if action == 'validate': + set_email_validation_message(user_) + + return output + +def emailopenid_success(request, identity_url, openid_response): + logging.debug('') + openid_ = from_openid_response(openid_response) + + user_ = request.user + try: + uassoc = UserAssociation.objects.get( + openid_url__exact=identity_url + ) + except: + return emailopenid_failure(request, + _("No OpenID %s found associated in our database" % identity_url)) + + if uassoc.user.username != request.user.username: + return emailopenid_failure(request, + _("The OpenID %s isn't associated to current user logged in" % + identity_url)) + + new_email = request.session.get('new_email', '') + if new_email: + user_.email = new_email + user_.save() + del request.session['new_email'] + msg = _("Email Changed.") + + redirect = "%s?msg=%s" % (reverse('user_account_settings'), + urlquote_plus(msg)) + return HttpResponseRedirect(redirect) + + +def emailopenid_failure(request, message): + logging.debug('') + redirect_to = "%s?msg=%s" % ( + reverse('user_changeemail'), urlquote_plus(message)) + return HttpResponseRedirect(redirect_to) + +@login_required +def changeopenid(request): + """ + change openid view. Allow user to change openid + associated to its username. + + url : /changeopenid/ + + template: authopenid/changeopenid.html + """ + logging.error('change openid view - never tested it yet!!!') + + extension_args = {} + openid_url = '' + has_openid = True + msg = request.GET.get('msg', '') + + user_ = request.user + + try: + uopenid = UserAssociation.objects.get(user=user_) + openid_url = uopenid.openid_url + except: + has_openid = False + + redirect_to = get_url_host(request) + reverse('user_changeopenid') + if request.POST and has_openid: + form = ChangeopenidForm(request.POST, user=user_) + if form.is_valid(): + return ask_openid(request, form.cleaned_data['openid_url'], + redirect_to, on_failure=changeopenid_failure) + elif not request.POST and has_openid: + if 'openid.mode' in request.GET: + return complete(request, changeopenid_success, + changeopenid_failure, redirect_to) + + form = ChangeopenidForm(initial={'openid_url': openid_url }, user=user_) + return render_to_response('authopenid/changeopenid.html', { + 'form': form, + 'has_openid': has_openid, + 'msg': msg + }, context_instance=RequestContext(request)) + +def changeopenid_success(request, identity_url, openid_response): + logging.error('never tested this worflow') + openid_ = from_openid_response(openid_response) + is_exist = True + try: + uassoc = UserAssociation.objects.get(openid_url__exact=identity_url) + except: + is_exist = False + + if not is_exist: + try: + uassoc = UserAssociation.objects.get( + user__username__exact=request.user.username + ) + uassoc.openid_url = identity_url + uassoc.save() + except: + uassoc = UserAssociation(user=request.user, + openid_url=identity_url) + uassoc.save() + elif uassoc.user.username != request.user.username: + return changeopenid_failure(request, + _('This OpenID is already associated with another account.')) + + request.session['openids'] = [] + request.session['openids'].append(openid_) + + msg = _("OpenID %s is now associated with your account." % identity_url) + redirect = "%s?msg=%s" % ( + reverse('user_account_settings'), + urlquote_plus(msg)) + return HttpResponseRedirect(redirect) + + +def changeopenid_failure(request, message): + logging.error('never tested this workflow') + redirect_to = "%s?msg=%s" % ( + reverse('user_changeopenid'), + urlquote_plus(message)) + return HttpResponseRedirect(redirect_to) + +@login_required +def delete(request): + """ + delete view. Allow user to delete its account. Password/openid are required to + confirm it. He should also check the confirm checkbox. + + url : /delete + + template : authopenid/delete.html + """ + logging.error('deleting account - never tested this') + + extension_args = {} + + user_ = request.user + + redirect_to = get_url_host(request) + reverse('user_delete') + if request.POST: + form = DeleteForm(request.POST, user=user_) + if form.is_valid(): + if not form.test_openid: + user_.delete() + return signout(request) + else: + return ask_openid(request, form.cleaned_data['password'], + redirect_to, on_failure=deleteopenid_failure) + elif not request.POST and 'openid.mode' in request.GET: + return complete(request, deleteopenid_success, deleteopenid_failure, + redirect_to) + + form = DeleteForm(user=user_) + + msg = request.GET.get('msg','') + return render_to_response('authopenid/delete.html', { + 'form': form, + 'msg': msg, + }, context_instance=RequestContext(request)) + +def deleteopenid_success(request, identity_url, openid_response): + logging.error('never tested this') + openid_ = from_openid_response(openid_response) + + user_ = request.user + try: + uassoc = UserAssociation.objects.get( + openid_url__exact=identity_url + ) + except: + return deleteopenid_failure(request, + _("No OpenID %s found associated in our database" % identity_url)) + + if uassoc.user.username == user_.username: + user_.delete() + return signout(request) + else: + return deleteopenid_failure(request, + _("The OpenID %s isn't associated to current user logged in" % + identity_url)) + + msg = _("Account deleted.") + redirect = reverse('index') + u"/?msg=%s" % (urlquote_plus(msg)) + return HttpResponseRedirect(redirect) + + +def deleteopenid_failure(request, message): + logging.error('never tested this') + redirect_to = "%s?msg=%s" % (reverse('user_delete'), urlquote_plus(message)) + return HttpResponseRedirect(redirect_to) + +def external_legacy_login_info(request): + logging.debug('maybe this view does not belong in this library') + feedback_url = reverse('feedback') + return render_to_response('authopenid/external_legacy_login_info.html', + {'feedback_url':feedback_url}, + context_instance=RequestContext(request)) + +def sendpw(request): + """ + send a new password to the user. It return a mail with + a new pasword and a confirm link in. To activate the + new password, the user should click on confirm link. + + url : /sendpw/ + + templates : authopenid/sendpw_email.txt, authopenid/sendpw.html + """ + logging.debug('') + if settings.USE_EXTERNAL_LEGACY_LOGIN == True: + logging.debug('delegating to view dealing with external password recovery') + return HttpResponseRedirect(reverse('user_external_legacy_login_issues')) + + msg = request.GET.get('msg','') + logging.debug('request method is %s' % request.method) + if request.method == 'POST': + form = EmailPasswordForm(request.POST) + if form.is_valid(): + logging.debug('EmailPasswordForm is valid') + new_pw = User.objects.make_random_password() + confirm_key = UserPasswordQueue.objects.get_new_confirm_key() + try: + uqueue = UserPasswordQueue.objects.get( + user=form.user_cache + ) + except: + uqueue = UserPasswordQueue( + user=form.user_cache + ) + uqueue.new_password = new_pw + uqueue.confirm_key = confirm_key + uqueue.save() + # send email + subject = _("Request for new password") + message_template = loader.get_template( + 'authopenid/sendpw_email.txt') + key_link = askbot_settings.APP_URL + reverse('user_confirmchangepw') + '?key=' + confirm_key + logging.debug('emailing new password for %s' % form.user_cache.username) + message_context = Context({ + 'site_url': askbot_settings.APP_URL + reverse('index'), + 'key_link': key_link, + 'username': form.user_cache.username, + 'password': new_pw, + }) + message = message_template.render(message_context) + send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, + [form.user_cache.email]) + msg = _("A new password and the activation link were sent to your email address.") + else: + form = EmailPasswordForm() + + logging.debug('showing reset password form') + return render_to_response('authopenid/sendpw.html', { + 'form': form, + 'msg': msg + }, context_instance=RequestContext(request)) + +def confirmchangepw(request): + """ + view to set new password when the user click on confirm link + in its mail. Basically it check if the confirm key exist, then + replace old password with new password and remove confirm + ley from the queue. Then it redirect the user to signin + page. + + url : /sendpw/confirm/?key + + """ + logging.debug('') + confirm_key = request.GET.get('key', '') + if not confirm_key: + logging.error('someone called confirm password without a key!') + return HttpResponseRedirect(reverse('index')) + + try: + uqueue = UserPasswordQueue.objects.get( + confirm_key__exact=confirm_key + ) + except: + msg = _("Could not change password. Confirmation key '%s'\ + is not registered." % confirm_key) + logging.error(msg) + redirect = "%s?msg=%s" % ( + reverse('user_sendpw'), urlquote_plus(msg)) + return HttpResponseRedirect(redirect) + + try: + user_ = User.objects.get(id=uqueue.user.id) + except: + msg = _("Can not change password. User don't exist anymore \ + in our database.") + logging.error(msg) + redirect = "%s?msg=%s" % (reverse('user_sendpw'), + urlquote_plus(msg)) + return HttpResponseRedirect(redirect) + + user_.set_password(uqueue.new_password) + user_.save() + uqueue.delete() + msg = _("Password changed for %s. You may now sign in." % + user_.username) + logging.debug(msg) + redirect = "%s?msg=%s" % (reverse('user_signin'), + urlquote_plus(msg)) + + return HttpResponseRedirect(redirect) diff --git a/askbot/deps/grapefruit.py b/askbot/deps/grapefruit.py new file mode 100644 index 00000000..ca684745 --- /dev/null +++ b/askbot/deps/grapefruit.py @@ -0,0 +1,1973 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*-# + +# Copyright (c) 2008, Xavier Basty +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +'''GrapeFruit - Color manipulation in Python''' + +# $Id: grapefruit.py 31 2008-06-15 10:48:06Z xbasty $ +__author__ = 'Xavier Basty ' +__version__ = '0.1a3' + + +# The default white reference, use 2° Standard Observer, D65 (daylight) +_DEFAULT_WREF = (0.95043, 1.00000, 1.08890) + +_oneThird = 1.0 / 3 +_srgbGammaCorrInv = 0.03928 / 12.92 +_sixteenHundredsixteenth = 16.0 / 116 + +_RybWheel = ( + 0, 26, 52, + 83, 120, 130, + 141, 151, 162, + 177, 190, 204, + 218, 232, 246, + 261, 275, 288, + 303, 317, 330, + 338, 345, 352, + 360) + +_RgbWheel = ( + 0, 8, 17, + 26, 34, 41, + 48, 54, 60, + 81, 103, 123, + 138, 155, 171, + 187, 204, 219, + 234, 251, 267, + 282, 298, 329, + 360) + +class Color: + '''Hold a color value. + + Example usage: + + To create an instance of the grapefruit.Color from RGB values: + + >>> import grapefruit + >>> r, g, b = 1, 0.5, 0 + >>> col = grapefruit.Color.NewFromRgb(r, g, b) + + To get the values of the color in another colorspace: + + >>> h, s, v = col.hsv + >>> l, a, b = col.lab + + To get the complementary of a color: + + >>> compl = col.ComplementaryColor() + >>> print compl.hsl + (210.0, 1.0, 0.5) + + To directly convert RGB values to their HSL equivalent: + + >>> h, s, l = Color.RgbToHsl(r, g, b) + + ''' + + WHITE_REFERENCE = { + 'std_A' : (1.09847, 1.00000, 0.35582), + 'std_B' : (0.99093, 1.00000, 0.85313), + 'std_C' : (0.98071, 1.00000, 1.18225), + 'std_D50' : (0.96421, 1.00000, 0.82519), + 'std_D55' : (0.95680, 1.00000, 0.92148), + 'std_D65' : (0.95043, 1.00000, 1.08890), + 'std_D75' : (0.94972, 1.00000, 1.22639), + 'std_E' : (1.00000, 1.00000, 1.00000), + 'std_F1' : (0.92834, 1.00000, 1.03665), + 'std_F2' : (0.99145, 1.00000, 0.67316), + 'std_F3' : (1.03753, 1.00000, 0.49861), + 'std_F4' : (1.09147, 1.00000, 0.38813), + 'std_F5' : (0.90872, 1.00000, 0.98723), + 'std_F6' : (0.97309, 1.00000, 0.60191), + 'std_F7' : (0.95017, 1.00000, 1.08630), + 'std_F8' : (0.96413, 1.00000, 0.82333), + 'std_F9' : (1.00365, 1.00000, 0.67868), + 'std_F10' : (0.96174, 1.00000, 0.81712), + 'std_F11' : (1.00899, 1.00000, 0.64262), + 'std_F12' : (1.08046, 1.00000, 0.39228), + 'sup_A' : (1.11142, 1.00000, 0.35200), + 'sup_B' : (0.99178, 1.00000, 0.84349), + 'sup_C' : (0.97286, 1.00000, 1.16145), + 'sup_D50' : (0.96721, 1.00000, 0.81428), + 'sup_D55' : (0.95797, 1.00000, 0.90925), + 'sup_D65' : (0.94810, 1.00000, 1.07305), + 'sup_D75' : (0.94417, 1.00000, 1.20643), + 'sup_E' : (1.00000, 1.00000, 1.00000), + 'sup_F1' : (0.94791, 1.00000, 1.03191), + 'sup_F2' : (1.03245, 1.00000, 0.68990), + 'sup_F3' : (1.08968, 1.00000, 0.51965), + 'sup_F4' : (1.14961, 1.00000, 0.40963), + 'sup_F5' : (0.93369, 1.00000, 0.98636), + 'sup_F6' : (1.02148, 1.00000, 0.62074), + 'sup_F7' : (0.95780, 1.00000, 1.07618), + 'sup_F8' : (0.97115, 1.00000, 0.81135), + 'sup_F9' : (1.02116, 1.00000, 0.67826), + 'sup_F10' : (0.99001, 1.00000, 0.83134), + 'sup_F11' : (1.03820, 1.00000, 0.65555), + 'sup_F12' : (1.11428, 1.00000, 0.40353)} + + NAMED_COLOR = { + 'aliceblue': '#f0f8ff', + 'antiquewhite': '#faebd7', + 'aqua': '#00ffff', + 'aquamarine': '#7fffd4', + 'azure': '#f0ffff', + 'beige': '#f5f5dc', + 'bisque': '#ffe4c4', + 'black': '#000000', + 'blanchedalmond': '#ffebcd', + 'blue': '#0000ff', + 'blueviolet': '#8a2be2', + 'brown': '#a52a2a', + 'burlywood': '#deb887', + 'cadetblue': '#5f9ea0', + 'chartreuse': '#7fff00', + 'chocolate': '#d2691e', + 'coral': '#ff7f50', + 'cornflowerblue': '#6495ed', + 'cornsilk': '#fff8dc', + 'crimson': '#dc143c', + 'cyan': '#00ffff', + 'darkblue': '#00008b', + 'darkcyan': '#008b8b', + 'darkgoldenrod': '#b8860b', + 'darkgray': '#a9a9a9', + 'darkgrey': '#a9a9a9', + 'darkgreen': '#006400', + 'darkkhaki': '#bdb76b', + 'darkmagenta': '#8b008b', + 'darkolivegreen': '#556b2f', + 'darkorange': '#ff8c00', + 'darkorchid': '#9932cc', + 'darkred': '#8b0000', + 'darksalmon': '#e9967a', + 'darkseagreen': '#8fbc8f', + 'darkslateblue': '#483d8b', + 'darkslategray': '#2f4f4f', + 'darkslategrey': '#2f4f4f', + 'darkturquoise': '#00ced1', + 'darkviolet': '#9400d3', + 'deeppink': '#ff1493', + 'deepskyblue': '#00bfff', + 'dimgray': '#696969', + 'dimgrey': '#696969', + 'dodgerblue': '#1e90ff', + 'firebrick': '#b22222', + 'floralwhite': '#fffaf0', + 'forestgreen': '#228b22', + 'fuchsia': '#ff00ff', + 'gainsboro': '#dcdcdc', + 'ghostwhite': '#f8f8ff', + 'gold': '#ffd700', + 'goldenrod': '#daa520', + 'gray': '#808080', + 'grey': '#808080', + 'green': '#008000', + 'greenyellow': '#adff2f', + 'honeydew': '#f0fff0', + 'hotpink': '#ff69b4', + 'indianred': '#cd5c5c', + 'indigo': '#4b0082', + 'ivory': '#fffff0', + 'khaki': '#f0e68c', + 'lavender': '#e6e6fa', + 'lavenderblush': '#fff0f5', + 'lawngreen': '#7cfc00', + 'lemonchiffon': '#fffacd', + 'lightblue': '#add8e6', + 'lightcoral': '#f08080', + 'lightcyan': '#e0ffff', + 'lightgoldenrodyellow': '#fafad2', + 'lightgreen': '#90ee90', + 'lightgray': '#d3d3d3', + 'lightgrey': '#d3d3d3', + 'lightpink': '#ffb6c1', + 'lightsalmon': '#ffa07a', + 'lightseagreen': '#20b2aa', + 'lightskyblue': '#87cefa', + 'lightslategray': '#778899', + 'lightslategrey': '#778899', + 'lightsteelblue': '#b0c4de', + 'lightyellow': '#ffffe0', + 'lime': '#00ff00', + 'limegreen': '#32cd32', + 'linen': '#faf0e6', + 'magenta': '#ff00ff', + 'maroon': '#800000', + 'mediumaquamarine': '#66cdaa', + 'mediumblue': '#0000cd', + 'mediumorchid': '#ba55d3', + 'mediumpurple': '#9370db', + 'mediumseagreen': '#3cb371', + 'mediumslateblue': '#7b68ee', + 'mediumspringgreen': '#00fa9a', + 'mediumturquoise': '#48d1cc', + 'mediumvioletred': '#c71585', + 'midnightblue': '#191970', + 'mintcream': '#f5fffa', + 'mistyrose': '#ffe4e1', + 'moccasin': '#ffe4b5', + 'navajowhite': '#ffdead', + 'navy': '#000080', + 'oldlace': '#fdf5e6', + 'olive': '#808000', + 'olivedrab': '#6b8e23', + 'orange': '#ffa500', + 'orangered': '#ff4500', + 'orchid': '#da70d6', + 'palegoldenrod': '#eee8aa', + 'palegreen': '#98fb98', + 'paleturquoise': '#afeeee', + 'palevioletred': '#db7093', + 'papayawhip': '#ffefd5', + 'peachpuff': '#ffdab9', + 'peru': '#cd853f', + 'pink': '#ffc0cb', + 'plum': '#dda0dd', + 'powderblue': '#b0e0e6', + 'purple': '#800080', + 'red': '#ff0000', + 'rosybrown': '#bc8f8f', + 'royalblue': '#4169e1', + 'saddlebrown': '#8b4513', + 'salmon': '#fa8072', + 'sandybrown': '#f4a460', + 'seagreen': '#2e8b57', + 'seashell': '#fff5ee', + 'sienna': '#a0522d', + 'silver': '#c0c0c0', + 'skyblue': '#87ceeb', + 'slateblue': '#6a5acd', + 'slategray': '#708090', + 'slategrey': '#708090', + 'snow': '#fffafa', + 'springgreen': '#00ff7f', + 'steelblue': '#4682b4', + 'tan': '#d2b48c', + 'teal': '#008080', + 'thistle': '#d8bfd8', + 'tomato': '#ff6347', + 'turquoise': '#40e0d0', + 'violet': '#ee82ee', + 'wheat': '#f5deb3', + 'white': '#ffffff', + 'whitesmoke': '#f5f5f5', + 'yellow': '#ffff00', + 'yellowgreen': '#9acd32'} + + def __init__(self, values, mode='rgb', alpha=1.0, wref=_DEFAULT_WREF): + '''Instantiate a new grapefruit.Color object. + + Parameters: + :values: + The values of this color, in the specified representation. + :mode: + The representation mode used for values. + :alpha: + the alpha value (transparency) of this color. + :wref: + The whitepoint reference, default is 2° D65. + + ''' + if not(isinstance(values, tuple)): + raise TypeError, 'values must be a tuple' + + if mode=='rgb': + self.__rgb = values + self.__hsl = Color.RgbToHsl(*values) + elif mode=='hsl': + self.__hsl = values + self.__rgb = Color.HslToRgb(*values) + else: + raise ValueError('Invalid color mode: ' + mode) + + self.__a = alpha + self.__wref = wref + + def __ne__(self, other): + return not self.__eq__(other) + + def __eq__(self, other): + try: + if isinstance(other, Color): + return (self.__rgb==other.__rgb) and (self.__a==other.__a) + + if len(other) != 4: + return False + rgba = self.__rgb + (self.__a,) + return reduce(lambda x, y: x and (y[0]==y[1]), zip(rgba, other), True) + except TypeError: + return False + except AttributeError: + return False + + def __repr__(self): + return str(self.__rgb + (self.__a,)) + + def __str__(self): + '''A string representation of this grapefruit.Color instance. + + Returns: + The RGBA representation of this grapefruit.Color instance. + + ''' + return '(%g, %g, %g, %g)' % (self.__rgb + (self.__a,)) + + def __unicode__(self): + '''A unicode string representation of this grapefruit.Color instance. + + Returns: + The RGBA representation of this grapefruit.Color instance. + + ''' + return u'(%g, %g, %g, %g)' % (self.__rgb + (self.__a,)) + + def __iter__(self): + return iter(self.__rgb + (self.__a,)) + + def __len__(self): + return 4 + + @staticmethod + def RgbToHsl(r, g, b): + '''Convert the color from RGB coordinates to HSL. + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + + Returns: + The color as an (h, s, l) tuple in the range: + h[0...360], + s[0...1], + l[0...1] + + >>> Color.RgbToHsl(1, 0.5, 0) + (30.0, 1.0, 0.5) + + ''' + minVal = min(r, g, b) # min RGB value + maxVal = max(r, g, b) # max RGB value + + l = (maxVal + minVal) / 2.0 + if minVal==maxVal: + return (0.0, 0.0, l) # achromatic (gray) + + d = maxVal - minVal # delta RGB value + + if l < 0.5: s = d / (maxVal + minVal) + else: s = d / (2.0 - maxVal - minVal) + + dr, dg, db = [(maxVal-val) / d for val in (r, g, b)] + + if r==maxVal: + h = db - dg + elif g==maxVal: + h = 2.0 + dr - db + else: + h = 4.0 + dg - dr + + h = (h*60.0) % 360.0 + return (h, s, l) + + @staticmethod + def _HueToRgb(n1, n2, h): + h %= 6.0 + if h < 1.0: return n1 + ((n2-n1) * h) + if h < 3.0: return n2 + if h < 4.0: return n1 + ((n2-n1) * (4.0 - h)) + return n1 + + @staticmethod + def HslToRgb(h, s, l): + '''Convert the color from HSL coordinates to RGB. + + Parameters: + :h: + The Hue component value [0...1] + :s: + The Saturation component value [0...1] + :l: + The Lightness component value [0...1] + + Returns: + The color as an (r, g, b) tuple in the range: + r[0...1], + g[0...1], + b[0...1] + + >>> Color.HslToRgb(30.0, 1.0, 0.5) + (1.0, 0.5, 0.0) + + ''' + if s==0: return (l, l, l) # achromatic (gray) + + if l<0.5: n2 = l * (1.0 + s) + else: n2 = l+s - (l*s) + + n1 = (2.0 * l) - n2 + + h /= 60.0 + hueToRgb = Color._HueToRgb + r = hueToRgb(n1, n2, h + 2) + g = hueToRgb(n1, n2, h) + b = hueToRgb(n1, n2, h - 2) + + return (r, g, b) + + @staticmethod + def RgbToHsv(r, g, b): + '''Convert the color from RGB coordinates to HSV. + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + + Returns: + The color as an (h, s, v) tuple in the range: + h[0...360], + s[0...1], + v[0...1] + + >>> Color.RgbToHsv(1, 0.5, 0) + (30.0, 1, 1) + + ''' + v = max(r, g, b) + d = v - min(r, g, b) + if d==0: return (0.0, 0.0, v) + s = d / v + + dr, dg, db = [(v - val) / d for val in (r, g, b)] + + if r==v: + h = db - dg # between yellow & magenta + elif g==v: + h = 2.0 + dr - db # between cyan & yellow + else: # b==v + h = 4.0 + dg - dr # between magenta & cyan + + h = (h*60.0) % 360.0 + return (h, s, v) + + @staticmethod + def HsvToRgb(h, s, v): + '''Convert the color from RGB coordinates to HSV. + + Parameters: + :h: + The Hus component value [0...1] + :s: + The Saturation component value [0...1] + :v: + The Value component [0...1] + + Returns: + The color as an (r, g, b) tuple in the range: + r[0...1], + g[0...1], + b[0...1] + + >>> Color.HslToRgb(30.0, 1.0, 0.5) + (1.0, 0.5, 0.0) + + ''' + if s==0: return (v, v, v) # achromatic (gray) + + h /= 60.0 + h = h % 6.0 + + i = int(h) + f = h - i + if not(i&1): f = 1-f # if i is even + + m = v * (1.0 - s) + n = v * (1.0 - (s * f)) + + if i==0: return (v, n, m) + if i==1: return (n, v, m) + if i==2: return (m, v, n) + if i==3: return (m, n, v) + if i==4: return (n, m, v) + return (v, m, n) + + @staticmethod + def RgbToYiq(r, g, b): + '''Convert the color from RGB to YIQ. + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + + Returns: + The color as an (y, i, q) tuple in the range: + y[0...1], + i[0...1], + q[0...1] + + >>> '(%g, %g, %g)' % Color.RgbToYiq(1, 0.5, 0) + '(0.592263, 0.458874, -0.0499818)' + + ''' + y = (r * 0.29895808) + (g * 0.58660979) + (b *0.11443213) + i = (r * 0.59590296) - (g * 0.27405705) - (b *0.32184591) + q = (r * 0.21133576) - (g * 0.52263517) + (b *0.31129940) + return (y, i, q) + + @staticmethod + def YiqToRgb(y, i, q): + '''Convert the color from YIQ coordinates to RGB. + + Parameters: + :y: + Tte Y component value [0...1] + :i: + The I component value [0...1] + :q: + The Q component value [0...1] + + Returns: + The color as an (r, g, b) tuple in the range: + r[0...1], + g[0...1], + b[0...1] + + >>> '(%g, %g, %g)' % Color.YiqToRgb(0.592263, 0.458874, -0.0499818) + '(1, 0.5, 5.442e-007)' + + ''' + r = y + (i * 0.9562) + (q * 0.6210) + g = y - (i * 0.2717) - (q * 0.6485) + b = y - (i * 1.1053) + (q * 1.7020) + return (r, g, b) + + @staticmethod + def RgbToYuv(r, g, b): + '''Convert the color from RGB coordinates to YUV. + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + + Returns: + The color as an (y, u, v) tuple in the range: + y[0...1], + u[-0.436...0.436], + v[-0.615...0.615] + + >>> '(%g, %g, %g)' % Color.RgbToYuv(1, 0.5, 0) + '(0.5925, -0.29156, 0.357505)' + + ''' + y = (r * 0.29900) + (g * 0.58700) + (b * 0.11400) + u = -(r * 0.14713) - (g * 0.28886) + (b * 0.43600) + v = (r * 0.61500) - (g * 0.51499) - (b * 0.10001) + return (y, u, v) + + @staticmethod + def YuvToRgb(y, u, v): + '''Convert the color from YUV coordinates to RGB. + + Parameters: + :y: + The Y component value [0...1] + :u: + The U component value [-0.436...0.436] + :v: + The V component value [-0.615...0.615] + + Returns: + The color as an (r, g, b) tuple in the range: + r[0...1], + g[0...1], + b[0...1] + + >>> '(%g, %g, %g)' % Color.YuvToRgb(0.5925, -0.2916, 0.3575) + '(0.999989, 0.500015, -6.3276e-005)' + + ''' + r = y + (v * 1.13983) + g = y - (u * 0.39465) - (v * 0.58060) + b = y + (u * 2.03211) + return (r, g, b) + + @staticmethod + def RgbToXyz(r, g, b): + '''Convert the color from sRGB to CIE XYZ. + + The methods assumes that the RGB coordinates are given in the sRGB + colorspace (D65). + + .. note:: + + Compensation for the sRGB gamma correction is applied before converting. + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + + Returns: + The color as an (x, y, z) tuple in the range: + x[0...1], + y[0...1], + z[0...1] + + >>> '(%g, %g, %g)' % Color.RgbToXyz(1, 0.5, 0) + '(0.488941, 0.365682, 0.0448137)' + + ''' + r, g, b = [((v <= 0.03928) and [v / 12.92] or [((v+0.055) / 1.055) **2.4])[0] for v in (r, g, b)] + + x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805) + y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722) + z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505) + return (x, y, z) + + @staticmethod + def XyzToRgb(x, y, z): + '''Convert the color from CIE XYZ coordinates to sRGB. + + .. note:: + + Compensation for sRGB gamma correction is applied before converting. + + Parameters: + :x: + The X component value [0...1] + :y: + The Y component value [0...1] + :z: + The Z component value [0...1] + + Returns: + The color as an (r, g, b) tuple in the range: + r[0...1], + g[0...1], + b[0...1] + + >>> '(%g, %g, %g)' % Color.XyzToRgb(0.488941, 0.365682, 0.0448137) + '(1, 0.5, 6.81883e-008)' + + ''' + r = (x * 3.2406255) - (y * 1.5372080) - (z * 0.4986286) + g = -(x * 0.9689307) + (y * 1.8757561) + (z * 0.0415175) + b = (x * 0.0557101) - (y * 0.2040211) + (z * 1.0569959) + return tuple((((v <= _srgbGammaCorrInv) and [v * 12.92] or [(1.055 * (v ** (1/2.4))) - 0.055])[0] for v in (r, g, b))) + + @staticmethod + def XyzToLab(x, y, z, wref=_DEFAULT_WREF): + '''Convert the color from CIE XYZ to CIE L*a*b*. + + Parameters: + :x: + The X component value [0...1] + :y: + The Y component value [0...1] + :z: + The Z component value [0...1] + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + The color as an (L, a, b) tuple in the range: + L[0...100], + a[-1...1], + b[-1...1] + + >>> '(%g, %g, %g)' % Color.XyzToLab(0.488941, 0.365682, 0.0448137) + '(66.9518, 0.43084, 0.739692)' + + >>> '(%g, %g, %g)' % Color.XyzToLab(0.488941, 0.365682, 0.0448137, Color.WHITE_REFERENCE['std_D50']) + '(66.9518, 0.411663, 0.67282)' + + ''' + # White point correction + x /= wref[0] + y /= wref[1] + z /= wref[2] + + # Nonlinear distortion and linear transformation + x, y, z = [((v > 0.008856) and [v**_oneThird] or [(7.787 * v) + _sixteenHundredsixteenth])[0] for v in (x, y, z)] + + # Vector scaling + l = (116 * y) - 16 + a = 5.0 * (x - y) + b = 2.0 * (y - z) + + return (l, a, b) + + @staticmethod + def LabToXyz(l, a, b, wref=_DEFAULT_WREF): + '''Convert the color from CIE L*a*b* to CIE 1931 XYZ. + + Parameters: + :l: + The L component [0...100] + :a: + The a component [-1...1] + :b: + The a component [-1...1] + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + The color as an (x, y, z) tuple in the range: + x[0...q], + y[0...1], + z[0...1] + + >>> '(%g, %g, %g)' % Color.LabToXyz(66.9518, 0.43084, 0.739692) + '(0.488941, 0.365682, 0.0448137)' + + >>> '(%g, %g, %g)' % Color.LabToXyz(66.9518, 0.411663, 0.67282, Color.WHITE_REFERENCE['std_D50']) + '(0.488941, 0.365682, 0.0448138)' + + ''' + y = (l + 16) / 116 + x = (a / 5.0) + y + z = y - (b / 2.0) + return tuple((((v > 0.206893) and [v**3] or [(v - _sixteenHundredsixteenth) / 7.787])[0] * w for v, w in zip((x, y, z), wref))) + + @staticmethod + def CmykToCmy(c, m, y, k): + '''Convert the color from CMYK coordinates to CMY. + + Parameters: + :c: + The Cyan component value [0...1] + :m: + The Magenta component value [0...1] + :y: + The Yellow component value [0...1] + :k: + The Black component value [0...1] + + Returns: + The color as an (c, m, y) tuple in the range: + c[0...1], + m[0...1], + y[0...1] + + >>> '(%g, %g, %g)' % Color.CmykToCmy(1, 0.32, 0, 0.5) + '(1, 0.66, 0.5)' + + ''' + mk = 1-k + return ((c*mk + k), (m*mk + k), (y*mk + k)) + + @staticmethod + def CmyToCmyk(c, m, y): + '''Convert the color from CMY coordinates to CMYK. + + Parameters: + :c: + The Cyan component value [0...1] + :m: + The Magenta component value [0...1] + :y: + The Yellow component value [0...1] + + Returns: + The color as an (c, m, y, k) tuple in the range: + c[0...1], + m[0...1], + y[0...1], + k[0...1] + + >>> '(%g, %g, %g, %g)' % Color.CmyToCmyk(1, 0.66, 0.5) + '(1, 0.32, 0, 0.5)' + + ''' + k = min(c, m, y) + if k==1.0: return (0.0, 0.0, 0.0, 1.0) + mk = 1-k + return ((c-k) / mk, (m-k) / mk, (y-k) / mk, k) + + @staticmethod + def RgbToCmy(r, g, b): + '''Convert the color from RGB coordinates to CMY. + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + + Returns: + The color as an (c, m, y) tuple in the range: + c[0...1], + m[0...1], + y[0...1] + + >>> Color.RgbToCmy(1, 0.5, 0) + (0, 0.5, 1) + + ''' + return (1-r, 1-g, 1-b) + + @staticmethod + def CmyToRgb(c, m, y): + '''Convert the color from CMY coordinates to RGB. + + Parameters: + :c: + The Cyan component value [0...1] + :m: + The Magenta component value [0...1] + :y: + The Yellow component value [0...1] + + Returns: + The color as an (r, g, b) tuple in the range: + r[0...1], + g[0...1], + b[0...1] + + >>> Color.CmyToRgb(0, 0.5, 1) + (1, 0.5, 0) + + ''' + return (1-c, 1-m, 1-y) + + @staticmethod + def RgbToHtml(r, g, b): + '''Convert the color from (r, g, b) to #RRGGBB. + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + + Returns: + A CSS string representation of this color (#RRGGBB). + + >>> Color.RgbToHtml(1, 0.5, 0) + '#ff8000' + + ''' + return '#%02x%02x%02x' % tuple((min(round(v*255), 255) for v in (r, g, b))) + + @staticmethod + def HtmlToRgb(html): + '''Convert the HTML color to (r, g, b). + + Parameters: + :html: + the HTML definition of the color (#RRGGBB or #RGB or a color name). + + Returns: + The color as an (r, g, b) tuple in the range: + r[0...1], + g[0...1], + b[0...1] + + Throws: + :ValueError: + If html is neither a known color name or a hexadecimal RGB + representation. + + >>> '(%g, %g, %g)' % Color.HtmlToRgb('#ff8000') + '(1, 0.501961, 0)' + >>> '(%g, %g, %g)' % Color.HtmlToRgb('ff8000') + '(1, 0.501961, 0)' + >>> '(%g, %g, %g)' % Color.HtmlToRgb('#f60') + '(1, 0.4, 0)' + >>> '(%g, %g, %g)' % Color.HtmlToRgb('f60') + '(1, 0.4, 0)' + >>> '(%g, %g, %g)' % Color.HtmlToRgb('lemonchiffon') + '(1, 0.980392, 0.803922)' + + ''' + html = html.strip().lower() + if html[0]=='#': + html = html[1:] + elif Color.NAMED_COLOR.has_key(html): + html = Color.NAMED_COLOR[html][1:] + + if len(html)==6: + rgb = html[:2], html[2:4], html[4:] + elif len(html)==3: + rgb = ['%c%c' % (v,v) for v in html] + else: + raise ValueError, 'input #%s is not in #RRGGBB format' % html + + return tuple(((int(n, 16) / 255.0) for n in rgb)) + + @staticmethod + def RgbToPil(r, g, b): + '''Convert the color from RGB to a PIL-compatible integer. + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + + Returns: + A PIL compatible integer (0xBBGGRR). + + >>> '0x%06x' % Color.RgbToPil(1, 0.5, 0) + '0x0080ff' + + ''' + r, g, b = [min(int(round(v*255)), 255) for v in (r, g, b)] + return (b << 16) + (g << 8) + r + + @staticmethod + def PilToRgb(pil): + '''Convert the color from a PIL-compatible integer to RGB. + + Parameters: + pil: a PIL compatible color representation (0xBBGGRR) + Returns: + The color as an (r, g, b) tuple in the range: + the range: + r: [0...1] + g: [0...1] + b: [0...1] + + >>> '(%g, %g, %g)' % Color.PilToRgb(0x0080ff) + '(1, 0.501961, 0)' + + ''' + r = 0xff & pil + g = 0xff & (pil >> 8) + b = 0xff & (pil >> 16) + return tuple((v / 255.0 for v in (r, g, b))) + + @staticmethod + def _WebSafeComponent(c, alt=False): + '''Convert a color component to its web safe equivalent. + + Parameters: + :c: + The component value [0...1] + :alt: + If True, return the alternative value instead of the nearest one. + + Returns: + The web safe equivalent of the component value. + + ''' + # This sucks, but floating point between 0 and 1 is quite fuzzy... + # So we just change the scale a while to make the equality tests + # work, otherwise it gets wrong at some decimal far to the right. + sc = c * 100.0 + + # If the color is already safe, return it straight away + d = sc % 20 + if d==0: return c + + # Get the lower and upper safe values + l = sc - d + u = l + 20 + + # Return the 'closest' value according to the alt flag + if alt: + if (sc-l) >= (u-sc): return l/100.0 + else: return u/100.0 + else: + if (sc-l) >= (u-sc): return u/100.0 + else: return l/100.0 + + @staticmethod + def RgbToWebSafe(r, g, b, alt=False): + '''Convert the color from RGB to 'web safe' RGB + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + :alt: + If True, use the alternative color instead of the nearest one. + Can be used for dithering. + + Returns: + The color as an (r, g, b) tuple in the range: + the range: + r[0...1], + g[0...1], + b[0...1] + + >>> '(%g, %g, %g)' % Color.RgbToWebSafe(1, 0.55, 0.0) + '(1, 0.6, 0)' + + ''' + webSafeComponent = Color._WebSafeComponent + return tuple((webSafeComponent(v, alt) for v in (r, g, b))) + + @staticmethod + def RgbToGreyscale(r, g, b): + '''Convert the color from RGB to its greyscale equivalent + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + + Returns: + The color as an (r, g, b) tuple in the range: + the range: + r[0...1], + g[0...1], + b[0...1] + + >>> '(%g, %g, %g)' % Color.RgbToGreyscale(1, 0.8, 0) + '(0.6, 0.6, 0.6)' + + ''' + v = (r + g + b) / 3.0 + return (v, v, v) + + @staticmethod + def RgbToRyb(hue): + '''Maps a hue on the RGB color wheel to Itten's RYB wheel. + + Parameters: + :hue: + The hue on the RGB color wheel [0...360] + + Returns: + An approximation of the corresponding hue on Itten's RYB wheel. + + >>> Color.RgbToRyb(15) + 26 + + ''' + d = hue % 15 + i = int(hue / 15) + x0 = _RybWheel[i] + x1 = _RybWheel[i+1] + return x0 + (x1-x0) * d / 15 + + @staticmethod + def RybToRgb(hue): + '''Maps a hue on Itten's RYB color wheel to the standard RGB wheel. + + Parameters: + :hue: + The hue on Itten's RYB color wheel [0...360] + + Returns: + An approximation of the corresponding hue on the standard RGB wheel. + + >>> Color.RybToRgb(15) + 8 + + ''' + d = hue % 15 + i = int(hue / 15) + x0 = _RgbWheel[i] + x1 = _RgbWheel[i+1] + return x0 + (x1-x0) * d / 15 + + @staticmethod + def NewFromRgb(r, g, b, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed RGB values. + + Parameters: + :r: + The Red component value [0...1] + :g: + The Green component value [0...1] + :b: + The Blue component value [0...1] + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromRgb(1.0, 0.5, 0.0) + (1.0, 0.5, 0.0, 1.0) + >>> Color.NewFromRgb(1.0, 0.5, 0.0, 0.5) + (1.0, 0.5, 0.0, 0.5) + + ''' + return Color((r, g, b), 'rgb', alpha, wref) + + @staticmethod + def NewFromHsl(h, s, l, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed HSL values. + + Parameters: + :h: + The Hue component value [0...1] + :s: + The Saturation component value [0...1] + :l: + The Lightness component value [0...1] + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsl(30, 1, 0.5) + (1.0, 0.5, 0.0, 1.0) + >>> Color.NewFromHsl(30, 1, 0.5, 0.5) + (1.0, 0.5, 0.0, 0.5) + + ''' + return Color((h, s, l), 'hsl', alpha, wref) + + @staticmethod + def NewFromHsv(h, s, v, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed HSV values. + + Parameters: + :h: + The Hus component value [0...1] + :s: + The Saturation component value [0...1] + :v: + The Value component [0...1] + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsv(30, 1, 1) + (1.0, 0.5, 0.0, 1.0) + >>> Color.NewFromHsv(30, 1, 1, 0.5) + (1.0, 0.5, 0.0, 0.5) + + ''' + h2, s, l = Color.RgbToHsl(*Color.HsvToRgb(h, s, v)) + return Color((h, s, l), 'hsl', alpha, wref) + + @staticmethod + def NewFromYiq(y, i, q, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed YIQ values. + + Parameters: + :y: + The Y component value [0...1] + :i: + The I component value [0...1] + :q: + The Q component value [0...1] + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> str(Color.NewFromYiq(0.5922, 0.45885,-0.05)) + '(0.999902, 0.499955, -6.6905e-005, 1)' + >>> str(Color.NewFromYiq(0.5922, 0.45885,-0.05, 0.5)) + '(0.999902, 0.499955, -6.6905e-005, 0.5)' + + ''' + return Color(Color.YiqToRgb(y, i, q), 'rgb', alpha, wref) + + @staticmethod + def NewFromYuv(y, u, v, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed YUV values. + + Parameters: + :y: + The Y component value [0...1] + :u: + The U component value [-0.436...0.436] + :v: + The V component value [-0.615...0.615] + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> str(Color.NewFromYuv(0.5925, -0.2916, 0.3575)) + '(0.999989, 0.500015, -6.3276e-005, 1)' + >>> str(Color.NewFromYuv(0.5925, -0.2916, 0.3575, 0.5)) + '(0.999989, 0.500015, -6.3276e-005, 0.5)' + + ''' + return Color(Color.YuvToRgb(y, u, v), 'rgb', alpha, wref) + + @staticmethod + def NewFromXyz(x, y, z, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed CIE-XYZ values. + + Parameters: + :x: + The Red component value [0...1] + :y: + The Green component value [0...1] + :z: + The Blue component value [0...1] + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> str(Color.NewFromXyz(0.488941, 0.365682, 0.0448137)) + '(1, 0.5, 6.81883e-008, 1)' + >>> str(Color.NewFromXyz(0.488941, 0.365682, 0.0448137, 0.5)) + '(1, 0.5, 6.81883e-008, 0.5)' + + ''' + return Color(Color.XyzToRgb(x, y, z), 'rgb', alpha, wref) + + @staticmethod + def NewFromLab(l, a, b, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed CIE-LAB values. + + Parameters: + :l: + The L component [0...100] + :a: + The a component [-1...1] + :b: + The a component [-1...1] + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> str(Color.NewFromLab(66.9518, 0.43084, 0.739692)) + '(1, 0.5, 1.09491e-008, 1)' + >>> str(Color.NewFromLab(66.9518, 0.43084, 0.739692, wref=Color.WHITE_REFERENCE['std_D50'])) + '(1.01238, 0.492011, -0.14311, 1)' + >>> str(Color.NewFromLab(66.9518, 0.43084, 0.739692, 0.5)) + '(1, 0.5, 1.09491e-008, 0.5)' + >>> str(Color.NewFromLab(66.9518, 0.43084, 0.739692, 0.5, Color.WHITE_REFERENCE['std_D50'])) + '(1.01238, 0.492011, -0.14311, 0.5)' + + ''' + return Color(Color.XyzToRgb(*Color.LabToXyz(l, a, b, wref)), 'rgb', alpha, wref) + + @staticmethod + def NewFromCmy(c, m, y, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed CMY values. + + Parameters: + :c: + The Cyan component value [0...1] + :m: + The Magenta component value [0...1] + :y: + The Yellow component value [0...1] + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromCmy(0, 0.5, 1) + (1, 0.5, 0, 1.0) + >>> Color.NewFromCmy(0, 0.5, 1, 0.5) + (1, 0.5, 0, 0.5) + + ''' + return Color(Color.CmyToRgb(c, m, y), 'rgb', alpha, wref) + + @staticmethod + def NewFromCmyk(c, m, y, k, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed CMYK values. + + Parameters: + :c: + The Cyan component value [0...1] + :m: + The Magenta component value [0...1] + :y: + The Yellow component value [0...1] + :k: + The Black component value [0...1] + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> str(Color.NewFromCmyk(1, 0.32, 0, 0.5)) + '(0, 0.34, 0.5, 1)' + >>> str(Color.NewFromCmyk(1, 0.32, 0, 0.5, 0.5)) + '(0, 0.34, 0.5, 0.5)' + + ''' + return Color(Color.CmyToRgb(*Color.CmykToCmy(c, m, y, k)), 'rgb', alpha, wref) + + @staticmethod + def NewFromHtml(html, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed HTML color definition. + + Parameters: + :html: + The HTML definition of the color (#RRGGBB or #RGB or a color name). + :alpha: + The color transparency [0...1], default is opaque. + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> str(Color.NewFromHtml('#ff8000')) + '(1, 0.501961, 0, 1)' + >>> str(Color.NewFromHtml('ff8000')) + '(1, 0.501961, 0, 1)' + >>> str(Color.NewFromHtml('#f60')) + '(1, 0.4, 0, 1)' + >>> str(Color.NewFromHtml('f60')) + '(1, 0.4, 0, 1)' + >>> str(Color.NewFromHtml('lemonchiffon')) + '(1, 0.980392, 0.803922, 1)' + >>> str(Color.NewFromHtml('#ff8000', 0.5)) + '(1, 0.501961, 0, 0.5)' + + ''' + return Color(Color.HtmlToRgb(html), 'rgb', alpha, wref) + + @staticmethod + def NewFromPil(pil, alpha=1.0, wref=_DEFAULT_WREF): + '''Create a new instance based on the specifed PIL color. + + Parameters: + :pil: + A PIL compatible color representation (0xBBGGRR) + :alpha: + The color transparency [0...1], default is opaque + :wref: + The whitepoint reference, default is 2° D65. + + Returns: + A grapefruit.Color instance. + + >>> str(Color.NewFromPil(0x0080ff)) + '(1, 0.501961, 0, 1)' + >>> str(Color.NewFromPil(0x0080ff, 0.5)) + '(1, 0.501961, 0, 0.5)' + + ''' + return Color(Color.PilToRgb(pil), 'rgb', alpha, wref) + + def __GetAlpha(self): + return self.__a + alpha = property(fget=__GetAlpha, doc='The transparency of this color. 0.0 is transparent and 1.0 is fully opaque.') + + def __GetWRef(self): + return self.__wref + whiteRef = property(fget=__GetWRef, doc='the white reference point of this color.') + + def __GetRGB(self): + return self.__rgb + rgb = property(fget=__GetRGB, doc='The RGB values of this Color.') + + def __GetHue(self): + return self.__hsl[0] + hue = property(fget=__GetHue, doc='The hue of this color.') + + def __GetHSL(self): + return self.__hsl + hsl = property(fget=__GetHSL, doc='The HSL values of this Color.') + + def __GetHSV(self): + h, s, v = Color.RgbToHsv(*self.__rgb) + return (self.__hsl[0], s, v) + hsv = property(fget=__GetHSV, doc='The HSV values of this Color.') + + def __GetYIQ(self): + return Color.RgbToYiq(*self.__rgb) + yiq = property(fget=__GetYIQ, doc='The YIQ values of this Color.') + + def __GetYUV(self): + return Color.RgbToYuv(*self.__rgb) + yuv = property(fget=__GetYUV, doc='The YUV values of this Color.') + + def __GetXYZ(self): + return Color.RgbToXyz(*self.__rgb) + xyz = property(fget=__GetXYZ, doc='The CIE-XYZ values of this Color.') + + def __GetLAB(self): + return Color.XyzToLab(wref=self.__wref, *Color.RgbToXyz(*self.__rgb)) + lab = property(fget=__GetLAB, doc='The CIE-LAB values of this Color.') + + def __GetCMY(self): + return Color.RgbToCmy(*self.__rgb) + cmy = property(fget=__GetCMY, doc='The CMY values of this Color.') + + def __GetCMYK(self): + return Color.CmyToCmyk(*Color.RgbToCmy(*self.__rgb)) + cmyk = property(fget=__GetCMYK, doc='The CMYK values of this Color.') + + def __GetHTML(self): + return Color.RgbToHtml(*self.__rgb) + html = property(fget=__GetHTML, doc='This Color as an HTML color definition.') + + def __GetPIL(self): + return Color.RgbToPil(*self.__rgb) + pil = property(fget=__GetPIL, doc='This Color as a PIL compatible value.') + + def __GetwebSafe(self): + return Color.RgbToWebSafe(*self.__rgb) + webSafe = property(fget=__GetwebSafe, doc='The web safe color nearest to this one (RGB).') + + def __GetGreyscale(self): + return Color.RgbToGreyscale(*self.rgb) + greyscale = property(fget=__GetGreyscale, doc='The greyscale equivalent to this color (RGB).') + + def ColorWithAlpha(self, alpha): + '''Create a new instance based on this one with a new alpha value. + + Parameters: + :alpha: + The transparency of the new color [0...1]. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromRgb(1.0, 0.5, 0.0, 1.0).ColorWithAlpha(0.5) + (1.0, 0.5, 0.0, 0.5) + + ''' + return Color(self.__rgb, 'rgb', alpha, self.__wref) + + def ColorWithWhiteRef(self, wref, labAsRef=False): + '''Create a new instance based on this one with a new white reference. + + Parameters: + :wref: + The whitepoint reference. + :labAsRef: + If True, the L*a*b* values of the current instance are used as reference + for the new color; otherwise, the RGB values are used as reference. + + Returns: + A grapefruit.Color instance. + + + >>> c = Color.NewFromRgb(1.0, 0.5, 0.0, 1.0, Color.WHITE_REFERENCE['std_D65']) + + >>> c2 = c.ColorWithWhiteRef(Color.WHITE_REFERENCE['sup_D50']) + >>> c2.rgb + (1.0, 0.5, 0.0) + >>> '(%g, %g, %g)' % c2.whiteRef + '(0.96721, 1, 0.81428)' + + >>> c2 = c.ColorWithWhiteRef(Color.WHITE_REFERENCE['sup_D50'], labAsRef=True) + >>> '(%g, %g, %g)' % c2.rgb + '(1.01463, 0.490339, -0.148131)' + >>> '(%g, %g, %g)' % c2.whiteRef + '(0.96721, 1, 0.81428)' + >>> '(%g, %g, %g)' % c.lab + '(66.9518, 0.43084, 0.739692)' + >>> '(%g, %g, %g)' % c2.lab + '(66.9518, 0.43084, 0.739693)' + + ''' + if labAsRef: + l, a, b = self.__GetLAB() + return Color.NewFromLab(l, a, b, self.__a, wref) + else: + return Color(self.__rgb, 'rgb', self.__a, wref) + + def ColorWithHue(self, hue): + '''Create a new instance based on this one with a new hue. + + Parameters: + :hue: + The hue of the new color [0...360]. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsl(30, 1, 0.5).ColorWithHue(60) + (1.0, 1.0, 0.0, 1.0) + >>> Color.NewFromHsl(30, 1, 0.5).ColorWithHue(60).hsl + (60, 1, 0.5) + + ''' + h, s, l = self.__hsl + return Color((hue, s, l), 'hsl', self.__a, self.__wref) + + def ColorWithSaturation(self, saturation): + '''Create a new instance based on this one with a new saturation value. + + .. note:: + + The saturation is defined for the HSL mode. + + Parameters: + :saturation: + The saturation of the new color [0...1]. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsl(30, 1, 0.5).ColorWithSaturation(0.5) + (0.75, 0.5, 0.25, 1.0) + >>> Color.NewFromHsl(30, 1, 0.5).ColorWithSaturation(0.5).hsl + (30, 0.5, 0.5) + + ''' + h, s, l = self.__hsl + return Color((h, saturation, l), 'hsl', self.__a, self.__wref) + + def ColorWithLightness(self, lightness): + '''Create a new instance based on this one with a new lightness value. + + Parameters: + :lightness: + The lightness of the new color [0...1]. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsl(30, 1, 0.5).ColorWithLightness(0.25) + (0.5, 0.25, 0.0, 1.0) + >>> Color.NewFromHsl(30, 1, 0.5).ColorWithLightness(0.25).hsl + (30, 1, 0.25) + + ''' + h, s, l = self.__hsl + return Color((h, s, lightness), 'hsl', self.__a, self.__wref) + + def DarkerColor(self, level): + '''Create a new instance based on this one but darker. + + Parameters: + :level: + The amount by which the color should be darkened to produce + the new one [0...1]. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsl(30, 1, 0.5).DarkerColor(0.25) + (0.5, 0.25, 0.0, 1.0) + >>> Color.NewFromHsl(30, 1, 0.5).DarkerColor(0.25).hsl + (30, 1, 0.25) + + ''' + h, s, l = self.__hsl + return Color((h, s, max(l - level, 0)), 'hsl', self.__a, self.__wref) + + def LighterColor(self, level): + '''Create a new instance based on this one but lighter. + + Parameters: + :level: + The amount by which the color should be lightened to produce + the new one [0...1]. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsl(30, 1, 0.5).LighterColor(0.25) + (1.0, 0.75, 0.5, 1.0) + >>> Color.NewFromHsl(30, 1, 0.5).LighterColor(0.25).hsl + (30, 1, 0.75) + + ''' + h, s, l = self.__hsl + return Color((h, s, min(l + level, 1)), 'hsl', self.__a, self.__wref) + + def Saturate(self, level): + '''Create a new instance based on this one but more saturated. + + Parameters: + :level: + The amount by which the color should be saturated to produce + the new one [0...1]. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsl(30, 0.5, 0.5).Saturate(0.25) + (0.875, 0.5, 0.125, 1.0) + >>> Color.NewFromHsl(30, 0.5, 0.5).Saturate(0.25).hsl + (30, 0.75, 0.5) + + ''' + h, s, l = self.__hsl + return Color((h, min(s + level, 1), l), 'hsl', self.__a, self.__wref) + + def Desaturate(self, level): + '''Create a new instance based on this one but less saturated. + + Parameters: + :level: + The amount by which the color should be desaturated to produce + the new one [0...1]. + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsl(30, 0.5, 0.5).Desaturate(0.25) + (0.625, 0.5, 0.375, 1.0) + >>> Color.NewFromHsl(30, 0.5, 0.5).Desaturate(0.25).hsl + (30, 0.25, 0.5) + + ''' + h, s, l = self.__hsl + return Color((h, max(s - level, 0), l), 'hsl', self.__a, self.__wref) + + def WebSafeDither(self): + '''Return the two websafe colors nearest to this one. + + Returns: + A tuple of two grapefruit.Color instances which are the two + web safe colors closest this one. + + >>> c = Color.NewFromRgb(1.0, 0.45, 0.0) + >>> c1, c2 = c.WebSafeDither() + >>> str(c1) + '(1, 0.4, 0, 1)' + >>> str(c2) + '(1, 0.6, 0, 1)' + + ''' + return ( + Color(Color.RgbToWebSafe(*self.__rgb), 'rgb', self.__a, self.__wref), + Color(Color.RgbToWebSafe(alt=True, *self.__rgb), 'rgb', self.__a, self.__wref)) + + def Gradient(self, target, steps=100): + '''Create a list with the gradient colors between this and the other color. + + Parameters: + :target: + The grapefruit.Color at the other end of the gradient. + :steps: + The number of gradients steps to create. + + + Returns: + A list of grapefruit.Color instances. + + >>> c1 = Color.NewFromRgb(1.0, 0.0, 0.0, alpha=1) + >>> c2 = Color.NewFromRgb(0.0, 1.0, 0.0, alpha=0) + >>> c1.Gradient(c2, 3) + [(0.75, 0.25, 0.0, 0.75), (0.5, 0.5, 0.0, 0.5), (0.25, 0.75, 0.0, 0.25)] + + ''' + gradient = [] + rgba1 = self.__rgb + (self.__a,) + rgba2 = target.__rgb + (target.__a,) + + steps += 1 + for n in xrange(1, steps): + d = 1.0*n/steps + r = (rgba1[0]*(1-d)) + (rgba2[0]*d) + g = (rgba1[1]*(1-d)) + (rgba2[1]*d) + b = (rgba1[2]*(1-d)) + (rgba2[2]*d) + a = (rgba1[3]*(1-d)) + (rgba2[3]*d) + + gradient.append(Color((r, g, b), 'rgb', a, self.__wref)) + + return gradient + + def ComplementaryColor(self, mode='ryb'): + '''Create a new instance which is the complementary color of this one. + + Parameters: + :mode: + Select which color wheel to use for the generation (ryb/rgb). + + + Returns: + A grapefruit.Color instance. + + >>> Color.NewFromHsl(30, 1, 0.5).ComplementaryColor() + (0.0, 0.5, 1.0, 1.0) + >>> Color.NewFromHsl(30, 1, 0.5).ComplementaryColor().hsl + (210, 1, 0.5) + + ''' + h, s, l = self.__hsl + + if mode == 'ryb': h = Color.RgbToRyb(h) + h = (h+180)%360 + if mode == 'ryb': h = Color.RybToRgb(h) + + return Color((h, s, l), 'hsl', self.__a, self.__wref) + + def MonochromeScheme(self): + '''Return 4 colors in the same hue with varying saturation/lightness. + + Returns: + A tuple of 4 grapefruit.Color in the same hue as this one, + with varying saturation/lightness. + + >>> c = Color.NewFromHsl(30, 0.5, 0.5) + >>> ['(%g, %g, %g)' % clr.hsl for clr in c.MonochromeScheme()] + ['(30, 0.2, 0.8)', '(30, 0.5, 0.3)', '(30, 0.2, 0.6)', '(30, 0.5, 0.8)'] + + ''' + def _wrap(x, min, thres, plus): + if (x-min) < thres: return x + plus + else: return x-min + + h, s, l = self.__hsl + + s1 = _wrap(s, 0.3, 0.1, 0.3) + l1 = _wrap(l, 0.5, 0.2, 0.3) + + s2 = s + l2 = _wrap(l, 0.2, 0.2, 0.6) + + s3 = s1 + l3 = max(0.2, l + (1-l)*0.2) + + s4 = s + l4 = _wrap(l, 0.5, 0.2, 0.3) + + return ( + Color((h, s1, l1), 'hsl', self.__a, self.__wref), + Color((h, s2, l2), 'hsl', self.__a, self.__wref), + Color((h, s3, l3), 'hsl', self.__a, self.__wref), + Color((h, s4, l4), 'hsl', self.__a, self.__wref)) + + def TriadicScheme(self, angle=120, mode='ryb'): + '''Return two colors forming a triad or a split complementary with this one. + + Parameters: + :angle: + The angle between the hues of the created colors. + The default value makes a triad. + :mode: + Select which color wheel to use for the generation (ryb/rgb). + + Returns: + A tuple of two grapefruit.Color forming a color triad with + this one or a split complementary. + + >>> c1 = Color.NewFromHsl(30, 1, 0.5) + + >>> c2, c3 = c1.TriadicScheme() + >>> c2.hsl + (150.0, 1, 0.5) + >>> c3.hsl + (270.0, 1, 0.5) + + >>> c2, c3 = c1.TriadicScheme(40) + >>> c2.hsl + (190.0, 1, 0.5) + >>> c3.hsl + (230.0, 1, 0.5) + + ''' + h, s, l = self.__hsl + angle = min(angle, 120) / 2.0 + + if mode == 'ryb': h = Color.RgbToRyb(h) + h += 180 + h1 = (h - angle) % 360 + h2 = (h + angle) % 360 + if mode == 'ryb': + h1 = Color.RybToRgb(h1) + h2 = Color.RybToRgb(h2) + + return ( + Color((h1, s, l), 'hsl', self.__a, self.__wref), + Color((h2, s, l), 'hsl', self.__a, self.__wref)) + + def TetradicScheme(self, angle=30, mode='ryb'): + '''Return three colors froming a tetrad with this one. + + Parameters: + :angle: + The angle to substract from the adjacent colors hues [-90...90]. + You can use an angle of zero to generate a square tetrad. + :mode: + Select which color wheel to use for the generation (ryb/rgb). + + Returns: + A tuple of three grapefruit.Color forming a color tetrad with + this one. + + >>> col = Color.NewFromHsl(30, 1, 0.5) + >>> [c.hsl for c in col.TetradicScheme(mode='rgb', angle=30)] + [(90, 1, 0.5), (210, 1, 0.5), (270, 1, 0.5)] + + ''' + h, s, l = self.__hsl + + if mode == 'ryb': h = Color.RgbToRyb(h) + h1 = (h + 90 - angle) % 360 + h2 = (h + 180) % 360 + h3 = (h + 270 - angle) % 360 + if mode == 'ryb': + h1 = Color.RybToRgb(h1) + h2 = Color.RybToRgb(h2) + h3 = Color.RybToRgb(h3) + + return ( + Color((h1, s, l), 'hsl', self.__a, self.__wref), + Color((h2, s, l), 'hsl', self.__a, self.__wref), + Color((h3, s, l), 'hsl', self.__a, self.__wref)) + + def AnalogousScheme(self, angle=30, mode='ryb'): + '''Return two colors analogous to this one. + + Args: + :angle: + The angle between the hues of the created colors and this one. + :mode: + Select which color wheel to use for the generation (ryb/rgb). + + Returns: + A tuple of grapefruit.Colors analogous to this one. + + >>> c1 = Color.NewFromHsl(30, 1, 0.5) + + >>> c2, c3 = c1.AnalogousScheme() + >>> c2.hsl + (330, 1, 0.5) + >>> c3.hsl + (90, 1, 0.5) + + >>> c2, c3 = c1.AnalogousScheme(10) + >>> c2.hsl + (20, 1, 0.5) + >>> c3.hsl + (40, 1, 0.5) + + ''' + h, s, l = self.__hsl + + if mode == 'ryb': h = Color.RgbToRyb(h) + h += 360 + h1 = (h - angle) % 360 + h2 = (h + angle) % 360 + if mode == 'ryb': + h1 = Color.RybToRgb(h1) + h2 = Color.RybToRgb(h2) + + return (Color((h1, s, l), 'hsl', self.__a, self.__wref), + Color((h2, s, l), 'hsl', self.__a, self.__wref)) + + def AlphaBlend(self, other): + '''Alpha-blend this color on the other one. + + Args: + :other: + The grapefruit.Color to alpha-blend with this one. + + Returns: + A grapefruit.Color instance which is the result of alpha-blending + this color on the other one. + + >>> c1 = Color.NewFromRgb(1, 0.5, 0, 0.2) + >>> c2 = Color.NewFromRgb(1, 1, 1, 0.8) + >>> c3 = c1.AlphaBlend(c2) + >>> str(c3) + '(1, 0.875, 0.75, 0.84)' + + ''' + # get final alpha channel + fa = self.__a + other.__a - (self.__a * other.__a) + + # get percentage of source alpha compared to final alpha + if fa==0: sa = 0 + else: sa = min(1.0, self.__a/other.__a) + + # destination percentage is just the additive inverse + da = 1.0 - sa + + sr, sg, sb = [v * sa for v in self.__rgb] + dr, dg, db = [v * da for v in other.__rgb] + + return Color((sr+dr, sg+dg, sb+db), 'rgb', fa, self.__wref) + + def Blend(self, other, percent=0.5): + '''Blend this color with the other one. + + Args: + :other: + the grapefruit.Color to blend with this one. + + Returns: + A grapefruit.Color instance which is the result of blending + this color on the other one. + + >>> c1 = Color.NewFromRgb(1, 0.5, 0, 0.2) + >>> c2 = Color.NewFromRgb(1, 1, 1, 0.6) + >>> c3 = c1.Blend(c2) + >>> str(c3) + '(1, 0.75, 0.5, 0.4)' + + ''' + dest = 1.0 - percent + rgb = tuple(((u * percent) + (v * dest) for u, v in zip(self.__rgb, other.__rgb))) + a = (self.__a * percent) + (other.__a * dest) + return Color(rgb, 'rgb', a, self.__wref) + +def _test(): + import doctest + reload(doctest) + doctest.testmod() + +if __name__=='__main__': + _test() diff --git a/askbot/deps/livesettings/README b/askbot/deps/livesettings/README new file mode 100644 index 00000000..6fe70cc5 --- /dev/null +++ b/askbot/deps/livesettings/README @@ -0,0 +1,4 @@ +this is very slightly forked version of django-livesettings +for use in the askbot forum project + +will attempt to re-merge into the original django-livesettings diff --git a/askbot/deps/livesettings/__init__.py b/askbot/deps/livesettings/__init__.py new file mode 100644 index 00000000..49aaacc9 --- /dev/null +++ b/askbot/deps/livesettings/__init__.py @@ -0,0 +1,16 @@ +"""Database persistent administrative settings with defaults. + +This code is a large fork of the excellent "dbsettings" code found at +http://code.google.com/p/django-values/ + +The items set here are intended to be changeable during runtime, and do not require a +programmer to test or install. + +Appropriate: Your google code for adwords. +Inappropriate: The keyedcache timeout for the store. + +""" + +from functions import * +from models import * +from values import * \ No newline at end of file diff --git a/askbot/deps/livesettings/forms.py b/askbot/deps/livesettings/forms.py new file mode 100644 index 00000000..ed4a7e5a --- /dev/null +++ b/askbot/deps/livesettings/forms.py @@ -0,0 +1,38 @@ +from django import forms +from askbot.deps.livesettings import * +import logging + +log = logging.getLogger('configuration') + +class SettingsEditor(forms.Form): + "Base editor, from which customized forms are created" + + def __init__(self, *args, **kwargs): + settings = kwargs.pop('settings') + super(SettingsEditor, self).__init__(*args, **kwargs) + flattened = [] + groups = [] + for setting in settings: + if isinstance(setting, ConfigurationGroup): + for s in setting: + flattened.append(s) + else: + flattened.append(setting) + + for setting in flattened: + # Add the field to the customized field list + kw = { + 'label': setting.description, + 'help_text': setting.help_text, + # Provide current setting values for initializing the form + 'initial': setting.editor_value + } + field = setting.make_field(**kw) + + k = '%s__%s' % (setting.group.key, setting.key) + self.fields[k] = field + if not setting.group in groups: + groups.append(setting.group) + #log.debug("Added field: %s = %s" % (k, str(field))) + + self.groups = groups \ No newline at end of file diff --git a/askbot/deps/livesettings/functions.py b/askbot/deps/livesettings/functions.py new file mode 100644 index 00000000..99e5cc87 --- /dev/null +++ b/askbot/deps/livesettings/functions.py @@ -0,0 +1,247 @@ +from django.utils.translation import ugettext +from askbot.deps.livesettings import values +from askbot.deps.livesettings.models import SettingNotSet +from askbot.deps.livesettings.utils import is_string_like + +import logging + +log = logging.getLogger('configuration') + +_NOTSET = object() + +class ConfigurationSettings(object): + """A singleton manager for ConfigurationSettings""" + + class __impl(object): + def __init__(self): + self.settings = values.SortedDotDict() + self.prereg = {} + + def __getitem__(self, key): + """Get an element either by ConfigurationGroup object or by its key""" + key = self._resolve_key(key) + return self.settings.get(key) + + def __getattr__(self, key): + """Get an element either by ConfigurationGroup object or by its key""" + try: + return self[key] + except: + raise AttributeError, key + + def __iter__(self): + for v in self.groups(): + yield v + + def __len__(self): + return len(self.settings) + + def __contains__(self, key): + try: + key = self._resolve_key(key) + return self.settings.has_key(key) + except: + return False + + def _resolve_key(self, raw): + if is_string_like(raw): + key = raw + + elif isinstance(raw, values.ConfigurationGroup): + key = raw.key + + else: + group = self.groups()[raw] + key = group.key + + return key + + def get_config(self, group, key): + try: + if isinstance(group, values.ConfigurationGroup): + group = group.key + + cg = self.settings.get(group, None) + if not cg: + raise SettingNotSet('%s config group does not exist' % group) + + else: + return cg[key] + except KeyError: + raise SettingNotSet('%s.%s' % (group, key)) + + def groups(self): + """Return ordered list""" + return self.settings.values() + + def has_config(self, group, key): + if isinstance(group, values.ConfigurationGroup): + group = group.key + + cfg = self.settings.get(group, None) + if cfg and key in cfg: + return True + else: + return False + + def preregister_choice(self, group, key, choice): + """Setup a choice for a group/key which hasn't been instantiated yet.""" + k = (group, key) + if self.prereg.has_key(k): + self.prereg[k].append(choice) + else: + self.prereg[k] = [choice] + + def register(self, value): + g = value.group + if not isinstance(g, values.ConfigurationGroup): + raise ValueError('value.group should be an instance of ConfigurationGroup') + + groupkey = g.key + valuekey = value.key + + k = (groupkey, valuekey) + if self.prereg.has_key(k): + for choice in self.prereg[k]: + value.add_choice(choice) + + if not groupkey in self.settings: + self.settings[groupkey] = g + + self.settings[groupkey][valuekey] = value + + return value + + __instance = None + + def __init__(self): + if ConfigurationSettings.__instance is None: + ConfigurationSettings.__instance = ConfigurationSettings.__impl() + #ConfigurationSettings.__instance.load_app_configurations() + + self.__dict__['_ConfigurationSettings__instance'] = ConfigurationSettings.__instance + + def __getattr__(self, attr): + """ Delegate access to implementation """ + return getattr(self.__instance, attr) + + def __getitem__(self, key): + return self.__instance[key] + + def __len__(self): + return len(self.__instance) + + def __setattr__(self, attr, value): + """ Delegate access to implementation """ + return setattr(self.__instance, attr, value) + + def __unicode__(self): + return u"ConfigurationSettings: " + unicode(self.groups()) + +def config_exists(group, key): + """Test to see if a setting has been registered""" + + return ConfigurationSettings().has_config(group, key) + +def config_get(group, key): + """Get a configuration setting""" + try: + return ConfigurationSettings().get_config(group, key) + except SettingNotSet: + log.debug('SettingNotSet: %s.%s', group, key) + raise + +def config_get_group(group): + return ConfigurationSettings()[group] + +def config_collect_values(group, groupkey, key, unique=True, skip_missing=True): + """Look up (group, groupkey) from config, then take the values returned and + use them as groups for a second-stage lookup. + + For example: + + config_collect_values(PAYMENT, MODULES, CREDITCHOICES) + + Stage 1: ['PAYMENT_GOOGLE', 'PAYMENT_AUTHORIZENET'] + Stage 2: config_value('PAYMENT_GOOGLE', 'CREDITCHOICES') + + config_value('PAYMENT_AUTHORIZENET', 'CREDITCHOICES') + Stage 3: (if unique is true) remove dupes + """ + groups = config_value(group, groupkey) + + ret = [] + for g in groups: + try: + ret.append(config_value(g, key)) + except KeyError, ke: + if not skip_missing: + raise SettingNotSet('No config %s.%s' % (g, key)) + + if unique: + out = [] + for x in ret: + if not x in out: + out.append(x) + ret = out + + return ret + +def config_register(value): + """Register a value or values. + + Parameters: + -A Value + """ + return ConfigurationSettings().register(value) + +def config_register_list(*args): + for value in args: + config_register(value) + +def config_value(group, key, default=_NOTSET): + """Get a value from the configuration system""" + try: + return config_get(group, key).value + except SettingNotSet: + if default != _NOTSET: + return default + raise + +def config_value_safe(group, key, default_value): + """Get a config value with a default fallback, safe for use during SyncDB.""" + raw = default_value + + try: + raw = config_value(group, key) + except SettingNotSet: + pass + except ImportError, e: + log.warn("Error getting %s.%s, OK if you are in SyncDB.", group, key) + + return raw + + +def config_choice_values(group, key, skip_missing=True, translate=False): + """Get pairs of key, label from the setting.""" + try: + cfg = config_get(group, key) + choices = cfg.choice_values + + except SettingNotSet: + if skip_missing: + return [] + else: + raise SettingNotSet('%s.%s' % (group, key)) + + if translate: + choices = [(k, ugettext(v)) for k, v in choices] + + return choices + +def config_add_choice(group, key, choice): + """Add a choice to a value""" + if config_exists(group, key): + cfg = config_get(group, key) + cfg.add_choice(choice) + else: + ConfigurationSettings().preregister_choice(group, key, choice) diff --git a/askbot/deps/livesettings/locale/de/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 00000000..e176bc53 Binary files /dev/null and b/askbot/deps/livesettings/locale/de/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/de/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/de/LC_MESSAGES/django.po new file mode 100644 index 00000000..1cef701b --- /dev/null +++ b/askbot/deps/livesettings/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,101 @@ +# Satchmo Translation Package +# Copyright (C) 2008 Satchmo Project +# This file is distributed under the same license as the Satchmo package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-03-22 15:10+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: values.py:88 +msgid "Base Settings" +msgstr "Basiseinstellungen" + +#: values.py:194 +msgid "Default value: \"\"" +msgstr "Standardwert: \"\"" + +#: values.py:201 +msgid "Default value: " +msgstr "Standardwert: " + +#: values.py:204 +#, python-format +msgid "Default value: %s" +msgstr "Standardwert: %s" + +#: templates/livesettings/group_settings.html:10 +#: templates/livesettings/site_settings.html:10 +msgid "Home" +msgstr "Start" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Log out" +msgstr "Abmelden" + +#: templates/livesettings/group_settings.html:18 +#: templates/livesettings/site_settings.html:18 +#, fuzzy +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +msgstr[1] "" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +#, fuzzy +msgid "Documentation" +msgstr "" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Change password" +msgstr "Passwort ändern" + +#: templates/livesettings/site_settings.html:11 +msgid "Edit Site Settings" +msgstr "" + +#: templates/livesettings/group_settings.html:11 +msgid "Edit Group Settings" +msgstr "" + +#: templates/livesettings/group_settings.html:24 +#, python-format +msgid "Settings included in %(name)s." +msgstr "" + +#: templates/livesettings/group_settings.html:49 +#: templates/livesettings/site_settings.html:61 +msgid "You don't have permission to edit values." +msgstr "" + +#: templates/livesettings/site_settings.html:34 +#, python-format +msgid "Group settings: %(name)s" +msgstr "" + diff --git a/askbot/deps/livesettings/locale/en/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 00000000..c2bc0b94 Binary files /dev/null and b/askbot/deps/livesettings/locale/en/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/en/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/en/LC_MESSAGES/django.po new file mode 100644 index 00000000..45eb23a5 --- /dev/null +++ b/askbot/deps/livesettings/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,100 @@ +# Satchmo Translation Package +# Copyright (C) 2008 Satchmo Project +# This file is distributed under the same license as the Satchmo package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-12-31 00:49-0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: values.py:88 +msgid "Base Settings" +msgstr "" + +#: values.py:194 +msgid "Default value: \"\"" +msgstr "" + +#: values.py:201 +msgid "Default value: " +msgstr "" + +#: values.py:204 +#, python-format +msgid "Default value: %s" +msgstr "" + +#: templates/livesettings/group_settings.html:10 +#: templates/livesettings/site_settings.html:10 +msgid "Home" +msgstr "" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Log out" +msgstr "" + +#: templates/livesettings/group_settings.html:18 +#: templates/livesettings/site_settings.html:18 +#, fuzzy +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +msgstr[1] "" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Documentation" +msgstr "" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Change password" +msgstr "" + +#: templates/livesettings/group_settings.html:11 +msgid "Edit Group Settings" +msgstr "" + +#: templates/livesettings/group_settings.html:24 +#, python-format +msgid "Settings included in %(name)s." +msgstr "" + +#: templates/livesettings/group_settings.html:49 +#: templates/livesettings/site_settings.html:61 +msgid "You don't have permission to edit values." +msgstr "" + +#: templates/livesettings/site_settings.html:11 +msgid "Edit Site Settings" +msgstr "" + +#: templates/livesettings/site_settings.html:34 +#, python-format +msgid "Group settings: %(name)s" +msgstr "" + diff --git a/askbot/deps/livesettings/locale/es/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/es/LC_MESSAGES/django.po new file mode 100644 index 00000000..e69de29b diff --git a/askbot/deps/livesettings/locale/fr/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 00000000..dd872edd Binary files /dev/null and b/askbot/deps/livesettings/locale/fr/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/fr/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 00000000..90475585 --- /dev/null +++ b/askbot/deps/livesettings/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,113 @@ +# Satchmo Translation Package +# Copyright (C) 2008 Satchmo Project +# Jacques Moulin , 2008. +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-11-02 16:11+0100\n" +"PO-Revision-Date: 2008-11-02 17:51+0100\n" +"Last-Translator: Jacques Moulin \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: French\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: templates/livesettings/group_settings.html.py:10 +#: templates/livesettings/site_settings.html.py:25 +#: templates/livesettings/group_settings.html.py:10 +#: templates/livesettings/site_settings.html.py:25 +msgid "Home" +msgstr "Accueil" + +#: models.py:76 +#: models.py:115 +msgid "Site" +msgstr "Site" + +#: values.py:94 +msgid "Base Settings" +msgstr "Configuration de base" + +#: values.py:200 +msgid "Default value: \"\"" +msgstr "Valeur par défaut: \"\"" + +#: values.py:207 +msgid "Default value: " +msgstr "Valeur par défaut:" + +#: values.py:210 +#, python-format +msgid "Default value: %s" +msgstr "Valeur par défaut: %s" + +#: templates/livesettings/group_settings.html.py:7 +#: templates/livesettings/site_settings.html.py:22 +#: templates/livesettings/group_settings.html.py:7 +#: templates/livesettings/site_settings.html.py:22 +msgid "Documentation" +msgstr "Documentation" + +#: templates/livesettings/group_settings.html.py:7 +#: templates/livesettings/site_settings.html.py:22 +#: templates/livesettings/group_settings.html.py:7 +#: templates/livesettings/site_settings.html.py:22 +msgid "Change password" +msgstr "Modifier le mot de passe" + +#: templates/livesettings/group_settings.html.py:7 +#: templates/livesettings/site_settings.html.py:22 +#: templates/livesettings/group_settings.html.py:7 +#: templates/livesettings/site_settings.html.py:22 +msgid "Log out" +msgstr "Se déconnecter" + +#: templates/livesettings/group_settings.html.py:11 +#: templates/livesettings/group_settings.html.py:11 +msgid "Edit Group Settings" +msgstr "Editer les paramètres de groupe" + +#: templates/livesettings/group_settings.html.py:18 +#: templates/livesettings/site_settings.html.py:43 +#: templates/livesettings/group_settings.html.py:18 +#: templates/livesettings/site_settings.html.py:41 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Veuillez corriger l'erreur ci-dessous:" +msgstr[1] "Veuillez corriger les erreurs ci-dessous:" + +#: templates/livesettings/group_settings.html.py:24 +#: templates/livesettings/group_settings.html.py:24 +msgid "Settings included in %(name)s." +msgstr "Paramètres inclus dans %(name)s." + +#: templates/livesettings/group_settings.html.py:49 +#: templates/livesettings/site_settings.html.py:89 +#: templates/livesettings/group_settings.html.py:49 +#: templates/livesettings/site_settings.html.py:87 +msgid "You don't have permission to edit values." +msgstr "Vous n'avez pas le droit d'éditer les valeurs." + +#: templates/livesettings/site_settings.html.py:26 +#: templates/livesettings/site_settings.html.py:26 +msgid "Edit Site Settings" +msgstr "Editer les paramètres du site" + +#: templates/livesettings/site_settings.html.py:59 +#: templates/livesettings/site_settings.html.py:58 +msgid "Group settings: %(name)s" +msgstr "Paramètres du groupe: %(name)s" + +#: templates/livesettings/site_settings.html.py:86 +#: templates/livesettings/site_settings.html.py:84 +msgid "Uncollapse all" +msgstr "Déployer tout" + +#: templates/livesettings/_admin_site_views.html.py:5 +msgid "Sites" +msgstr "Sites" + diff --git a/askbot/deps/livesettings/locale/he/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/he/LC_MESSAGES/django.mo new file mode 100644 index 00000000..04270a04 Binary files /dev/null and b/askbot/deps/livesettings/locale/he/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/he/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/he/LC_MESSAGES/django.po new file mode 100644 index 00000000..362f5612 --- /dev/null +++ b/askbot/deps/livesettings/locale/he/LC_MESSAGES/django.po @@ -0,0 +1,98 @@ +# translation of Satchmo +# Copyright (C) 2008 The Satchmo Project +# This file is distributed under the same license as the Satchmo package. +# +# Aviv Greenberg , 2008. +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-03-13 23:02+0200\n" +"PO-Revision-Date: 2009-03-22 07:45\n" +"Last-Translator: Aviv Greenberg \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: KBabel 1.11.4\n" +"X-Translated-Using: django-rosetta 0.4.0\n" + +#: models.py:75 models.py:114 +msgid "Site" +msgstr "×תר" + +#: values.py:96 +msgid "Base Settings" +msgstr "תצורה בסיסית" + +#: values.py:202 +msgid "Default value: \"\"" +msgstr "ברירת מחדל:\"\"" + +#: values.py:209 +msgid "Default value: " +msgstr "ברירת מחדל:" + +#: values.py:212 +#, python-format +msgid "Default value: %s" +msgstr "ברירת מחדל:%s" + +#: templates/livesettings/_admin_site_views.html:4 +msgid "Sites" +msgstr "×תרי×" + +#: templates/livesettings/group_settings.html:11 +#: templates/livesettings/site_settings.html:23 +msgid "Documentation" +msgstr "תיעוד" + +#: templates/livesettings/group_settings.html:11 +#: templates/livesettings/site_settings.html:23 +msgid "Change password" +msgstr "שינוי סיסמה" + +#: templates/livesettings/group_settings.html:11 +#: templates/livesettings/site_settings.html:23 +msgid "Log out" +msgstr "יצי××”" + +#: templates/livesettings/group_settings.html:14 +#: templates/livesettings/site_settings.html:26 +msgid "Home" +msgstr "דף הבית" + +#: templates/livesettings/group_settings.html:15 +msgid "Edit Group Settings" +msgstr "ערוך הגדרות קבוצה" + +#: templates/livesettings/group_settings.html:22 +#: templates/livesettings/site_settings.html:44 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "× × ×œ×ª×§×Ÿ ×ת השגי××” המופיעה מתחת." +msgstr[1] "× × ×œ×ª×§×Ÿ ×ת השגי×ות המופיעות מתחת." + +#: templates/livesettings/group_settings.html:28 +#, python-format +msgid "Settings included in %(name)s." +msgstr "הגדרות כלולות %(name)s" + +#: templates/livesettings/group_settings.html:53 +#: templates/livesettings/site_settings.html:90 +msgid "You don't have permission to edit values." +msgstr "×ינך מורשה לערוך ערכי×." + +#: templates/livesettings/site_settings.html:27 +msgid "Edit Site Settings" +msgstr "ערוך הגדרות ×תר" + +#: templates/livesettings/site_settings.html:60 +#, python-format +msgid "Group settings: %(name)s" +msgstr "הגדרות קבוצה: %(name)s" + +#: templates/livesettings/site_settings.html:87 +msgid "Uncollapse all" +msgstr "הסתר פרטי×" diff --git a/askbot/deps/livesettings/locale/it/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 00000000..05c50952 Binary files /dev/null and b/askbot/deps/livesettings/locale/it/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/it/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/it/LC_MESSAGES/django.po new file mode 100644 index 00000000..66401866 --- /dev/null +++ b/askbot/deps/livesettings/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,106 @@ +# translation of django.po to Italiano +# Copyright (C) 2008 Satchmo Project +# This file is distributed under the same license as the PACKAGE package. +# +# costantino giuliodori , 2007. +# Alessandro Ronchi , 2008. +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-27 09:16-0700\n" +"PO-Revision-Date: 2008-09-30 13:13+0200\n" +"Last-Translator: Alessandro Ronchi \n" +"Language-Team: Italiano \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=n > 1\n" + +#: templates/livesettings/group_settings.html:10 +#: templates/livesettings/site_settings.html:25 +msgid "Home" +msgstr "Pagina iniziale" + +#: models.py:76 +#: models.py:115 +msgid "Site" +msgstr "Sito" + +#: values.py:94 +msgid "Base Settings" +msgstr "Impostazioni base" + +#: values.py:200 +msgid "Default value: \"\"" +msgstr "Valore di default: \"\"" + +#: values.py:207 +msgid "Default value: " +msgstr "Valore di default: " + +#: values.py:210 +#, python-format +msgid "Default value: %s" +msgstr "Valore di default:%s" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +# translated = "Extra di spedizione" +msgid "Documentation" +msgstr "Documentazione" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Change password" +msgstr "Cambia Password" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Log out" +msgstr "Esci" + +#: templates/livesettings/group_settings.html:11 +msgid "Edit Group Settings" +msgstr "Modifica le impostazioni del Gruppo" + +#: templates/livesettings/group_settings.html:18 +#: templates/livesettings/site_settings.html:43 +# translated = "" +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Correggi l'errore indicato di seguito." +msgstr[1] "Correggi gli errori indicati di seguito." + +#: templates/livesettings/group_settings.html:24 +# translated = "Modificare le impostazioni di gruppo" +#, python-format +msgid "Settings included in %(name)s." +msgstr "Impostazioni incluse in %(name)s." + +#: templates/livesettings/group_settings.html:49 +#: templates/livesettings/site_settings.html:89 +# translated = "Impostazioni incluse in% (nome) s." +msgid "You don't have permission to edit values." +msgstr "Non hai il permesso di modificare questi valori." + +#: templates/livesettings/site_settings.html:26 +# translated = "Non avete il permesso di modificare i valori." +msgid "Edit Site Settings" +msgstr "Modifica le impostazioni del sito" + +#: templates/livesettings/site_settings.html:59 +# translated = "Modifica impostazioni sito" +#, python-format +msgid "Group settings: %(name)s" +msgstr "Impostazioni di gruppo: %(name)s" + +#: templates/livesettings/site_settings.html:86 +msgid "Uncollapse all" +msgstr "Espandi tutti" + +#: templates/livesettings/_admin_site_views.html:5 +msgid "Sites" +msgstr "Siti" + diff --git a/askbot/deps/livesettings/locale/ko/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/ko/LC_MESSAGES/django.mo new file mode 100644 index 00000000..e0738605 Binary files /dev/null and b/askbot/deps/livesettings/locale/ko/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/ko/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 00000000..0dbd2d4d --- /dev/null +++ b/askbot/deps/livesettings/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,100 @@ +# Satchmo Translation Package +# Copyright (C) 2008 Satchmo Project +# This file is distributed under the same license as the Satchmo package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-12-31 00:49-0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: values.py:88 +msgid "Base Settings" +msgstr "기본 세팅" + +#: values.py:194 +msgid "Default value: \"\"" +msgstr "기본 ê°’: \"\"" + +#: values.py:201 +msgid "Default value: " +msgstr "기본 ê°’: " + +#: values.py:204 +#, python-format +msgid "Default value: %s" +msgstr "기본 ê°’:%s" + +#: templates/livesettings/group_settings.html:10 +#: templates/livesettings/site_settings.html:10 +msgid "Home" +msgstr "홈" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Log out" +msgstr "로그 아웃" + +#: templates/livesettings/group_settings.html:18 +#: templates/livesettings/site_settings.html:18 +#, fuzzy +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +msgstr[1] "" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Documentation" +msgstr "문서" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Change password" +msgstr "패스워드 변경" + +#: templates/livesettings/group_settings.html:11 +msgid "Edit Group Settings" +msgstr "그룹설정 수정" + +#: templates/livesettings/group_settings.html:24 +#, python-format +msgid "Settings included in %(name)s." +msgstr "%(name)sì„ í¬í•¨í•œ 설정" + +#: templates/livesettings/group_settings.html:49 +#: templates/livesettings/site_settings.html:61 +msgid "You don't have permission to edit values." +msgstr "ì´ ê°’ì„ ìˆ˜ì •í•  ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤." + +#: templates/livesettings/site_settings.html:11 +msgid "Edit Site Settings" +msgstr "사ì´íŠ¸ 설정 수정" + +#: templates/livesettings/site_settings.html:34 +#, python-format +msgid "Group settings: %(name)s" +msgstr "그룹 설정: %(name)s" + diff --git a/askbot/deps/livesettings/locale/pl/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 00000000..f45e49ed Binary files /dev/null and b/askbot/deps/livesettings/locale/pl/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/pl/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 00000000..1e7b4199 --- /dev/null +++ b/askbot/deps/livesettings/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,97 @@ +# Satchmo Translation Package +# Copyright (C) 2008 Satchmo Project +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-03 18:10+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: templates/livesettings/group_settings.html:10 +#: templates/livesettings/site_settings.html:25 +msgid "Home" +msgstr "Strona startowa" + +#: models.py:76 +#: models.py:115 +msgid "Site" +msgstr "Strona" + +#: values.py:93 +msgid "Base Settings" +msgstr "Ustawienia podstawowe" + +#: values.py:199 +msgid "Default value: \"\"" +msgstr "DomyÅ›lna wartość: \"\"" + +#: values.py:206 +msgid "Default value: " +msgstr "DomyÅ›lna wartość: " + +#: values.py:209 +#, python-format +msgid "Default value: %s" +msgstr "DomyÅ›lna wartość: %s" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Documentation" +msgstr "Dokumentacja" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Change password" +msgstr "Zmiana hasÅ‚a" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Log out" +msgstr "Wyloguj" + +#: templates/livesettings/group_settings.html:11 +msgid "Edit Group Settings" +msgstr "Edycja UstawieÅ„ dla Grupy" + +#: templates/livesettings/group_settings.html:18 +#: templates/livesettings/site_settings.html:43 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "ProszÄ™ poprawić poniższy bÅ‚Ä…d." +msgstr[1] "ProszÄ™ poprawić poniższe bÅ‚Ä™dy." + +#: templates/livesettings/group_settings.html:24 +#, python-format +msgid "Settings included in %(name)s." +msgstr "Ustawienia w %(name)s." + +#: templates/livesettings/group_settings.html:49 +#: templates/livesettings/site_settings.html:89 +msgid "You don't have permission to edit values." +msgstr "Nie masz uprawnieÅ„ do zmiany tych wartoÅ›ci." + +#: templates/livesettings/site_settings.html:26 +msgid "Edit Site Settings" +msgstr "Edytuj ustawienia serwisu" + +#: templates/livesettings/site_settings.html:59 +#, python-format +msgid "Group settings: %(name)s" +msgstr "Ustawienia grupy: %(name)s" + +#: templates/livesettings/site_settings.html:86 +msgid "Uncollapse all" +msgstr "RozwiÅ„ wszystko" + +#: templates/livesettings/_admin_site_views.html:5 +msgid "Sites" +msgstr "Strony" + diff --git a/askbot/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 00000000..a8bfb8b2 Binary files /dev/null and b/askbot/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 00000000..72d49df7 --- /dev/null +++ b/askbot/deps/livesettings/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,100 @@ +# Satchmo Translation Package +# Copyright (C) 2008 Satchmo Project +# This file is distributed under the same license as the PACKAGE package. +# Terry Laundos Aguiar , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-05 23:50-0300\n" +"PO-Revision-Date: 2008-09-05 23:51-0300\n" +"Last-Translator: Terry Laundos Aguiar \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: templates/livesettings/group_settings.html:10 +#: templates/livesettings/site_settings.html:25 +msgid "Home" +msgstr "Inicial" + +#: models.py:76 +#: models.py:115 +#, fuzzy +msgid "Site" +msgstr "Estado" + +#: values.py:93 +msgid "Base Settings" +msgstr "Configurações Iniciais" + +#: values.py:199 +msgid "Default value: \"\"" +msgstr "Valor padrão: \"\"" + +#: values.py:206 +msgid "Default value: " +msgstr "Valor padrão: " + +#: values.py:209 +#, python-format +msgid "Default value: %s" +msgstr "Valor padrão: %s" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Documentation" +msgstr "Documentação" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Change password" +msgstr "Mudar senha" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Log out" +msgstr "Deslogar" + +#: templates/livesettings/group_settings.html:11 +msgid "Edit Group Settings" +msgstr "Editar preferências de grupo" + +#: templates/livesettings/group_settings.html:18 +#: templates/livesettings/site_settings.html:43 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#: templates/livesettings/group_settings.html:24 +#, python-format +msgid "Settings included in %(name)s." +msgstr "Configurações inclusas no %(name)s." + +#: templates/livesettings/group_settings.html:49 +#: templates/livesettings/site_settings.html:89 +msgid "You don't have permission to edit values." +msgstr "Você não tem permissão para editar valores." + +#: templates/livesettings/site_settings.html:26 +msgid "Edit Site Settings" +msgstr "Editar configurações do site" + +#: templates/livesettings/site_settings.html:59 +#, python-format +msgid "Group settings: %(name)s" +msgstr "Configurações de grupo: %(name)s" + +#: templates/livesettings/site_settings.html:86 +#, fuzzy +msgid "Uncollapse all" +msgstr "Desmarcar todos" + +#: templates/livesettings/_admin_site_views.html:5 +#, fuzzy +msgid "Sites" +msgstr "Notas" + diff --git a/askbot/deps/livesettings/locale/ru/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 00000000..42e6074a Binary files /dev/null and b/askbot/deps/livesettings/locale/ru/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/ru/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 00000000..a0db054b --- /dev/null +++ b/askbot/deps/livesettings/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,85 @@ +# Satchmo Translation Package +# Copyright (C) 2008 Satchmo Project +# This file is distributed under the same license as the Satchmo package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Satchmo\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-12-31 00:49-0600\n" +"PO-Revision-Date: 2009-03-02 21:52+0300\n" +"Last-Translator: Данил Семеленов \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language-Team: \n" + +#: values.py:88 +msgid "Base Settings" +msgstr "ОÑновные наÑтройки" + +#: values.py:194 +msgid "Default value: \"\"" +msgstr "Значение по умолчанию: \"\"" + +#: values.py:201 +msgid "Default value: " +msgstr "Значение по умолчанию: " + +#: values.py:204 +#, python-format +msgid "Default value: %s" +msgstr "Значение по умолчанию: %s" + +#: templates/livesettings/group_settings.html:10 +#: templates/livesettings/site_settings.html:10 +msgid "Home" +msgstr "" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Log out" +msgstr "" + +#: templates/livesettings/group_settings.html:18 +#: templates/livesettings/site_settings.html:18 +#, fuzzy +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Documentation" +msgstr "" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Change password" +msgstr "" + +#: templates/livesettings/group_settings.html:11 +msgid "Edit Group Settings" +msgstr "Изменить группу наÑтроек" + +#: templates/livesettings/group_settings.html:24 +#, python-format +msgid "Settings included in %(name)s." +msgstr "ÐаÑтройки включены в %(name)s." + +#: templates/livesettings/group_settings.html:49 +#: templates/livesettings/site_settings.html:61 +msgid "You don't have permission to edit values." +msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ значение." + +#: templates/livesettings/site_settings.html:11 +msgid "Edit Site Settings" +msgstr "Изменить наÑтройки Ñайта" + +#: templates/livesettings/site_settings.html:34 +#, python-format +msgid "Group settings: %(name)s" +msgstr "Группа наÑтроек: %(name)s" + diff --git a/askbot/deps/livesettings/locale/sv/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 00000000..caed0ab9 Binary files /dev/null and b/askbot/deps/livesettings/locale/sv/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/sv/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 00000000..6b096f6b --- /dev/null +++ b/askbot/deps/livesettings/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,92 @@ +# Satchmo Translation Package +# Copyright (C) 2008 Satchmo Project +# This file is distributed under the same license as the PACKAGE package. +# N.L. , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Satchmo svn\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-04-30 23:40+0200\n" +"PO-Revision-Date: 2008-04-30 23:35+0100\n" +"Last-Translator: N.L. \n" +"Language-Team: Group\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Swedish\n" +"X-Poedit-Basepath: ../../../\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Country: SWEDEN\n" + +#: values.py:89 +msgid "Base Settings" +msgstr "Grundinställningar" + +#: values.py:195 +msgid "Default value: \"\"" +msgstr "Förvalt värde: \"\"" + +#: values.py:202 +msgid "Default value: " +msgstr "Förvalt värde:" + +#: values.py:205 +#, python-format +msgid "Default value: %s" +msgstr "Förvalt värde: %s" + +#: templates/livesettings/group_settings.html:10 +#: templates/livesettings/site_settings.html:25 +msgid "Home" +msgstr "Hem" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Log out" +msgstr "Logga ut" + +#: templates/livesettings/group_settings.html:18 +#: templates/livesettings/site_settings.html:41 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Var god rätta till felet nedan." +msgstr[1] "Var god rätta till felen nedan." + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Documentation" +msgstr "Dokumentation" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:22 +msgid "Change password" +msgstr "Byt lösenord" + +#: templates/livesettings/site_settings.html:26 +msgid "Edit Site Settings" +msgstr "Ändra sajtinställningar" + +#: templates/livesettings/group_settings.html:11 +msgid "Edit Group Settings" +msgstr "Redigera gruppinställningar" + +#: templates/livesettings/group_settings.html:24 +#, python-format +msgid "Settings included in %(name)s." +msgstr "Inställningar som ingÃ¥r i %(name)s." + +#: templates/livesettings/group_settings.html:49 +#: templates/livesettings/site_settings.html:87 +msgid "You don't have permission to edit values." +msgstr "Du har inte tillÃ¥telse att ändra värden." + +#: templates/livesettings/site_settings.html:58 +#, python-format +msgid "Group settings: %(name)s" +msgstr "Gruppinställningar: %(name)s" + +#: templates/livesettings/site_settings.html:84 +msgid "Uncollapse all" +msgstr "Visa alla" + diff --git a/askbot/deps/livesettings/locale/tr/LC_MESSAGES/django.mo b/askbot/deps/livesettings/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 00000000..d56ad423 Binary files /dev/null and b/askbot/deps/livesettings/locale/tr/LC_MESSAGES/django.mo differ diff --git a/askbot/deps/livesettings/locale/tr/LC_MESSAGES/django.po b/askbot/deps/livesettings/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 00000000..bb2a1506 --- /dev/null +++ b/askbot/deps/livesettings/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,102 @@ +# Satchmo Translation Package +# Copyright (C) 2008 Satchmo Project +# This file is distributed under the same license as the Satchmo package. +# Selin Çuhadar , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Satchmo\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-12-31 00:49-0600\n" +"PO-Revision-Date: 2008-06-09 18:18+0200\n" +"Last-Translator: Selin Çuhadar \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: values.py:88 +msgid "Base Settings" +msgstr "Temel Ayarlar" + +#: values.py:194 +msgid "Default value: \"\"" +msgstr "Geçerli DeÄŸer: \"\"" + +#: values.py:201 +msgid "Default value: " +msgstr "Geçerli DeÄŸer:" + +#: values.py:204 +#, python-format +msgid "Default value: %s" +msgstr "Geçerli DeÄŸer: %s" + +#: templates/livesettings/group_settings.html:10 +#: templates/livesettings/site_settings.html:10 +msgid "Home" +msgstr "Ev" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Log out" +msgstr "Oturumu kapa" + +#: templates/livesettings/group_settings.html:18 +#: templates/livesettings/site_settings.html:18 +#, fuzzy +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +msgstr[1] "" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" +"#-#-#-#-# django.pot (PACKAGE VERSION) #-#-#-#-#\n" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Documentation" +msgstr "Dokümentasyon" + +#: templates/livesettings/group_settings.html:7 +#: templates/livesettings/site_settings.html:7 +msgid "Change password" +msgstr "Åžifreyi deÄŸiÅŸtir" + +#: templates/livesettings/group_settings.html:11 +msgid "Edit Group Settings" +msgstr "Grup Ayarlarını Düzenle" + +#: templates/livesettings/group_settings.html:24 +#, python-format +msgid "Settings included in %(name)s." +msgstr "%(name)s ayarlara dahil edildi." + +#: templates/livesettings/group_settings.html:49 +#: templates/livesettings/site_settings.html:61 +msgid "You don't have permission to edit values." +msgstr "DeÄŸerleri düzenlemek için gerekli izniniz yok." + +#: templates/livesettings/site_settings.html:11 +msgid "Edit Site Settings" +msgstr "Site Ayarlarını Düzenle" + +#: templates/livesettings/site_settings.html:34 +#, python-format +msgid "Group settings: %(name)s" +msgstr "Grup ayarları: %(name)s" + diff --git a/askbot/deps/livesettings/models.py b/askbot/deps/livesettings/models.py new file mode 100644 index 00000000..1a57dfc5 --- /dev/null +++ b/askbot/deps/livesettings/models.py @@ -0,0 +1,170 @@ +from django.conf import settings +from django.contrib.sites.models import Site +from django.db import models +from django.db.models import loading +from django.utils.translation import ugettext_lazy as _ +from keyedcache import cache_key, cache_get, cache_set, NotCachedError +from keyedcache.models import CachedObjectMixin +from askbot.deps.livesettings.overrides import get_overrides +import logging + +log = logging.getLogger('configuration.models') + +__all__ = ['SettingNotSet', 'Setting', 'LongSetting', 'find_setting'] + +def _safe_get_siteid(site): + if not site: + try: + site = Site.objects.get_current() + siteid = site.id + except: + siteid = settings.SITE_ID + else: + siteid = site.id + return siteid + +def find_setting(group, key, site=None): + """Get a setting or longsetting by group and key, cache and return it.""" + + siteid = _safe_get_siteid(site) + setting = None + + use_db, overrides = get_overrides(siteid) + ck = cache_key('Setting', siteid, group, key) + + if use_db: + try: + setting = cache_get(ck) + + except NotCachedError, nce: + if loading.app_cache_ready(): + try: + setting = Setting.objects.get(site__id__exact=siteid, key__exact=key, group__exact=group) + + except Setting.DoesNotExist: + # maybe it is a "long setting" + try: + setting = LongSetting.objects.get(site__id__exact=siteid, key__exact=key, group__exact=group) + + except LongSetting.DoesNotExist: + pass + + cache_set(ck, value=setting) + + else: + grp = overrides.get(group, None) + if grp and grp.has_key(key): + val = grp[key] + setting = ImmutableSetting(key=key, group=group, value=val) + log.debug('Returning overridden: %s', setting) + + if not setting: + raise SettingNotSet(key, cachekey=ck) + + return setting + +class SettingNotSet(Exception): + def __init__(self, k, cachekey=None): + self.key = k + self.cachekey = cachekey + self.args = [self.key, self.cachekey] + +class SettingManager(models.Manager): + def get_query_set(self): + all = super(SettingManager, self).get_query_set() + siteid = _safe_get_siteid(None) + return all.filter(site__id__exact=siteid) + + +class ImmutableSetting(object): + + def __init__(self, group="", key="", value="", site=1): + self.site = site + self.group = group + self.key = key + self.value = value + + def cache_key(self, *args, **kwargs): + return cache_key('OverrideSetting', self.site, self.group, self.key) + + def delete(self): + pass + + def save(self, *args, **kwargs): + pass + + def __repr__(self): + return "ImmutableSetting: %s.%s=%s" % (self.group, self.key, self.value) + + +class Setting(models.Model, CachedObjectMixin): + site = models.ForeignKey(Site, verbose_name=_('Site')) + group = models.CharField(max_length=100, blank=False, null=False) + key = models.CharField(max_length=100, blank=False, null=False) + value = models.CharField(max_length=255, blank=True) + + objects = SettingManager() + + def __nonzero__(self): + return self.id is not None + + def cache_key(self, *args, **kwargs): + return cache_key('Setting', self.site, self.group, self.key) + + def delete(self): + self.cache_delete() + super(Setting, self).delete() + + def save(self, force_insert=False, force_update=False): + try: + site = self.site + except Site.DoesNotExist: + self.site = Site.objects.get_current() + + super(Setting, self).save(force_insert=force_insert, force_update=force_update) + + self.cache_set() + + class Meta: + unique_together = ('site', 'group', 'key') + + +class LongSettingManager(models.Manager): + def get_query_set(self): + all = super(LongSettingManager, self).get_query_set() + siteid = _safe_get_siteid(None) + return all.filter(site__id__exact=siteid) + +class LongSetting(models.Model, CachedObjectMixin): + """A Setting which can handle more than 255 characters""" + site = models.ForeignKey(Site, verbose_name=_('Site')) + group = models.CharField(max_length=100, blank=False, null=False) + key = models.CharField(max_length=100, blank=False, null=False) + value = models.TextField(blank=True) + + objects = LongSettingManager() + + def __nonzero__(self): + return self.id is not None + + def cache_key(self, *args, **kwargs): + # note same cache pattern as Setting. This is so we can look up in one check. + # they can't overlap anyway, so this is moderately safe. At the worst, the + # Setting will override a LongSetting. + return cache_key('Setting', self.site, self.group, self.key) + + def delete(self): + self.cache_delete() + super(LongSetting, self).delete() + + def save(self, force_insert=False, force_update=False): + try: + site = self.site + except Site.DoesNotExist: + self.site = Site.objects.get_current() + super(LongSetting, self).save(force_insert=force_insert, force_update=force_update) + self.cache_set() + + class Meta: + unique_together = ('site', 'group', 'key') + diff --git a/askbot/deps/livesettings/overrides.py b/askbot/deps/livesettings/overrides.py new file mode 100644 index 00000000..3d8404ef --- /dev/null +++ b/askbot/deps/livesettings/overrides.py @@ -0,0 +1,55 @@ +"""Allows askbot.deps.livesettings to be "locked down" and no longer use the settings page or the database +for settings retrieval. +""" + +from django.conf import settings as djangosettings +from django.contrib.sites.models import Site +import logging + +__all__ = ['get_overrides'] + +def _safe_get_siteid(site): + if not site: + try: + site = Site.objects.get_current() + siteid = site.id + except: + siteid = djangosettings.SITE_ID + else: + siteid = site.id + return siteid + +def get_overrides(siteid=-1): + """Check to see if askbot.deps.livesettings is allowed to use the database. If not, then + it will only use the values in the dictionary, LIVESETTINGS_OPTIONS[SITEID]['SETTINGS'], + this allows 'lockdown' of a live site. + + The LIVESETTINGS dict must be formatted as follows:: + + LIVESETTINGS_OPTIONS = { + 1 : { + 'DB' : [True/False], + SETTINGS = { + 'GROUPKEY' : {'KEY', val, 'KEY2', val}, + 'GROUPKEY2' : {'KEY', val, 'KEY2', val}, + } + } + } + + In the settings dict above, the "val" entries must exactly match the format + stored in the database for a setting. Do not use a literal True or an integer, + it needs to be the string representation of them. + + Returns a tuple (DB_ALLOWED, SETTINGS) + """ + overrides = (True, {}) + if hasattr(djangosettings, 'LIVESETTINGS_OPTIONS'): + if siteid == -1: + siteid = _safe_get_siteid(None) + + opts = djangosettings.LIVESETTINGS_OPTIONS + if opts.has_key(siteid): + opts = opts[siteid] + overrides = (opts.get('DB', True), opts['SETTINGS']) + + return overrides diff --git a/askbot/deps/livesettings/signals.py b/askbot/deps/livesettings/signals.py new file mode 100644 index 00000000..ddea31f5 --- /dev/null +++ b/askbot/deps/livesettings/signals.py @@ -0,0 +1,3 @@ +import django.dispatch + +configuration_value_changed = django.dispatch.Signal() diff --git a/askbot/deps/livesettings/templates/livesettings/_admin_site_views.html b/askbot/deps/livesettings/templates/livesettings/_admin_site_views.html new file mode 100644 index 00000000..17d08f58 --- /dev/null +++ b/askbot/deps/livesettings/templates/livesettings/_admin_site_views.html @@ -0,0 +1,15 @@ +{% load i18n %} + diff --git a/askbot/deps/livesettings/templates/livesettings/group_settings.html b/askbot/deps/livesettings/templates/livesettings/group_settings.html new file mode 100644 index 00000000..e56f764f --- /dev/null +++ b/askbot/deps/livesettings/templates/livesettings/group_settings.html @@ -0,0 +1,81 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_modify config_tags %} +{% block extrastyle %} +{{ block.super }} + +{% endblock %} + +{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/forms.css{% endblock %} +{% block coltype %}colMS{% endblock %} +{% block bodyclass %}dashboard{% endblock %} +{% block userlinks %}{% trans 'Documentation' %} / {% trans 'Change password' %} / {% trans 'Log out' %}{% endblock %} +{% block breadcrumbs %}{% if not is_popup %} + +{% endif %}{% endblock %} +{% block content %} +
+{% if form.errors %} +

+ {% blocktrans count form.errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} +

+{% endif %} +{% if form.fields %} +
+
+ + {% for field in form %} + {% if field.is_hidden %} + + {% else %} + {% if field.errors %} + + + + {% endif %} + + + + + {% endif %} + {% endfor %} +
{{ field.errors }}
+ {{ field.label_tag }} + {% if field.help_text %} +

{{ field.help_text|safe }}

+ {% endif %} + {% if field.field.default_text %} +

{{ field.field.default_text|safe }}

+ {% endif %} +
{{ field }}
+ {% for field in form %} + {% if field.is_hidden %} + {{field}} + {% endif %} + {% endfor %} +
+ +
+{% else %} +

{% trans "You don't have permission to edit values." %}

+{% endif %} +
+{% if all_groups %} + +{% endif %} +{% endblock %} diff --git a/askbot/deps/livesettings/templates/livesettings/site_settings.html b/askbot/deps/livesettings/templates/livesettings/site_settings.html new file mode 100644 index 00000000..35333778 --- /dev/null +++ b/askbot/deps/livesettings/templates/livesettings/site_settings.html @@ -0,0 +1,101 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_modify config_tags %} + +{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/forms.css{% endblock %} +{% block extrahead %} + + + +{% endblock %} +{% block extrastyle %} +{{ block.super }} + + +{% endblock %} +{% block coltype %}colMS{% endblock %} +{% block bodyclass %}dashboard{% endblock %} +{% block userlinks %}{% trans 'Documentation' %} / {% trans 'Change password' %} / {% trans 'Log out' %}{% endblock %} +{% block breadcrumbs %}{% if not is_popup %} + +{% endif %}{% endblock %} +{% block content %} +{% comment %} +
+ +
+{% endcomment %} + +
+{% if not use_db %} +

{% trans "Livesettings are disabled for this site." %}

+

{% trans "All configuration options must be edited in the site settings.py file" %}

+
+ {% admin_site_views 'satchmo_site_settings' %} +{% else %} + {% if form.errors %} +

+ {% blocktrans count form.errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} +

+ {% endif %} + {% if form.fields %} +
+ {% for field in form %} + {% if field.is_hidden %} + {{ field }} + {% else %} + {% ifchanged field.field.group %}{% with field.field.group as group %} + {% if not forloop.first %} + + + {% endif %} +
+

{{ group.name }}

+ + {% endwith %}{% endifchanged %} + + {% if field.errors %} + + + + {% endif %} + + + + + {% endif %} + {% endfor %} +
{{ field.errors }}
+ {{ field.label_tag }} + {% if field.help_text %} +

{{ field.help_text|break_at:40|safe }}

+ {% endif %} + {% if field.field.default_text %} +

{{ field.field.default_text|break_at:40}}

+ {% endif %} +
{{ field }}
+ + {% admin_site_views 'satchmo_site_settings' %} +
+ +

{% trans 'Uncollapse all' %}

+

Export

+ + {% else %} +

{% trans "You don't have permission to edit values." %}

+ {% endif %} +{% endif %} + +{% endblock %} diff --git a/askbot/deps/livesettings/templates/livesettings/text.txt b/askbot/deps/livesettings/templates/livesettings/text.txt new file mode 100644 index 00000000..d57a57e3 --- /dev/null +++ b/askbot/deps/livesettings/templates/livesettings/text.txt @@ -0,0 +1 @@ +{{ text|safe }} \ No newline at end of file diff --git a/askbot/deps/livesettings/templatetags/__init__.py b/askbot/deps/livesettings/templatetags/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/deps/livesettings/templatetags/config_tags.py b/askbot/deps/livesettings/templatetags/config_tags.py new file mode 100644 index 00000000..ab5cf6b4 --- /dev/null +++ b/askbot/deps/livesettings/templatetags/config_tags.py @@ -0,0 +1,91 @@ +from django import template +from django.contrib.sites.models import Site +from django.core import urlresolvers +from askbot.deps.livesettings import config_value +from askbot.deps.livesettings.utils import url_join +import logging + +log = logging.getLogger('configuration.config_tags') + +register = template.Library() + +def force_space(value, chars=40): + """Forces spaces every `chars` in value""" + + chars = int(chars) + if len(value) < chars: + return value + else: + out = [] + start = 0 + end = 0 + looping = True + + while looping: + start = end + end += chars + out.append(value[start:end]) + looping = end < len(value) + + return ' '.join(out) + +def break_at(value, chars=40): + """Force spaces into long lines which don't have spaces""" + #todo: EF - lazy patch + return value + + chars = int(chars) + value = unicode(value) + if len(value) < chars: + return value + else: + out = [] + line = value.split(' ') + for word in line: + if len(word) > chars: + out.append(force_space(word, chars)) + else: + out.append(word) + + return " ".join(out) + +register.filter('break_at', break_at) + +def config_boolean(option): + """Looks up the configuration option, returning true or false.""" + args = option.split('.') + try: + val = config_value(*args) + except: + log.warn('config_boolean tag: Tried to look up config setting "%s", got SettingNotSet, returning False', option) + val = False + if val: + return "true" + else: + return "" + +register.filter('config_boolean', config_boolean) + +def admin_site_views(view): + """Returns a formatted list of sites, rendering for view, if any""" + + if view: + path = urlresolvers.reverse(view) + else: + path = None + + links = [] + for site in Site.objects.all(): + paths = ["http://", site.domain] + if path: + paths.append(path) + + links.append((site.name, url_join(paths))) + + ret = { + 'links' : links, + } + return ret + + +register.inclusion_tag('askbot.deps.livesettings/_admin_site_views.html')(admin_site_views) diff --git a/askbot/deps/livesettings/tests.py b/askbot/deps/livesettings/tests.py new file mode 100644 index 00000000..aab61f4a --- /dev/null +++ b/askbot/deps/livesettings/tests.py @@ -0,0 +1,545 @@ +from django.conf import settings as djangosettings +from django.test import TestCase +import keyedcache +from askbot.deps.livesettings import * +import logging +log = logging.getLogger('test'); + +class ConfigurationFunctionTest(TestCase): + + def testSetSingleConfigItem(self): + value = IntegerValue(BASE_GROUP, 'SingleItem') + config_register(value) + self.assert_(config_exists(BASE_GROUP, 'SingleItem')) + + def testSetTwoConfigItems(self): + s = [IntegerValue(BASE_GROUP, 'testTwoA'), StringValue(BASE_GROUP, 'testTwoB')] + config_register_list(*s) + + self.assert_(config_exists(BASE_GROUP, 'testTwoA')) + self.assert_(config_exists(BASE_GROUP, 'testTwoB')) + + def testSetGroup(self): + g1 = ConfigurationGroup('test1','test1') + value = IntegerValue(g1, 'SingleGroupedItem') + config_register(value) + self.assertFalse(config_exists(BASE_GROUP, 'SingleGroupedItem')) + self.assert_(config_exists(g1, 'SingleGroupedItem')) + + +class ConfigurationTestSettings(TestCase): + + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + g = ConfigurationGroup('test2','test2') + self.g = g + config_register(StringValue(g, 's1')) + config_register(IntegerValue(g, 's2', default=10)) + config_register(IntegerValue(g, 's3', default=10)) + + def testSetSetting(self): + c = config_get('test2', 's1') + c.update('test') + + self.assertEqual(c.value, 'test') + self.assertEqual(c.setting.value, 'test') + + def testSettingDefault(self): + c = config_get('test2', 's2') + self.assertEqual(c.value, 10) + + def testSetAndReset(self): + """Test setting one value and then updating""" + c = config_get('test2', 's1') + c.update('test1') + + self.assertEqual(c.value, 'test1') + + # should be true, since it is an update + self.assert_(c.update('test2')) + self.assertEqual(c.value, 'test2') + + def testTwice(self): + """Config items should respond False to duplicate requests to update.""" + + c = config_get('test2', 's1') + c.update('test1') + + self.assertFalse(c.update('test1')) + + + def testDeletesDefault(self): + c = config_get('test2', 's3') + # false because it isn't saving a default value + self.assertFalse(c.update(10)) + + self.assert_(c.update(20)) + self.assertEqual(c.value, 20) + try: + s = c.setting + except SettingNotSet: + self.fail("Should have a setting now") + + # now delete and go back to no setting by setting the default + self.assert_(c.update(10)) + self.assertEqual(c.value, 10) + + try: + s = c.setting + self.fail('Should throw SettingNotSet') + except SettingNotSet: + pass + + +class ConfigTestDotAccess(TestCase): + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + g = ConfigurationGroup('test3','test3') + self.g = g + c1 = config_register(BooleanValue(g, 's1', default=True)) + c2 = config_register(IntegerValue(g, 's2', default=10)) + c2.update(100) + + def testDotAccess(self): + self.assert_(ConfigurationSettings().test3.s1.value) + self.assertEqual(ConfigurationSettings().test3.s2.value, 100) + + def testSettingProperty(self): + c = config_get('test3','s2') + s = c.setting + self.assert_(s.value, 100) + + def testDictValues(self): + d = self.g.dict_values() + self.assertEqual(d, {'s1': True, 's2' : 100}) + +class ConfigTestModuleValue(TestCase): + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + g = ConfigurationGroup('modules','module test') + self.g = g + self.c = config_register(ModuleValue(g, 'test')) + + # def testModule(self): + # c = config_get('modules', 'test') + # c.update('satchmo_store') + + # self.assert_(hasattr(self.c.value, 'get_version')) + +class ConfigTestSortOrder(TestCase): + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + g1 = ConfigurationGroup('group1', 'Group 1', ordering=-1001) + g2 = ConfigurationGroup('group2', 'Group 2', ordering=-1002) + g3 = ConfigurationGroup('group3', 'Group 3', ordering=-1003) + + self.g1 = g1 + self.g2 = g2 + self.g3 = g3 + + self.g1c1 = config_register(IntegerValue(g1, 'c1')) + self.g1c2 = config_register(IntegerValue(g1, 'c2')) + self.g1c3 = config_register(IntegerValue(g1, 'c3')) + + self.g2c1 = config_register(IntegerValue(g2, 'c1')) + self.g2c2 = config_register(IntegerValue(g2, 'c2')) + self.g2c3 = config_register(IntegerValue(g2, 'c3')) + + self.g3c1 = config_register(IntegerValue(g3, 'c1')) + self.g3c2 = config_register(IntegerValue(g3, 'c2')) + self.g3c3 = config_register(IntegerValue(g3, 'c3')) + + def testGroupOrdering(self): + mgr = ConfigurationSettings() + self.assertEqual(mgr[2].key, self.g1.key) + self.assertEqual(mgr[1].key, self.g2.key) + self.assertEqual(mgr[0].key, self.g3.key) + + +class TestMultipleValues(TestCase): + + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + g1 = ConfigurationGroup('m1', 'Multiple Group 1', ordering=1000) + self.g1 = g1 + + self.g1c1 = config_register(MultipleStringValue(g1, + 'c1', + choices=((1,'one'),(2,'two'),(3,'three')))) + + def testSave(self): + + c = config_get('m1','c1') + c.update([1,2]) + self.assertEqual(c.value, [1,2]) + + def testAddChoice(self): + + config_add_choice('m1','c1',(4, 'four')) + c = config_get('m1','c1') + self.assertEqual(c.choices, ((1,'one'),(2,'two'),(3,'three'),(4,'four'))) + + def testChoiceValues(self): + self.g1c1.update([1,2]) + + self.assertEqual(self.g1c1.value, [1,2]) + self.assertEqual(self.g1c1.choice_values, [(1, 'one'),(2, 'two')]) + + choices = config_choice_values('m1', 'c1') + self.assertEqual(choices, [(1, 'one'),(2, 'two')]) + +class TestMultipleValuesWithDefault(TestCase): + + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + g1 = ConfigurationGroup('mv2', 'Multiple Group 2', ordering=1000) + self.g1 = g1 + + self.g1c1 = config_register(MultipleStringValue(g1, + 'c1', + choices=((1,'one'),(2,'two'),(3,'three')), + default=[1,2])) + + def testDefault(self): + + c = config_get('mv2','c1') + self.assertEqual(c.value, [1,2]) + + c.update([1,2,3]) + self.assertEqual(c.value, [1,2,3]) + +class ConfigTestChoices(TestCase): + + def testAddPreregisteredChoice(self): + """Test that we can register choices before the config is actually set up.""" + config_add_choice('ctg1', 'c1', ('a', 'Item A')) + config_add_choice('ctg1', 'c1', ('b', 'Item B')) + config_add_choice('ctg1', 'c1', ('c', 'Item C')) + + g1 = ConfigurationGroup('ctg1', 'Choice 1', ordering=1000) + config_register(StringValue(g1, 'c1')) + + c = config_get('ctg1','c1') + + self.assertEqual(c.choices, [('a','Item A'), ('b','Item B'), ('c','Item C')]) + + +class ConfigTestRequires(TestCase): + + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + g1 = ConfigurationGroup('req1', 'Requirements 1', ordering=1000) + + self.g1 = g1 + + bool1 = config_register(BooleanValue(g1, 'bool1', default=False, ordering=1)) + bool2 = config_register(BooleanValue(g1, 'bool2', ordering=2)) + + self.g1c1 = config_register(IntegerValue(g1, 'c1', requires=bool1, ordering=3)) + + self.g1c2 = config_register(IntegerValue(g1, 'c2', requires=bool2, ordering=4)) + self.g1c3 = config_register(IntegerValue(g1, 'c3', ordering=5)) + + bool2.update(True) + + def testSimpleRequires(self): + + v = config_value('req1', 'bool2') + self.assertTrue(v) + + keys = [cfg.key for cfg in self.g1] + self.assertEqual(keys, ['bool1', 'bool2', 'c2','c3']) + + c = config_get('req1','bool1') + c.update(True) + + keys = [cfg.key for cfg in self.g1] + self.assertEqual(keys, ['bool1', 'bool2', 'c1', 'c2', 'c3']) + +class ConfigTestRequiresChoices(TestCase): + + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + g1 = ConfigurationGroup('req2', 'Requirements 2', ordering=1000) + + self.g1 = g1 + + choices1 = config_register(MultipleStringValue(BASE_GROUP, 'rc1', ordering=1)) + + self.g1c1 = config_register(IntegerValue(g1, 'c1', requires=choices1, ordering=3)) + self.g1c2 = config_register(IntegerValue(g1, 'c2', requires=choices1, ordering=4)) + self.g1c3 = config_register(IntegerValue(g1, 'c3', ordering=5)) + + choices1.update('c1') + + g2 = ConfigurationGroup('req3', 'Requirements 3', ordering=1000) + + self.g2 = g2 + + choices2 = config_register(StringValue(BASE_GROUP, 'choices2', ordering=1)) + + self.g2c1 = config_register(IntegerValue(g2, 'c1', requires=choices2, ordering=3)) + self.g2c2 = config_register(IntegerValue(g2, 'c2', requires=choices2, ordering=4)) + self.g2c3 = config_register(IntegerValue(g2, 'c3', requires=choices2, ordering=5)) + + choices2.update('c1') + + def testSimpleRequiresChoices(self): + + v = config_value('BASE', 'rc1') + self.assertEquals(v, ['c1']) + + g = config_get_group('req2') + keys = [cfg.key for cfg in g] + self.assertEqual(keys, ['c1','c3']) + + c = config_get('BASE', 'rc1') + c.update(['c1','c2']) + + g = config_get_group('req2') + keys = [cfg.key for cfg in g] + self.assertEqual(keys, ['c1', 'c2', 'c3']) + + def testRequiresSingleValue(self): + v = config_value('BASE', 'choices2') + self.assertEquals(v, 'c1') + + keys = [cfg.key for cfg in self.g2] + self.assertEqual(keys, ['c1']) + + c = config_get('BASE', 'choices2') + c.update('c2') + + keys = [cfg.key for cfg in self.g2] + self.assertEqual(keys, ['c2']) + +class ConfigTestRequiresValue(TestCase): + + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + g1 = ConfigurationGroup('reqval', 'Requirements 3', ordering=1000) + + self.g1 = g1 + + choices1 = config_register(MultipleStringValue(BASE_GROUP, 'valchoices', ordering=1)) + + self.g1c1 = config_register(IntegerValue(g1, 'c1', requires=choices1, requiresvalue='foo', ordering=3)) + self.g1c2 = config_register(IntegerValue(g1, 'c2', requires=choices1, requiresvalue='bar', ordering=4)) + self.g1c3 = config_register(IntegerValue(g1, 'c3', ordering=5)) + + choices1.update('foo') + + g2 = ConfigurationGroup('reqval2', 'Requirements 4', ordering=1000) + + self.g2 = g2 + + choices2 = config_register(StringValue(BASE_GROUP, 'valchoices2', ordering=1, + choices=(('a','test a'),('b', 'test b'),('c', 'test c')))) + + self.g2c1 = config_register(IntegerValue(g2, 'c1', requires=choices2, requiresvalue='a', ordering=3)) + self.g2c2 = config_register(IntegerValue(g2, 'c2', requires=choices2, requiresvalue='b', ordering=4)) + self.g2c3 = config_register(IntegerValue(g2, 'c3', requires=choices2, requiresvalue='c', ordering=5)) + + choices2.update('a') + + def testRequiresValue(self): + v = config_value('BASE', 'valchoices') + self.assertEquals(v, ['foo']) + + g = config_get_group('reqval') + + keys = [cfg.key for cfg in g] + self.assertEqual(keys, ['c1','c3']) + + c = config_get('BASE', 'valchoices') + c.update(['foo','bar']) + + g = config_get_group('reqval') + keys = [cfg.key for cfg in g] + self.assertEqual(keys, ['c1', 'c2', 'c3']) + + def testRequiresSingleValue(self): + v = config_value('BASE', 'valchoices2') + self.assertEquals(v, 'a') + + keys = [cfg.key for cfg in self.g2] + self.assertEqual(keys, ['c1']) + + c = config_get('BASE', 'valchoices2') + c.update('b') + + keys = [cfg.key for cfg in self.g2] + self.assertEqual(keys, ['c2']) + +class ConfigTestGroupRequires(TestCase): + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + choices1 = config_register(MultipleStringValue(BASE_GROUP, 'groupchoice', ordering=1)) + choices2 = config_register(MultipleStringValue(BASE_GROUP, 'groupchoice2', ordering=1)) + + g1 = ConfigurationGroup('groupreq', 'Requirements 4', ordering=1000, requires=choices1) + self.g1 = g1 + + self.g1c1 = config_register(IntegerValue(g1, 'c1', ordering=3)) + self.g1c2 = config_register(IntegerValue(g1, 'c2', requires=choices2, requiresvalue='bar', ordering=4)) + self.g1c3 = config_register(IntegerValue(g1, 'c3', ordering=5)) + + def testRequiresValue(self): + c = config_get('BASE', 'groupchoice') + self.assertEquals(c.value, []) + + keys = [cfg.key for cfg in self.g1] + self.assertEqual(keys, []) + + c2 = config_get('BASE', 'groupchoice2') + c2.update('bar') + + keys = [cfg.key for cfg in self.g1] + self.assertEqual(keys, ['c2']) + + c.update(['groupreq']) + + keys = [cfg.key for cfg in self.g1] + self.assertEqual(keys, ['c1', 'c2', 'c3']) + +class ConfigCollectGroup(TestCase): + def setUp(self): + keyedcache.cache_delete() + choices = config_register(MultipleStringValue(BASE_GROUP, 'collect', ordering=1)) + self.choices = choices + + g1 = ConfigurationGroup('coll1', 'Collection 1') + g2 = ConfigurationGroup('coll2', 'Collection 2') + g3 = ConfigurationGroup('coll3', 'Collection 3') + + g1c1 = config_register(StringValue(g1, 'test')) + g1c2 = config_register(StringValue(g1, 'test1')) + g2c1 = config_register(StringValue(g2, 'test')) + g3c1 = config_register(StringValue(g3, 'test')) + + g1c1.update('set a') + g1c2.update('set b') + g2c1.update('set a') + g3c1.update('set d') + + choices.update(['coll1','coll3']) + + def testCollectSimple(self): + v = config_collect_values('BASE', 'collect', 'test') + + self.assertEqual(v, ['set a', 'set d']) + + def testCollectUnique(self): + self.choices.update(['coll1','coll2','coll3']) + + v = config_collect_values('BASE', 'collect', 'test', unique=False) + + self.assertEqual(v, ['set a', 'set a', 'set d']) + + v = config_collect_values('BASE', 'collect', 'test', unique=True) + + self.assertEqual(v, ['set a', 'set d']) + +class LongSettingTest(TestCase): + def setUp(self): + keyedcache.cache_delete() + wide = config_register(LongStringValue(BASE_GROUP, 'LONG', ordering=1, default="woot")) + self.wide = wide + self.wide.update('*' * 1000) + + def testLongStorage(self): + w = config_value('BASE', 'LONG') + self.assertEqual(len(w), 1000) + self.assertEqual(w, '*'*1000) + + def testShortInLong(self): + self.wide.update("test") + w = config_value('BASE', 'LONG') + self.assertEqual(len(w), 4) + self.assertEqual(w, 'test') + + def testDelete(self): + remember = self.wide.setting.id + self.wide.update('woot') + + try: + q = LongSetting.objects.get(pk = remember) + self.fail("Should be deletec") + except LongSetting.DoesNotExist: + pass + +class OverrideTest(TestCase): + """Test settings overrides""" + def setUp(self): + # clear out cache from previous runs + keyedcache.cache_delete() + + djangosettings.LIVESETTINGS_OPTIONS = { + 1 : { + 'DB' : False, + 'SETTINGS' : { + 'overgroup' : { + 's2' : '100', + 'choices' : '["one","two","three"]' + } + } + } + } + + g = ConfigurationGroup('overgroup','Override Group') + self.g = g + config_register(StringValue(g, 's1')) + config_register(IntegerValue(g, 's2', default=10)) + config_register(IntegerValue(g, 's3', default=10)) + config_register(MultipleStringValue(g, 'choices')) + + def tearDown(self): + djangosettings.LIVESETTINGS_OPTIONS = {} + + def testOverriddenSetting(self): + """Accessing an overridden setting should give the override value.""" + c = config_get('overgroup', 's2') + self.assertEquals(c.value, 100) + + def testCantChangeSetting(self): + """When overridden, setting a value should not work, should get the overridden value""" + c = config_get('overgroup', 's2') + c.update(1) + + c = config_get('overgroup', 's2') + self.assertEquals(c.value, 100) + + def testNotOverriddenSetting(self): + """Settings which are not overridden should return their defaults""" + c = config_get('overgroup', 's3') + + self.assertEquals(c.value, 10) + + def testOverriddenListSetting(self): + """Make sure lists work when overridden""" + + c = config_get('overgroup', 'choices') + v = c.value + self.assertEqual(len(v), 3) + self.assertEqual(v[0], "one") + self.assertEqual(v[1], "two") + self.assertEqual(v[2], "three") diff --git a/askbot/deps/livesettings/urls.py b/askbot/deps/livesettings/urls.py new file mode 100644 index 00000000..b608bf1f --- /dev/null +++ b/askbot/deps/livesettings/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls.defaults import * + +urlpatterns = patterns('askbot.deps.livesettings.views', + url(r'^$', 'site_settings', {}, name='site_settings'), + url(r'^export/$', 'export_as_python', {}, name='settings_export'), + url(r'^(?P[^/]+)/$', 'group_settings', name='group_settings'), +) diff --git a/askbot/deps/livesettings/utils.py b/askbot/deps/livesettings/utils.py new file mode 100644 index 00000000..c0e0e293 --- /dev/null +++ b/askbot/deps/livesettings/utils.py @@ -0,0 +1,87 @@ +import sys +import types +import os + +def can_loop_over(maybe): + """Test value to see if it is list like""" + try: + iter(maybe) + except: + return 0 + else: + return 1 + +def is_list_or_tuple(maybe): + return isinstance(maybe, (types.TupleType, types.ListType)) + + +def is_scalar(maybe): + """Test to see value is a string, an int, or some other scalar type""" + return is_string_like(maybe) or not can_loop_over(maybe) + +def is_string_like(maybe): + """Test value to see if it acts like a string""" + try: + maybe+"" + except TypeError: + return 0 + else: + return 1 + + +def flatten_list(sequence, scalarp=is_scalar, result=None): + """flatten out a list by putting sublist entries in the main list""" + if result is None: + result = [] + + for item in sequence: + if scalarp(item): + result.append(item) + else: + flatten_list(item, scalarp, result) + +def load_module(module): + """Load a named python module.""" + try: + module = sys.modules[module] + except KeyError: + __import__(module) + module = sys.modules[module] + return module + +def get_flat_list(sequence): + """flatten out a list and return the flat list""" + flat = [] + flatten_list(sequence, result=flat) + return flat + +def url_join(*args): + """Join any arbitrary strings into a forward-slash delimited string. + Do not strip leading / from first element, nor trailing / from last element. + + This function can take lists as arguments, flattening them appropriately. + + example: + url_join('one','two',['three','four'],'five') => 'one/two/three/four/five' + """ + if len(args) == 0: + return "" + + args = get_flat_list(args) + + if len(args) == 1: + return str(args[0]) + + else: + args = [str(arg).replace("\\", "/") for arg in args] + + work = [args[0]] + for arg in args[1:]: + if arg.startswith("/"): + work.append(arg[1:]) + else: + work.append(arg) + + joined = reduce(os.path.join, work) + + return joined.replace("\\", "/") diff --git a/askbot/deps/livesettings/values.py b/askbot/deps/livesettings/values.py new file mode 100644 index 00000000..6bde7f5a --- /dev/null +++ b/askbot/deps/livesettings/values.py @@ -0,0 +1,628 @@ +"""Taken and modified from the dbsettings project. + +http://code.google.com/p/django-values/ +""" +from decimal import Decimal +from django import forms +from django.core.exceptions import ImproperlyConfigured +from django.utils import simplejson +from django.utils.datastructures import SortedDict +from django.utils.encoding import smart_str +from django.utils.translation import gettext, ugettext_lazy as _ +from askbot.deps.livesettings.models import find_setting, LongSetting, Setting, SettingNotSet +from askbot.deps.livesettings.overrides import get_overrides +from askbot.deps.livesettings.utils import load_module, is_string_like, is_list_or_tuple +import datetime +import logging +import signals + +__all__ = ['BASE_GROUP', 'ConfigurationGroup', 'Value', 'BooleanValue', 'DecimalValue', 'DurationValue', + 'FloatValue', 'IntegerValue', 'ModuleValue', 'PercentValue', 'PositiveIntegerValue', 'SortedDotDict', + 'StringValue', 'LongStringValue', 'MultipleStringValue'] + +_WARN = {} + +log = logging.getLogger('configuration') + +NOTSET = object() + +class SortedDotDict(SortedDict): + + def __getattr__(self, key): + try: + return self[key] + except: + raise AttributeError, key + + def __iter__(self): + vals = self.values() + for k in vals: + yield k + + def values(self): + vals = super(SortedDotDict, self).values() + vals = [v for v in vals if isinstance(v, (ConfigurationGroup, Value))] + vals.sort() + return vals + +class ConfigurationGroup(SortedDotDict): + """A simple wrapper for a group of configuration values""" + def __init__(self, key, name, *args, **kwargs): + """Create a new ConfigurationGroup. + + Arguments: + - key + - group name - for display to user + + Named Arguments: + - ordering: integer, optional, defaults to 1. + - requires: See `Value` requires. The default `requires` all member values will have if not overridden. + - requiresvalue: See `Values` requires_value. The default `requires_value` if not overridden on the `Value` objects. + """ + self.key = key + self.name = name + self.ordering = kwargs.pop('ordering', 1) + self.requires = kwargs.pop('requires', None) + if self.requires: + reqval = kwargs.pop('requiresvalue', key) + if not is_list_or_tuple(reqval): + reqval = (reqval, reqval) + + self.requires_value = reqval[0] + self.requires.add_choice(reqval) + + super(ConfigurationGroup, self).__init__(*args, **kwargs) + + def __cmp__(self, other): + return cmp((self.ordering, self.name), (other.ordering, other.name)) + + def __eq__(self, other): + return (type(self) == type(other) + and self.ordering == other.ordering + and self.name == other.name) + + def __ne__(self, other): + return not self == other + + def dict_values(self, load_modules=True): + vals = {} + keys = super(ConfigurationGroup, self).keys() + for key in keys: + v = self[key] + if isinstance(v, Value): + value = v.value + else: + value = v + vals[key] = value + return vals + + def values(self): + vals = super(ConfigurationGroup, self).values() + return [v for v in vals if v.enabled()] + +BASE_GROUP = ConfigurationGroup('BASE', _('Base Settings'), ordering=0) + +class Value(object): + + creation_counter = 0 + + def __init__(self, group, key, **kwargs): + """ + Create a new Value object for configuration. + + Args: + - `ConfigurationGroup` + - key - a string key + + Named arguments: + - `description` - Will be passed to the field for form usage. Should be a translation proxy. Ex: _('example') + - `help_text` - Will be passed to the field for form usage. + - `choices` - If given, then the form field will use a select box + - `ordering` - Defaults to alphabetical by key if not given. + - `requires` - If given as a `Value`, then this field will only be rendered if that Value evaluates true (for Boolean requires) or the proper key is in the associated value. + - `requiresvalue` - If set, then this field will only be rendered if that value is in the list returned by self.value. Defaults to self.key. + - `hidden` - If true, then render a hidden field. + - `default` - If given, then this Value will return that default whenever it has no assocated `Setting`. + - `update_callback` - if given, then this value will call the callback whenever updated + """ + self.group = group + self.key = key + self.description = kwargs.get('description', None) + self.help_text = kwargs.get('help_text') + self.choices = kwargs.get('choices',[]) + self.ordering = kwargs.pop('ordering', 0) + self.hidden = kwargs.pop('hidden', False) + self.update_callback = kwargs.pop('update_callback', None) + self.requires = kwargs.pop('requires', None) + if self.requires: + reqval = kwargs.pop('requiresvalue', key) + if not is_list_or_tuple(reqval): + reqval = (reqval, reqval) + + self.requires_value = reqval[0] + self.requires.add_choice(reqval) + + elif group.requires: + self.requires = group.requires + self.requires_value = group.requires_value + + if kwargs.has_key('default'): + self.default = kwargs.pop('default') + self.use_default = True + else: + self.use_default = False + + self.creation_counter = Value.creation_counter + Value.creation_counter += 1 + + def __cmp__(self, other): + return cmp((self.ordering, self.description, self.creation_counter), (other.ordering, other.description, other.creation_counter)) + + def __eq__(self, other): + if type(self) == type(other): + return self.value == other.value + else: + return self.value == other + + def __iter__(self): + return iter(self.value) + + def __unicode__(self): + return unicode(self.value) + + def __str__(self): + return str(self.value) + + def add_choice(self, choice): + """Add a choice if it doesn't already exist.""" + if not is_list_or_tuple(choice): + choice = (choice, choice) + skip = False + for k, v in self.choices: + if k == choice[0]: + skip = True + break + if not skip: + self.choices += (choice, ) + + def choice_field(self, **kwargs): + if self.hidden: + kwargs['widget'] = forms.MultipleHiddenInput() + return forms.ChoiceField(choices=self.choices, **kwargs) + + def _choice_values(self): + choices = self.choices + vals = self.value + return [x for x in choices if x[0] in vals] + + choice_values = property(fget=_choice_values) + + def copy(self): + new_value = self.__class__(self.key) + new_value.__dict__ = self.__dict__.copy() + return new_value + + def _default_text(self): + if not self.use_default: + note = "" + else: + if self.default == "": + note = _('Default value: ""') + + elif self.choices: + work = [] + for x in self.choices: + if x[0] in self.default: + work.append(smart_str(x[1])) + note = gettext('Default value: ') + ", ".join(work) + + else: + note = _("Default value: %s") % unicode(self.default) + + return note + + default_text = property(fget=_default_text) + + def enabled(self): + enabled = False + try: + if not self.requires: + enabled = True + else: + v = self.requires.value + if self.requires.choices: + enabled = self.requires_value == v or self.requires_value in v + elif v: + enabled = True + except SettingNotSet: + pass + return enabled + + def make_field(self, **kwargs): + if self.choices: + if self.hidden: + kwargs['widget'] = forms.MultipleHiddenInput() + field = self.choice_field(**kwargs) + else: + if self.hidden: + kwargs['widget'] = forms.HiddenInput() + field = self.field(**kwargs) + + field.group = self.group + field.default_text = self.default_text + return field + + def make_setting(self, db_value): + log.debug('new setting %s.%s', self.group.key, self.key) + return Setting(group=self.group.key, key=self.key, value=db_value) + + def _setting(self): + return find_setting(self.group.key, self.key) + + setting = property(fget = _setting) + + def _value(self): + use_db, overrides = get_overrides() + + if not use_db: + try: + val = overrides[self.group.key][self.key] + except KeyError: + if self.use_default: + val = self.default + else: + raise SettingNotSet('%s.%s is not in your LIVESETTINGS_OPTIONS' % (self.group.key, self.key)) + + else: + try: + val = self.setting.value + + except SettingNotSet, sns: + if self.use_default: + val = self.default + if overrides: + # maybe override the default + grp = overrides.get(self.group.key, {}) + if grp.has_key(self.key): + val = grp[self.key] + else: + val = NOTSET + + except AttributeError, ae: + log.error("Attribute error: %s", ae) + log.error("%s: Could not get _value of %s", self.key, self.setting) + raise(ae) + + except Exception, e: + global _WARN + log.error(e) + if str(e).find("configuration_setting") > -1: + if not _WARN.has_key('configuration_setting'): + log.warn('Error loading setting %s.%s from table, OK if you are in syncdb', self.group.key, self.key) + _WARN['configuration_setting'] = True + + if self.use_default: + val = self.default + else: + raise ImproperlyConfigured("All settings used in startup must have defaults, %s.%s does not", self.group.key, self.key) + else: + import traceback + traceback.print_exc() + log.warn("Problem finding settings %s.%s, %s", self.group.key, self.key, e) + raise SettingNotSet("Startup error, couldn't load %s.%s" %(self.group.key, self.key)) + return val + + def update(self, value): + use_db, overrides = get_overrides() + + if use_db: + current_value = self.value + + new_value = self.to_python(value) + if current_value != new_value: + if self.update_callback: + new_value = apply(self.update_callback, (current_value, new_value)) + + db_value = self.get_db_prep_save(new_value) + + try: + s = self.setting + s.value = db_value + + except SettingNotSet: + s = self.make_setting(db_value) + + if self.use_default and self.default == new_value: + if s.id: + log.info("Deleted setting %s.%s", self.group.key, self.key) + s.delete() + else: + log.info("Updated setting %s.%s = %s", self.group.key, self.key, value) + s.save() + + signals.configuration_value_changed.send(self, old_value=current_value, new_value=new_value, setting=self) + + return True + else: + log.debug('not updating setting %s.%s - askbot.deps.livesettings db is disabled',self.group.key, self.key) + + return False + + @property + def value(self): + val = self._value() + return self.to_python(val) + + @property + def editor_value(self): + val = self._value() + return self.to_editor(val) + + # Subclasses should override the following methods where applicable + + def to_python(self, value): + "Returns a native Python object suitable for immediate use" + if value == NOTSET: + value = None + return value + + def get_db_prep_save(self, value): + "Returns a value suitable for storage into a CharField" + if value == NOTSET: + value = "" + return unicode(value) + + def to_editor(self, value): + "Returns a value suitable for display in a form widget" + if value == NOTSET: + return NOTSET + return unicode(value) + +############### +# VALUE TYPES # +############### + +class BooleanValue(Value): + + class field(forms.BooleanField): + + def __init__(self, *args, **kwargs): + kwargs['required'] = False + forms.BooleanField.__init__(self, *args, **kwargs) + + def add_choice(self, choice): + # ignore choice adding for boolean types + pass + + def to_python(self, value): + if value in (True, 't', 'True', 1, '1'): + return True + return False + + to_editor = to_python + +class DecimalValue(Value): + class field(forms.DecimalField): + + def __init__(self, *args, **kwargs): + kwargs['required'] = False + forms.DecimalField.__init__(self, *args, **kwargs) + + def to_python(self, value): + if value==NOTSET: + return Decimal("0") + + try: + return Decimal(value) + except TypeError, te: + log.warning("Can't convert %s to Decimal for settings %s.%s", value, self.group.key, self.key) + raise TypeError(te) + + def to_editor(self, value): + if value == NOTSET: + return "0" + else: + return unicode(value) + +# DurationValue has a lot of duplication and ugliness because of issue #2443 +# Until DurationField is sorted out, this has to do some extra work +class DurationValue(Value): + + class field(forms.CharField): + def clean(self, value): + try: + return datetime.timedelta(seconds=float(value)) + except (ValueError, TypeError): + raise forms.ValidationError('This value must be a real number.') + except OverflowError: + raise forms.ValidationError('The maximum allowed value is %s' % datetime.timedelta.max) + + def to_python(self, value): + if value == NOTSET: + value = 0 + if isinstance(value, datetime.timedelta): + return value + try: + return datetime.timedelta(seconds=float(value)) + except (ValueError, TypeError): + raise forms.ValidationError('This value must be a real number.') + except OverflowError: + raise forms.ValidationError('The maximum allowed value is %s' % datetime.timedelta.max) + + def get_db_prep_save(self, value): + if value == NOTSET: + return NOTSET + else: + return unicode(value.days * 24 * 3600 + value.seconds + float(value.microseconds) / 1000000) + +class FloatValue(Value): + + class field(forms.FloatField): + + def __init__(self, *args, **kwargs): + kwargs['required'] = False + forms.FloatField.__init__(self, *args, **kwargs) + + def to_python(self, value): + if value == NOTSET: + value = 0 + return float(value) + + def to_editor(self, value): + if value == NOTSET: + return "0" + else: + return unicode(value) + +class IntegerValue(Value): + class field(forms.IntegerField): + + def __init__(self, *args, **kwargs): + kwargs['required'] = False + forms.IntegerField.__init__(self, *args, **kwargs) + + def to_python(self, value): + if value == NOTSET: + value = 0 + return int(value) + + def to_editor(self, value): + if value == NOTSET: + return "0" + else: + return unicode(value) + + +class PercentValue(Value): + + class field(forms.DecimalField): + + def __init__(self, *args, **kwargs): + kwargs['required'] = False + forms.DecimalField.__init__(self, 100, 0, 5, 2, *args, **kwargs) + + class widget(forms.TextInput): + def render(self, *args, **kwargs): + # Place a percent sign after a smaller text field + attrs = kwargs.pop('attrs', {}) + attrs['size'] = attrs['max_length'] = 6 + return forms.TextInput.render(self, attrs=attrs, *args, **kwargs) + '%' + + def to_python(self, value): + if value == NOTSET: + value = 0 + return Decimal(value) / 100 + + def to_editor(self, value): + if value == NOTSET: + return "0" + else: + return unicode(value) + +class PositiveIntegerValue(IntegerValue): + + class field(forms.IntegerField): + + def __init__(self, *args, **kwargs): + kwargs['min_value'] = 0 + forms.IntegerField.__init__(self, *args, **kwargs) + + +class StringValue(Value): + + class field(forms.CharField): + def __init__(self, *args, **kwargs): + kwargs['required'] = False + forms.CharField.__init__(self, *args, **kwargs) + + def to_python(self, value): + if value == NOTSET: + value = "" + return unicode(value) + + to_editor = to_python + +class LongStringValue(Value): + + class field(forms.CharField): + def __init__(self, *args, **kwargs): + kwargs['required'] = False + kwargs['widget'] = forms.Textarea() + forms.CharField.__init__(self, *args, **kwargs) + + def make_setting(self, db_value): + log.debug('new long setting %s.%s', self.group.key, self.key) + return LongSetting(group=self.group.key, key=self.key, value=db_value) + + def to_python(self, value): + if value == NOTSET: + value = "" + return unicode(value) + + to_editor = to_python + + +class MultipleStringValue(Value): + + class field(forms.CharField): + + def __init__(self, *args, **kwargs): + kwargs['required'] = False + forms.CharField.__init__(self, *args, **kwargs) + + def choice_field(self, **kwargs): + kwargs['required'] = False + return forms.MultipleChoiceField(choices=self.choices, **kwargs) + + def get_db_prep_save(self, value): + if is_string_like(value): + value = [value] + return simplejson.dumps(value) + + def to_python(self, value): + if not value or value == NOTSET: + return [] + if is_list_or_tuple(value): + return value + else: + try: + return simplejson.loads(value) + except: + if is_string_like(value): + return [value] + else: + log.warning('Could not decode returning empty list: %s', value) + return [] + + + to_editor = to_python + +class ModuleValue(Value): + """Handles setting modules, storing them as strings in the db.""" + + class field(forms.CharField): + + def __init__(self, *args, **kwargs): + kwargs['required'] = False + forms.CharField.__init__(self, *args, **kwargs) + + def load_module(self, module): + """Load a child module""" + value = self._value() + if value == NOTSET: + raise SettingNotSet("%s.%s", self.group.key, self.key) + else: + return load_module("%s.%s" % (value, module)) + + def to_python(self, value): + if value == NOTSET: + v = {} + else: + v = load_module(value) + return v + + def to_editor(self, value): + if value == NOTSET: + value = "" + return value + diff --git a/askbot/deps/livesettings/views.py b/askbot/deps/livesettings/views.py new file mode 100644 index 00000000..000a7bbd --- /dev/null +++ b/askbot/deps/livesettings/views.py @@ -0,0 +1,93 @@ +from django.http import HttpResponseRedirect +from django.core.urlresolvers import reverse +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.contrib.admin.views.decorators import staff_member_required +from django.views.decorators.cache import never_cache +from askbot.deps.livesettings import ConfigurationSettings, forms +from askbot.deps.livesettings.overrides import get_overrides +import logging + +log = logging.getLogger('configuration.views') + +def group_settings(request, group, template='askbot.deps.livesettings/group_settings.html'): + # Determine what set of settings this editor is used for + + use_db, overrides = get_overrides(); + + mgr = ConfigurationSettings() + + settings = mgr[group] + title = settings.name + log.debug('title: %s', title) + + if use_db: + # Create an editor customized for the current user + #editor = forms.customized_editor(settings) + + if request.method == 'POST': + # Populate the form with user-submitted data + data = request.POST.copy() + form = forms.SettingsEditor(data, settings=settings) + if form.is_valid(): + form.full_clean() + for name, value in form.cleaned_data.items(): + group, key = name.split('__') + cfg = mgr.get_config(group, key) + if cfg.update(value): + + # Give user feedback as to which settings were changed + request.user.message_set.create(message='Updated %s on %s' % (cfg.key, cfg.group.key)) + + return HttpResponseRedirect(request.path) + else: + # Leave the form populated with current setting values + #form = editor() + form = forms.SettingsEditor(settings=settings) + else: + form = None + + return render_to_response(template, { + 'all_groups': mgr.groups(), + 'title': title, + 'group' : settings, + 'form': form, + 'use_db' : use_db + }, context_instance=RequestContext(request)) +group_settings = never_cache(staff_member_required(group_settings)) + +# Site-wide setting editor is identical, but without a group +# staff_member_required is implied, since it calls group_settings +def site_settings(request): + mgr = ConfigurationSettings() + default_group= mgr.groups()[0].key + return HttpResponseRedirect(reverse('group_settings', args=[default_group])) + #return group_settings(request, group=None, template='askbot.deps.livesettings/site_settings.html') + +def export_as_python(request): + """Export site settings as a dictionary of dictionaries""" + + from askbot.deps.livesettings.models import Setting, LongSetting + import pprint + + work = {} + both = list(Setting.objects.all()) + both.extend(list(LongSetting.objects.all())) + + for s in both: + if not work.has_key(s.site.id): + work[s.site.id] = {} + sitesettings = work[s.site.id] + + if not sitesettings.has_key(s.group): + sitesettings[s.group] = {} + sitegroup = sitesettings[s.group] + + sitegroup[s.key] = s.value + + pp = pprint.PrettyPrinter(indent=4) + pretty = pp.pformat(work) + + return render_to_response('askbot.deps.livesettings/text.txt', { 'text' : pretty }, mimetype='text/plain') + +export_as_python = never_cache(staff_member_required(export_as_python)) diff --git a/askbot/doc/HOW_TO_DEBUG b/askbot/doc/HOW_TO_DEBUG new file mode 100644 index 00000000..fbbdb1f7 --- /dev/null +++ b/askbot/doc/HOW_TO_DEBUG @@ -0,0 +1,39 @@ +1) LOGGING +Please remember that log files may contain plaintext passwords, etc. + +Please do not add print statements - at least do not commit them to git +because in some environments printing to stdout causes errors + +Instead use python logging this way: +-------------------------------- +#somewere on top of file +import logging + +#anywhere below +logging.debug('this maybe works') +logging.error('have big error!') +#or even +logging.debug('') #this will add time, line number, function and file record +#sometimes useful record for call tracing on its own +#etc - take a look at http://docs.python.org/library/logging.html +------------------------------- + +in Askbot logging is currently set up in settings_local.py.dist +please update it if you need - in older revs logging strings have less info + +messages of interest can be grepped out of the log file by module/file/function name +e.g. to take out all django_authopenid logs run: +>grep 'askbot\/django_authopenid' log/django.askbot.log | sed 's/^.*MSG: //' +in the example above 'sed' call truncates out a long prefix +and makes output look more meaningful + +2) DJANGO DEBUG TOOLBAR +askbot works with django debug toolbar +if debugging under apache server, check +that debug toolbar media is loaded correctly +if toolbar is enabled but you do not see it, possibly some Alias statement +in apache config is wrong in your VirtualHost or elsewhere + +3) If you discover new debugging techniques, please add here. +Possible areas to improve - at this point there is no SQL query logging, +as well as request data and http header. diff --git a/askbot/doc/INSTALL b/askbot/doc/INSTALL new file mode 100644 index 00000000..55b8614d --- /dev/null +++ b/askbot/doc/INSTALL @@ -0,0 +1,291 @@ +CONTENTS +------------------ +A. PREREQUISITES +B. INSTALLATION + 1. Settings file + 2. Database + 3. Running Askbot in the development server + 4. Installation under Apache/WSGI + 5. Full text search + 6. Email subscriptions + 7. Sitemap + 8. Miscellaneous +C. CONFIGURATION PARAMETERS (settings_local.py) +D. CUSTOMIZATION + + +A. PREREQUISITES +----------------------------------------------- +Note: by default all installation activity is made in the superuser 'root' account. +This can be achieved either by logging in as root (su root), +or - if you have program sudo installed - prefix all commands with sudo. +So sodo will be listed below as optional. + +0. We recommend you to use python-setuptools to install pre-requirement libraries. +If you haven't installed it, please try to install it first. +e.g, [sudo] apt-get install python-setuptools + +1. Python2.5/2.6, Django v1.1.1 + +1A If you are using MySQL, mysql client for python must be installed +[sudo] easy_install mysql-python + +2. Python-openid v2.2 +http://openidenabled.com/python-openid/ +[sudo] easy_install python-openid + +4. html5lib +http://code.google.com/p/html5lib/ +Used for HTML sanitizer +[sudo] easy_install html5lib + +5. Markdown2 +http://code.google.com/p/python-markdown2/ +[sudo] easy_install markdown2 + +6. Django Debug Toolbar +http://github.com/robhudson/django-debug-toolbar/tree/master + +7. djangosphinx (optional - for full text questions+answer+tag) +http://github.com/dcramer/django-sphinx/tree/master/djangosphinx + +8. sphinx search engine (optional, works together with djangosphinx) +http://sphinxsearch.com/downloads.html + +9. recaptcha_django (installed through svn) +http://code.google.com/p/recaptcha-django/ + +10. python recaptcha module +http://code.google.com/p/recaptcha/ +easy_install recaptcha-client +Notice that you will need to register with recaptcha.net and receive +recaptcha public and private keys that need to be saved in your +settings_local.py file + +11. South +http://south.aeracode.org/docs/installation.html +Used for database schema and data migrations +[sudo] easy_install South + +EXTRA DEPENDENCIES FOR PYTHON 2.4 +* hashlib (made standard in python 2.5) + +NOTES: django_authopenid is included into Askbot code +and is significantly modified. http://code.google.com/p/django-authopenid/ +no need to install this library + +B. INSTALLATION + +NOTE: If you want to upgrade software, not install from scratch - + take a look into forum/documentation/UPGRADE + +----------------------------------------------- +0. Make sure you have all above python libraries installed. + + DO NOT name the main directory 'askbot' - this name is reserved + for the future name of the app file itself. + + make askbot installation server-readable on Linux command might be: + chown -R yourlogin:apache /path/to/askbot-site + + directories: + /path/to/askbot-site/forum/upfiles + /path/to/askbot-site/log + must be server writable + + on Linux type chmod + chmod -R g+w /path/to/askbot-site/forum/upfiles + chmod -R g+w /path/to/askbot-site/log + + above it is assumed that webserver runs under group named "apache" + +1. Settings file + +Copy settings_local.py.dist to settings_local.py and +update all your settings. Check settings.py and update +it as well if necessory. +Section C explains configuration paramaters. + +Minimally required modification of settings_local.py are +DATABASE_NAME +DATABASE_USER +DATABASE_PASSWORD +DATABASE_ENGINE + +If you set these up, and your database is ready (see section 2), +run (note that application 'forum' is under control of south migration system: + +python manage.py syncdb #create tables for anything not under control of migration system +python manage.py migrate forum #run migration command - will apply all migrations in sequence + +Now you are ready to test your installation: + +python manage.py runserver `hostname -i`:8000 +(choose another port number if you wish) + +and askbot should be running - if you have any issues at this point (or later:) +please post them at http://askbot.org/meta + +2. Database + +Prepare your database by using the same database/account +configuration from above. + +If your host has database manager in the control panel - you +can use that or you can create database by typing commands manually + +on MySQL the commands are: + +create database askbot DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci; +grant all on askbot.* to 'askbot'@'localhost'; + +And then run : + +python manage.py syncdb +python manage.py migrate + +3. Running Askbot on the development server + +Run "python manage.py runserver" to startup django +development environment. +(Under Linux you can use command "python manage.py runserver `hostname -i`:8000", +where you can use any other available number for the port) + +you might want to have DEBUG=True in the beginning of settings.py +when using the test server + +4. Installation under Apache/WSGI + +The main wsgi script is in the file django.wsgi +it does not need to be modified + +4.1 Configure webserver +Settings below are not perfect but may be a good starting point + +--------- +WSGISocketPrefix /path/to/socket/sock #must be readable and writable by apache +WSGIPythonHome /usr/local #must be readable by apache +WSGIPythonEggs /var/python/eggs #must be readable and writable by apache + +#NOTE: all urs below will need to be adjusted if +#settings.FORUM_SCRIPT_ALIAS !='' (e.g. = 'forum/') +#this allows "rooting" forum at http://example.com/forum, if you like + + ServerAdmin forum@example.com + DocumentRoot /path/to/askbot-site + ServerName example.com + + #run mod_wsgi process for django in daemon mode + #this allows avoiding confused timezone settings when + #another application runs in the same virtual host + WSGIDaemonProcess askbot + WSGIProcessGroup askbot + + #force all content to be served as static files + #otherwise django will be crunching images through itself wasting time + Alias /m/ /path/to/askbot-site/forum/skins/ + Alias /upfiles/ /path/to/askbot-site/forum/upfiles/ + + Order deny,allow + Allow from all + + + #this is your wsgi script described in the prev section + WSGIScriptAlias / /path/to/askbot-site/django.wsgi + + #this will force admin interface to work only + #through https (optional) + #"nimda" is the secret spelling of "admin" ;) + + RewriteEngine on + RewriteRule /nimda(.*)$ https://example.com/nimda$1 [L,R=301] + + CustomLog /var/log/httpd/askbot/access_log common + ErrorLog /var/log/httpd/askbot/error_log + +#(optional) run admin interface under https + + ServerAdmin forum@example.com + DocumentRoot /path/to/askbot-site + ServerName example.com + SSLEngine on + SSLCertificateFile /path/to/ssl-certificate/server.crt + SSLCertificateKeyFile /path/to/ssl-certificate/server.key + WSGIScriptAlias / /path/to/askbot-site/django.wsgi + CustomLog /var/log/httpd/askbot/access_log common + ErrorLog /var/log/httpd/askbot/error_log + DirectoryIndex index.html + +------------- + +5. Full text search (using sphinx search) + + Currently full text search works only with sphinx search engine + And builtin PostgreSQL (postgres only >= 8.3???) + + 5.1 Instructions for Sphinx search setup + Sphinx at this time supports only MySQL and PostgreSQL databases + to enable this, install sphinx search engine and djangosphinx + + configure sphinx, sample configuration can be found in + sphinx/sphinx.conf file usually goes somewhere in /etc tree + + build askbot index first time manually + + % indexer --config /path/to/sphinx.conf --index askbot + + setup cron job to rebuild index periodically with command + your crontab entry may be something like + + 0 9,15,21 * * * /usr/local/bin/indexer --config /etc/sphinx/sphinx.conf --all --rotate >/dev/null 2>&1 + adjust it as necessary this one will reindex three times a day at 9am 3pm and 9pm + + if your forum grows very big ( good luck with that :) you'll + need to two search indices one diff index and one main + please refer to online sphinx search documentation for the information + on the subject http://sphinxsearch.com/docs/ + + in settings_local.py set + USE_SPHINX_SEARCH=True + adjust other settings that have SPHINX_* prefix accordingly + remember that there must be trailing comma in parentheses for + SHPINX_SEARCH_INDICES tuple - particlarly with just one item! + + in settings.py look for INSTALLED_APPS + and uncomment #'djangosphinx', + + +6. Email subsctiptions and badge awards + + copy file forum/cron/askbot_cron_job + somewhere in your user space (outside of forum) + edit paths in that file + + set up a cron job to call it say hourly + + the commands within askbot_cron_job can also be called manually + from the command line for the testing purposes + +7. Sitemap +Sitemap will be available at /sitemap.xml +e.g yoursite.com/forum/sitemap.xml + +google will be pinged each time question, answer or +comment is saved or a question deleted + +for this to be useful - do register you sitemap with Google at +https://www.google.com/webmasters/tools/ + +8. Miscellaneous + +There are some demo scripts under forum/sql_scripts folder, +including badges and test accounts for CNProg.com. You +don't need them to run your sample. + +C. Customization + +Other than settings_local.py the following will most likely need customization: +* locale/*/django.po - language files that may also contain your site-specific messages + if you want to start with english messages file - look for words like "forum" and + "Askbot" in the msgstr lines +* skins diff --git a/askbot/doc/INSTALL.pip b/askbot/doc/INSTALL.pip new file mode 100644 index 00000000..2f817ff8 --- /dev/null +++ b/askbot/doc/INSTALL.pip @@ -0,0 +1,31 @@ +* Install virtualenv and pip: + easy_install virtualenv + easy_install pip + +* Install MySQL: + sudo apt-get install mysql-client mysql-server + +* Install sphinxsearch. See: + [optional] + http://sphinxsearch.com/downloads.html + http://www.hackido.com/2009/01/install-sphinx-search-on-ubuntu.html + git://github.com/johnl/deb-sphinx-search.git + +* Install a virtual environment OUTSIDE of this directory: + pip install -E ~/env -r askbot-requirements.txt +[there is discussion on the pinax forums about what it should be outside +the source directory] + +* Notice that you will need to register with recaptcha.net and receive + recaptcha public and private keys that need to be saved in your + settings_local.py file + +* Start your environment: + source ~/env/bin/activate + +* Install mysql-python into your virtualenv, because we can't +automagically install it with pip: + easy_install --prefix ~/env/ mysql-python + +For more information about why pip can't automatically install the +MySQL driver, see this message: http://groups.google.com/group/python-virtualenv/msg/ea988085951c92b3 diff --git a/askbot/doc/INSTALL.webfaction b/askbot/doc/INSTALL.webfaction new file mode 100644 index 00000000..a449ffe6 --- /dev/null +++ b/askbot/doc/INSTALL.webfaction @@ -0,0 +1,345 @@ +NOTE: this file may be a bit out of date + +Detailed instructions for installing Askbot on WebFaction + +Adapted from http://code.pinaxproject.com/wiki/DetailedPinaxWebfaction/ + +Please email turian at gmail with any updates or corrections. + + +Installing Askbot on Webfaction +------------------------------------ + +Details the steps for setting up Askbot on a Webfaction shared-hosting +account, including email setup, using Apache2, mod_wsgi, psycopg2. + +If you want to search-and-replace through this file, you will need to replace: + askbot_server [name of Webfaction application, which will be in ~/webapps/] + askbot_static [name of Webfaction application for static media serving] + DOMAIN.com [domain name for Askbot site] + PORT [port number assigned by WebFaction to your mod_wsgi application] + SITENAME [name you give the Askbot site, which will contain the apache logs] + myaskbot [name of the Askbot project] + MAILBOX_USERNAME [username you give the email address] + MAILBOX_PASSWORD [password that webfaction gives to this email username] + AskbotDATABASE_NAME [username you give the database] + AskbotDATABASE_PASSWORD [password that webfaction gives to this database] + ~/envs/askbot [directory for the Askbot python environment, grep for 'env'] + USERNAME [your WebFaction username] + +Some things I'm not sure about: + +Here's what I don't know how to do: + * Set up a nginx server for static media. + * Configure sphinx search + * Use PostgreSQL, not MySQL: http://askbot.net/question/13/can-i-use-askbot-with-postgresql + + +Webfaction Control Panel +-------------------------- + +(Note: if you sign up and pick django it will create the application +for you, website/subdomain and associate the two for you.) + + If necessary, add or create any domains or subdomains you may need. + + https://panel.webfaction.com/domain/list/ + + Let's call the domain DOMAIN.com. + + Create a new Webfaction application with a "Type:" of "mod_wsgi + 2.5/Python2.5", naming it "askbot_server". (These instructions + might also work with mod_wsgi 2.0, if you like.) + + https://panel.webfaction.com/app_/list + + Note the port number assigned to the mod_wsgi application. Call + it PORT. + + Create a new Webfaction website which will associate the subdomain + with the new askbot_server application. Give it name SITENAME, at least one + domain, and set it to use the askbot_server application for the site's + root location, "/". + + https://panel.webfaction.com/site/list + + You will need to create a database, typically one for each project + you create. Change the type to PostgreSql and modify the name (it + defaults to your webfaction account name) by adding an underscore + and a project-specific identifier such as "_askbot". Before + leaving this section of the control panel, you may wish to change + the password. + + https://panel.webfaction.com/database/create + + Call these AskbotDATABASE_NAME and AskbotDATABASE_PASSWORD. + + Save the database password for later. + + [The following I haven't figured out yet] + You will probably want to add a static media server. This is a + Webfaction application. I created one of type "Static only (no + .htaccess)" and with the name of "askbot_static". + + https://panel.webfaction.com/app_/create + + To configure email, you need an email mailbox. Add one here. Note + that your mailbox password shouldn't be the same password you use + to SSH to webfaction. + + https://panel.webfaction.com/mailbox/list + + Save the mail password for later. + We will call the username and password MAILBOX_USERNAME and + MAILBOX_PASSWORD, respectively. + You might also consider adding an email address like admin@DOMAIN.com, + here: + + https://panel.webfaction.com/email/list + + +Askbot Software +-------------- + + Log onto webfaction and get the code. I use my fork because I have + a simple pip installation: + git://github.com/turian/askbot.git + In my situation, I keep source code in ~/utils/src, create + virtual environments in ~/envs/askbot, and create Pinax projects in + ~/webapps/askbot_server/projects. + + You will need pip + virtualenv installed: + + easy_install --prefix=~/utils/ pip + easy_install --prefix=~/utils/ virtualenv + + cd ~/utils/src/ + git clone git://github.com/turian/askbot.git + cd askbot + + # We need python2.5 to be compatible with WSGI + python2.5 ~/utils/bin/pip install -E ~/envs/askbot -r askbot-requirements.txt + source ~/envs/askbot/bin/activate + + # [Optional] If you want a MySQL database + easy_install-2.5 --prefix ~/envs/askbot/ mysql-python + +Additional Software +------------------- + + [Note that PostgreSQL installation doesn't work for me.] + + You will need to install psycopg2 separately for PostgreSQL. + Psycopg2 requires a little fiddling. Continuing to + work in the ~/utils/src/ directory: + + cd ~/utils/src/ + wget http://initd.org/pub/software/psycopg/psycopg2-2.0.13.tar.gz + tar zxf psycopg2-2.0.13.tar.gz + cd psycopg2-2.0.13 + nano setup.cfg + + # edit the line reading "#pg_config=" so that it reads: + "pg_config=/usr/local/pgsql/bin/pg_config" + + python2.5 setup.py build + python2.5 setup.py install + + +Create a Project +---------------- + + In Pinax, you clone a project from Askbot. + However, Askbot we just copy it. + + cd ~/webapps/askbot_server + mkdir projects + cd projects + cp -R ~/utils/src/askbot myaskbot + cd myaskbot + export AskbotPROJECT=`pwd` + + Make some directories, as described in the Askbot INSTALL file: + [okay I haven't actually done this yet] + +# mkdir -p $AskbotSITE/upfiles/ +# mkdir -p $AskbotLOG +# sudo chown -R `whoami`:www-data $AskbotSITE +# sudo chown -R `whoami`:www-data $AskbotLOG +# chmod -R g+w $AskbotSITE/upfiles +# chmod -R g+w $AskbotLOG + + + Edit the settings files: + + cd $AskbotPROJECT + cp settings_local.py.dist settings_local.py + vi settings_local.py settings.py + + Pay attention to the following settings: + + DATABASE_ENGINE = 'mysql' + DATABASE_NAME = 'AskbotDATABASE_NAME' + DATABASE_USER = 'AskbotDATABASE_NAME' + DATABASE_PASSWORD = 'AskbotDATABASE_PASSWORD' + + EMAIL_HOST='smtp.webfaction.com' + EMAIL_HOST_USER='MAILBOX_USERNAME' + EMAIL_HOST_PASSWORD='MAILBOX_PASSWORD' + EMAIL_PORT='25' + DEFAULT_FROM_EMAIL = 'MAILBOX_USERNAME@DOMAIN.com' + SERVER_EMAIL = 'MAILBOX_USERNAME@DOMAIN.com' + # The following setting might not be necessary, it's used in Pinax tho + CONTACT_EMAIL = "MAILBOX_USERNAME@DOMAIN.com" + + APP_URL = 'http://DOMAIN.com' #used by email notif system and RSS + + [Later on, the install instructions should talk about] + SERVE_MEDIA = False # [Not present, not ready yet] + + Create a directory for logs: + + cd $AskbotPROJECT + mkdir log + + Modify mail cron scripts "cron/send_email_alerts" as follows: + [Pinax has cron/emit_notices.sh, cron/retry_deferred.sh, + cron/send_mail.sh, are these also necessary?] + + #!/bin/sh + + WORKON_HOME=~/envs/askbot + PROJECT_ROOT=~/webapps/askbot_server/projects/myaskbot/ + + # activate virtual environment + . $WORKON_HOME/bin/activate + + cd $PROJECT_ROOT + python manage.py send_email_alerts >> $PROJECT_ROOT/log/cron_mail.log 2>&1 + + Use command "crontab -e" to add this script to your cron file, to run twice a day:: + + 1 0,12 * * * ~/webapps/askbot_server/projects/myaskbot/cron/send_email_alerts + + [Configure sphinx] + + Create the database tables, indices, and so forth: + + python manage.py syncdb + + [Ignore the following static media steps, I haven't tried them] + Build media directory links within the project and create symbolic + links on the static media server. + python manage.py build_media -all + mkdir ~/webapps/Askbot_STATIC/myaskbot + ln -sd ~/webapps/askbot_server/projects/myaskbot/site_media ~/webapps/Askbot_STATIC/myaskbot/site_media + + + Set up the badges: + + 1. You should run the SQL commands in: + + sql_scripts/badges.sql + + 2. Edit paths in the file `cron/multi_award_badges`. (This + file doesn't yet exist in the git repositories, so just + copy `cron/send_email_alerts` and make sure the command + `multi_award_badges` is executed.) + + 3. Run `cron/multi_award_badges` to make sure it works okay. + + 4. Use `crontab -e` to call `cron/multi_award_badges` maybe + four times an hour. + + 4,19,34,49 * * * * ~/webapps/askbot_server/projects/myaskbot/cron/multi_award_badges + + 5. Repeat steps 1-4 for `cron/once_award_badges`. + + +Configure Apache2 +---------------- + + Edit ~/webapps/askbot_server/apache2/conf/httpd.conf as follows:: + + ServerAdmin "MAILBOX_USERNAME@DOMAIN.com" + ServerRoot "/home/USERNAME/webapps/askbot_server/apache2" + ServerName DOMAIN.com + + LoadModule dir_module modules/mod_dir.so + LoadModule env_module modules/mod_env.so + #LoadModule setenvif_module modules/mod_setenvif.so + LoadModule log_config_module modules/mod_log_config.so + LoadModule mime_module modules/mod_mime.so + LoadModule rewrite_module modules/mod_rewrite.so + LoadModule wsgi_module modules/mod_wsgi.so + + KeepAlive Off + Listen PORT + LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined + CustomLog /home/USERNAME/logs/user/access_askbot_server_log combined + ErrorLog /home/USERNAME/logs/user/error_askbot_server_log + ServerLimit 2 + + #SetEnvIf X-Forwarded-SSL on HTTPS=1 + + WSGIPythonPath /home/USERNAME/envs/askbot/lib/python2.5/site-packages/ + WSGIScriptAlias / /home/USERNAME/webapps/askbot_server/projects/myaskbot/django.wsgi + + LoadModule alias_module modules/mod_alias.so + WSGIDaemonProcess askbotWSGI user=USERNAME group=USERNAME threads=25 python-path=/home/USERNAME/envs/askbot/lib/python2.5/site-packages + WSGIProcessGroup askbotWSGI + + NameVirtualHost 127.0.0.1:PORT + + #ErrorLog "logs/myaskbot_2009_05_06.log" + SetHandler none + #Alias /site_media /home/USERNAME/webapps/static/myaskbot/site_media + + #force all content to be served as static files + #otherwise django will be crunching images through itself wasting time + Alias /content/ /home/USERNAME/webapps/askbot_server/projects/myaskbot/templates/content/ + Alias /forum/admin/media/ /home/turian/envs/askbot/lib/python2.5/site-packages/django/contrib/admin/media/ + #AliasMatch /([^/]*\.css) /home/USERNAME/webapps/askbot_server/projects/myaskbot/templates/content/style/$1 + + # Order deny,allow + # Allow from all + + + If you want virtual hosts of the admin interface under HTTPS, please + look at Askbot's install file. + + Edit ~/webapps/askbot_server/projects/myaskbot/deploy/django.wsgi as follows:: + + import os + import sys + + # redirect sys.stdout to sys.stderr for bad libraries like geopy that uses + # print statements for optional import exceptions. + sys.stdout = sys.stderr + + from os.path import abspath, dirname, join + from site import addsitedir + + # add the virtual environment site-packages to the path + from site import addsitedir + addsitedir('/home/USERNAME/envs/askbot/lib/python2.5/site-packages') + + sys.path.insert(0, abspath(join(dirname(__file__), "../"))) + sys.path.append(abspath(dirname(__file__))) + + from django.conf import settings + os.environ["DJANGO_SETTINGS_MODULE"] = "myaskbot.settings" + + #print sys.path + + from django.core.handlers.wsgi import WSGIHandler + application = WSGIHandler() + +And then you're up and running with: + + ~/webapps/askbot_server/apache2/bin/stop + ~/webapps/askbot_server/apache2/bin/start + +You should log in to the admin interface (http://DOMAIN.com/admin/), +and go to "Sites > Sites", and change the domain name that is used in +all emails. diff --git a/askbot/doc/ROADMAP.rst b/askbot/doc/ROADMAP.rst new file mode 100644 index 00000000..c79e0ae4 --- /dev/null +++ b/askbot/doc/ROADMAP.rst @@ -0,0 +1,88 @@ +Intro +========= +ROADMAP aims to streamline activities of the Askbot open source project and +to minimize ad-hoc approaches of "big-picture" level. + +Aksbot is a Question and Asnwer system for the normal people! + +Let's discuss stuff that goes into this file on +http://groups.google.com/group/askbot + +Bacic principles of the project +================================== +Here they are: + +* our rule #1 is that all developers have commit right to the project + repository, but they must follow this ROADMAP and TODO - + to keep up with our own sanity. +* we welcome contributions by other people and show tolerance + and patience - especially to the new team members. +* when users who might not be tech-savvy ask questions - + we try to answer to the point and using their language + (i.e. not programmer jargon:) +* we favor plain and minimalistic style of programming, but pay + attention to detail - especially details of user experience. + +We try do develop using the following workflow: + +* specify problem that we try to solve +* create requirements that will guarantee a solution, once met +* dream up some implementation ideas (maybe even some sketches on the paper) +* discuss and decide on the best one +* write and test code + +The process doesn't have to be this formal all the time, but trying to stick +to some subset of this almost always helps! +Especially it helps to iron out disagreements between +individual programmers (which if you are one - you know are qute common +- and they don't all end well :). + +Ad-hoc programming - i.e. simply go and add code - is not really encouraged. +This works fine in the one person team or when the team consists of +best friends, but is almost sure to fail in a heterogenous group. + +Architecture and Requirements +===================================== +Obviously Django and Python are pre-made choices - so this +is not going to change any time soon. At this point all of +the client side Javascript is written using jQuery library. + +Our basic principle is that Askbot should be a mashable Q&A component. +Askbot is an application written in Python/Django. So it should be +distributable as a Django App alone or as a whole site (by option). + +If we develop sub-systems that can be used in the broader scope - +we package that thing as a separate django application (login system is one example). + +We will start using Google Closure library soon! + +Sub-systems +----------------- +* authentication system +* Q&A system +* admin interface +* full text search +* skins (directory forum/skins) + +Authentication system +------------------------- +Authentication system will be a separate django application + +Here is the discussion thread: +* http://groups.google.com/group/askbot/browse_thread/thread/1916dfcf666dd56c + +Most of the requirements are listed in the first message + +Skins +----------- +Skins eventually must be upgrade-stable - that is people who created custom +skins should not need to change anything if something changes in the code + +Admin interface +----------------------- +* extend forum/settings.py to list default settings of various groups +* create Registry database table the will store setting values +* leave only essential settings that go to the main django settings.py +Create key-value storage +* should some settings be accessible to admins and some to staff??? + for example-secret keys probably should not be shared with staff members diff --git a/askbot/doc/TODO.rst b/askbot/doc/TODO.rst new file mode 100644 index 00000000..b89013b0 --- /dev/null +++ b/askbot/doc/TODO.rst @@ -0,0 +1,70 @@ +note: there is also WISH_LIST. Here is only stuff that will be done soon. + +Site looks +=========== +* make links within posts underlined +* add happy talk to tags and people view + +Code Cleanups +============== +* remove usage of EXTERNAL_LEGACY_LOGIN +* clean up forum_modules: + * keep this directory for dependency modules that can be shared + by multiple apps, + * but move other things that are not shared + inside forum app directory + * one-by one convert "auto-discovery" modules into + regular explicit python imports +* python2.4 incompatibilities + * datatime.datetime.strptime + +Search +======== +* make full text search work in postgres +* walkthrough sphinx search setup again +* text query lost when visiting question, it just doesn't print in Q view +* make username and tags persist in corresponding search windows + +Bugs +====== +* fix skin resolution bug in javascript - currently have to + copy skin media to customize + +Refactoring +============= +nothing right now + +Skins +======= +* organize templates and document them so that + skins could be more easily created by others + who are savvy enough +* identify and maybe create snippet-type templates + and put them into a separate directory + for example: + * gravatar (currently a string in + forum/templatetags/extra_tags.py - try inclusion template + and see if it slows things down a lot) + * question body + * answer body + * datetime widget??? +* there is a separator line between posts + but it shows either before the post or after + it is nice that separator is lightweight - + based on css alone - but we need to fix it so that + it shows only between the posts as a joining item + +Features +=========== +* new login system, please see + http://groups.google.com/group/askbot/browse_thread/thread/1916dfcf666dd56c + on a separate branch multi-auth-app, then merge +* forum admin interface, some badge configuration + +Development environment +========================== +* set up environment for closure development + +Project website +==================== +* Adopt Jekyll for project site and transition from Dango diff --git a/askbot/doc/UPGRADE b/askbot/doc/UPGRADE new file mode 100644 index 00000000..538b75a0 --- /dev/null +++ b/askbot/doc/UPGRADE @@ -0,0 +1,24 @@ +if you are upgrading this software, then + +* first download the newer version and write it over the old one. + +for the database migrations you will need to use django package called "south" + +Install it (if you don't have it yet) with: + + easy_install South + +* 'south' must already be in the list of INSTALLED_APPS + otherwise you must have downloaded wrong version of Askbot + +if you are using south the very first time, then type: + + python manage.py migrate forum 0001_initial --fake + +otherwise skip above step. + +Finally run + + python manage.py migrate forum --auto + +then all relevant schema and data migrations will be applied diff --git a/askbot/doc/WISH_LIST b/askbot/doc/WISH_LIST new file mode 100644 index 00000000..2b53662c --- /dev/null +++ b/askbot/doc/WISH_LIST @@ -0,0 +1,55 @@ +* smarter debug mode +* The wonder bar (integrated the search / ask functionality) +* The authentication system ??? +* allow multiple logins to the same account +* allow multiple logins to the same account +* more advanced templating/skinning system +* per-tag email subscriptions +* view for personalized news on the site +* a little flag popping when there are news +* drill-down mode for navigation by tags +* improved admin console +* sort out mess with profile - currently we patch django User + +* Some functionality should be moved out of the forums app, in the case +that the forum app is restricted only to authenticated users: + + (r'^%s/$' % _('signin/'), 'django_authopenid.views.signin'), + url(r'^%s$' % _('about/'), app.about, name='about'), + url(r'^%s$' % _('faq/'), app.faq, name='faq'), + url(r'^%s$' % _('privacy/'), app.privacy, name='privacy'), + url(r'^%s$' % _('logout/'), app.logout, name='logout'), + url(r'^%s$' % _('feedback/'), app.feedback, name='feedback'), + (r'^%sfb/' % _('account/'), include('fbconnect.urls')), + (r'^%s' % _('account/'), include('django_authopenid.urls')), + +Copied from old todo list: + +There are two kinds of things that can be done: +refactorings (think of jogging in the morning, going to a spa, well make the code better :) +new features (go to law school, get a job, do something real) +Just a joke - pick yourself a task and work on it. + +==Refactoring== +* validate HTML +* set up loading of default settings from inside the /forum dir +* automatic dependency checking for modules +* propose how to rename directory forum --> askbot + without breaking things and keeping name of the project root + named the same way - askbot + +==New features== +Whoever wants - pick a feature from the WISH_LIST +add it here and start working on it +If you are not starting immediately - leave it on the wishlist :) + +==Notes== +1)after this is done most new suggested features + may be worked on easily since most of them + only require editing view functions and templates + + However, anyone can work on new features anyway - you'll + just have to probably copy-paste your code into + the branch undergoing refactoring which involves + splitting the files. Auto merging across split points + is harder or impossible. diff --git a/askbot/doc/askbot-requirements.txt b/askbot/doc/askbot-requirements.txt new file mode 100644 index 00000000..66a37fbe --- /dev/null +++ b/askbot/doc/askbot-requirements.txt @@ -0,0 +1,9 @@ +django>=1.1 # Note: email subscription sender job requires Django 1.1, everything else works with 1.0 +#mysql-python # Can't use with pip, see http://groups.google.com/group/python-virtualenv/msg/ea988085951c92b3 +python-openid +html5lib +markdown2 +git+git://github.com/robhudson/django-debug-toolbar.git +git+git://github.com/dcramer/django-sphinx.git +svn+http://recaptcha-django.googlecode.com/svn/trunk/ +svn+http://recaptcha.googlecode.com/svn/trunk/recaptcha-plugins/python/ diff --git a/askbot/doc/scratch b/askbot/doc/scratch new file mode 100644 index 00000000..948055fa --- /dev/null +++ b/askbot/doc/scratch @@ -0,0 +1,12 @@ +Error upon restarting Apache: + +Name duplicates previous WSGI daemon definition + +different keys - empty space counts for translation keys +{% blocktrans %}page number {{num}} {% endblocktrans %} +{% blocktrans %}page number {{num}}{% endblocktrans %} + +for admin interface downloaded two packages: +django-keyedcache +django-livesettings +from http://bitbucket.org/bkroeze/ diff --git a/askbot/feed.py b/askbot/feed.py new file mode 100644 index 00000000..a204b98d --- /dev/null +++ b/askbot/feed.py @@ -0,0 +1,63 @@ +""" +#------------------------------------------------------------------------------- +# Name: Syndication feed class for subscription +# Purpose: +# +# Author: Mike +# +# Created: 29/01/2009 +# Copyright: (c) CNPROG.COM 2009 +# Licence: GPL V2 +#------------------------------------------------------------------------------- +""" +#!/usr/bin/env python +#encoding:utf-8 +from django.contrib.syndication.feeds import Feed, FeedDoesNotExist +from django.utils.translation import ugettext as _ +from askbot.models import Question +from askbot.conf import settings as askbot_settings +class RssLastestQuestionsFeed(Feed): + """rss feed class for the latest questions + """ + title = askbot_settings.APP_TITLE + _(' - ')+ _('latest questions') + link = askbot_settings.APP_URL + description = askbot_settings.APP_DESCRIPTION + #ttl = 10 + copyright = askbot_settings.APP_COPYRIGHT + + def item_link(self, item): + """get full url to the item + """ + return self.link + item.get_absolute_url() + + def item_author_name(self, item): + """get name of author + """ + return item.author.username + + def item_author_link(self, item): + """get url of the author's profile + """ + return item.author.get_profile_url() + + def item_pubdate(self, item): + """get date of creation for the item + """ + return item.added_at + + def items(self, item): + """get questions for the feed + """ + return Question.objects.filter( + deleted=False + ).order_by( + '-last_activity_at' + )[:30] + +def main(): + """main function for use as a script + """ + pass + +if __name__ == '__main__': + main() diff --git a/askbot/forms.py b/askbot/forms.py new file mode 100644 index 00000000..dabb80b6 --- /dev/null +++ b/askbot/forms.py @@ -0,0 +1,466 @@ +import re +from django import forms +from askbot import models +from askbot import const +from django.utils.translation import ugettext as _ +from django.utils.translation import ungettext +from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType +from askbot.utils.forms import NextUrlField, UserNameField +from recaptcha_django import ReCaptchaField +from askbot.conf import settings as askbot_settings +import logging + + +class TitleField(forms.CharField): + def __init__(self, *args, **kwargs): + super(TitleField, self).__init__(*args, **kwargs) + self.required = True + self.widget = forms.TextInput( + attrs={'size' : 70, 'autocomplete' : 'off'} + ) + self.max_length = 255 + self.label = _('title') + self.help_text = _('please enter a descriptive title for your question') + self.initial = '' + + def clean(self, value): + if len(value) < 10: + raise forms.ValidationError(_('title must be > 10 characters')) + + return value + +class EditorField(forms.CharField): + def __init__(self, *args, **kwargs): + super(EditorField, self).__init__(*args, **kwargs) + self.required = True + self.widget = forms.Textarea(attrs={'id':'editor'}) + self.label = _('content') + self.help_text = u'' + self.initial = '' + + def clean(self, value): + if len(value) < 10: + raise forms.ValidationError(_('question content must be > 10 characters')) + return value + +class TagNamesField(forms.CharField): + def __init__(self, *args, **kwargs): + super(TagNamesField, self).__init__(*args, **kwargs) + self.required = True + self.widget = forms.TextInput(attrs={'size' : 50, 'autocomplete' : 'off'}) + self.max_length = 255 + self.label = _('tags') + #self.help_text = _('please use space to separate tags (this enables autocomplete feature)') + self.help_text = _('Tags are short keywords, with no spaces within. Up to five tags can be used.') + self.initial = '' + + def clean(self, value): + value = super(TagNamesField, self).clean(value) + data = value.strip() + if len(data) < 1: + raise forms.ValidationError(_('tags are required')) + + split_re = re.compile(const.TAG_SPLIT_REGEX) + tag_strings = split_re.split(data) + out_tag_list = [] + tag_count = len(tag_strings) + if tag_count > askbot_settings.MAX_TAGS_PER_POST: + max_tags = askbot_settings.MAX_TAGS_PER_POST + msg = ungettext( + 'please use %(tag_count)d tag or less', + 'please use %(tag_count)d tags or less', + tag_count) % {'tag_count':max_tags} + raise forms.ValidationError(msg) + for tag in tag_strings: + tag_length = len(tag) + if tag_length > askbot_settings.MAX_TAG_LENGTH: + #singular form is odd in english, but required for pluralization + #in other languages + msg = ungettext('each tag must be shorter than %(max_chars)d character',#odd but added for completeness + 'each tag must be shorter than %(max_chars)d characters', + tag_length) % {'max_chars':tag_length} + raise forms.ValidationError(msg) + + #todo - this needs to come from settings + tagname_re = re.compile(const.TAG_REGEX, re.UNICODE) + if not tagname_re.search(tag): + raise forms.ValidationError(_('use-these-chars-in-tags')) + #only keep unique tags + if tag not in out_tag_list: + out_tag_list.append(tag) + return u' '.join(out_tag_list) + +class WikiField(forms.BooleanField): + def __init__(self, *args, **kwargs): + super(WikiField, self).__init__(*args, **kwargs) + self.required = False + self.label = _('community wiki') + self.help_text = _('if you choose community wiki option, the question and answer do not generate points and name of author will not be shown') + def clean(self, value): + return value and askbot_settings.WIKI_ON + +class EmailNotifyField(forms.BooleanField): + def __init__(self, *args, **kwargs): + super(EmailNotifyField, self).__init__(*args, **kwargs) + self.required = False + self.widget.attrs['class'] = 'nomargin' + +class SummaryField(forms.CharField): + def __init__(self, *args, **kwargs): + super(SummaryField, self).__init__(*args, **kwargs) + self.required = False + self.widget = forms.TextInput(attrs={'size' : 50, 'autocomplete' : 'off'}) + self.max_length = 300 + self.label = _('update summary:') + self.help_text = _('enter a brief summary of your revision (e.g. fixed spelling, grammar, improved style, this field is optional)') + +class ModerateUserForm(forms.ModelForm): + is_approved = forms.BooleanField(label=_("Automatically accept user's contributions for the email updates"), + required=False) + + def clean_is_approved(self): + if 'is_approved' not in self.cleaned_data: + self.cleaned_data['is_approved'] = False + return self.cleaned_data['is_approved'] + + class Meta: + model = User + fields = ('is_approved',) + +class AdvancedSearchForm(forms.Form): + #nothing must be required in this form + #it is used by the main questions view + scope = forms.ChoiceField(choices=const.POST_SCOPE_LIST, required=False) + sort = forms.ChoiceField(choices=const.POST_SORT_METHODS, required=False) + query = forms.CharField(max_length=256, required=False) + reset_tags = forms.BooleanField(required=False) + reset_author = forms.BooleanField(required=False) + reset_query = forms.BooleanField(required=False) + start_over = forms.BooleanField(required=False) + tags = forms.CharField(max_length=256, required=False) + author = forms.IntegerField(required=False) + page_size = forms.ChoiceField(choices=const.PAGE_SIZE_CHOICES, required=False) + page = forms.IntegerField(required=False) + + def clean_tags(self): + if 'tags' in self.cleaned_data: + tags_input = self.cleaned_data['tags'].strip() + split_re = re.compile(const.TAG_SPLIT_REGEX) + tag_strings = split_re.split(tags_input) + tagname_re = re.compile(const.TAG_REGEX, re.UNICODE) + out = set() + for s in tag_strings: + if tagname_re.search(s): + out.add(s) + if len(out) > 0: + self.cleaned_data['tags'] = out + else: + self.cleaned_data['tags'] = None + return self.cleaned_data['tags'] + + def clean_query(self): + if 'query' in self.cleaned_data: + q = self.cleaned_data['query'].strip() + if q == '': + q = None + self.cleaned_data['query'] = q + return self.cleaned_data['query'] + + def clean_page_size(self): + if 'page_size' in self.cleaned_data: + if self.cleaned_data['page_size'] == '': + self.cleaned_data['page_size'] = None + else: + page_size = self.cleaned_data['page_size'] + #by this time it is guaranteed to be castable as int + self.cleaned_data['page_size'] = int(page_size) + return self.cleaned_data['page_size'] + + def clean(self): + #todo rewrite + if self.cleaned_data['scope'] == '': + del self.cleaned_data['scope'] + if self.cleaned_data['tags'] is None: + del self.cleaned_data['tags'] + if self.cleaned_data['sort'] == '': + del self.cleaned_data['sort'] + if self.cleaned_data['query'] == None: + del self.cleaned_data['query'] + if self.cleaned_data['reset_tags'] == False: + del self.cleaned_data['reset_tags'] + if self.cleaned_data['reset_author'] == False: + del self.cleaned_data['reset_author'] + if self.cleaned_data['reset_query'] == False: + del self.cleaned_data['reset_query'] + if self.cleaned_data['start_over'] == False: + del self.cleaned_data['start_over'] + if self.cleaned_data['author'] is None: + del self.cleaned_data['author'] + if self.cleaned_data['page'] is None: + del self.cleaned_data['page'] + if self.cleaned_data['page_size'] is None: + del self.cleaned_data['page_size'] + return self.cleaned_data + +class NotARobotForm(forms.Form): + recaptcha = ReCaptchaField() + +class FeedbackForm(forms.Form): + name = forms.CharField(label=_('Your name:'), required=False) + email = forms.EmailField(label=_('Email (not shared with anyone):'), required=False) + message = forms.CharField(label=_('Your message:'), max_length=800,widget=forms.Textarea(attrs={'cols':60})) + next = NextUrlField() + +class AskForm(forms.Form): + title = TitleField() + text = EditorField() + tags = TagNamesField() + wiki = WikiField() + + openid = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 40, 'class':'openid-input'})) + user = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) + email = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) + +class AnswerForm(forms.Form): + text = EditorField() + wiki = WikiField() + openid = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 40, 'class':'openid-input'})) + user = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) + email = forms.CharField(required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) + email_notify = EmailNotifyField() + def __init__(self, question, user, *args, **kwargs): + super(AnswerForm, self).__init__(*args, **kwargs) + self.fields['email_notify'].widget.attrs['id'] = 'question-subscribe-updates' + if question.wiki and askbot_settings.WIKI_ON: + self.fields['wiki'].initial = True + if user.is_authenticated(): + if user in question.followed_by.all(): + self.fields['email_notify'].initial = True + return + self.fields['email_notify'].initial = False + + +class CloseForm(forms.Form): + reason = forms.ChoiceField(choices=const.CLOSE_REASONS) + +class RetagQuestionForm(forms.Form): + tags = TagNamesField() + # initialize the default values + def __init__(self, question, *args, **kwargs): + super(RetagQuestionForm, self).__init__(*args, **kwargs) + self.fields['tags'].initial = question.tagnames + +class RevisionForm(forms.Form): + """ + Lists revisions of a Question or Answer + """ + revision = forms.ChoiceField(widget=forms.Select(attrs={'style' : 'width:520px'})) + + def __init__(self, post, latest_revision, *args, **kwargs): + super(RevisionForm, self).__init__(*args, **kwargs) + revisions = post.revisions.all().values_list( + 'revision', 'author__username', 'revised_at', 'summary') + date_format = '%c' + self.fields['revision'].choices = [ + (r[0], u'%s - %s (%s) %s' % (r[0], r[1], r[2].strftime(date_format), r[3])) + for r in revisions] + self.fields['revision'].initial = latest_revision.revision + +class EditQuestionForm(forms.Form): + title = TitleField() + text = EditorField() + tags = TagNamesField() + summary = SummaryField() + + #todo: this is odd that this form takes question as an argument + def __init__(self, question, revision, *args, **kwargs): + super(EditQuestionForm, self).__init__(*args, **kwargs) + self.fields['title'].initial = revision.title + self.fields['text'].initial = revision.text + self.fields['tags'].initial = revision.tagnames + # Once wiki mode is enabled, it can't be disabled + if not question.wiki: + self.fields['wiki'] = WikiField() + +class EditAnswerForm(forms.Form): + text = EditorField() + summary = SummaryField() + + def __init__(self, answer, revision, *args, **kwargs): + super(EditAnswerForm, self).__init__(*args, **kwargs) + self.fields['text'].initial = revision.text + +class EditUserForm(forms.Form): + email = forms.EmailField(label=u'Email', help_text=_('this email does not have to be linked to gravatar'), required=True, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) + if askbot_settings.EDITABLE_SCREEN_NAME: + username = UserNameField(label=_('Screen name')) + realname = forms.CharField(label=_('Real name'), required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) + website = forms.URLField(label=_('Website'), required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) + city = forms.CharField(label=_('Location'), required=False, max_length=255, widget=forms.TextInput(attrs={'size' : 35})) + birthday = forms.DateField(label=_('Date of birth'), help_text=_('will not be shown, used to calculate age, format: YYYY-MM-DD'), required=False, widget=forms.TextInput(attrs={'size' : 35})) + about = forms.CharField(label=_('Profile'), required=False, widget=forms.Textarea(attrs={'cols' : 60})) + + def __init__(self, user, *args, **kwargs): + super(EditUserForm, self).__init__(*args, **kwargs) + logging.debug('initializing the form') + if askbot_settings.EDITABLE_SCREEN_NAME: + self.fields['username'].initial = user.username + self.fields['username'].user_instance = user + self.fields['email'].initial = user.email + self.fields['realname'].initial = user.real_name + self.fields['website'].initial = user.website + self.fields['city'].initial = user.location + + if user.date_of_birth is not None: + self.fields['birthday'].initial = user.date_of_birth + else: + self.fields['birthday'].initial = '1990-01-01' + self.fields['about'].initial = user.about + self.user = user + + def clean_email(self): + """For security reason one unique email in database""" + if self.user.email != self.cleaned_data['email']: + #todo dry it, there is a similar thing in openidauth + if askbot_settings.EMAIL_UNIQUE == True: + if 'email' in self.cleaned_data: + try: + User.objects.get(email = self.cleaned_data['email']) + except User.DoesNotExist: + return self.cleaned_data['email'] + except User.MultipleObjectsReturned: + raise forms.ValidationError(_('this email has already been registered, please use another one')) + raise forms.ValidationError(_('this email has already been registered, please use another one')) + return self.cleaned_data['email'] + +class TagFilterSelectionForm(forms.ModelForm): + tag_filter_setting = forms.ChoiceField(choices=const.TAG_EMAIL_FILTER_CHOICES, + initial='ignored', + label=_('Choose email tag filter'), + widget=forms.RadioSelect) + class Meta: + model = User + fields = ('tag_filter_setting',) + + def save(self): + before = self.instance.tag_filter_setting + super(TagFilterSelectionForm, self).save() + after = self.instance.tag_filter_setting #User.objects.get(pk=self.instance.id).tag_filter_setting + if before != after: + return True + return False + + +class EmailFeedSettingField(forms.ChoiceField): + def __init__(self, *arg, **kwarg): + kwarg['choices'] = const.NOTIFICATION_DELIVERY_SCHEDULE_CHOICES + kwarg['initial'] = askbot_settings.DEFAULT_NOTIFICATION_DELIVERY_SCHEDULE + kwarg['widget'] = forms.RadioSelect + super(EmailFeedSettingField, self).__init__(*arg, **kwarg) + +class EditUserEmailFeedsForm(forms.Form): + FORM_TO_MODEL_MAP = { + 'all_questions':'q_all', + 'asked_by_me':'q_ask', + 'answered_by_me':'q_ans', + 'individually_selected':'q_sel', + 'mentions_and_comments':'m_and_c', + } + NO_EMAIL_INITIAL = { + 'all_questions':'n', + 'asked_by_me':'n', + 'answered_by_me':'n', + 'individually_selected':'n', + 'mentions_and_comments':'n', + } + + asked_by_me = EmailFeedSettingField( + label=_('Asked by me') + ) + answered_by_me = EmailFeedSettingField( + label=_('Answered by me') + ) + individually_selected = EmailFeedSettingField( + label=_('Individually selected') + ) + all_questions = EmailFeedSettingField( + label=_('Entire askbot (tag filtered)'), + ) + + mentions_and_comments = EmailFeedSettingField( + label=_('Comments and posts mentioning me'), + ) + + def set_initial_values(self, user=None): + KEY_MAP = dict([(v, k) for k, v in self.FORM_TO_MODEL_MAP.iteritems()]) + if user != None: + settings = models.EmailFeedSetting.objects.filter(subscriber=user) + initial_values = {} + for setting in settings: + feed_type = setting.feed_type + form_field = KEY_MAP[feed_type] + frequency = setting.frequency + initial_values[form_field] = frequency + self.initial = initial_values + return self + + def reset(self): + if self.is_bound: + self.cleaned_data['all_questions'] = 'n' + self.cleaned_data['asked_by_me'] = 'n' + self.cleaned_data['answered_by_me'] = 'n' + self.cleaned_data['individually_selected'] = 'n' + self.cleaned_data['mentions_and_comments'] = 'n' + self.initial = self.NO_EMAIL_INITIAL + return self + + def save(self,user,save_unbound=False): + """ + with save_unbound==True will bypass form validation and save initial values + """ + changed = False + for form_field, feed_type in self.FORM_TO_MODEL_MAP.items(): + s, created = models.EmailFeedSetting.objects.get_or_create( + subscriber=user, + feed_type=feed_type + ) + if save_unbound: + #just save initial values instead + if form_field in self.initial: + new_value = self.initial[form_field] + else: + new_value = self.fields[form_field].initial + else: + new_value = self.cleaned_data[form_field] + if s.frequency != new_value: + s.frequency = new_value + s.save() + changed = True + else: + if created: + s.save() + if form_field == 'individually_selected': + feed_type = ContentType.objects.get_for_model(models.Question) + user.followed_questions.clear() + return changed + +class SimpleEmailSubscribeForm(forms.Form): + SIMPLE_SUBSCRIBE_CHOICES = ( + ('y',_('okay, let\'s try!')), + ('n',_('no community email please, thanks')) + ) + subscribe = forms.ChoiceField( + widget=forms.widgets.RadioSelect, + error_messages={'required':_('please choose one of the options above')}, + choices=SIMPLE_SUBSCRIBE_CHOICES + ) + + def save(self, user=None): + EFF = EditUserEmailFeedsForm + if self.cleaned_data['subscribe'] == 'y': + email_settings_form = EFF() + logging.debug('%s wants to subscribe' % user.username) + else: + email_settings_form = EFF(initial=EFF.NO_EMAIL_INITIAL) + email_settings_form.save(user, save_unbound=True) diff --git a/askbot/importers/__init__.py b/askbot/importers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/importers/stackexchange/ANOMALIES b/askbot/importers/stackexchange/ANOMALIES new file mode 100644 index 00000000..05a7dbdb --- /dev/null +++ b/askbot/importers/stackexchange/ANOMALIES @@ -0,0 +1,14 @@ +* several user accounts with same email +* users with no openid +* users with no email (hack: gravatar set to settings.ANONYMOUS_USER_EMAIL) +* users with no screen name +* users with no email and no screen name (25% in homeschool) +* tag preferences are not stored explicitly (interesting/ignored) + maybe they are in se.User.preferences_raw + but the data there is not marked up and is kind of cryptic +* we don't have Community user. SE has one with id=-1 + this id may break the load script + potential break places are anywhere where is X.get_user() call + issues may happen with larger data sets where activity + of user "Community" is somehow reflected in a way + that load_stackexchange does not take care of diff --git a/askbot/importers/stackexchange/README b/askbot/importers/stackexchange/README new file mode 100644 index 00000000..598a8555 --- /dev/null +++ b/askbot/importers/stackexchange/README @@ -0,0 +1,62 @@ +this app's function will be to: + +* install it's own tables (#todo: not yet automated) +* read SE xml dump into DjangoDB (automated) +* populate askbot database (automated) +* remove SE tables (#todo: not done yet) + +Current process to load SE data into Askbot is: +============================================== + +1) backup database + +2) unzip SE dump into dump_dir (any directory name) + you may want to make sure that your dump directory in .gitignore file + so that you don't publish it by mistake + +3) enable 'stackexchange' in the list of installed apps (probably aready in settings.py) + +4) (optional - create models.py for SE, which is included anyway) run: + + #a) run in-place removal of xml namspace prefix to make parsing easier + perl -pi -w -e 's/xs://g' $SE_DUMP_PATH/xsd/*.xsd + cd stackexchange + python parse_models.py $SE_DUMP_PATH/xsd/*.xsd > models.py + +5) Install stackexchange models (as well as any other missing models) + python manage.py syncdb + +6) make sure that badges are installed + if not, run (example for mysql): + + mysql -u user -p dbname < sql_scripts/badges.sql + +7) load SE data: + + python manage.py load_stackexchange dump_dir + + if anything doesn't go right - run 'python manage.py flush' and repeat + steps 6 and 7 + +NOTES: +============ + +Here is the load script that I used for the testing +it assumes that SE dump has been unzipped inside the tmp directory + + #!/bin/sh$ + python manage.py flush + #delete all data + mysql -u askbot -p aksbot < sql_scripts/badges.sql + python manage.py load_stackexchange tmp + +Untested parts are tagged with comments starting with +#todo: + +The test set did not have all the usage cases of StackExchange represented so +it may break with other sets. + +The job takes some time to run, especially +content revisions and votes - may be optimized + +Some of the fringe cases are described in file stackexchange/ANOMALIES diff --git a/askbot/importers/stackexchange/__init__.py b/askbot/importers/stackexchange/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/importers/stackexchange/management/__init__.py b/askbot/importers/stackexchange/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/importers/stackexchange/management/commands/__init__.py b/askbot/importers/stackexchange/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/importers/stackexchange/management/commands/load_stackexchange.py b/askbot/importers/stackexchange/management/commands/load_stackexchange.py new file mode 100644 index 00000000..031a2d79 --- /dev/null +++ b/askbot/importers/stackexchange/management/commands/load_stackexchange.py @@ -0,0 +1,799 @@ +from django.core.management.base import BaseCommand +from django.template.defaultfilters import slugify #todo: adopt unicode-aware slugify +#todo: http://stackoverflow.com/questions/837828/how-to-use-a-slug-in-django +import os +import re +import sys +import askbot.importers.stackexchange.parse_models as se_parser +from xml.etree import ElementTree as et +from django.db import models +import askbot.models as askbot +import askbot.deps.django_authopenid.models as askbot_openid +import askbot.importers.stackexchange.models as se +from askbot.forms import EditUserEmailFeedsForm +from askbot.conf import settings as askbot_settings +from django.contrib.auth.models import Message as DjangoMessage +from django.utils.translation import ugettext as _ +#from markdown2 import Markdown +#markdowner = Markdown(html4tags=True) + +xml_read_order = ( + 'VoteTypes','UserTypes','Users','Users2Votes', + 'Badges','Users2Badges','CloseReasons','FlatPages', + 'MessageTypes','PostHistoryTypes','PostTypes','SchemaVersion', + 'Settings','SystemMessages','ThemeResources','ThemeTextResources', + 'ThrottleBucket','UserHistoryTypes','UserHistory', + 'Users2Badges','VoteTypes','Users2Votes','MessageTypes', + 'Posts','Posts2Votes','PostHistory','PostComments', + 'ModeratorMessages','Messages','Comments2Votes', + ) + +#association tables SE item id --> ASKBOT item id +#table associations are implied +#todo: there is an issue that these may be inconsistent with the database +USER = {}#SE User.id --> django(ASKBOT) User.id +QUESTION = {} +ANSWER = {} +NAMESAKE_COUNT = {}# number of times user name was used - for X.get_screen_name + +class X(object):# + """class with methods for handling some details + of SE --> ASKBOT mapping + """ + badge_type_map = {'1':'gold','2':'silver','3':'bronze'} + + askbot_supported_id_providers = ( + 'google','yahoo','aol','myopenid', + 'flickr','technorati', + 'wordpress','blogger','livejournal', + 'claimid','vidoop','verisign', + 'openidurl','facebook','local', + 'twitter' #oauth is not on this list, b/c it has no own url + ) + + #map SE VoteType -> askbot.User vote method + #created methods with the same call structure in askbot.User + #User.(post, timestamp=None, cancel=False) + vote_actions = { + 'UpMod':'upvote', + 'DownMod':'downvote', + 'AcceptedByOriginator':'accept_answer', + 'Offensive':'flag_post', + 'Favorite':'toggle_favorite_question', + } + + #these modes cannot be mixed + #only wiki is assumed to be mixable + exclusive_revision_modes = ( + 'initial','edit','rollback','lock', + 'migrate','close','merge','delete', + ) + + #badges whose names don't match exactly, but + #present in both SE and ASKBOT + badge_exceptions = {# SE --> ASKBOT + 'Citizen Patrol':'Citizen patrol',#single #todo: why sentence case? + 'Strunk & White':'Strunk & White',#single + 'Civic Duty':'Civic duty', + } + + revision_type_map = { + 'Initial Title':'initial', + 'Initial Body':'initial', + 'Initial Tags':'initial', + 'Edit Title':'edit', + 'Edit Body':'edit', + 'Edit Tags':'edit', + 'Rollback Title':'rollback', + 'Rollback Body':'rollback', + 'Rollback Tags':'rollback', + 'Post Closed':'close', + 'Post Reopened':'close', + 'Post Deleted':'delete', + 'Post Undeleted':'delete', + 'Post Locked':'lock', + 'Post Unlocked':'lock', + 'Community Owned':'wiki', + 'Post Migrated':'migrate', + 'Question Merged':'merge', + } + + close_reason_map = { + 1:1,#duplicate + 2:2,#off-topic + 3:3,#subjective and argumentative + 4:4,#not a real question + 5:7,#offensive + 6:6,#irrelevant or outdated question + 7:9,#too localized + 10:8,#spam + } + + @classmethod + def get_message_text(cls, se_m): + """try to intelligently translate + SE message to ASKBOT so that it makese sense in + our context + """ + #todo: properly translate messages + #todo: maybe work through more instances of messages + if se_m.message_type.name == 'Badge Notification': + return se_m.text + else: + if 'you are now an administrator' in se_m.text: + return _('Congratulations, you are now an Administrator') + elif re.search(r'^You have \d+ new',se_m.text): + bits = se_m.text.split('.') + text = bits[0] + if se_m.user.id == -1: + return None + url = cls.get_user(se_m.user).get_profile_url() + return '%s' % (url,text) + return None + + @classmethod + def get_post(cls, se_post): + #todo: fix this hack - either in-memory id association table + #or use database to store these associations + post_type = se_post.post_type.name + if post_type == 'Question': + return askbot.Question.objects.get(id=QUESTION[se_post.id].id) + elif post_type == 'Answer': + return askbot.Answer.objects.get(id=ANSWER[se_post.id].id) + else: + raise Exception('unknown post type %s' % post_type) + + @classmethod + def get_close_reason(cls, se_reason): + #todo: this is a guess - have not seen real data + se_reason = int(se_reason) + return cls.close_reason_map[se_reason] + + @classmethod + def get_user(cls, se_user): + #todo: same as get_post + return askbot.User.objects.get(id=USER[se_user.id].id) + + @classmethod + def get_post_revision_group_types(cls, rev_group): + rev_types = {} + for rev in rev_group: + rev_type = cls.get_post_revision_type(rev) + rev_types[rev_type] = 1 + rev_types = rev_types.keys() + + #make sure that exclusive rev modes are not mixed + exclusive = cls.exclusive_revision_modes + if len(rev_types) > 1 and all([t in exclusive for t in rev_types]): + tstr = ','.join(rev_types) + gstr = ','.join([str(rev.id) for rev in rev_group]) + msg = 'incompatible revision types %s in PostHistory %s' % (tstr,gstr) + raise Exception(msg) + return rev_types + + @classmethod + def clean_tags(cls, tags): + tags = re.subn(r'\s+',' ',tags.strip())[0] + bits = tags.split(' ') + tags = ' '.join([bit[1:-1] for bit in bits]) + tags = re.subn(r'\xf6','-',tags)[0] + return tags + + @classmethod + def get_screen_name(cls, name): + """always returns unique screen name + even if there are multiple users in SE + with the same exact screen name + """ + if name is None: + name = 'anonymous' + name = name.strip() + name = re.subn(r'\s+',' ',name)[0]#remove repeating spaces + + try: + u = askbot.User.objects.get(username = name) + try: + if u.location: + name += ', %s' % u.location + if name in NAMESAKE_COUNT: + NAMESAKE_COUNT[name] += 1 + name += ' %d' % NAMESAKE_COUNT[name] + else: + NAMESAKE_COUNT[name] = 1 + except askbot.User.DoesNotExist: + pass + except askbot.User.DoesNotExist: + NAMESAKE_COUNT[name] = 1 + return name + + @classmethod + def get_email(cls, email):#todo: fix fringe case - user did not give email! + if email is None: + return askbot_settings.ANONYMOUS_USER_EMAIL + else: + assert(email != '') + return email + + @classmethod + def get_post_revision_type(cls, rev): + rev_name = rev.post_history_type.name + rev_type = cls.revision_type_map.get(rev_name, None) + if rev_type is None: + raise Exception('dont understand revision type %s' % rev) + return rev_type + + #crude method of getting id provider name from the url + @classmethod + def get_openid_provider_name(cls, openid_url): + openid_str = str(openid_url) + bits = openid_str.split('/') + base_url = bits[2] #assume this is base url + url_bits = base_url.split('.') + provider_name = url_bits[-2].lower() + if provider_name not in cls.askbot_supported_id_providers: + raise Exception('could not determine login provider for %s' % openid_url) + return provider_name + + @staticmethod + def blankable(input): + if input is None: + return '' + else: + return input + + @classmethod + def parse_badge_summary(cls, badge_summary): + (gold,silver,bronze) = (0,0,0) + if badge_summary: + if len(badge_summary) > 3: + print 'warning: guessing that badge summary is comma separated' + print 'have %s' % badge_summary + bits = badge_summary.split(',') + else: + bits = [badge_summary] + for bit in bits: + m = re.search(r'^(?P[1-3])=(?P\d+)$', bit) + if not m: + raise Exception('could not parse badge summary: %s' % badge_summary) + else: + badge_type = cls.badge_type_map[m.groupdict()['type']] + locals()[badge_type] = int(m.groupdict()['count']) + return (gold,silver,bronze) + + @classmethod + def get_badge_name(cls, name): + return cls.badge_exceptions.get(name, name) + +class Command(BaseCommand): + help = 'Loads StackExchange data from unzipped directory of XML files into the ASKBOT database' + args = 'se_dump_dir' + + def handle(self, *arg, **kwarg): + if len(arg) < 1 or not os.path.isdir(arg[0]): + print 'Error: first argument must be a directory with all the SE *.xml files' + sys.exit(1) + + self.dump_path = arg[0] + #read the data into SE tables + for xml in xml_read_order: + xml_path = self.get_xml_path(xml) + table_name = self.get_table_name(xml) + self.load_xml_file(xml_path, table_name) + + #this is important so that when we clean up messages + #automatically generated by the procedures below + #we do not delete old messages + #todo: unfortunately this may need to be redone + #when we upgrade to django 1.2 and definitely by 1.4 when + #the current message system will be replaced with the + #django messages framework + self.save_askbot_message_id_list() + + #transfer data into ASKBOT tables + print 'Transferring users...', + sys.stdout.flush() + self.transfer_users() + print 'done.' + print 'Transferring content edits...', + sys.stdout.flush() + self.transfer_question_and_answer_activity() + print 'done.' + print 'Transferring view counts...', + sys.stdout.flush() + self.transfer_question_view_counts() + print 'done.' + print 'Transferring comments...', + sys.stdout.flush() + self.transfer_comments() + print 'done.' + print 'Transferring badges and badge awards...', + sys.stdout.flush() + self.transfer_badges() + print 'done.' + print 'Transferring votes...', + sys.stdout.flush() + self.transfer_votes()#includes favorites, accepts and flags + print 'done.' + + self.cleanup_messages()#delete autogenerated messages + self.transfer_messages() + + #todo: these are not clear how to go about + self.transfer_update_subscriptions() + self.transfer_tag_preferences() + self.transfer_meta_pages() + + def save_askbot_message_id_list(self): + id_list = list(DjangoMessage.objects.all().values('id')) + self._askbot_message_id_list = id_list + + def cleanup_messages(self): + """deletes messages generated by the load process + """ + id_list = self._askbot_message_id_list + mset = DjangoMessage.objects.all().exclude(id__in=id_list) + mset.delete() + + def transfer_messages(self): + """transfers some messages from + SE to ASKBOT + """ + for m in se.Message.objects.all(): + if m.is_read: + continue + if m.user.id == -1: + continue + u = X.get_user(m.user) + text = X.get_message_text(m) + if text: + u.message_set.create( + message=text, + ) + + def _process_post_initial_revision_group(self, rev_group): + + title = None + text = None + tags = None + wiki = False + author = USER[rev_group[0].user.id] + added_at = rev_group[0].creation_date + + for rev in rev_group: + rev_type = rev.post_history_type.name + if rev_type == 'Initial Title': + title = rev.text + elif rev_type == 'Initial Body': + text = rev.text + elif rev_type == 'Initial Tags': + tags = X.clean_tags(rev.text) + elif rev_type == 'Community Owned': + wiki = True + else: + raise Exception('unexpected revision type %s' % rev_type) + + post_type = rev_group[0].post.post_type.name + if post_type == 'Question': + q = askbot.Question.objects.create_new( + title = title, + author = author, + added_at = added_at, + wiki = wiki, + tagnames = tags, + text = text + ) + QUESTION[rev_group[0].post.id] = q + elif post_type == 'Answer': + q = X.get_post(rev_group[0].post.parent) + a = askbot.Answer.objects.create_new( + question = q, + author = author, + added_at = added_at, + wiki = wiki, + text = text, + ) + ANSWER[rev_group[0].post.id] = a + else: + post_id = rev_group[0].post.id + raise Exception('unknown post type %s for id=%d' % (post_type, post_id)) + + def _process_post_edit_revision_group(self, rev_group): + #question apply edit + (title, text, tags) = (None, None, None) + for rev in rev_group: + rev_type = rev.post_history_type.name + if rev_type == 'Edit Title': + title = rev.text + elif rev_type == 'Edit Body': + text = rev.text + elif rev_type == 'Edit Tags': + tags = X.clean_tags(rev.text) + elif rev_type == 'Community Owned': + pass + else: + raise Exception('unexpected revision type %s' % rev_type) + + rev0 = rev_group[0] + edited_by = USER[rev0.user.id] + edited_at = rev0.creation_date + comment = ';'.join([rev.comment for rev in rev_group if rev.comment]) + post_type = rev0.post.post_type.name + + if post_type == 'Question': + q = X.get_post(rev0.post) + q.apply_edit( + edited_at = edited_at, + edited_by = edited_by, + title = title, + text = text, + comment = comment, + tags = tags, + ) + elif post_type == 'Answer': + a = X.get_post(rev0.post) + a.apply_edit( + edited_at = edited_at, + edited_by = edited_by, + text = text, + comment = comment, + ) + + def _make_post_wiki(self, rev_group): + #todo: untested + for rev in rev_group: + if rev.post_history_type.name == 'Community Owned': + p = X.get_post(rev.post) + u = X.get_user(rev.user) + t = rev.creation_date + p.wiki = True + p.wikified_at = t + p.wikified_by = u + self.mark_activity(p,u,t) + p.save() + return + + def mark_activity(self,p,u,t): + """p,u,t - post, user, timestamp + """ + if isinstance(p, askbot.Question): + p.last_activity_by = u + p.last_activity_at = t + elif isinstance(p, askbot.Answer): + p.question.last_activity_by = u + p.question.last_activity_at = t + p.question.save() + + def _process_post_rollback_revision_group(self, rev_group): + #todo: don't know what to do here as there were no + #such data available + pass + + def _process_post_lock_revision_group(self, rev_group): + #todo: untested + for rev in rev_group: + rev_type = rev.post_history_type.name + if rev_type.endswith('ocked'): + t = rev.creation_date + u = X.get_user(rev.user) + p = X.get_post(rev.post) + if rev_type == 'Post Locked': + p.locked = True + p.locked_by = u + p.locked_at = t + elif rev_type == 'Post Unlocked': + p.locked = False + p.locked_by = None + p.locked_at = None + else: + return + self.mark_activity(p,u,t) + p.save() + return + + def _process_post_close_revision_group(self, rev_group): + #todo: untested + for rev in rev_group: + if rev.post.post_type.name != 'Question': + return + rev_type = rev.post_history_type.name + if rev_type in ('Post Closed', 'Post Reopened'): + t = rev.creation_date + u = X.get_user(rev.user) + p = X.get_post(rev.post) + if rev_type == 'Post Closed': + p.closed = True + p.closed_at = t + p.closed_by = u + p.close_reason = X.get_close_reason(rev.text) + elif rev_type == 'Post Reopened': + p.closed = False + p.closed_at = None + p.closed_by = None + p.close_reason = None + self.mark_activity(p,u,t) + p.save() + return + + def _process_post_delete_revision_group(self, rev_group): + #todo: untested + for rev in rev_group: + rev_type = rev.post_history_type.name + if rev_type.endswith('eleted'): + t = rev.creation_date + u = X.get_user(rev.user) + p = X.get_post(rev.post) + if rev_type == 'Post Deleted': + p.deleted = True + p.deleted_at = t + p.deleted_by = u + elif rev_type == 'Post Undeleted': + p.deleted = False + p.deleted_at = None + p.deleted_by = None + self.mark_activity(p,u,t) + p.save() + return + + def _process_post_revision_group(self, rev_group): + #determine revision type + #'initial','edit','rollback','lock', + #'migrate','close','merge','delete', + rev_types = X.get_post_revision_group_types(rev_group) + if 'initial' in rev_types: + self._process_post_initial_revision_group(rev_group) + elif 'edit' in rev_types: + self._process_post_edit_revision_group(rev_group) + elif 'rollback' in rev_types: + self._process_post_rollback_revision_group(rev_group) + elif 'lock' in rev_types: + self._process_post_lock_revision_group(rev_group) + elif 'close' in rev_types: + self._process_post_close_revision_group(rev_group) + elif 'delete' in rev_types: + self._process_post_delete_revision_group(rev_group) + else: + pass + #todo: rollback, lock, close and delete are + #not tested + #merge and migrate actions are ignored + #wiki is mixable with other groups, so process it in addition + if 'wiki' in rev_types: + self._make_post_wiki(rev_group) + + def transfer_tag_preferences(self): + #todo: figure out where these are stored in SE + #maybe in se.User.preferences_raw? + pass + + def transfer_question_and_answer_activity(self): + """transfers all question and answer + edits and related status changes + """ + #assuming that there are only two post types + se_revs = se.PostHistory.objects.all() + #assuming that chronologial order is correct and there + #will be no problems of data integrity upon insertion of records + se_revs = se_revs.order_by('creation_date','revision_guid') + #todo: ignored fringe case - no revisions + c_guid = se_revs[0].revision_guid + c_group = [] + #this loop groups revisions by revision id, then calls process function + #for the revision grup (elementary revisions posted at once) + for se_rev in se_revs: + if se_rev.revision_guid == c_guid: + c_group.append(se_rev) + else: + self._process_post_revision_group(c_group) + c_group = [] + c_group.append(se_rev) + c_guid = se_rev.revision_guid + if len(c_group) != 0: + self._process_post_revision_group(c_group) + + def transfer_comments(self): + for se_c in se.PostComment.objects.all(): + if se_c.deletion_date: + print 'Warning deleted comment %d dropped' % se_c.id + continue + se_post = se_c.post + if se_post.post_type.name == 'Question': + askbot_post = QUESTION[se_post.id] + elif se_post.post_type.name == 'Answer': + askbot_post = ANSWER[se_post.id] + + askbot_post.add_comment( + comment = se_c.text, + added_at = se_c.creation_date, + user = USER[se_c.user.id] + ) + + def _install_missing_badges(self): + self._missing_badges = {} + for se_b in se.Badge.objects.all(): + name = X.get_badge_name(se_b.name) + try: + askbot.Badge.objects.get(name=name) + except: + self._missing_badges[name] = 0 + if len(se_b.description) > 300: + print 'Warning truncated description for badge %d' % se_b.id + askbot.Badge.objects.create( + name = name, + slug = slugify(name), + description = se_b.description, + multiple = (not se_b.single), + type = se_b.class_type + ) + + def _award_badges(self): + #note: SE does not keep information on + #content-related badges like askbot does + for se_a in se.User2Badge.objects.all(): + if se_a.user.id == -1: + continue #skip community user + u = USER[se_a.user.id] + badge_name = X.get_badge_name(se_a.badge.name) + b = askbot.Badge.objects.get(name=badge_name) + if b.multiple == False: + if b.award_badge.count() > 0: + continue + #todo: fake content object here b/c SE does not support this + #todo: but askbot requires related content object + askbot.Award.objects.create( + user=u, + badge=b, + awarded_at=se_a.date, + content_object=u, + ) + if b.name in self._missing_badges: + self._missing_badges[b.name] += 1 + + def _cleanup_badges(self): + d = self._missing_badges + unused = [name for name in d.keys() if d[name] == 0] + askbot.Badge.objects.filter(name__in=unused).delete() + installed = [name for name in d.keys() if d[name] > 0] + print 'Warning - following unsupported badges were installed:' + print ', '.join(installed) + + def transfer_badges(self): + #note: badge level is neglected + #1) install missing badges + self._install_missing_badges() + #2) award badges + self._award_badges() + #3) delete unused newly installed badges + self._cleanup_badges() + pass + + def transfer_question_view_counts(self): + for se_q in se.Post.objects.filter(post_type__name='Question'): + q = X.get_post(se_q) + q.view_count = se_q.view_count + q.save() + + + def transfer_votes(self): + for v in se.Post2Vote.objects.all(): + vote_type = v.vote_type.name + if not vote_type in X.vote_actions: + continue + + u = X.get_user(v.user) + p = X.get_post(v.post) + m = X.vote_actions[vote_type] + vote_method = getattr(askbot.User, m) + vote_method(u, p, timestamp = v.creation_date) + if v.deletion_date: + vote_method(u, p, timestamp = v.deletion_date, cancel=True) + + def transfer_update_subscriptions(self): + #todo: not clear where this is stored in SE + #maybe in se.User.preferences_raw? + pass + + def transfer_meta_pages(self): + #here we actually don't have anything in the database yet + #so we can't do this + pass + + def load_xml_file(self, xml_path, table_name): + tree = et.parse(xml_path) + print 'loading from %s to %s' % (xml_path, table_name) , + model = models.get_model('stackexchange', table_name) + i = 0 + for row in tree.findall('.//row'): + model_entry = model() + i += 1 + for col in row.getchildren(): + field_name = se_parser.parse_field_name(col.tag) + field_type = model._meta.get_field(field_name) + field_value = se_parser.parse_value(col.text, field_type) + setattr(model_entry, field_name, field_value) + model_entry.save() + print '... %d objects saved' % i + + def get_table_name(self,xml): + return se_parser.get_table_name(xml) + + def get_xml_path(self, xml): + xml_path = os.path.join(self.dump_path, xml + '.xml') + if not os.path.isfile(xml_path): + print 'Error: file %s not found' % xml_path + sys.exit(1) + return xml_path + + def transfer_users(self): + for se_u in se.User.objects.all(): + if se_u.id < 1:#skip the Community user + continue + u = askbot.User() + u_type = se_u.user_type.name + if u_type == 'Administrator': + u.is_superuser = True + elif u_type == 'Moderator': + u.is_staff = True + elif u_type not in ('Unregistered', 'Registered'): + raise Exception('unknown user type %s' % u_type) + + #if user is not registered, no association record created + #we do not allow posting by users who are not authenticated + #probably they'll just have to "recover" their account by email + if u_type != 'Unregistered': + assert(se_u.open_id)#everybody must have open_id + u_openid = askbot_openid.UserAssociation() + u_openid.openid_url = se_u.open_id + u_openid.user = u + + if se_u.open_id is None and se_u.email is None: + print 'Warning: SE user %d is not recoverable (no email or openid)' + + u.reputation = 1#se_u.reputation, it's actually re-computed + u.last_seen = se_u.last_access_date + u.email = X.get_email(se_u.email) + u.location = X.blankable(se_u.location) + u.date_of_birth = se_u.birthday #dattime -> date + u.website = X.blankable(se_u.website_url) + u.about = X.blankable(se_u.about_me) + u.last_login = se_u.last_login_date + u.date_joined = se_u.creation_date + u.is_active = True #todo: this may not be the case + + u.username = X.get_screen_name(se_u.display_name) + u.real_name = X.blankable(se_u.real_name) + + (gold,silver,bronze) = X.parse_badge_summary(se_u.badge_summary) + u.gold = gold + u.silver = silver + u.bronze = bronze + + #todo: we don't have these fields + #views - number of profile views? + #has_replies + #has_message + #opt_in_recruit + #last_login_ip + #open_id_alt - ?? + #preferences_raw - not clear how to use + #display_name_cleaned - lowercased, srtipped name + #timed_penalty_date + #phone + + #don't know how to handle these - there was no usage example + #password_id + #guid + + #ignored + #last_email_date - this translates directly to EmailFeedSetting.reported_at + + #save the data + u.save() + form = EditUserEmailFeedsForm() + form.reset() + if se_u.opt_in_email == True:#set up daily subscription on "own" items + form.initial['individually_selected'] = 'd' + form.initial['asked_by_me'] = 'd' + form.initial['answered_by_me'] = 'd' + # + form.save(user=u, save_unbound=True) + USER[se_u.id] = u diff --git a/askbot/importers/stackexchange/models.py b/askbot/importers/stackexchange/models.py new file mode 100644 index 00000000..a30a9859 --- /dev/null +++ b/askbot/importers/stackexchange/models.py @@ -0,0 +1,266 @@ +from django.db import models +class Badge(models.Model): + id = models.IntegerField(primary_key=True) + class_type = models.IntegerField(null=True) + name = models.CharField(max_length=50, null=True) + description = models.TextField(null=True) + single = models.NullBooleanField(null=True) + secret = models.NullBooleanField(null=True) + tag_based = models.NullBooleanField(null=True) + command = models.TextField(null=True) + award_frequency = models.IntegerField(null=True) + +class CloseReason(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=200, null=True) + description = models.CharField(max_length=256, null=True) + display_order = models.IntegerField(null=True) + +class Comment2Vote(models.Model): + id = models.IntegerField(primary_key=True) + post_comment = models.ForeignKey('PostComment', related_name='Comment2Vote_by_post_comment_set', null=True) + vote_type = models.ForeignKey('VoteType', related_name='Comment2Vote_by_vote_type_set', null=True) + creation_date = models.DateTimeField(null=True) + user = models.ForeignKey('User', related_name='Comment2Vote_by_user_set', null=True) + ip_address = models.CharField(max_length=40, null=True) + user_display_name = models.CharField(max_length=40, null=True) + deletion_date = models.DateTimeField(null=True) + +class FlatPage(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + url = models.CharField(max_length=128, null=True) + value = models.TextField(null=True) + content_type = models.CharField(max_length=50, null=True) + active = models.NullBooleanField(null=True) + use_master = models.NullBooleanField(null=True) + +class Message(models.Model): + id = models.IntegerField(primary_key=True) + user = models.ForeignKey('User', related_name='Message_by_user_set', null=True) + message_type = models.ForeignKey('MessageType', related_name='Message_by_message_type_set', null=True) + is_read = models.NullBooleanField(null=True) + creation_date = models.DateTimeField(null=True) + text = models.TextField(null=True) + post = models.ForeignKey('Post', related_name='Message_by_post_set', null=True) + +class MessageType(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + description = models.CharField(max_length=300, null=True) + +class ModeratorMessage(models.Model): + id = models.IntegerField(primary_key=True) + message_type = models.ForeignKey('MessageType', related_name='ModeratorMessage_by_message_type_set', null=True) + creation_date = models.DateTimeField(null=True) + creation_ip_address = models.CharField(max_length=40, null=True) + text = models.TextField(null=True) + user = models.ForeignKey('User', related_name='ModeratorMessage_by_user_set', null=True) + post = models.ForeignKey('Post', related_name='ModeratorMessage_by_post_set', null=True) + deletion_date = models.DateTimeField(null=True) + deletion_user = models.ForeignKey('User', related_name='ModeratorMessage_by_deletion_user_set', null=True) + deletion_ip_address = models.CharField(max_length=40, null=True) + user_display_name = models.CharField(max_length=40, null=True) + +class PostComment(models.Model): + id = models.IntegerField(primary_key=True) + post = models.ForeignKey('Post', related_name='PostComment_by_post_set', null=True) + text = models.TextField(null=True) + creation_date = models.DateTimeField(null=True) + ip_address = models.CharField(max_length=15, null=True) + user = models.ForeignKey('User', related_name='PostComment_by_user_set', null=True) + user_display_name = models.CharField(max_length=30, null=True) + deletion_date = models.DateTimeField(null=True) + deletion_user = models.ForeignKey('User', related_name='PostComment_by_deletion_user_set', null=True) + score = models.IntegerField(null=True) + +class PostHistoryType(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + description = models.CharField(max_length=300, null=True) + +class PostHistory(models.Model): + id = models.IntegerField(primary_key=True) + post_history_type = models.ForeignKey('PostHistoryType', related_name='PostHistory_by_post_history_type_set', null=True) + post = models.ForeignKey('Post', related_name='PostHistory_by_post_set', null=True) + revision_guid = models.CharField(max_length=64, null=True) + creation_date = models.DateTimeField(null=True) + ip_address = models.CharField(max_length=40, null=True) + user = models.ForeignKey('User', related_name='PostHistory_by_user_set', null=True) + comment = models.CharField(max_length=400, null=True) + text = models.TextField(null=True) + user_display_name = models.CharField(max_length=40, null=True) + user_email = models.CharField(max_length=100, null=True) + user_website_url = models.CharField(max_length=200, null=True) + +class Post2Vote(models.Model): + id = models.IntegerField(primary_key=True) + post = models.ForeignKey('Post', related_name='Post2Vote_by_post_set', null=True) + user = models.ForeignKey('User', related_name='Post2Vote_by_user_set', null=True) + vote_type = models.ForeignKey('VoteType', related_name='Post2Vote_by_vote_type_set', null=True) + creation_date = models.DateTimeField(null=True) + deletion_date = models.DateTimeField(null=True) + target_user = models.ForeignKey('User', related_name='Post2Vote_by_target_user_set', null=True) + target_rep_change = models.IntegerField(null=True) + voter_rep_change = models.IntegerField(null=True) + comment = models.CharField(max_length=150, null=True) + ip_address = models.CharField(max_length=40, null=True) + linked_post = models.ForeignKey('Post', related_name='Post2Vote_by_linked_post_set', null=True) + +class Post(models.Model): + id = models.IntegerField(primary_key=True) + post_type = models.ForeignKey('PostType', related_name='Post_by_post_type_set', null=True) + creation_date = models.DateTimeField(null=True) + score = models.IntegerField(null=True) + view_count = models.IntegerField(null=True) + body = models.TextField(null=True) + owner_user = models.ForeignKey('User', related_name='Post_by_owner_user_set', null=True) + last_editor_user = models.ForeignKey('User', related_name='Post_by_last_editor_user_set', null=True) + last_edit_date = models.DateTimeField(null=True) + last_activity_date = models.DateTimeField(null=True) + last_activity_user = models.ForeignKey('User', related_name='Post_by_last_activity_user_set', null=True) + parent = models.ForeignKey('self', related_name='Post_by_parent_set', null=True) + accepted_answer = models.ForeignKey('self', related_name='Post_by_accepted_answer_set', null=True) + title = models.CharField(max_length=250, null=True) + tags = models.CharField(max_length=150, null=True) + community_owned_date = models.DateTimeField(null=True) + history_summary = models.CharField(max_length=150, null=True) + answer_score = models.IntegerField(null=True) + answer_count = models.IntegerField(null=True) + comment_count = models.IntegerField(null=True) + favorite_count = models.IntegerField(null=True) + deletion_date = models.DateTimeField(null=True) + closed_date = models.DateTimeField(null=True) + locked_date = models.DateTimeField(null=True) + locked_duration = models.IntegerField(null=True) + owner_display_name = models.CharField(max_length=40, null=True) + last_editor_display_name = models.CharField(max_length=40, null=True) + bounty_amount = models.IntegerField(null=True) + bounty_closes = models.DateTimeField(null=True) + bounty_closed = models.DateTimeField(null=True) + last_owner_email_date = models.DateTimeField(null=True) + +class PostType(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + description = models.CharField(max_length=300, null=True) + +class SchemaVersion(models.Model): + version = models.IntegerField(null=True) + +class Setting(models.Model): + id = models.IntegerField(primary_key=True) + key = models.CharField(max_length=256, null=True) + value = models.TextField(null=True) + +class SystemMessage(models.Model): + id = models.IntegerField(primary_key=True) + user = models.ForeignKey('User', related_name='SystemMessage_by_user_set', null=True) + creation_date = models.DateTimeField(null=True) + text = models.TextField(null=True) + deletion_date = models.DateTimeField(null=True) + deletion_user = models.ForeignKey('User', related_name='SystemMessage_by_deletion_user_set', null=True) + +class Tag(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + count = models.IntegerField(null=True) + user = models.ForeignKey('User', related_name='Tag_by_user_set', null=True) + creation_date = models.DateTimeField(null=True) + is_moderator_only = models.NullBooleanField(null=True) + is_required = models.NullBooleanField(null=True) + aliases = models.CharField(max_length=200, null=True) + +class ThemeResource(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + value = models.TextField(null=True) + content_type = models.CharField(max_length=50, null=True) + version = models.CharField(max_length=6, null=True) + +class ThemeTextResource(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + value = models.TextField(null=True) + content_type = models.CharField(max_length=50, null=True) + +class ThrottleBucket(models.Model): + id = models.IntegerField(primary_key=True) + type = models.CharField(max_length=256, null=True) + ip_address = models.CharField(max_length=64, null=True) + tokens = models.IntegerField(null=True) + last_update = models.DateTimeField(null=True) + +class UserHistoryType(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + description = models.CharField(max_length=300, null=True) + +class UserHistory(models.Model): + id = models.IntegerField(primary_key=True) + user_history_type = models.ForeignKey('UserHistoryType', related_name='UserHistory_by_user_history_type_set', null=True) + creation_date = models.DateTimeField(null=True) + ip_address = models.CharField(max_length=40, null=True) + user = models.ForeignKey('User', related_name='UserHistory_by_user_set', null=True) + comment = models.CharField(max_length=400, null=True) + user_display_name = models.CharField(max_length=40, null=True) + moderator_user = models.ForeignKey('User', related_name='UserHistory_by_moderator_user_set', null=True) + reputation = models.IntegerField(null=True) + +class User2Badge(models.Model): + id = models.IntegerField(primary_key=True) + user = models.ForeignKey('User', related_name='User2Badge_by_user_set', null=True) + badge = models.ForeignKey('Badge', related_name='User2Badge_by_badge_set', null=True) + date = models.DateTimeField(null=True) + comment = models.CharField(max_length=50, null=True) + +class User2Vote(models.Model): + id = models.IntegerField(primary_key=True) + user = models.ForeignKey('User', related_name='User2Vote_by_user_set', null=True) + vote_type = models.ForeignKey('VoteType', related_name='User2Vote_by_vote_type_set', null=True) + target_user = models.ForeignKey('User', related_name='User2Vote_by_target_user_set', null=True) + creation_date = models.DateTimeField(null=True) + deletion_date = models.DateTimeField(null=True) + ip_address = models.CharField(max_length=40, null=True) + +class User(models.Model): + id = models.IntegerField(primary_key=True) + user_type = models.ForeignKey('UserType', related_name='User_by_user_type_set', null=True) + open_id = models.CharField(max_length=200, null=True) + reputation = models.IntegerField(null=True) + views = models.IntegerField(null=True) + creation_date = models.DateTimeField(null=True) + last_access_date = models.DateTimeField(null=True) + has_replies = models.NullBooleanField(null=True) + has_message = models.NullBooleanField(null=True) + opt_in_email = models.NullBooleanField(null=True) + opt_in_recruit = models.NullBooleanField(null=True) + last_login_date = models.DateTimeField(null=True) + last_email_date = models.DateTimeField(null=True) + last_login_ip = models.CharField(max_length=15, null=True) + open_id_alt = models.CharField(max_length=200, null=True) + email = models.CharField(max_length=100, null=True) + display_name = models.CharField(max_length=40, null=True) + display_name_cleaned = models.CharField(max_length=40, null=True) + website_url = models.CharField(max_length=200, null=True) + real_name = models.CharField(max_length=100, null=True) + location = models.CharField(max_length=100, null=True) + birthday = models.DateTimeField(null=True) + badge_summary = models.CharField(max_length=50, null=True) + about_me = models.TextField(null=True) + preferences_raw = models.TextField(null=True) + timed_penalty_date = models.DateTimeField(null=True) + guid = models.CharField(max_length=64, null=True) + phone = models.CharField(max_length=20, null=True) + password_id = models.IntegerField(null=True) + +class UserType(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + description = models.CharField(max_length=300, null=True) + +class VoteType(models.Model): + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=50, null=True) + description = models.CharField(max_length=300, null=True) + diff --git a/askbot/importers/stackexchange/parse_models.py b/askbot/importers/stackexchange/parse_models.py new file mode 100644 index 00000000..64796e57 --- /dev/null +++ b/askbot/importers/stackexchange/parse_models.py @@ -0,0 +1,225 @@ +from xml.etree import ElementTree as et +import sys +import re +import os +if __name__ != '__main__':#hack do not import models if run as script + from django.db import models +from datetime import datetime + +table_prefix = ''#StackExchange or something, if needed +date_time_format = '%Y-%m-%dT%H:%M:%S' #note that fractional part of second is lost +time_re = re.compile(r'(\.[\d]+)?$') +loader_app_name = os.path.dirname(__file__) + +types = { + 'unsignedByte':'models.IntegerField', + 'FK':'models.ForeignKey', + 'PK':'models.IntegerField', + 'string':'models.CharField', + 'text':'models.TextField', + 'int':'models.IntegerField', + 'boolean':'models.NullBooleanField', + 'dateTime':'models.DateTimeField', + 'base64Binary':'models.TextField', + 'double':'models.IntegerField', +} + +def camel_to_python(camel): + """http://stackoverflow.com/questions/1175208/ + """ + s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', camel) + return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower() + +def singular(word): + if word.endswith('s'): + return word[:-1] + else: + return word + +def get_table_name(name): + """Determine db table name + from the basename of the .xml file + """ + out = table_prefix + if name.find('2') == -1: + out += singular(name) + else: + bits = name.split('2') + bits = map(singular, bits) + out += '2'.join(bits) + return out + +class DjangoModel(object): + def __init__(self, name): + self.name = get_table_name(name) + self.fields = [] + def add_field(self,field): + field.table = self + self.fields.append(field) + def __str__(self): + out = 'class %s(models.Model):\n' % self.name + for f in self.fields: + out += ' %s\n' % str(f) + return out + +class DjangoField(object): + def __init__(self, name, type, restriction = None): + self.name = camel_to_python(name) + if self.name == 'class': + self.name = 'class_type'#work around python keyword + self.type = type + self.table = None + self.restriction = restriction + self.relation = None + + def __str__(self): + out = '%s = %s(' % (self.name, types[self.type]) + if self.type == 'FK': + out += "'%s'" % self.relation + out += ", related_name='%s_by_%s_set'" % (self.table.name, self.name) + out += ', null=True'#nullable to make life easier + elif self.type == 'PK': + out += 'primary_key=True' + elif self.restriction != -1: + if self.type == 'string': + out += 'max_length=%s' % self.restriction + out += ', null=True' + else: + raise Exception('restriction (max_length) supported only for string type') + else: + out += 'null=True' + out += ')' + return out + + def get_type(self): + return self.type + +class DjangoPK(DjangoField): + def __init__(self): + self.name = 'id' + self.type = 'PK' + +class DjangoFK(DjangoField): + def __init__(self, source_name): + bits = source_name.split('Id') + if len(bits) == 2 and bits[1] == '': + name = bits[0] + super(DjangoFK, self).__init__(name, 'FK') + self.set_relation(name) + + def set_relation(self, name): + """some relations need to be mapped + to actual tables + """ + self.relation = table_prefix + if name.endswith('User'): + self.relation += 'User' + elif name.endswith('Post'): + self.relation += 'Post' + elif name in ('AcceptedAnswer','Parent'): + self.relation = 'self' #self-referential Post model + else: + self.relation += name + def get_relation(self): + return self.relation + +def get_col_type(col): + type = col.get('type') + restriction = -1 + if type == None: + type_e = col.find('.//simpleType/restriction') + type = type_e.get('base') + try: + restriction = int(type_e.getchildren()[0].get('value')) + except: + restriction = -1 + if restriction > 400: + type = 'text' + restriction = -1 + return type, restriction + +def make_field_from_xml_tree(xml_element): + """used by the model parser + here we need to be detailed about field types + because this defines the database schema + """ + name = xml_element.get('name') + if name == 'LinkedVoteId':#not used + return None + if name == 'Id': + field = DjangoPK() + elif name.endswith('Id') and name not in ('OpenId','PasswordId'): + field = DjangoFK(name) + elif name.endswith('GUID'): + field = DjangoField(name, 'string', 64) + else: + type, restriction = get_col_type(xml_element) + field = DjangoField(name, type, restriction) + return field + +def parse_field_name(input): + """used by the data reader + + The problem is that I've scattered + code for determination of field name over three classes: + DjangoField, DjangoPK and DjangoFK + so the function actually cretes fake field objects + many time over + """ + if input == 'Id': + return DjangoPK().name + elif input in ('OpenId', 'PasswordId'): + return DjangoField(input, 'string', 7).name#happy fake field + elif input.endswith('Id'): + return DjangoFK(input).name#real FK field + else: + return DjangoField(input, 'string', 7).name#happy fake field + +def parse_value(input, field_object): + if isinstance(field_object, models.ForeignKey): + try: + id = int(input) + except: + raise Exception('non-numeric foreign key %s' % input) + related_model = field_object.rel.to + try: + return related_model.objects.get(id=id) + except related_model.DoesNotExist: + obj = related_model(id=id) + obj.save()#save fake empty object + return obj + elif isinstance(field_object, models.IntegerField): + try: + return int(input) + except: + raise Exception('expected integer, found %s' % input) + elif isinstance(field_object, models.CharField): + return input + elif isinstance(field_object, models.TextField): + return input + elif isinstance(field_object, models.BooleanField): + try: + return bool(input) + except: + raise Exception('boolean value expected %s found' % input) + elif isinstance(field_object, models.DateTimeField): + input = time_re.sub('', input) + try: + return datetime.strptime(input, date_time_format) + except: + raise Exception('datetime expected "%s" found' % input) + +print 'from django.db import models' +for file in sys.argv: + if '.xsd' in file: + tname = os.path.basename(file).replace('.xsd','') + tree = et.parse(file) + + model = DjangoModel(tname) + + row = tree.find('.//sequence') + for col in row.getchildren(): + field = make_field_from_xml_tree(col) + if field: + model.add_field(field) + print model diff --git a/askbot/locale/de/LC_MESSAGES/django.mo b/askbot/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 00000000..fd451a6d Binary files /dev/null and b/askbot/locale/de/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/de/LC_MESSAGES/django.po b/askbot/locale/de/LC_MESSAGES/django.po new file mode 100644 index 00000000..b5de1030 --- /dev/null +++ b/askbot/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,4432 @@ +# German translation for Askbot project. +# Copyright (C) 2009 Gang Chen, 2010 Askbot +# This file is distributed under the same license as the Askbot package. +# Pekka Gaiser , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-09 19:41-0400\n" +"PO-Revision-Date: 2010-05-06 02:23\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" + +#: django_authopenid/forms.py:71 django_authopenid/views.py:132 +msgid "i-names are not supported" +msgstr "i-names werden nicht unterstützt." + +#: django_authopenid/forms.py:134 +msgid "Account with this name already exists on the forum" +msgstr "Ein Zugang dieses Namens existiert bereits!" + +#: django_authopenid/forms.py:135 +msgid "can't have two logins to the same account yet, sorry." +msgstr "Zwei Logins für den selben Zugang sind leider noch nicht möglich." + +#: django_authopenid/forms.py:157 +msgid "Please enter valid username and password (both are case-sensitive)." +msgstr "" +"Bitte geben Sie einen gültigen Benutzernamen und ein Passwort ein. Es wird " +"zwischen Groß- und Kleinschreibung unterschieden." + +#: django_authopenid/forms.py:160 django_authopenid/forms.py:210 +msgid "This account is inactive." +msgstr "Dieser Zugang ist inaktiv." + +#: django_authopenid/forms.py:162 +msgid "Login failed." +msgstr "Login fehlgeschlagen." + +#: django_authopenid/forms.py:164 +msgid "Please enter username and password" +msgstr "Bitte geben Sie Benutzernamen und Passwort ein." + +#: django_authopenid/forms.py:166 +msgid "Please enter your password" +msgstr "Bitte geben Sie Ihr Passwort ein." + +#: django_authopenid/forms.py:168 +msgid "Please enter user name" +msgstr "Bitte geben Sie Ihren Benutzernamen ein." + +#: django_authopenid/forms.py:206 +msgid "" +"Please enter a valid username and password. Note that " +"both fields are case-sensitive." +msgstr "" +"Bitte geben Sie einen gültigen Benutzernamen und ein Passwort ein. Es wird " +"zwischen Groß- und Kleinschreibung unterschieden." + +#: django_authopenid/forms.py:229 +msgid "Current password" +msgstr "Momentanes Passwort" + +#: django_authopenid/forms.py:240 +msgid "" +"Old password is incorrect. Please enter the correct " +"password." +msgstr "" +"Das alte Passwort ist falsch. Bitte geben Sie das richtige Passwort ein." + +#: django_authopenid/forms.py:305 +msgid "Your user name (required)" +msgstr "Ihr Benutzername (Pflichtfeld)" + +#: django_authopenid/forms.py:320 +msgid "Incorrect username." +msgstr "Ungültiger Benutzername." + +#: django_authopenid/urls.py:23 django_authopenid/urls.py:24 +#: django_authopenid/urls.py:25 django_authopenid/urls.py:27 +#: fbconnect/urls.py:12 fbconnect/urls.py:13 fbconnect/urls.py:14 +msgid "signin/" +msgstr "einloggen/" + +#: django_authopenid/urls.py:24 fbconnect/urls.py:13 fbconnect/urls.py:17 +msgid "newquestion/" +msgstr "frage_stellen/" + +#: django_authopenid/urls.py:25 fbconnect/urls.py:14 fbconnect/urls.py:18 +msgid "newanswer/" +msgstr "antworten/" + +#: django_authopenid/urls.py:26 +msgid "signout/" +msgstr "ausloggen/" + +#: django_authopenid/urls.py:27 +msgid "complete/" +msgstr "fertig/" + +#: django_authopenid/urls.py:29 fbconnect/urls.py:16 fbconnect/urls.py:17 +#: fbconnect/urls.py:18 +msgid "register/" +msgstr "registrieren/" + +#: django_authopenid/urls.py:30 +msgid "signup/" +msgstr "registrieren/" + +#: django_authopenid/urls.py:32 +msgid "sendpw/" +msgstr "passwort_senden/" + +#: django_authopenid/urls.py:33 django_authopenid/urls.py:37 +msgid "password/" +msgstr "passwort/" + +#: django_authopenid/urls.py:33 +msgid "confirm/" +msgstr "bestaetigen/" + +#: django_authopenid/urls.py:38 django_authopenid/urls.py:39 +#: django_authopenid/urls.py:40 django_authopenid/urls.py:41 +msgid "email/" +msgstr "email/" + +#: django_authopenid/urls.py:38 +msgid "validate/" +msgstr "validieren/" + +#: django_authopenid/urls.py:39 +msgid "change/" +msgstr "aendern/" + +#: django_authopenid/urls.py:40 +msgid "sendkey/" +msgstr "key_senden/" + +#: django_authopenid/urls.py:41 +msgid "verify/" +msgstr "verifizieren/" + +#: django_authopenid/urls.py:42 +msgid "openid/" +msgstr "openid/" + +#: django_authopenid/urls.py:43 forum/urls.py:52 forum/urls.py:56 +msgid "delete/" +msgstr "loeschen/" + +#: django_authopenid/urls.py:51 +msgid "external-login/forgot-password/" +msgstr "externer-login/passwort-vergessen/" + +#: django_authopenid/urls.py:54 +msgid "external-login/signup/" +msgstr "externer-login/anmelden/" + +#: django_authopenid/views.py:139 +#, python-format +msgid "OpenID %(openid_url)s is invalid" +msgstr "OpenID %(openid_url)s ist ungültig" + +#: django_authopenid/views.py:614 +msgid "Welcome email subject line" +msgstr "Willkommen im Forum" + +#: django_authopenid/views.py:720 +msgid "Password changed." +msgstr "Passwort geändert." + +#: django_authopenid/views.py:732 django_authopenid/views.py:738 +#, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" +"Sie müssen Ihre E-Mail-Adresse bestätigen. Mehr Informationenhier." + +#: django_authopenid/views.py:759 +msgid "Email verification subject line" +msgstr "Bestätigung Ihrer E-Mail-Adresse" + +#: django_authopenid/views.py:850 +msgid "your email was not changed" +msgstr "Ihre E-Mail-Adresse wurde nicht geändert." + +#: django_authopenid/views.py:898 django_authopenid/views.py:1056 +#, python-format +msgid "No OpenID %s found associated in our database" +msgstr "Keine Verknüpfung für OpenID %s in der Datenbank gefunden." + +#: django_authopenid/views.py:902 django_authopenid/views.py:1063 +#, python-format +msgid "The OpenID %s isn't associated to current user logged in" +msgstr "" +"Die OpenID %s ist nicht mit dem momentan eingeloggten Benutzer vernknüpft." + +#: django_authopenid/views.py:910 +msgid "Email Changed." +msgstr "E-Mail-Adresse geändert." + +#: django_authopenid/views.py:988 +msgid "This OpenID is already associated with another account." +msgstr "Diese OpenID ist bereits mit einem anderen Zugang verknüpft." + +#: django_authopenid/views.py:993 +#, python-format +msgid "OpenID %s is now associated with your account." +msgstr "Die OpenID %s ist jetzt mit Ihrem Zugang verknüpft." + +#: django_authopenid/views.py:1066 +msgid "Account deleted." +msgstr "Zugang gelöscht." + +#: django_authopenid/views.py:1118 +msgid "Request for new password" +msgstr "Anfordern eines neuen Passworts" + +#: django_authopenid/views.py:1132 +msgid "A new password and the activation link were sent to your email address." +msgstr "" +"Ein neues Passwort und ein Aktivierungslink wurden an Ihre E-Mail-Adresse " +"gesandt." + +#: django_authopenid/views.py:1164 +#, python-format +msgid "" +"Could not change password. Confirmation key '%s' is not " +"registered." +msgstr "" +"Passwort konnte nicht geändert werden. Bestätigungscode '%s' nicht gefunden. " + +#: django_authopenid/views.py:1174 +msgid "" +"Can not change password. User don't exist anymore in our " +"database." +msgstr "" +"Passwort konnte nicht geändert werden. Der Benutzer existiert nicht mehr." + +#: django_authopenid/views.py:1184 +#, python-format +msgid "Password changed for %s. You may now sign in." +msgstr "Passwort für '%s' geändert. Sie können sich jetzt anmelden." + +#: forum/auth.py:505 +msgid "Your question and all of it's answers have been deleted" +msgstr "Ihre Frage und alle Antworten wurden gelöscht." + +#: forum/auth.py:507 +msgid "Your question has been deleted" +msgstr "Ihre Frage wurde gelöscht." + +#: forum/auth.py:510 +msgid "The question and all of it's answers have been deleted" +msgstr "Die Frage und alle Antworten wurden gelöscht." + +#: forum/auth.py:512 +msgid "The question has been deleted" +msgstr "Die Frage wurde gelöscht." + +#: forum/const.py:8 +msgid "duplicate question" +msgstr "Duplikat" + +#: forum/const.py:9 +msgid "question is off-topic or not relevant" +msgstr "Die Frage geht am Thema vorbei oder ist nicht relevant " + +#: forum/const.py:10 +msgid "too subjective and argumentative" +msgstr "Zu subjektiv und zu diskussionen verleitend" + +#: forum/const.py:11 +msgid "not a real question" +msgstr "Keine echte Frage" + +#: forum/const.py:12 +msgid "the question is answered, right answer was accepted" +msgstr "" +"The Frage wurde beantwortet, die korrekte Antwort als \"Akzeptiert\" " +"markiert." + +#: forum/const.py:13 +msgid "question is not relevant or outdated" +msgstr "Die Frage ist nicht relevant oder inzwischen veraltet." + +#: forum/const.py:14 +msgid "question contains offensive or malicious remarks" +msgstr "Die Frage enthält beleidigende oder illegale Formulierungen" + +#: forum/const.py:15 +msgid "spam or advertising" +msgstr "Spam oder Werbung" + +#: forum/const.py:16 +msgid "too localized" +msgstr "Zu eng gefaßt" + +#: forum/const.py:37 forum/skins/default/templates/questions.html:70 +#: forum/skins/default/templates/questions.html:75 +msgid "newest" +msgstr "neueste" + +#: forum/const.py:38 forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/users.html:28 +msgid "oldest" +msgstr "älteste" + +#: forum/const.py:39 forum/skins/default/templates/questions.html:89 +#: forum/skins/default/templates/questions.html:94 +msgid "active" +msgstr "aktiv" + +#: forum/const.py:40 forum/skins/default/templates/questions.html:83 +msgid "inactive" +msgstr "inaktiv" + +#: forum/const.py:41 +msgid "hottest" +msgstr "heißeste" + +#: forum/const.py:42 +msgid "coldest" +msgstr "kälteste" + +#: forum/const.py:43 +msgid "most voted" +msgstr "am häufigsten positiv bewertet" + +#: forum/const.py:44 +msgid "least voted" +msgstr "am seltensten positiv bewertet" + +#: forum/const.py:45 +msgid "relevance" +msgstr "Relevanz" + +#: forum/const.py:52 forum/skins/default/templates/questions.html:52 +msgid "all" +msgstr "alle" + +#: forum/const.py:53 forum/skins/default/templates/questions.html:53 +msgid "unanswered" +msgstr "unbeantwortet" + +#: forum/const.py:54 forum/skins/default/templates/questions.html:55 +msgid "favorite" +msgstr "Favorit" + +#: forum/const.py:97 +msgid "question" +msgstr "Frage" + +#: forum/const.py:98 forum/skins/default/templates/book.html:110 +msgid "answer" +msgstr "Antwort" + +#: forum/const.py:99 +msgid "commented question" +msgstr "kommentierte Frage" + +#: forum/const.py:100 +msgid "commented answer" +msgstr "kommentierte Antwort" + +#: forum/const.py:101 +msgid "edited question" +msgstr "überarbeitete Frage" + +#: forum/const.py:102 +msgid "edited answer" +msgstr "überarbeitete Antwort" + +#: forum/const.py:103 +msgid "received award" +msgstr "Auszeichnung erhalten" + +#: forum/const.py:104 +msgid "marked best answer" +msgstr "als beste Antwort markiert" + +#: forum/const.py:105 +msgid "upvoted" +msgstr "positiv bewertet" + +#: forum/const.py:106 +msgid "downvoted" +msgstr "negativ bewertet" + +#: forum/const.py:107 +msgid "canceled vote" +msgstr "Bewertung zurückgezogen" + +#: forum/const.py:108 +msgid "deleted question" +msgstr "Frage gelöscht" + +#: forum/const.py:109 +msgid "deleted answer" +msgstr "Antwort gelöscht" + +#: forum/const.py:110 +msgid "marked offensive" +msgstr "als beleidigend/illegal gemeldet" + +#: forum/const.py:111 +msgid "updated tags" +msgstr "tags aktualisiert" + +#: forum/const.py:112 +msgid "selected favorite" +msgstr "Favorit ausgewählt" + +#: forum/const.py:113 +msgid "completed user profile" +msgstr "Benutzerprofil komplettiert" + +#: forum/const.py:114 +msgid "email update sent to user" +msgstr "E-Mail-Update an Benutzer versandt" + +#: forum/const.py:118 +msgid "question_answered" +msgstr "Frage beantwortet" + +#: forum/const.py:119 +msgid "question_commented" +msgstr "Frage kommentiert" + +#: forum/const.py:120 +msgid "answer_commented" +msgstr "Antwort kommentiert" + +#: forum/const.py:121 +msgid "answer_accepted" +msgstr "Antwort akzeptiert" + +#: forum/const.py:125 +msgid "[closed]" +msgstr "[geschlossen]" + +#: forum/const.py:126 +msgid "[deleted]" +msgstr "[gelöscht]" + +#: forum/const.py:127 forum/views/readers.py:396 forum/views/readers.py:417 +msgid "initial version" +msgstr "ursprüngliche Version" + +#: forum/const.py:128 +msgid "retagged" +msgstr "Tags verändert" + +#: forum/const.py:132 +msgid "exclude ignored tags" +msgstr "Ignorierte Tags ausschließen" + +#: forum/const.py:132 +msgid "allow only selected tags" +msgstr "Nur ausgewählte Tags erlauben" + +#: forum/feed.py:18 +msgid " - " +msgstr "-" + +#: forum/feed.py:18 +msgid "latest questions" +msgstr "Neueste Fragen" + +#: forum/forms.py:23 forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "title" +msgstr "Titel" + +#: forum/forms.py:24 +msgid "please enter a descriptive title for your question" +msgstr "Bitte geben Sie einen Aussagekräftigen Titel für Ihre Frage ein." + +#: forum/forms.py:29 +msgid "title must be > 10 characters" +msgstr "Der Titel muß länger als 10 Zeichen sein." + +#: forum/forms.py:38 +msgid "content" +msgstr "Inhalt" + +#: forum/forms.py:44 +msgid "question content must be > 10 characters" +msgstr "Der Fragentext muß länger als 10 Buchstaben sein." + +#: forum/forms.py:53 forum/skins/default/templates/header.html:28 +msgid "tags" +msgstr "Tags" + +#: forum/forms.py:55 +msgid "" +"Tags are short keywords, with no spaces within. Up to five tags can be used." +msgstr "" +"Tags sind kurze Stichwörter. Sie dürfen keine Leerzeichen enthalten. Bis zu " +"fünf Tags können vergeben werden." + +#: forum/forms.py:62 forum/skins/default/templates/question_retag.html:39 +msgid "tags are required" +msgstr "Mindestens ein Tag muß gesetzt sein." + +#: forum/forms.py:70 +#, python-format +msgid "please use %(tag_count)d tag or less" +msgid_plural "please use %(tag_count)d tags or less" +msgstr[0] "Bitte %(tag_count)d Tags oder weniger benutzen" +msgstr[1] "Bitte %(tag_count)d Tags oder weniger benutzen" + +#: forum/forms.py:79 +#, python-format +msgid "each tag must be shorter than %(max_chars)d character" +msgid_plural "each tag must be shorter than %(max_chars)d characters" +msgstr[0] "Tags müssen kürzer als %(max_chars)d Zeichen sein" +msgstr[1] "Tags müssen kürzer als %(max_chars)d Zeichen sein" + +#: forum/forms.py:87 +msgid "use-these-chars-in-tags" +msgstr "Diese Buchstaben dürfen in Tags vorkommen" + +#: forum/forms.py:97 +#: forum/skins/default/templates/post_contributor_info.html:7 +#: forum/skins/default/templates/question_summary_list_roll.html:26 +#: forum/skins/default/templates/question_summary_list_roll.html:38 +msgid "community wiki" +msgstr "Community Wiki" + +#: forum/forms.py:98 +msgid "" +"if you choose community wiki option, the question and answer do not generate " +"points and name of author will not be shown" +msgstr "" +"Wenn Sie \"Community Wiki\" auswählen, werden auf die Frage und die " +"Antworten keine Bewertungspunkte vergeben, und der Name des Autors wird " +"nicht angezeigt." + +#: forum/forms.py:114 +msgid "update summary:" +msgstr "Zusammenfassung der Überarbeitung:" + +#: forum/forms.py:115 +msgid "" +"enter a brief summary of your revision (e.g. fixed spelling, grammar, " +"improved style, this field is optional)" +msgstr "" +"Bitte geben Sie eine kurze Beschreibung Ihrer Überarbeitung ein (z.B. " +"Rechtschreibung, Tippfehler korrigiert, Grammatik, Stil verbessert) " +"Freiwillige Angabe." + +#: forum/forms.py:118 +msgid "Automatically accept user's contributions for the email updates" +msgstr "Beiträge dieses Benutzers automatisch für E-Mail-Updates akzeptieren" + +#: forum/forms.py:209 +msgid "Your name:" +msgstr "Ihr Name:" + +#: forum/forms.py:210 +msgid "Email (not shared with anyone):" +msgstr "Ihre E-Mail-Adresse (wird nicht angezeigt):" + +#: forum/forms.py:211 +msgid "Your message:" +msgstr "Ihre Nachricht:" + +#: forum/forms.py:294 +msgid "this email does not have to be linked to gravatar" +msgstr "Diese E-Mail muß nicht mit Gravatar verknüpft werden." + +#: forum/forms.py:296 +msgid "Screen name" +msgstr "Nickname" + +#: forum/forms.py:297 +msgid "Real name" +msgstr "Echter Name" + +#: forum/forms.py:298 +msgid "Website" +msgstr "Website" + +#: forum/forms.py:299 +msgid "Location" +msgstr "Ort" + +#: forum/forms.py:300 +msgid "Date of birth" +msgstr "Geburtsdatum" + +#: forum/forms.py:300 +msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" +msgstr "" +"wird nicht angezeigt, aber für die Altersberechnung verwendet. Format: JJJJ-" +"MM-TT, Beispiel: 1980-05-27 für den 27. Mai 1980" + +#: forum/forms.py:301 forum/skins/default/templates/account_settings.html:21 +#: forum/skins/default/templates/authopenid/settings.html:21 +msgid "Profile" +msgstr "Profil" + +#: forum/forms.py:332 forum/forms.py:333 +msgid "this email has already been registered, please use another one" +msgstr "" +"Ein Zugang mit dieser E-Mail-Adresse existiert bereits. Bitte verwenden Sie " +"eine andere E-Mail-Adresse." + +#: forum/forms.py:339 +msgid "Choose email tag filter" +msgstr "E-Mail-Tag-Filter festlegen" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "weekly" +msgstr "wöchentlich" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "no email" +msgstr "Keine E-Mail" + +#: forum/forms.py:356 +msgid "daily" +msgstr "täglich" + +#: forum/forms.py:371 +msgid "Asked by me" +msgstr "Von mir gefragt" + +#: forum/forms.py:374 +msgid "Answered by me" +msgstr "Von mir beantwortet" + +#: forum/forms.py:377 +msgid "Individually selected" +msgstr "Individuell ausgewählt" + +#: forum/forms.py:380 +msgid "Entire forum (tag filtered)" +msgstr "Das ganze Forum (Tag-gefiltert)" + +#: forum/forms.py:434 +msgid "okay, let's try!" +msgstr "Okay, versuchen wir's!" + +#: forum/forms.py:435 +msgid "no community email please, thanks" +msgstr "Ich möchte gar keine E-Mails erhalten, danke" + +#: forum/forms.py:438 +msgid "please choose one of the options above" +msgstr "Bitte wählen Sie eine der obenstehenden Optionen aus" + +#: forum/urls.py:28 +msgid "upfiles/" +msgstr "dateien/" + +#: forum/urls.py:33 +msgid "about/" +msgstr "ueber/" + +#: forum/urls.py:34 +msgid "faq/" +msgstr "faq/" + +#: forum/urls.py:35 +msgid "privacy/" +msgstr "datenschutz/" + +#: forum/urls.py:36 +msgid "logout/" +msgstr "logout/" + +#: forum/urls.py:37 forum/urls.py:38 forum/urls.py:39 forum/urls.py:56 +msgid "answers/" +msgstr "antworten/" + +#: forum/urls.py:37 forum/urls.py:49 forum/urls.py:52 forum/urls.py:56 +msgid "comments/" +msgstr "kommentare/" + +#: forum/urls.py:38 forum/urls.py:43 forum/urls.py:78 +#: forum/skins/default/templates/user_info.html:47 +msgid "edit/" +msgstr "bearbeiten/" + +#: forum/urls.py:39 forum/urls.py:48 +msgid "revisions/" +msgstr "revisionen/" + +#: forum/urls.py:40 forum/urls.py:41 forum/urls.py:42 forum/urls.py:43 +#: forum/urls.py:44 forum/urls.py:45 forum/urls.py:46 forum/urls.py:47 +#: forum/urls.py:48 forum/urls.py:49 forum/urls.py:52 +msgid "questions/" +msgstr "fragen/" + +#: forum/urls.py:41 forum_modules/books/urls.py:8 +msgid "ask/" +msgstr "frage/" + +#: forum/urls.py:42 +msgid "unanswered/" +msgstr "unbeantwortet/" + +#: forum/urls.py:44 +msgid "close/" +msgstr "schliessen/" + +#: forum/urls.py:45 +msgid "reopen/" +msgstr "oeffnen/" + +#: forum/urls.py:46 +msgid "answer/" +msgstr "antwort/" + +#: forum/urls.py:47 +msgid "vote/" +msgstr "abstimmen/" + +#: forum/urls.py:50 +msgid "command/" +msgstr "befehl/" + +#: forum/urls.py:60 forum/views/readers.py:265 +msgid "question/" +msgstr "frage/" + +#: forum/urls.py:61 forum/urls.py:62 +msgid "tags/" +msgstr "tags/" + +#: forum/urls.py:64 forum/urls.py:68 +msgid "mark-tag/" +msgstr "tag-markieren/" + +#: forum/urls.py:64 +msgid "interesting/" +msgstr "interessant/" + +#: forum/urls.py:68 +msgid "ignored/" +msgstr "ignoriert/" + +#: forum/urls.py:72 +msgid "unmark-tag/" +msgstr "tag-entfernen/" + +#: forum/urls.py:76 forum/urls.py:78 forum/urls.py:79 +msgid "users/" +msgstr "benutzer/" + +#: forum/urls.py:77 +msgid "moderate-user/" +msgstr "benutzer-moderieren/" + +#: forum/urls.py:80 forum/urls.py:81 +msgid "badges/" +msgstr "auszeichnungen/" + +#: forum/urls.py:82 +msgid "messages/" +msgstr "nachrichten/" + +#: forum/urls.py:82 +msgid "markread/" +msgstr "gelesen_markieren/" + +#: forum/urls.py:84 +msgid "nimda/" +msgstr "nimda/" + +#: forum/urls.py:86 +msgid "upload/" +msgstr "upload/" + +#: forum/urls.py:87 +msgid "search/" +msgstr "suche/" + +#: forum/urls.py:88 +msgid "feedback/" +msgstr "feedback/" + +#: forum/urls.py:89 forum/urls.py:90 +msgid "account/" +msgstr "zugang/" + +#: forum/importers/stackexchange/management/commands/load_stackexchange.py:124 +msgid "Congratulations, you are now an Administrator" +msgstr "Gratulation, Sie sind jetzt Administrator" + +#: forum/management/commands/send_email_alerts.py:236 +msgid "email update message subject" +msgstr "Aktuelle Mitteilung" + +#: forum/management/commands/send_email_alerts.py:238 +#, fuzzy, python-format +msgid "%(name)s, this is an update message header for %(num)d question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "

Hallo %(name)s,

Es gibt neues zu einer Frage:

" +msgstr[1] "

Hallo %(name)s,

Es gibt neues zu %(num)d Fragen:

" + +#: forum/management/commands/send_email_alerts.py:255 +msgid "new question" +msgstr "Neue Frage" + +#: forum/management/commands/send_email_alerts.py:272 +msgid "" +"Please visit the forum and see what's new! Could you spread the word about " +"it - can somebody you know help answering those questions or benefit from " +"posting one?" +msgstr "" +"Schauen Sie rein und entdecken Sie neue Fragen und Antworten. Empfehlen Sie " +"uns gern auch an Freunde und Bekannte weiter!" + +#: forum/management/commands/send_email_alerts.py:284 +msgid "" +"Your most frequent subscription setting is 'daily' on selected questions. If " +"you are receiving more than one email per dayplease tell about this issue to " +"the forum administrator." +msgstr "" +"Die Einstellung, mit der Sie am häufigsten benachrichtigt werden, ist " +"\"täglich\". Sollten Sie mehr als eine E-Mail pro Tag bekommen, " +"benachrichtigen Sie uns bitte." + +#: forum/management/commands/send_email_alerts.py:290 +msgid "" +"Your most frequent subscription setting is 'weekly' if you are receiving " +"this email more than once a week please report this issue to the forum " +"administrator." +msgstr "" +"Die Einstellung, mit der Sie am häufigsten benachrichtigt werden, ist " +"\"wöchentlich\". Sollten Sie mehr als eine E-Mail pro Woche bekommen, " +"benachrichtigen Sie uns bitte." + +#: forum/management/commands/send_email_alerts.py:296 +msgid "" +"There is a chance that you may be receiving links seen before - due to a " +"technicality that will eventually go away. " +msgstr "" +"Aus technischen Gründen kann es manchmal vorkommen, daß Sie Links empfangen, " +"die Sie bereits gesehen haben. " + +#: forum/management/commands/send_email_alerts.py:311 +#, python-format +msgid "" +"go to %(link)s to change frequency of email updates or %(email)s " +"administrator" +msgstr "" +"

Sie können die Häufigkeit, mit der Sie Benachrichtigungen erhalten, " +"jederzeit hier einstellen oder sie gänzlich " +"abschalten.
Falls Sie diese Nachricht irrtümlich erhalten haben, " +"informieren Sie uns bitte unter %(email)s.

" + +#: forum/middleware/anon_user.py:34 +#, python-format +msgid "First time here? Check out the FAQ!" +msgstr "Zum ersten Mal hier? Häufige Fragen lesen!" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Disciplined" +msgstr "Diszipliniert" + +#: forum/migrations/0005_install_badges.py:10 +msgid "disciplined" +msgstr "diszipliniert" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Deleted own post with score of 3 or higher" +msgstr "Eigenen Beitrag mit 3 oder mehr positiven Bewertungen gelöscht" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Peer Pressure" +msgstr "Gruppenzwang" + +#: forum/migrations/0005_install_badges.py:11 +msgid "peer-pressure" +msgstr "gruppenzwang" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Deleted own post with score of -3 or lower" +msgstr "Eigenen Beitrag mit mehr als 3 negativen Bewertungen gelöscht" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Nice answer" +msgstr "Nette Antwort" + +#: forum/migrations/0005_install_badges.py:12 +msgid "nice-answer" +msgstr "nette-antwort/" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Answer voted up 10 times" +msgstr "Benutzer hat positive Bewertungen abgegeben" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Nice Question" +msgstr "Fragen" + +#: forum/migrations/0005_install_badges.py:13 +msgid "nice-question" +msgstr "nette-frage/" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Question voted up 10 times" +msgstr "Benutzer hat positive Bewertungen abgegeben" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Pundit" +msgstr "Experte" + +#: forum/migrations/0005_install_badges.py:14 +msgid "pundit" +msgstr "experte" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Left 10 comments with score of 10 or more" +msgstr "Hat 10 Kommentare mit einer Bewertung von 10 oder mehr hinterlassen" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Popular Question" +msgstr "populäre Frage" + +#: forum/migrations/0005_install_badges.py:15 +msgid "popular-question" +msgstr "populaere-frage" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Asked a question with 1,000 views" +msgstr "Hat Frage mit mindestens 1.000 Einblendungen gestellt" + +#: forum/migrations/0005_install_badges.py:16 +msgid "Citizen patrol" +msgstr "Engagierter Bürger" + +#: forum/migrations/0005_install_badges.py:16 +msgid "citizen-patrol" +msgstr "engagierter-buerger" + +#: forum/migrations/0005_install_badges.py:16 +msgid "First flagged post" +msgstr "Erster gemeldeter Beitrag" + +#: forum/migrations/0005_install_badges.py:17 +msgid "Cleanup" +msgstr "Putzaktion" + +#: forum/migrations/0005_install_badges.py:17 +msgid "cleanup" +msgstr "putzaktion" + +#: forum/migrations/0005_install_badges.py:17 +msgid "First rollback" +msgstr "Erster Rollback (Rückkehr zur Vorversion eines Beitrags)" + +#: forum/migrations/0005_install_badges.py:18 +msgid "Critic" +msgstr "Kritiker" + +#: forum/migrations/0005_install_badges.py:18 +msgid "critic" +msgstr "kritiker" + +#: forum/migrations/0005_install_badges.py:18 +msgid "First down vote" +msgstr "Erste negative Bewertung" + +#: forum/migrations/0005_install_badges.py:19 +msgid "Editor" +msgstr "Redakteur" + +#: forum/migrations/0005_install_badges.py:19 +msgid "editor" +msgstr "redakteur" + +#: forum/migrations/0005_install_badges.py:19 +msgid "First edit" +msgstr "Erste Bearbeitung eines Beitrags" + +#: forum/migrations/0005_install_badges.py:20 +msgid "Organizer" +msgstr "Organisierer" + +#: forum/migrations/0005_install_badges.py:20 +msgid "organizer" +msgstr "Organisator" + +#: forum/migrations/0005_install_badges.py:20 +msgid "First retag" +msgstr "Erste Tag-Bearbeitung" + +#: forum/migrations/0005_install_badges.py:21 +msgid "Scholar" +msgstr "Lernender" + +#: forum/migrations/0005_install_badges.py:21 +msgid "scholar" +msgstr "lernender" + +#: forum/migrations/0005_install_badges.py:21 +msgid "First accepted answer on your own question" +msgstr "Erste Antwort auf eine eigene Frage akzeptiert" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Student" +msgstr "Schüler" + +#: forum/migrations/0005_install_badges.py:22 +msgid "student" +msgstr "schueler" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Asked first question with at least one up vote" +msgstr "Hat erste Frage mit mindestens einer positiven Bewertung gestellt" + +#: forum/migrations/0005_install_badges.py:23 +msgid "Supporter" +msgstr "Unterstützer" + +#: forum/migrations/0005_install_badges.py:23 +msgid "supporter" +msgstr "unterstuetzer" + +#: forum/migrations/0005_install_badges.py:23 +msgid "First up vote" +msgstr "Erste positive Bewertung" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Teacher" +msgstr "Lehrer" + +#: forum/migrations/0005_install_badges.py:24 +msgid "teacher" +msgstr "Suche" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Answered first question with at least one up vote" +msgstr "Hat erste Frage mit mindestens einer positiven Bewertung beantwortet" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Autobiographer" +msgstr "Autobiograph" + +#: forum/migrations/0005_install_badges.py:25 +msgid "autobiographer" +msgstr "autobiograph" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Completed all user profile fields" +msgstr "Benutzerprofil komplettiert" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Self-Learner" +msgstr "Eigenständig lernender" + +#: forum/migrations/0005_install_badges.py:26 +msgid "self-learner" +msgstr "eigenstaendig-lernender" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Answered your own question with at least 3 up votes" +msgstr "" +"Eigene Frage beantwortet und mindestens 3 positive Bewertungen dafür erhalten" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Great Answer" +msgstr "Sehr gute Antwort" + +#: forum/migrations/0005_install_badges.py:27 +msgid "great-answer" +msgstr "sehr-gute-antwort" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Answer voted up 100 times" +msgstr "Antwort wurde 100 Mal positiv bewertet" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Great Question" +msgstr "Sehr gute Frage" + +#: forum/migrations/0005_install_badges.py:28 +msgid "great-question" +msgstr "sehr-gute-frage" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Question voted up 100 times" +msgstr "Frage wurde 100 Mal positiv bewertet" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Stellar Question" +msgstr "Exzellente Frage" + +#: forum/migrations/0005_install_badges.py:29 +msgid "stellar-question" +msgstr "exzellente-frage" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Question favorited by 100 users" +msgstr "Frage von 100 Benutzern in Favoritenliste aufgenommen" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Famous question" +msgstr "Berühmte Frage" + +#: forum/migrations/0005_install_badges.py:30 +msgid "famous-question" +msgstr "beruehmte-frage" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Asked a question with 10,000 views" +msgstr "Hat Frage mit 10.000 Einblendungen gestellt" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Alpha" +msgstr "Alpha" + +#: forum/migrations/0005_install_badges.py:31 +msgid "alpha" +msgstr "alpha" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Actively participated in the private alpha" +msgstr "Hat aktiv an der privaten Alphaphase des Forums teilgenommen" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Good Answer" +msgstr "Gute Antwort" + +#: forum/migrations/0005_install_badges.py:32 +msgid "good-answer" +msgstr "gute-antwort" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Answer voted up 25 times" +msgstr "Antwort wurde 25 Mal positiv bewertet" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Good Question" +msgstr "Gute Frage" + +#: forum/migrations/0005_install_badges.py:33 +msgid "good-question" +msgstr "gute-frage" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Question voted up 25 times" +msgstr "Frage wurde 25 Mal positiv bewertet" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Favorite Question" +msgstr "Favoritenfrage" + +#: forum/migrations/0005_install_badges.py:34 +msgid "favorite-question" +msgstr "favoriten-frage" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Question favorited by 25 users" +msgstr "Frage von 25 Benutzern in Favoritenliste aufgenommen" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Civic duty" +msgstr "Bürgerpflicht" + +#: forum/migrations/0005_install_badges.py:35 +msgid "civic-duty" +msgstr "buergerpflicht" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Voted 300 times" +msgstr "300 Mal abgestimmt" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Strunk & White" +msgstr "Form und Grammatik" + +#: forum/migrations/0005_install_badges.py:36 +msgid "strunk-and-white" +msgstr "form-und-grammatik" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Edited 100 entries" +msgstr "100 Beiträge überarbeitet" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Generalist" +msgstr "Generalist" + +#: forum/migrations/0005_install_badges.py:37 +msgid "generalist" +msgstr "generalist" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Active in many different tags" +msgstr "In vielen verschiedenen Tags aktiv" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Expert" +msgstr "Experte" + +#: forum/migrations/0005_install_badges.py:38 +msgid "expert" +msgstr "Experte" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Very active in one tag" +msgstr "Sehr aktiv in einem bestimmten Tag" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Yearling" +msgstr "Jahresring" + +#: forum/migrations/0005_install_badges.py:39 +msgid "yearling" +msgstr "jahresring" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Active member for a year" +msgstr "Aktives Mitglied für ein Jahr" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Notable Question" +msgstr "Bemerkenswerte Frage" + +#: forum/migrations/0005_install_badges.py:40 +msgid "notable-question" +msgstr "bemerkenswerte-frage" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Asked a question with 2,500 views" +msgstr "Hat eine Frage mit 2.500 Einblendungen gestellt" + +#: forum/migrations/0005_install_badges.py:41 +msgid "Enlightened" +msgstr "Hat Ahnung" + +#: forum/migrations/0005_install_badges.py:41 +msgid "enlightened" +msgstr "hat-ahnung" + +#: forum/migrations/0005_install_badges.py:41 +msgid "First answer was accepted with at least 10 up votes" +msgstr "" +"Erste Antwort verfaßt, diese wurde akzeptiert und mindestens 10 Mal positiv " +"bewertet" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Beta" +msgstr "Beta" + +#: forum/migrations/0005_install_badges.py:42 +msgid "beta" +msgstr "beta" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Actively participated in the private beta" +msgstr "Hat aktiv in der nichtöffentlichen Beta-Phase des Forums teilgenommen" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Guru" +msgstr "Guru" + +#: forum/migrations/0005_install_badges.py:43 +msgid "guru" +msgstr "guru" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Accepted answer and voted up 40 times" +msgstr "Antwort akzeptiert und 40 Mal positiv bewertet" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Necromancer" +msgstr "Totenbeschwörer" + +#: forum/migrations/0005_install_badges.py:44 +msgid "necromancer" +msgstr "totenbeschwoerer" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Answered a question more than 60 days later with at least 5 votes" +msgstr "" +"Hat eine Frage mehr als 2 Monate später beantwortet und mindestens 5 " +"positive Bewertungen dafür erhalten" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Taxonomist" +msgstr "Tag-Schöpfer" + +#: forum/migrations/0005_install_badges.py:45 +msgid "taxonomist" +msgstr "tag-schoepfer" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Created a tag used by 50 questions" +msgstr "Tag formuliert, das in 50 Fragen verwendet wurde" + +#: forum/models/question.py:499 +#, python-format +msgid "%(author)s modified the question" +msgstr "%(author)s hat die Frage bearbeitet" + +#: forum/models/question.py:503 +#, python-format +msgid "%(people)s posted %(new_answer_count)s new answers" +msgstr "%(people)s Benutzer haben %(new_answer_count)s neue Antworten verfaßt" + +#: forum/models/question.py:508 +#, python-format +msgid "%(people)s commented the question" +msgstr "%(people)s Benutzer haben die Frage kommentiert" + +#: forum/models/question.py:513 +#, python-format +msgid "%(people)s commented answers" +msgstr "%(people)s Benutzer haben Kommentare zu Antworten verfaßt" + +#: forum/models/question.py:515 +#, python-format +msgid "%(people)s commented an answer" +msgstr "%(people)s Benutzer haben Kommentare zu einer Antwort verfaßt" + +#: forum/models/repute.py:13 forum/skins/default/templates/badges.html:54 +msgid "gold" +msgstr "Gold" + +#: forum/models/repute.py:14 forum/skins/default/templates/badges.html:62 +msgid "silver" +msgstr "Silber" + +#: forum/models/repute.py:15 forum/skins/default/templates/badges.html:69 +msgid "bronze" +msgstr "Bronze" + +#: forum/models/tag.py:81 +msgid "interesting" +msgstr "Interessant" + +#: forum/models/tag.py:81 +msgid "ignored" +msgstr "Ignorieren" + +#: forum/models/user.py:36 +msgid "Entire forum" +msgstr "Gesamtes Forum" + +#: forum/models/user.py:37 +msgid "Questions that I asked" +msgstr "Fragen, die ich gestellt habe" + +#: forum/models/user.py:38 +msgid "Questions that I answered" +msgstr "Fragen, die ich beantwortet habe" + +#: forum/models/user.py:39 +msgid "Individually selected questions" +msgstr "Individuell ausgewählte Fragen" + +#: forum/models/user.py:42 +msgid "Weekly" +msgstr "Wöchentlich" + +#: forum/models/user.py:43 +msgid "Daily" +msgstr "Täglich" + +#: forum/models/user.py:44 +msgid "No email" +msgstr "Keine E-Mail" + +#: forum/skins/default/templates/404.html:24 +msgid "Sorry, could not find the page you requested." +msgstr "Die angeforderte Seite konnte nicht gefunden werden." + +#: forum/skins/default/templates/404.html:26 +msgid "This might have happened for the following reasons:" +msgstr "Dies könnte einen der folgenden Gründe haben:" + +#: forum/skins/default/templates/404.html:28 +msgid "this question or answer has been deleted;" +msgstr "Diese Frage oder Antwort wurde gelöscht;" + +#: forum/skins/default/templates/404.html:29 +msgid "url has error - please check it;" +msgstr "Die eingegebene Adresse ist fehlerhaft - bitte überprüfen;" + +#: forum/skins/default/templates/404.html:30 +msgid "" +"the page you tried to visit is protected or you don't have sufficient " +"points, see" +msgstr "" +"Die angeforderte Seite ist geschützt oder Sie haben nicht genug Punkte, um " +"sie anzuschauen, siehe" + +#: forum/skins/default/templates/404.html:31 +msgid "if you believe this error 404 should not have occured, please" +msgstr "Falls dieser Fehler nicht hätte passieren sollen, " + +#: forum/skins/default/templates/404.html:32 +msgid "report this problem" +msgstr "melden Sie uns das Problem bitte." + +#: forum/skins/default/templates/404.html:41 +#: forum/skins/default/templates/500.html:27 +msgid "back to previous page" +msgstr "Zurück zur vorigen Seite" + +#: forum/skins/default/templates/404.html:42 +#: forum/skins/default/templates/questions.html:52 +msgid "see all questions" +msgstr "Alle Fragen zeigen" + +#: forum/skins/default/templates/404.html:43 +msgid "see all tags" +msgstr "Alle Tags zeigen" + +#: forum/skins/default/templates/500.html:22 +msgid "sorry, system error" +msgstr "Interner Fehler" + +#: forum/skins/default/templates/500.html:24 +msgid "system error log is recorded, error will be fixed as soon as possible" +msgstr "" +"Der Fehler wurde aufgezeichnet, und wir werden ihn so bald wie möglich " +"beheben." + +#: forum/skins/default/templates/500.html:25 +msgid "please report the error to the site administrators if you wish" +msgstr "Bitte melden Sie uns den Fehler, falls Sie möchten." + +#: forum/skins/default/templates/500.html:28 +msgid "see latest questions" +msgstr "Zeige neueste Fragen" + +#: forum/skins/default/templates/500.html:29 +msgid "see tags" +msgstr "Zeige Tags" + +#: forum/skins/default/templates/about.html:6 +#: forum/skins/default/templates/about.html:11 +msgid "About" +msgstr "Über" + +#: forum/skins/default/templates/account_settings.html:4 +#: forum/skins/default/templates/authopenid/settings.html:4 +msgid "Account functions" +msgstr "Zugangsverwaltung" + +#: forum/skins/default/templates/account_settings.html:29 +#: forum/skins/default/templates/authopenid/changepw.html:5 +#: forum/skins/default/templates/authopenid/changepw.html:14 +#: forum/skins/default/templates/authopenid/settings.html:29 +msgid "Change password" +msgstr "Passwort ändern" + +#: forum/skins/default/templates/account_settings.html:30 +#: forum/skins/default/templates/authopenid/settings.html:30 +msgid "Give your account a new password." +msgstr "Legen Sie ein neues Passwort für Ihren Zugang fest." + +#: forum/skins/default/templates/account_settings.html:32 +#: forum/skins/default/templates/authopenid/settings.html:31 +msgid "Change email " +msgstr "E-Mail verändern" + +#: forum/skins/default/templates/account_settings.html:33 +#: forum/skins/default/templates/authopenid/settings.html:32 +msgid "Add or update the email address associated with your account." +msgstr "Neue E-Mail-Adresse zu Konto hinzufügen oder bestehende ändern" + +#: forum/skins/default/templates/account_settings.html:35 +#: forum/skins/default/templates/authopenid/changeopenid.html:4 +#: forum/skins/default/templates/authopenid/changeopenid.html:30 +#: forum/skins/default/templates/authopenid/settings.html:34 +msgid "Change OpenID" +msgstr "OpenID ändern" + +#: forum/skins/default/templates/account_settings.html:36 +#: forum/skins/default/templates/authopenid/settings.html:35 +msgid "Change openid associated to your account" +msgstr "Mit Ihrem Zugang verknüpfte OpenID ändern" + +#: forum/skins/default/templates/account_settings.html:39 +#: forum/skins/default/templates/authopenid/delete.html:4 +#: forum/skins/default/templates/authopenid/settings.html:38 +msgid "Delete account" +msgstr "Zugang löschen" + +#: forum/skins/default/templates/account_settings.html:40 +#: forum/skins/default/templates/authopenid/settings.html:39 +msgid "Erase your username and all your data from website" +msgstr "Ihren Benutzernamen und alle Ihre Daten von der Seite löschen" + +#: forum/skins/default/templates/answer_edit.html:5 +#: forum/skins/default/templates/answer_edit.html:48 +msgid "Edit answer" +msgstr "Antwort bearbeiten" + +#: forum/skins/default/templates/answer_edit.html:25 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:26 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:46 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:25 +#: forum/skins/default/templates/question_edit.html:28 +msgid "hide preview" +msgstr "Vorschau ausblenden" + +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:28 +msgid "show preview" +msgstr "Vorschau einblenden" + +#: forum/skins/default/templates/answer_edit.html:48 +#: forum/skins/default/templates/question_edit.html:66 +#: forum/skins/default/templates/question_retag.html:53 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "back" +msgstr "Zurück" + +#: forum/skins/default/templates/answer_edit.html:53 +#: forum/skins/default/templates/question_edit.html:71 +#: forum/skins/default/templates/revisions_answer.html:52 +#: forum/skins/default/templates/revisions_question.html:52 +msgid "revision" +msgstr "Version" + +#: forum/skins/default/templates/answer_edit.html:56 +#: forum/skins/default/templates/question_edit.html:75 +msgid "select revision" +msgstr "Version auswählen" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:418 +#: forum/skins/default/templates/question_edit.html:92 +msgid "Toggle the real time Markdown editor preview" +msgstr "Die Markdown-Echtzeit-Vorschau ein- oder ausblenden" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:419 +#: forum/skins/default/templates/question_edit.html:92 +msgid "toggle preview" +msgstr "Vorschau ein- oder ausblenden" + +#: forum/skins/default/templates/answer_edit.html:72 +#: forum/skins/default/templates/question_edit.html:118 +#: forum/skins/default/templates/question_retag.html:74 +msgid "Save edit" +msgstr "Überarbeitung speichern" + +#: forum/skins/default/templates/answer_edit.html:73 +#: forum/skins/default/templates/close.html:29 +#: forum/skins/default/templates/feedback.html:50 +#: forum/skins/default/templates/question_edit.html:119 +#: forum/skins/default/templates/question_retag.html:75 +#: forum/skins/default/templates/reopen.html:30 +#: forum/skins/default/templates/user_edit.html:90 +#: forum/skins/default/templates/authopenid/changeemail.html:40 +msgid "Cancel" +msgstr "Abbrechen" + +#: forum/skins/default/templates/answer_edit_tips.html:4 +msgid "answer tips" +msgstr "Tipps" + +#: forum/skins/default/templates/answer_edit_tips.html:7 +msgid "please make your answer relevant to this community" +msgstr "" +"Bitte formulieren Sie Ihre Frage so, daß sie für dieses Forum relevant ist." + +#: forum/skins/default/templates/answer_edit_tips.html:10 +msgid "try to give an answer, rather than engage into a discussion" +msgstr "" +"Bitte versuchen Sie, eine konkrete Antwort zu geben, und nicht in eine " +"Diskussion einzusteigen." + +#: forum/skins/default/templates/answer_edit_tips.html:13 +msgid "please try to provide details" +msgstr "Bitte versuchen Sie, Details einzubringen." + +#: forum/skins/default/templates/answer_edit_tips.html:16 +#: forum/skins/default/templates/question_edit_tips.html:13 +msgid "be clear and concise" +msgstr "Seien Sie klar und deutlich." + +#: forum/skins/default/templates/answer_edit_tips.html:20 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "see frequently asked questions" +msgstr "Siehe die häufig gestellten Fragen" + +#: forum/skins/default/templates/answer_edit_tips.html:26 +#: forum/skins/default/templates/question_edit_tips.html:23 +msgid "Markdown tips" +msgstr "Tipps zu Markdown" + +#: forum/skins/default/templates/answer_edit_tips.html:29 +#: forum/skins/default/templates/question_edit_tips.html:26 +msgid "*italic* or __italic__" +msgstr "*kursiv* oder __kursiv__" + +#: forum/skins/default/templates/answer_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:29 +msgid "**bold** or __bold__" +msgstr "**fett** oder __fett__" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/question_edit_tips.html:32 +msgid "link" +msgstr "Link" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "text" +msgstr "Text" + +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "image" +msgstr "Bild" + +#: forum/skins/default/templates/answer_edit_tips.html:43 +#: forum/skins/default/templates/question_edit_tips.html:41 +msgid "numbered list:" +msgstr "Nummerierte Liste:" + +#: forum/skins/default/templates/answer_edit_tips.html:48 +#: forum/skins/default/templates/question_edit_tips.html:46 +msgid "basic HTML tags are also supported" +msgstr "Grundlegende HTML-Tags werden ebenfalls unterstützt." + +#: forum/skins/default/templates/answer_edit_tips.html:52 +#: forum/skins/default/templates/question_edit_tips.html:50 +msgid "learn more about Markdown" +msgstr "Mehr Informationen über Markdown" + +#: forum/skins/default/templates/ask.html:5 +#: forum/skins/default/templates/ask.html:62 +msgid "Ask a question" +msgstr "Frage stellen" + +#: forum/skins/default/templates/ask.html:69 +#: forum/skins/default/templates/ask_form.html:11 +msgid "login to post question info" +msgstr "" +"Sie können Ihre Frage formulieren, ohne sich " +"vorher anmelden zu müssen. Wenn Sie Ihre Frage speichern, werden Sie " +"zum Anmeldeformular weitergeleitet. Einen neuen Zugang zu erstellen geht " +"ganz schnell. Ihre Frage wird für die Dauer des Anmeldevorgangs im " +"Hintergrund gespeichert und geht nicht verloren." + +#: forum/skins/default/templates/ask.html:75 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Ihre E-Mail-Adresse %(email)s wurde noch nicht " +"bestätigt. Um Beiträge veröffentlichen zu können, müssen Sie Ihre E-" +"Mail-Adresse bestätigen. Mehr infos " +"hier.
Sie können Ihren Beitrag speichern und die Bestätigung danach " +"durchführen - Ihr Beitrag wird bis dahin gespeichert." + +#: forum/skins/default/templates/ask.html:113 +#: forum/skins/default/templates/ask_form.html:54 +msgid "(required)" +msgstr "(Pflichtfeld)" + +#: forum/skins/default/templates/ask.html:120 +#: forum/skins/default/templates/ask_form.html:61 +msgid "Login/signup to post your question" +msgstr "Bitte einloggen, um Frage zu veröffentlichen" + +#: forum/skins/default/templates/ask.html:122 +#: forum/skins/default/templates/ask_form.html:63 +msgid "Ask your question" +msgstr "Stellen Sie Ihre Frage" + +#: forum/skins/default/templates/ask_form.html:15 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Ihre E-Mail-Adresse %(email)s wurde noch nicht " +"bestätigt. Um Beiträge veröffentlichen zu können, müssen Sie Ihre E-" +"Mail-Adresse bestätigen. Mehr infos " +"hier.
Sie können Ihren Beitrag speichern und die Bestätigung danach " +"durchführen - Ihr Beitrag wird bis dahin gespeichert." + +#: forum/skins/default/templates/badge.html:6 +#: forum/skins/default/templates/badge.html:17 +msgid "Badge" +msgstr "Auszeichnung" + +#: forum/skins/default/templates/badge.html:26 +msgid "user received this badge:" +msgid_plural "users received this badge:" +msgstr[0] "Benutzer hat dieses Abzeichen:" +msgstr[1] "Benutzer haben dieses Abzeichen:" + +#: forum/skins/default/templates/badges.html:6 +msgid "Badges summary" +msgstr "Zusammenfassung Auszeichnungen" + +#: forum/skins/default/templates/badges.html:17 +msgid "Badges" +msgstr "Auszeichnungen" + +#: forum/skins/default/templates/badges.html:21 +msgid "Community gives you awards for your questions, answers and votes." +msgstr "" +"Rege Teilnahme mit qualitativ hochwertigen Fragen und Antworten führt zum " +"Erhalt von Auszeichnungen." + +#: forum/skins/default/templates/badges.html:22 +#, python-format +msgid "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +" " +msgstr "" +"Es gibt im Moment drei Stufen von Auszeichnungen: Gild, " +"Silber und Bronze.\n" +"\n" +"Falls Sie Ideen für neue Auszeichnungen haben, senden Sie uns diese über die " +"Feedback-Seite." + +#: forum/skins/default/templates/badges.html:51 +msgid "Community badges" +msgstr "Auszeichnungs-Stufen" + +#: forum/skins/default/templates/badges.html:57 +msgid "gold badge description" +msgstr "" +"Goldene Auszeichnungen erreicht man mit regelmäßiger, überdurchschnittlicher " +"Beteiligung." + +#: forum/skins/default/templates/badges.html:65 +msgid "silver badge description" +msgstr "" +"Silberne Auszeichnungen erzielt man durch regelmäßige, geduldige Teilnahme " +"am Forum." + +#: forum/skins/default/templates/badges.html:68 +msgid "bronze badge: often given as a special honor" +msgstr "" +"Bronzene Auszeichnungen sind die einfachste Auszeichnungsstufe. Man erhält " +"einige von ihnen durch einigermaßen aktive Teilnahme. Sie werden oft als " +"Ehrenauszeichnung verliehen." + +#: forum/skins/default/templates/badges.html:72 +msgid "bronze badge description" +msgstr "Aktive Forumsteilnehmer werden in Bronze ausgezeichnet." + +#: forum/skins/default/templates/book.html:7 +msgid "reading channel" +msgstr "Lese-Kanal" + +#: forum/skins/default/templates/book.html:26 +msgid "[author]" +msgstr "[Autor]" + +#: forum/skins/default/templates/book.html:30 +msgid "[publisher]" +msgstr "[Verlag]" + +#: forum/skins/default/templates/book.html:34 +msgid "[publication date]" +msgstr "[Veröffentlichungsdatum]" + +#: forum/skins/default/templates/book.html:38 +msgid "[price]" +msgstr "[Preis]" + +#: forum/skins/default/templates/book.html:39 +msgid "currency unit" +msgstr "Wähjrung" + +#: forum/skins/default/templates/book.html:42 +msgid "[pages]" +msgstr "[Seiten]" + +#: forum/skins/default/templates/book.html:43 +msgid "pages abbreviation" +msgstr "Seitenabkürzung" + +#: forum/skins/default/templates/book.html:46 +msgid "[tags]" +msgstr "[Tags]" + +#: forum/skins/default/templates/book.html:56 +msgid "author blog" +msgstr "Autoren-Blog" + +#: forum/skins/default/templates/book.html:62 +msgid "book directory" +msgstr "Buchverzeichnis" + +#: forum/skins/default/templates/book.html:66 +msgid "buy online" +msgstr "Online kaufen" + +#: forum/skins/default/templates/book.html:79 +msgid "reader questions" +msgstr "Leserfragen" + +#: forum/skins/default/templates/book.html:82 +msgid "ask the author" +msgstr "Fragen Sie den Autor" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:18 +msgid "this question was selected as favorite" +msgstr "Die Frage wurde als Favorit ausgewählt" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:18 +msgid "number of times" +msgstr "Mal" + +#: forum/skins/default/templates/book.html:105 +#: forum/skins/default/templates/question_summary_list_roll.html:14 +msgid "votes" +msgstr "Stimmen" + +#: forum/skins/default/templates/book.html:108 +msgid "the answer has been accepted to be correct" +msgstr "The Antwort ist als korrekt akzeptiert worden" + +#: forum/skins/default/templates/book.html:115 +#: forum/skins/default/templates/question_summary_list_roll.html:15 +msgid "views" +msgstr "Einblendungen" + +#: forum/skins/default/templates/book.html:125 +#: forum/skins/default/templates/question.html:136 +#: forum/skins/default/templates/question_list.html:19 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/tags.html:50 +#: forum/skins/default/templates/users_questions.html:34 +#, python-format +msgid "see questions tagged '%(tag)s'" +msgstr "Fragen mit Tag '%(tag)s' anzeigen" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to book RSS feed" +msgstr "Buch-RSS-Feed abonnieren" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to the questions feed" +msgstr "Fragen-RSS-Feed abonnieren" + +#: forum/skins/default/templates/close.html:6 +#: forum/skins/default/templates/close.html:16 +msgid "Close question" +msgstr "Frage schließen" + +#: forum/skins/default/templates/close.html:19 +msgid "Close the question" +msgstr "Die Frage schließen" + +#: forum/skins/default/templates/close.html:25 +msgid "Reasons" +msgstr "Gründe" + +#: forum/skins/default/templates/close.html:28 +msgid "OK to close" +msgstr "OK zu schließen" + +#: forum/skins/default/templates/email_base.html:11 +msgid "home" +msgstr "Home" + +#: forum/skins/default/templates/faq.html:11 +msgid "Frequently Asked Questions " +msgstr "Häufig gestellte Fragen" + +#: forum/skins/default/templates/faq.html:16 +msgid "What kinds of questions can I ask here?" +msgstr "Was für Fragen kann ich hier stellen?" + +#: forum/skins/default/templates/faq.html:17 +msgid "" +"Most importanly - questions should be relevant to this " +"community." +msgstr "" +"Das allerwichtigste - Fragen sollten für dieses Forum relevant und themenbezogen sein." + +#: forum/skins/default/templates/faq.html:18 +msgid "" +"Before asking the question - please make sure to use search to see whether " +"your question has alredy been answered." +msgstr "" +"Bevor Sie fragen: Bitte benutzen Sie die Suchfunktion, um sicherzustellen, " +"daß die Frage nicht bereits gestellt wurde." + +#: forum/skins/default/templates/faq.html:21 +msgid "What questions should I avoid asking?" +msgstr "Was für Fragen sollten nicht gestellt werden?" + +#: forum/skins/default/templates/faq.html:22 +msgid "" +"Please avoid asking questions that are not relevant to this community, too " +"subjective and argumentative." +msgstr "" +"Bitte verzichten Sie auf Fragen, die für dieses Forum nicht relevant sind, " +"oder die zu subjektiv sind und zu Diskussionen verleiten." + +#: forum/skins/default/templates/faq.html:27 +msgid "What should I avoid in my answers?" +msgstr "Was sollte ich in meinen Antworten vermeiden?" + +#: forum/skins/default/templates/faq.html:28 +msgid "" +"is a Q&A site, not a discussion group. Therefore - please avoid having " +"discussions in your answers, comment facility allows some space for brief " +"discussions." +msgstr "" +"Wir sind ein Forum zum Stellen und Beantworten von Fragen - kein " +"Diskussionsforum. Bitte verzichten Sie in Ihren Antworten auf " +"Diskussionen. Kurze Gespräche, Kritik und Klärungen sind über die " +"Kommentarfunktion möglich. " + +#: forum/skins/default/templates/faq.html:32 +msgid "Who moderates this community?" +msgstr "Wer moderiert diese Forum?" + +#: forum/skins/default/templates/faq.html:33 +msgid "The short answer is: you." +msgstr "Die Antwort ist: Sie!" + +#: forum/skins/default/templates/faq.html:34 +msgid "This website is moderated by the users." +msgstr "Dieses Forum wird von seinen Benutzern moderiert." + +#: forum/skins/default/templates/faq.html:35 +msgid "" +"The reputation system allows users earn the authorization to perform a " +"variety of moderation tasks." +msgstr "" +"Je höher der Punktestand eines Benutzers, desto mehr Funktionen stehen ihm " +"zur Verfügung, z.B. das Bearbeiten und später auch Löschen anderer Beiträge." + +#: forum/skins/default/templates/faq.html:40 +msgid "How does reputation system work?" +msgstr "Wie funktioniert das Punktesystem?" + +#: forum/skins/default/templates/faq.html:41 +msgid "Rep system summary" +msgstr "" +"Wenn eine Frage oder Antwort positiv bewertet wird, erhält der Autor Punkte. " +"Diese Punkte sind ein ungefähres Abbild von dem Grad, in dem dem Benutzer " +"von der Gemeinschaft vertraut wird. Mit wachsendem Punktestand werden immer " +"mehr Möglichkeiten freigeschaltet." + +#: forum/skins/default/templates/faq.html:42 +msgid "" +"For example, if you ask an interesting question or give a helpful answer, " +"your input will be upvoted. On the other hand if the answer is misleading - " +"it will be downvoted. Each vote in favor will generate 10 " +"points, each vote against will subtract 2 points. There is " +"a limit of 200 points that can be accumulated per question " +"or answer. The table below explains reputation point requirements for each " +"type of moderation task." +msgstr "" +"Wenn Sie zum Beispiel eine interessante Frage stellen oder eine hilfreiche " +"Antwort geben, wird Ihr Beitrag von anderen Benutzern positiv bewertet. Wenn " +"die Frage schlecht gestellt oder eine Antwort falsch ist, kann er auch " +"negativ bewertet werden. Eine positive Bewertung bringt 10 " +"Punkte, eine negative zieht 2 Punkte ab. \n" +"\n" +"Für jede gestellte Frage oder verfaßte Antwort können maximal 200 Punkte " +"erzielt werden." + +#: forum/skins/default/templates/faq.html:53 +#: forum/skins/default/templates/user_votes.html:15 +msgid "upvote" +msgstr "Positiv bewerten" + +#: forum/skins/default/templates/faq.html:57 +msgid "use tags" +msgstr "Tags benutzen" + +#: forum/skins/default/templates/faq.html:62 +msgid "add comments" +msgstr "Kommentare hinzufügen" + +#: forum/skins/default/templates/faq.html:66 +#: forum/skins/default/templates/user_votes.html:17 +msgid "downvote" +msgstr "Negativ bewerten" + +#: forum/skins/default/templates/faq.html:69 +msgid "open and close own questions" +msgstr "Eigene Fragen öffnen und schließen" + +#: forum/skins/default/templates/faq.html:73 +msgid "retag questions" +msgstr "Vergebene Tags bearbeiten" + +#: forum/skins/default/templates/faq.html:78 +msgid "edit community wiki questions" +msgstr "Als \"Community Wiki\" markierte Fragen beantworten" + +#: forum/skins/default/templates/faq.html:83 +msgid "edit any answer" +msgstr "Beliebige Antworten bearbeiten" + +#: forum/skins/default/templates/faq.html:87 +msgid "open any closed question" +msgstr "Beliebige geschlossene Fragen wieder öffnen" + +#: forum/skins/default/templates/faq.html:91 +msgid "delete any comment" +msgstr "Kommentare löschen" + +#: forum/skins/default/templates/faq.html:95 +msgid "delete any questions and answers and perform other moderation tasks" +msgstr "" +"Beliebige Fragen und Antworten löschen und weitere Moderationsfunktionen" + +#: forum/skins/default/templates/faq.html:103 +msgid "how to validate email title" +msgstr "Wie bestätigt man seine E-Mail-Adresse und warum?" + +#: forum/skins/default/templates/faq.html:105 +#, python-format +msgid "" +"how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" +msgstr "" +"

Wie? Falls Sie soeben eine neue E-Mail-" +"Adresse eingegeben haben oder Ihre bestehende verändert - prüfen Sie " +"Ihr E-Mail-Postfach und klicken Sie auf den in der Bestätigungsmail " +"enthaltenen Link.
Der Link enthält einen Schlüssel, der extra " +"für Sie erzeugt wurde. Sie können auch . " +"Bitte rufen Sie Ihre E-Mails dann erneut ab.

Warum? Mit der E-Mail-Bestätigung wird sichergestellt, daß " +"nur Sie in Ihrem Namen Beiträge verfassen können, und " +"Spam minimiert wird.
Sie können per E-Mail auch " +"Benachrichtigungen für die Fragen abonnieren, die Sie am " +"meisten interessieren. Mit einer E-Mail-Adresse können Sie über den Gravatar-Dienst auch ein " +"persönliches Profilbild einstellen, das neben Ihrem Namen erscheint.

" + +#: forum/skins/default/templates/faq.html:110 +msgid "what is gravatar" +msgstr "Wie verändert man sein Profilbild (Avatar) und was ist Gravatar?" + +#: forum/skins/default/templates/faq.html:111 +msgid "gravatar faq info" +msgstr "" +"

Das Bild, das überall im Forum neben dem Benutzernamen angezeigt wird, " +"heißt Gravatar (\"Globally Recognized Avatar).

So funktioniert es: Ein " +"kryptographischer Schlüssel - ein nicht knackbarer code - " +"wird aus Ihrer E-Mail-Adresse berechnet. Sie laden Ihr gewünschtes " +"Profilbild auf der Website gravatar." +"com hoch.

Alle Foren, Blogs und andere Webseiten, die " +"Gravatar nutzen, können so Ihr Profilbild darstellen, ohne daß Ihre E-Mail-" +"Adresse öffentlich wird.

Um ein Profilbild hochzuladen, " +"registrieren Sie sich auf gravatar.com mit der selben E-Mail-Adresse, die " +"Sie hier bei uns angegeben haben und folgen Sie den dort angegebenen " +"Schritten. Laden Sie kein Profilbild hoch, wird ein neutrales Standard-" +"Symbol angezeigt.

" + +#: forum/skins/default/templates/faq.html:114 +msgid "To register, do I need to create new password?" +msgstr "Muß ich ein neues Passwort anlegen, um mich zu registrieren?" + +#: forum/skins/default/templates/faq.html:115 +msgid "" +"No, you don't have to. You can login through any service that supports " +"OpenID, e.g. Google, Yahoo, AOL, etc." +msgstr "" +"Nein. Sie können sich über jeden Dienst einloggen, der OpenID unterstützt, " +"zum Beispiel Google, Yahoo, AOL usw." + +#: forum/skins/default/templates/faq.html:116 +msgid "Login now!" +msgstr "Jetzt einloggen" + +#: forum/skins/default/templates/faq.html:121 +msgid "Why other people can edit my questions/answers?" +msgstr "Warum können andere Benutzer meine Fragen und Antworten bearbeiten?" + +#: forum/skins/default/templates/faq.html:122 +msgid "Goal of this site is..." +msgstr "Das Ziel dieser Seite ist:" + +#: forum/skins/default/templates/faq.html:122 +msgid "" +"So questions and answers can be edited like wiki pages by experienced users " +"of this site and this improves the overall quality of the knowledge base " +"content." +msgstr "" +"Fragen und Antworten nach dem Wiki-Prinzip für alle bearbeitbar zu machen, " +"sodaß jeder die Qualität der Beiträge verbessern kann." + +#: forum/skins/default/templates/faq.html:123 +msgid "If this approach is not for you, we respect your choice." +msgstr "" +"Falls Ihnen dies nicht gefällt, ist unser Forum vielleicht nicht das " +"richtige für Sie." + +#: forum/skins/default/templates/faq.html:127 +msgid "Still have questions?" +msgstr "Sie haben noch Fragen?" + +#: forum/skins/default/templates/faq.html:128 +#, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "" +"Bitte stellen Sie Ihre Frage und helfen " +"Sie uns, das Forum stetig zu verbessern!" + +#: forum/skins/default/templates/faq.html:130 +#: forum/skins/default/templates/header.html:27 +msgid "questions" +msgstr "Fragen" + +#: forum/skins/default/templates/faq.html:130 +msgid "." +msgstr "." + +#: forum/skins/default/templates/feedback.html:6 +msgid "Feedback" +msgstr "Feedback" + +#: forum/skins/default/templates/feedback.html:11 +msgid "Give us your feedback!" +msgstr "Senden Sie uns Ihr Feedback!" + +#: forum/skins/default/templates/feedback.html:17 +#, python-format +msgid "" +"\n" +" Dear %(user_name)s, we look " +"forward to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" +"\n" +"Hallo %(user_name)s, wir freuen uns darauf, " +"von Ihnen zu hören.\n" +"Bitte geben Sie hier Ihre Nachricht ein." + +#: forum/skins/default/templates/feedback.html:24 +msgid "" +"\n" +" Dear visitor, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" +"\n" +"Hallo, wir freuen uns darauf, von Ihnen zu " +"hören.\n" +"Bitte geben Sie hier Ihre Nachricht ein." + +#: forum/skins/default/templates/feedback.html:41 +msgid "(this field is required)" +msgstr "(Pflichtfeld)" + +#: forum/skins/default/templates/feedback.html:49 +msgid "Send Feedback" +msgstr "Feedback absenden" + +#: forum/skins/default/templates/feedback_email.txt:3 +#, python-format +msgid "" +"\n" +"Hello, this is a %(site_title)s forum feedback message\n" +msgstr "" +"\n" +"Hallo, dies ist Feedback zu %(site_title)s \n" + +#: forum/skins/default/templates/feedback_email.txt:9 +msgid "Sender is" +msgstr "Der Absender ist" + +#: forum/skins/default/templates/feedback_email.txt:11 +#: forum/skins/default/templates/feedback_email.txt:14 +msgid "email" +msgstr "E-Mail" + +#: forum/skins/default/templates/feedback_email.txt:13 +msgid "anonymous" +msgstr "Anonym" + +#: forum/skins/default/templates/feedback_email.txt:19 +msgid "Message body:" +msgstr "Nachrichtentext:" + +#: forum/skins/default/templates/footer.html:8 +#: forum/skins/default/templates/header.html:14 +msgid "about" +msgstr "Über uns" + +#: forum/skins/default/templates/footer.html:9 +#: forum/skins/default/templates/header.html:15 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "faq" +msgstr "Häufige Fragen" + +#: forum/skins/default/templates/footer.html:10 +msgid "privacy policy" +msgstr "Datenschutzrichtlinien" + +#: forum/skins/default/templates/footer.html:19 +msgid "give feedback" +msgstr "Feedback geben" + +#: forum/skins/default/templates/header.html:10 +msgid "logout" +msgstr "Ausloggen" + +#: forum/skins/default/templates/header.html:12 +msgid "login" +msgstr "Einloggen" + +#: forum/skins/default/templates/header.html:22 +msgid "back to home page" +msgstr "Zurück zur Startseite" + +#: forum/skins/default/templates/header.html:29 +msgid "users" +msgstr "Benutzer" + +#: forum/skins/default/templates/header.html:31 +msgid "books" +msgstr "Bücher" + +#: forum/skins/default/templates/header.html:33 +#: forum/templatetags/extra_tags.py:177 forum/templatetags/extra_tags.py:206 +msgid "badges" +msgstr "Auszeichnungen" + +#: forum/skins/default/templates/header.html:34 +#: forum/skins/default/templates/header.html:38 +msgid "ask a question" +msgstr "Frage stellen" + +#: forum/skins/default/templates/header.html:36 +msgid "unanswered questions" +msgstr "Unbeantwortete" + +#: forum/skins/default/templates/input_bar.html:33 +msgid "search" +msgstr "Suche" + +#: forum/skins/default/templates/logout.html:6 +#: forum/skins/default/templates/logout.html:16 +msgid "Logout" +msgstr "Logout" + +#: forum/skins/default/templates/logout.html:19 +msgid "" +"As a registered user you can login with your OpenID, log out of the site or " +"permanently remove your account." +msgstr "" +"Der Klick auf Logout beendet Ihre Sitzung hier im Forum, " +"aber nicht bei Ihrem OpenID-Anbietet.

Vergessen Sie nicht, sich auch " +"bei Ihrem Anbieter auszuloggen, falls Sie sich an diesem Computer komplett " +"ausloggen möchten." + +#: forum/skins/default/templates/logout.html:20 +msgid "Logout now" +msgstr "Jetzt ausloggen" + +#: forum/skins/default/templates/notarobot.html:3 +msgid "Please prove that you are a Human Being" +msgstr "" +"Bitte bestätigen Sie kurz, daß Sie ein Mensch und kein automatisches " +"Programm sind." + +#: forum/skins/default/templates/notarobot.html:10 +msgid "I am a Human Being" +msgstr "Ich bin ein Mensch" + +#: forum/skins/default/templates/pagesize.html:6 +msgid "posts per page" +msgstr "Beiträge pro Seite" + +#: forum/skins/default/templates/paginator.html:6 +#: forum/skins/default/templates/paginator.html:7 +msgid "previous" +msgstr "Vorige" + +#: forum/skins/default/templates/paginator.html:19 +msgid "current page" +msgstr "aktuelle Seite" + +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 +#, python-format +msgid "page number %(num)s" +msgstr "Seite %(num)s" + +#: forum/skins/default/templates/paginator.html:33 +msgid "next page" +msgstr "Nächste Seite" + +#: forum/skins/default/templates/post_contributor_info.html:9 +#, fuzzy, python-format +msgid "%(rev_count)s revision" +msgid_plural "%(rev_count)s revisions" +msgstr[0] "Version auswählen" +msgstr[1] "Version auswählen" + +#: forum/skins/default/templates/post_contributor_info.html:15 +msgid "asked" +msgstr "gefragt" + +#: forum/skins/default/templates/post_contributor_info.html:18 +msgid "answered" +msgstr "geantwortet" + +#: forum/skins/default/templates/post_contributor_info.html:20 +msgid "posted" +msgstr "veröffentlicht" + +#: forum/skins/default/templates/post_contributor_info.html:41 +msgid "updated" +msgstr "aktualisiert" + +#: forum/skins/default/templates/privacy.html:6 +#: forum/skins/default/templates/privacy.html:11 +msgid "Privacy policy" +msgstr "Datenschutzrichtlinien" + +#: forum/skins/default/templates/privacy.html:15 +msgid "general message about privacy" +msgstr "" +"Datenschutz und die Privatsphäre unserer Nutzer sind uns wichtig. Auf dieser " +"Seite wird erklärt, wie wir mit Ihren Daten umgehen." + +#: forum/skins/default/templates/privacy.html:18 +msgid "Site Visitors" +msgstr "Seitenbesucher" + +#: forum/skins/default/templates/privacy.html:20 +msgid "what technical information is collected about visitors" +msgstr "" +"Information über das Anschauen von Fragen, Fragen-Versionen und Antworten: " +"Sowohl Zugriffszeitpunkt als auch -Inhalt werden für jeden Nutzer " +"aufgezeichnet, um eine korrekte Zählung der Zugriffe sowie einen intakten " +"Datenbestand zu gewährleisten und um zuvor angeforderte " +"Benachrichtigungsmails an die Nutzer zu versenden." + +#: forum/skins/default/templates/privacy.html:23 +msgid "Personal Information" +msgstr "Persönliche Informationen" + +#: forum/skins/default/templates/privacy.html:25 +msgid "details on personal information policies" +msgstr "" +"Benutzer können auf freiwilliger Basis Informationen über sich in ihrem " +"Benutzerprofil ablegen. Diese Daten werden nicht ohne die ausdrückliche " +"Zustimmung des Nutzers öffentlich angezeigt." + +#: forum/skins/default/templates/privacy.html:28 +msgid "Other Services" +msgstr "Andere Dienste" + +#: forum/skins/default/templates/privacy.html:30 +msgid "details on sharing data with third parties" +msgstr "" +"Keine Daten, die nicht mit Zustimmung des Benutzers öffentlich auf der " +"Internetseite angezeigt werden, werden mit Dritten geteilt. " + +#: forum/skins/default/templates/privacy.html:35 +msgid "cookie policy details" +msgstr "" +"Unsere Website benötigt Cookies, um technisch einwandfrei zu funktionieren." + +#: forum/skins/default/templates/privacy.html:37 +msgid "Policy Changes" +msgstr "Veränderungen der Datenschutzrichtlinien" + +#: forum/skins/default/templates/privacy.html:38 +msgid "how privacy policies can be changed" +msgstr "" +"Unsere Datenschutzrichtlinien können sich im Laufe der Zeit verfeinern und " +"verändern. Registrierte Benutzer werden in diesen Fällen automatisch " +"benachrichtigt." + +#: forum/skins/default/templates/question.html:78 +#: forum/skins/default/templates/question.html:79 +#: forum/skins/default/templates/question.html:95 +#: forum/skins/default/templates/question.html:97 +msgid "i like this post (click again to cancel)" +msgstr "Ich halte diesen Beitrag für hilfreich (Zum Abbrechen erneut klicken)" + +#: forum/skins/default/templates/question.html:81 +#: forum/skins/default/templates/question.html:99 +#: forum/skins/default/templates/question.html:251 +msgid "current number of votes" +msgstr "Aktuelle Anzahl Bewertungen" + +#: forum/skins/default/templates/question.html:90 +#: forum/skins/default/templates/question.html:91 +#: forum/skins/default/templates/question.html:104 +#: forum/skins/default/templates/question.html:105 +msgid "i dont like this post (click again to cancel)" +msgstr "Ich halte nichts von diesem Beitrag (Zum Abbrechen erneut klicken)" + +#: forum/skins/default/templates/question.html:109 +#: forum/skins/default/templates/question.html:110 +msgid "mark this question as favorite (click again to cancel)" +msgstr "" +"Diese Frage in die Favoritenliste aufnehmen (Zum Abbrechen erneut klicken)" + +#: forum/skins/default/templates/question.html:116 +#: forum/skins/default/templates/question.html:117 +msgid "remove favorite mark from this question (click again to restore mark)" +msgstr "" +"Diese Frage aus der Favoritenliste entfernen (Zum Abbrechen erneut klicken)" + +#: forum/skins/default/templates/question.html:141 +#: forum/skins/default/templates/question.html:288 +#: forum/skins/default/templates/revisions_answer.html:58 +#: forum/skins/default/templates/revisions_question.html:58 +msgid "edit" +msgstr "bearbeiten" + +#: forum/skins/default/templates/question.html:146 +msgid "reopen" +msgstr "wieder öffnen" + +#: forum/skins/default/templates/question.html:150 +msgid "close" +msgstr "schließen" + +#: forum/skins/default/templates/question.html:156 +#: forum/skins/default/templates/question.html:293 +msgid "" +"report as offensive (i.e containing spam, advertising, malicious text, etc.)" +msgstr "" +"Beitrag melden (z.B. Spam, unerwünschte Werbung, Beleidigungen, illegale " +"Inhalte usw.)" + +#: forum/skins/default/templates/question.html:157 +#: forum/skins/default/templates/question.html:294 +msgid "flag offensive" +msgstr "Als beleidigend melden" + +#: forum/skins/default/templates/question.html:165 +#: forum/skins/default/templates/question.html:305 +msgid "delete" +msgstr "löschen" + +#: forum/skins/default/templates/question.html:183 +#: forum/skins/default/templates/question.html:325 +msgid "delete this comment" +msgstr "Kommentar löschen" + +#: forum/skins/default/templates/question.html:194 +#: forum/skins/default/templates/question.html:336 +msgid "add comment" +msgstr "Kommentar hinzufügen" + +#: forum/skins/default/templates/question.html:198 +#: forum/skins/default/templates/question.html:340 +#, fuzzy, python-format +msgid "see %(counter)s more" +msgid_plural "see %(counter)s more" +msgstr[0] "1 mehr" +msgstr[1] "%(counter)s mehr" + +#: forum/skins/default/templates/question.html:200 +#: forum/skins/default/templates/question.html:342 +#, fuzzy, python-format +msgid "see %(counter)s more comment" +msgid_plural "" +"see %(counter)s more comments\n" +" " +msgstr[0] "1 weiterer Kommentar" +msgstr[1] "%(counter)s weitere Kommentare" + +#: forum/skins/default/templates/question.html:213 +#, python-format +msgid "" +"The question has been closed for the following reason \"%(close_reason)s\" by" +msgstr "" +"Die Frage wurde aus den folgenden Gründen: \"%(close_reason)s\" geschlossen " +"von" + +#: forum/skins/default/templates/question.html:215 +#, python-format +msgid "close date %(closed_at)s" +msgstr "Schließungszeitpunkt close date %(closed_at)s" + +#: forum/skins/default/templates/question.html:223 +#, fuzzy, python-format +msgid "" +"\n" +" %(counter)s Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +"\n" +"Eine Antwort:" +msgstr[1] "" +"\n" +"%(counter)s Antworten:" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers will be shown first" +msgstr "Älteste Antworten werden als Erstes angezeigt" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers" +msgstr "älteste" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers will be shown first" +msgstr "Neueste werden zuerst angezeigt" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers" +msgstr "Neueste Antworten" + +#: forum/skins/default/templates/question.html:235 +msgid "most voted answers will be shown first" +msgstr "Höchstbewertete werden zuerst angezeigt" + +#: forum/skins/default/templates/question.html:235 +msgid "popular answers" +msgstr "Höchstbewertet" + +#: forum/skins/default/templates/question.html:249 +#: forum/skins/default/templates/question.html:250 +msgid "i like this answer (click again to cancel)" +msgstr "Ich halte diese Antwort für hilfreich (zum Abbrechen erneut klicken)" + +#: forum/skins/default/templates/question.html:256 +#: forum/skins/default/templates/question.html:257 +msgid "i dont like this answer (click again to cancel)" +msgstr "" +"Ich halte diese Antwort für nicht hilfreich (zum Abbrechen erneut klicken)" + +#: forum/skins/default/templates/question.html:262 +#: forum/skins/default/templates/question.html:263 +msgid "mark this answer as favorite (click again to undo)" +msgstr "Zur Favoritenliste hinzufügen (zum Abbrechen erneut klicken)" + +#: forum/skins/default/templates/question.html:268 +#: forum/skins/default/templates/question.html:269 +msgid "the author of the question has selected this answer as correct" +msgstr "Der Fragesteller hat diese Antwort als die korrekte markiert" + +#: forum/skins/default/templates/question.html:282 +msgid "answer permanent link" +msgstr "Link zur Antwort" + +#: forum/skins/default/templates/question.html:283 +msgid "permanent link" +msgstr "Link" + +#: forum/skins/default/templates/question.html:305 +msgid "undelete" +msgstr "Wiederherstellen" + +#: forum/skins/default/templates/question.html:364 +#: forum/skins/default/templates/question.html:367 +msgid "Notify me once a day when there are any new answers" +msgstr "" +"Benachrichtigung bei neuen Antworten einmal täglich per E-" +"Mail" + +#: forum/skins/default/templates/question.html:370 +msgid "Notify me weekly when there are any new answers" +msgstr "" +"Benachrichtigung bei neuen Antworten einmal wöchentlich per " +"E-Mail" + +#: forum/skins/default/templates/question.html:375 +#, python-format +msgid "" +"You can always adjust frequency of email updates from your %(profile_url)s" +msgstr "" +"(Sie können die Frequenz der Benachrichtigungen jederzeit in Ihrem " +"Profil ändern)" + +#: forum/skins/default/templates/question.html:380 +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "" +"Hier können Sie regelmäßige Benachrichtigungen " +"für diese Frage abonnieren, sobald Sie sich eingeloggt haben." + +#: forum/skins/default/templates/question.html:391 +msgid "Your answer" +msgstr "Ihre Antwort" + +#: forum/skins/default/templates/question.html:393 +msgid "Be the first one to answer this question!" +msgstr "Verfassen Sie die erste Antwort auf diese Frage!" + +#: forum/skins/default/templates/question.html:399 +msgid "you can answer anonymously and then login" +msgstr "" +"Beginnen Sie Ihre Antwort als anonymer Gast " +"- Ihre Antwort wird gespeichert, während Sie sich danach einloggen oder " +"einen neuen Zugang anlegen. Bitte versuchen Sie, eine sachliche " +"Antwort mit Substanz zu verfassen. Für Rückfragen oder " +"Klarstellungen nutzen Sie bitte die Kommentarfunktion unter der Frage. " +"Nachdem Sie sich angemeldet und/oder eingeloggt haben, können Sie auch über " +"die Qualität der Frage abstimmen, vergessen Sie das nicht!" + +#: forum/skins/default/templates/question.html:403 +msgid "answer your own question only to give an answer" +msgstr "" +"Die eigene Frage zu beantworten ist ausdrücklich " +"erlaubt, aber es muß eine echte Antwort sein! " +"Vergessen Sie nicht, daß Sie Ihre ursprüngliche Frage jederzeit " +"verändern oder bei Bedarf auch wieder löschen können. Bitte " +"verwenden Sie die Kommentarfunktion für Diskussionen und " +"Rückfragen, und bitte vergessen Sie nicht, die eingehenden Antworten mit " +"Ihrer Stimme zu bewerten!" + +#: forum/skins/default/templates/question.html:405 +msgid "please only give an answer, no discussions" +msgstr "" +"Bitte verfassen Sie eine sachliche Antwort mit Substanz. Um " +"einen Kommentar zu verfassen, nutzen Sie bitte die " +"Kommentarfunktion unter jeder Frage und Antwort. Sie können Ihre Antwort " +"jederzeit bearbeiten - es ist normalerweise nicht nötig, " +"eine Frage doppelt zu beantworten. Vergessen Sie auch nicht, über die Frage " +"und andere Antworten abzustimmen - dies hilft, die besten " +"Fragen und Antworten herauszufinden!" + +#: forum/skins/default/templates/question.html:441 +msgid "Login/Signup to Post Your Answer" +msgstr "" +"Bitte loggen Sie sich ein oder registrieren Sie sich, um die Antwort " +"endgültig zu speichern." + +#: forum/skins/default/templates/question.html:444 +msgid "Answer Your Own Question" +msgstr "Eigene Frage beantworten" + +#: forum/skins/default/templates/question.html:446 +msgid "Answer the question" +msgstr "Frage beantworten" + +#: forum/skins/default/templates/question.html:460 +msgid "Question tags" +msgstr "Tags" + +#: forum/skins/default/templates/question.html:465 +#: forum/skins/default/templates/questions.html:257 +#: forum/skins/default/templates/tag_selector.html:11 +#: forum/skins/default/templates/tag_selector.html:28 +#, python-format +msgid "see questions tagged '%(tag_name)s'" +msgstr "Fragen mit Tag '%(tag_name)s' anschauen" + +#: forum/skins/default/templates/question.html:471 +msgid "question asked" +msgstr "Gefragt" + +#: forum/skins/default/templates/question.html:474 +msgid "question was seen" +msgstr "Frage betrachtet:" + +#: forum/skins/default/templates/question.html:474 +msgid "times" +msgstr "mal" + +#: forum/skins/default/templates/question.html:477 +msgid "last updated" +msgstr "Zuletzt aktualisiert" + +#: forum/skins/default/templates/question.html:483 +msgid "Related questions" +msgstr "Verwandte / ähnliche Fragen" + +#: forum/skins/default/templates/question_counter_widget.html:6 +msgid "Please decide if you like this question or not by voting" +msgstr "" +"Bitte entscheiden Sie durch Abstimmen, ob Sie diese Frage für gut halten." + +#: forum/skins/default/templates/question_counter_widget.html:12 +msgid "" +"\n" +" vote\n" +" " +msgid_plural "" +"\n" +" votes\n" +" " +msgstr[0] "" +"\n" +"Stimme" +msgstr[1] "" +"\n" +"Stimmen" + +#: forum/skins/default/templates/question_counter_widget.html:21 +msgid "this answer has been accepted to be correct" +msgstr "Die Antwort ist als korrekt akzeptiert worden" + +#: forum/skins/default/templates/question_counter_widget.html:27 +msgid "" +"\n" +" answer \n" +" " +msgid_plural "" +"\n" +" answers \n" +" " +msgstr[0] "" +"\n" +"Antwort" +msgstr[1] "" +"\n" +"Antworten" + +#: forum/skins/default/templates/question_counter_widget.html:39 +msgid "" +"\n" +" view\n" +" " +msgid_plural "" +"\n" +" views\n" +" " +msgstr[0] "" +"\n" +"Einblendung" +msgstr[1] "" +"\n" +"Einblendungen" + +#: forum/skins/default/templates/question_edit.html:5 +#: forum/skins/default/templates/question_edit.html:66 +msgid "Edit question" +msgstr "Frage bearbeiten" + +#: forum/skins/default/templates/question_edit_tips.html:4 +msgid "question tips" +msgstr "Tipps für Fragen" + +#: forum/skins/default/templates/question_edit_tips.html:7 +msgid "please ask a relevant question" +msgstr "Stellen Sie nur Fragen, die für dieses Forum relevant sind." + +#: forum/skins/default/templates/question_edit_tips.html:10 +msgid "please try provide enough details" +msgstr "Bitte erwähnen Sie in Ihrer Frage genügend Details." + +#: forum/skins/default/templates/question_retag.html:4 +#: forum/skins/default/templates/question_retag.html:53 +msgid "Change tags" +msgstr "Tags ändern" + +#: forum/skins/default/templates/question_retag.html:40 +msgid "up to 5 tags, less than 20 characters each" +msgstr "Bis zu 5 Tags mit jeweils weniger als 20 Buchstaben" + +#: forum/skins/default/templates/question_retag.html:83 +msgid "Why use and modify tags?" +msgstr "Warum Tags verwenden und bearbeiten?" + +#: forum/skins/default/templates/question_retag.html:86 +msgid "tags help us keep Questions organized" +msgstr "Tags helfen uns, Fragen zu organisieren und zu kategorisieren." + +#: forum/skins/default/templates/question_retag.html:94 +msgid "tag editors receive special awards from the community" +msgstr "" +"Benutzer, die Tags bearbeiten, bekommen spezielle Auszeichnungen verliehen." + +#: forum/skins/default/templates/question_summary_list_roll.html:13 +msgid "answers" +msgstr "Antworten" + +#: forum/skins/default/templates/questions.html:8 +msgid "Questions" +msgstr "Fragen" + +#: forum/skins/default/templates/questions.html:32 +msgid "Found by tags" +msgstr "Fragen mit Tag" + +#: forum/skins/default/templates/questions.html:36 +msgid "Search results" +msgstr "Suchergebnisse" + +#: forum/skins/default/templates/questions.html:38 +msgid "Found by title" +msgstr "Nach Titel" + +#: forum/skins/default/templates/questions.html:42 +msgid "Unanswered questions" +msgstr "Unbeantwortete Fragen" + +#: forum/skins/default/templates/questions.html:44 +msgid "All questions" +msgstr "Alle Fragen" + +#: forum/skins/default/templates/questions.html:51 +msgid "In:" +msgstr "In:" + +#: forum/skins/default/templates/questions.html:53 +msgid "see unanswered questions" +msgstr "Unbeantwortete Fragen anzeigen" + +#: forum/skins/default/templates/questions.html:55 +msgid "see your favorite questions" +msgstr "Favoritenliste anzeigen" + +#: forum/skins/default/templates/questions.html:59 +msgid "Sort by:" +msgstr "Sortieren nach:" + +#: forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/questions.html:75 +msgid "click to see the newest questions" +msgstr "Klicken Sie, um die neuesten Fragen zu sehen" + +#: forum/skins/default/templates/questions.html:70 +msgid "click to see the oldest questions" +msgstr "Klicken Sie, um die ältesten Fragen zu sehen" + +#: forum/skins/default/templates/questions.html:83 +#: forum/skins/default/templates/questions.html:94 +msgid "click to see the most recently updated questions" +msgstr "Klicken Sie, um die jüngst bearbeiteten Fragen zu sehen" + +#: forum/skins/default/templates/questions.html:89 +msgid "click to see the least recently updated questions" +msgstr "Klicken Sie, um die ältesten bearbeiteten Fragen zu sehen" + +#: forum/skins/default/templates/questions.html:102 +#: forum/skins/default/templates/questions.html:113 +msgid "click to see hottest questions" +msgstr "Fragen mit den meisten Antworten" + +#: forum/skins/default/templates/questions.html:102 +msgid "less answers" +msgstr "weniger Antworten" + +#: forum/skins/default/templates/questions.html:108 +msgid "click to see coldest questions" +msgstr "Fragen mit den wenigsten Antworten" + +#: forum/skins/default/templates/questions.html:108 +#: forum/skins/default/templates/questions.html:113 +msgid "more answers" +msgstr "mehr Antworten" + +#: forum/skins/default/templates/questions.html:121 +#: forum/skins/default/templates/questions.html:132 +msgid "click to see most voted questions" +msgstr "Klicken Sie, um die höchstbewerteten Fragen anzuzeigen" + +#: forum/skins/default/templates/questions.html:121 +msgid "unpopular" +msgstr "Unpopulär" + +#: forum/skins/default/templates/questions.html:127 +msgid "click to see least voted questions" +msgstr "am wenigsten positiv bewertete Fragen" + +#: forum/skins/default/templates/questions.html:127 +#: forum/skins/default/templates/questions.html:132 +msgid "popular" +msgstr "Populär" + +#: forum/skins/default/templates/questions.html:141 +#, fuzzy, python-format +msgid " %(q_num)s question found" +msgid_plural "%(q_num)s questions found" +msgstr[0] "%(q_num)s Frage" +msgstr[1] "%(q_num)s Fragen" + +#: forum/skins/default/templates/questions.html:143 +#, fuzzy, python-format +msgid "%(q_num)s question" +msgid_plural "%(q_num)s questions" +msgstr[0] "%(q_num)s Frage" +msgstr[1] "%(q_num)s Fragen" + +#: forum/skins/default/templates/questions.html:147 +#, python-format +msgid "with %(author_name)s's contributions" +msgstr "mit Beiträgen von %(author_name)s" + +#: forum/skins/default/templates/questions.html:151 +msgid "tagged" +msgstr "Getaggt" + +#: forum/skins/default/templates/questions.html:157 +msgid "Search tips:" +msgstr "Suchtipps:" + +#: forum/skins/default/templates/questions.html:161 +msgid "reset author" +msgstr "Autor zurücksetzen" + +#: forum/skins/default/templates/questions.html:165 +msgid "reset tags" +msgstr "Tags zurücksetzen" + +#: forum/skins/default/templates/questions.html:169 +#: forum/skins/default/templates/questions.html:173 +msgid "start over" +msgstr "Von vorn beginnen" + +#: forum/skins/default/templates/questions.html:175 +msgid " - to expand, or dig in by adding more tags and revising the query." +msgstr "" +"- um den Kontext zu erweitern, oder graben Sie sich ein, indem Sie weitere " +"Tags hinzufügen und die Suchabfrage überarbeiten." + +#: forum/skins/default/templates/questions.html:178 +msgid "Search tip:" +msgstr "Suchtipp:" + +#: forum/skins/default/templates/questions.html:178 +msgid "add tags and a query to focus your search" +msgstr "" +"Tags und eine Suchabfrage hinzufügen, um genauere Suchergebnisse zu erzielen" + +#: forum/skins/default/templates/questions.html:190 +msgid "There are no unanswered questions here" +msgstr "Es gibt hier keine unbeantworteten Fragen" + +#: forum/skins/default/templates/questions.html:193 +msgid "No favorite questions here. " +msgstr "Keine Favoriten-Fragen." + +#: forum/skins/default/templates/questions.html:194 +msgid "Please start (bookmark) some questions when you visit them" +msgstr "" +"Bitte fügen Sie Fragen, die Ihnen besonders gut gefallen, zu Ihrer " +"Favoritenliste hinzu." + +#: forum/skins/default/templates/questions.html:199 +msgid "You can expand your search by " +msgstr "Sie können Ihre Suche erweitern, indem Sie" + +#: forum/skins/default/templates/questions.html:203 +msgid "resetting author" +msgstr "die Autorenbeschränkung entfernen" + +#: forum/skins/default/templates/questions.html:207 +msgid "resetting tags" +msgstr "die Tag-Beschränkung entfernen" + +#: forum/skins/default/templates/questions.html:211 +#: forum/skins/default/templates/questions.html:215 +msgid "starting over" +msgstr "ganz von Vorne beginnen" + +#: forum/skins/default/templates/questions.html:220 +msgid "Please always feel free to ask your question!" +msgstr "Sie können jederzeit gern Ihre eigene Frage stellen!" + +#: forum/skins/default/templates/questions.html:224 +msgid "Did not find what you were looking for?" +msgstr "Sie haben nicht gefunden, wonach Sie gesucht haben?" + +#: forum/skins/default/templates/questions.html:225 +msgid "Please, post your question!" +msgstr "Bitte stellen Sie Ihre Frage!" + +#: forum/skins/default/templates/questions.html:241 +msgid "Contributors" +msgstr "Beitragende" + +#: forum/skins/default/templates/questions.html:254 +msgid "Related tags" +msgstr "Tags" + +#: forum/skins/default/templates/reopen.html:6 +#: forum/skins/default/templates/reopen.html:16 +msgid "Reopen question" +msgstr "Frage wieder eröffnen" + +#: forum/skins/default/templates/reopen.html:19 +msgid "Open the previously closed question" +msgstr "Die geschlossene Frage neu öffnen" + +#: forum/skins/default/templates/reopen.html:22 +msgid "The question was closed for the following reason " +msgstr "Die Frage wurde aus folgendem Grund geschlossen" + +#: forum/skins/default/templates/reopen.html:22 +msgid "reason - leave blank in english" +msgstr "Grund" + +#: forum/skins/default/templates/reopen.html:22 +msgid "on " +msgstr "am" + +#: forum/skins/default/templates/reopen.html:22 +msgid "date closed" +msgstr "Zeitpunkt der Schließung" + +#: forum/skins/default/templates/reopen.html:29 +msgid "Reopen this question" +msgstr "Diese Frage wieder eröffnen" + +#: forum/skins/default/templates/revisions_answer.html:7 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:8 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "Revision history" +msgstr "Versionsgeschichte" + +#: forum/skins/default/templates/revisions_answer.html:50 +#: forum/skins/default/templates/revisions_question.html:50 +msgid "click to hide/show revision" +msgstr "Klicken, um Version anzuzeigen/zu verstecken" + +#: forum/skins/default/templates/tag_selector.html:5 +msgid "Interesting tags" +msgstr "Tags, die mich interessieren" + +#: forum/skins/default/templates/tag_selector.html:15 +#, python-format +msgid "remove '%(tag_name)s' from the list of interesting tags" +msgstr "" +"'%(tag_name)s' von der Liste der Tags, die mich interessieren, entfernen" + +#: forum/skins/default/templates/tag_selector.html:21 +#: forum/skins/default/templates/tag_selector.html:38 +msgid "Add" +msgstr "Hinzufügen" + +#: forum/skins/default/templates/tag_selector.html:22 +msgid "Ignored tags" +msgstr "Ignorierte Tags" + +#: forum/skins/default/templates/tag_selector.html:32 +#, python-format +msgid "remove '%(tag_name)s' from the list of ignored tags" +msgstr "'%(tag_name)s' von der Liste der ignorierten Tags entfernen" + +#: forum/skins/default/templates/tag_selector.html:41 +msgid "keep ignored questions hidden" +msgstr "Fragen aus ignorierten Tags ausblenden" + +#: forum/skins/default/templates/tags.html:6 +#: forum/skins/default/templates/tags.html:30 +msgid "Tag list" +msgstr "Tag-Liste" + +#: forum/skins/default/templates/tags.html:32 +msgid "sorted alphabetically" +msgstr "Alphabetisch sortiert" + +#: forum/skins/default/templates/tags.html:32 +msgid "by name" +msgstr "nach Namen" + +#: forum/skins/default/templates/tags.html:33 +msgid "sorted by frequency of tag use" +msgstr "nach Tag-Verwendungshäufigkeit" + +#: forum/skins/default/templates/tags.html:33 +msgid "by popularity" +msgstr "nach Popularität" + +#: forum/skins/default/templates/tags.html:39 +#, python-format +msgid "" +"All tags matching '%(stag)s'" +msgstr "" +"Alle Tags, die '%(stag)s' " +"enthalten" + +#: forum/skins/default/templates/tags.html:42 +msgid "Nothing found" +msgstr "Nichts gefunden" + +#: forum/skins/default/templates/user_edit.html:6 +msgid "Edit user profile" +msgstr "Benutzerprofil bearbeiten" + +#: forum/skins/default/templates/user_edit.html:19 +msgid "edit profile" +msgstr "Profil bearbeiten" + +#: forum/skins/default/templates/user_edit.html:33 +#: forum/skins/default/templates/user_info.html:53 +msgid "Registered user" +msgstr "Registrierter Benutzer" + +#: forum/skins/default/templates/user_edit.html:40 +msgid "Screen Name" +msgstr "Nickname" + +#: forum/skins/default/templates/user_edit.html:89 +#: forum/skins/default/templates/user_email_subscriptions.html:20 +msgid "Update" +msgstr "Update" + +#: forum/skins/default/templates/user_email_subscriptions.html:8 +msgid "Email subscription settings" +msgstr "E-Mail-Abonnementeinstellungen" + +#: forum/skins/default/templates/user_email_subscriptions.html:9 +msgid "email subscription settings info" +msgstr "" +"Häufigkeit von E-Mail-Benachrichtigungen " +"einstellen Abonnieren Sie Benachrichtigungen über Neuigkeiten in " +"Fragen, die Sie interessieren. Falls Sie keine E-Mails erhalten möchten - " +"wählen Sie \"Keine E-Mail\".
Benachrichtigungen werden nur versandt, " +"wenn es neues in der betreffenden Frage gibt." + +#: forum/skins/default/templates/user_email_subscriptions.html:21 +msgid "Stop sending email" +msgstr "Keine E-Mails mehr senden" + +#: forum/skins/default/templates/user_info.html:18 +msgid "change picture" +msgstr "Bild ändern" + +#: forum/skins/default/templates/user_info.html:25 +#: forum/skins/default/templates/users.html:26 forum/views/users.py:933 +msgid "reputation" +msgstr "Punktestand" + +#: forum/skins/default/templates/user_info.html:35 +msgid "Moderate this user" +msgstr "Diesen Benutzer verwalten" + +#: forum/skins/default/templates/user_info.html:47 +msgid "update profile" +msgstr "Profil aktualisieren" + +#: forum/skins/default/templates/user_info.html:57 +msgid "real name" +msgstr "Realname" + +#: forum/skins/default/templates/user_info.html:62 +msgid "member for" +msgstr "Mitglied seit" + +#: forum/skins/default/templates/user_info.html:67 +msgid "last seen" +msgstr "Zuletzt gesehen" + +#: forum/skins/default/templates/user_info.html:73 +msgid "user website" +msgstr "Website" + +#: forum/skins/default/templates/user_info.html:79 +msgid "location" +msgstr "Ort" + +#: forum/skins/default/templates/user_info.html:86 +msgid "age" +msgstr "Alter" + +#: forum/skins/default/templates/user_info.html:87 +msgid "age unit" +msgstr "Jahre " + +#: forum/skins/default/templates/user_info.html:93 +msgid "todays unused votes" +msgstr "Ungenutzte Bewertungs-Stimmen heute" + +#: forum/skins/default/templates/user_info.html:94 +msgid "votes left" +msgstr "Stimmen übrig" + +#: forum/skins/default/templates/user_reputation.html:29 +msgid "Your karma change log." +msgstr "Ihr Punkte-Logbuch." + +#: forum/skins/default/templates/user_reputation.html:31 +#, python-format +msgid "%(user_name)s's karma change log" +msgstr "Punkte-Logbuch von %(user_name)s" + +#: forum/skins/default/templates/user_stats.html:11 +#, fuzzy, python-format +msgid "%(counter)s Question" +msgid_plural "%(counter)s Questions" +msgstr[0] "1 Frage" +msgstr[1] "%(counter)s Fragen" + +#: forum/skins/default/templates/user_stats.html:16 +#, fuzzy, python-format +msgid "%(counter)s Answer" +msgid_plural "%(counter)s Answers" +msgstr[0] "1 Antwort" +msgstr[1] "%(counter)s Antworten" + +#: forum/skins/default/templates/user_stats.html:24 +#, python-format +msgid "the answer has been voted for %(answer_score)s times" +msgstr "Diese Antwort ist %(answer_score)s mal positiv bewertet worden" + +#: forum/skins/default/templates/user_stats.html:24 +msgid "this answer has been selected as correct" +msgstr "Diese Antwort ist als korrekt ausgewählt worden" + +#: forum/skins/default/templates/user_stats.html:34 +#, fuzzy, python-format +msgid "(%(comment_count)s comment)" +msgid_plural "the answer has been commented %(comment_count)s times" +msgstr[0] "1 Kommentar" +msgstr[1] "%(comment_count)s mal kommentiert" + +#: forum/skins/default/templates/user_stats.html:44 +#, fuzzy, python-format +msgid "%(cnt)s Vote" +msgid_plural "%(cnt)s Votes " +msgstr[0] "1 Bewertung" +msgstr[1] "%(cnt)s Bewertungen" + +#: forum/skins/default/templates/user_stats.html:50 +msgid "thumb up" +msgstr "+1" + +#: forum/skins/default/templates/user_stats.html:51 +msgid "user has voted up this many times" +msgstr "Benutzer hat positiv bewertet" + +#: forum/skins/default/templates/user_stats.html:55 +msgid "thumb down" +msgstr "-1" + +#: forum/skins/default/templates/user_stats.html:56 +msgid "user voted down this many times" +msgstr "Benutzer hat negativ bewertet" + +#: forum/skins/default/templates/user_stats.html:64 +#, fuzzy, python-format +msgid "%(counter)s Tag" +msgid_plural "%(counter)s Tags" +msgstr[0] "1 Tag" +msgstr[1] "%(counter)s Tags" + +#: forum/skins/default/templates/user_stats.html:72 +#, python-format +msgid "" +"see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " +msgstr "Andere Fragen von %(view_user)s mit Tag '%(tag_name)s'" + +#: forum/skins/default/templates/user_stats.html:86 +#, fuzzy, python-format +msgid "%(counter)s Badge" +msgid_plural "%(counter)s Badges" +msgstr[0] "1 Auszeichnung" +msgstr[1] "%(counter)s Auszeichnungen" + +#: forum/skins/default/templates/user_tabs.html:7 +msgid "User profile" +msgstr "Benutzerprofil" + +#: forum/skins/default/templates/user_tabs.html:7 forum/views/users.py:907 +msgid "overview" +msgstr "Übersicht" + +#: forum/skins/default/templates/user_tabs.html:9 forum/views/users.py:915 +msgid "recent activity" +msgstr "Jüngste Aktivitäten" + +#: forum/skins/default/templates/user_tabs.html:12 forum/views/users.py:925 +msgid "comments and answers to others questions" +msgstr "Kommentare und Antworten" + +#: forum/skins/default/templates/user_tabs.html:13 forum/views/users.py:924 +msgid "responses" +msgstr "Reaktionen" + +#: forum/skins/default/templates/user_tabs.html:16 +msgid "graph of user reputation" +msgstr "Punkte-Statistik" + +#: forum/skins/default/templates/user_tabs.html:17 +msgid "reputation history" +msgstr "Punkte-Protokoll" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:951 +msgid "user vote record" +msgstr "Abstimmungsverhalten" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:950 +msgid "casted votes" +msgstr "abgegebene Stimmen" + +#: forum/skins/default/templates/user_tabs.html:23 +msgid "questions that user selected as his/her favorite" +msgstr "Vom Benutzer als Favoriten markierte Fragen" + +#: forum/skins/default/templates/user_tabs.html:24 +msgid "favorites" +msgstr "Favoriten" + +#: forum/skins/default/templates/user_tabs.html:27 forum/views/users.py:960 +msgid "email subscription settings" +msgstr "E-Mail-Abonnementeinstellungen" + +#: forum/skins/default/templates/user_tabs.html:28 forum/views/users.py:959 +msgid "email subscriptions" +msgstr "E-Mail-Abonnements" + +#: forum/skins/default/templates/users.html:6 +#: forum/skins/default/templates/users.html:24 +msgid "Users" +msgstr "Benutzer" + +#: forum/skins/default/templates/users.html:27 +msgid "recent" +msgstr "neueste" + +#: forum/skins/default/templates/users.html:29 +msgid "by username" +msgstr "nach Benutzernamen" + +#: forum/skins/default/templates/users.html:35 +#, python-format +msgid "users matching query %(suser)s:" +msgstr "Benutzer mit Wort %(suser)s" + +#: forum/skins/default/templates/users.html:39 +msgid "Nothing found." +msgstr "Nichts gefunden." + +#: forum/skins/default/templates/users_questions.html:11 +msgid "this questions was selected as favorite" +msgstr "Diese Frage wurde als Favorit markiert" + +#: forum/skins/default/templates/users_questions.html:12 +msgid "thumb-up on" +msgstr "+1 an" + +#: forum/skins/default/templates/users_questions.html:19 +msgid "thumb-up off" +msgstr "+1 aus" + +#: forum/skins/default/templates/authopenid/changeemail.html:3 +#: forum/skins/default/templates/authopenid/changeemail.html:9 +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Change email" +msgstr "E-Mail-Adresse ändern" + +#: forum/skins/default/templates/authopenid/changeemail.html:11 +msgid "Save your email address" +msgstr "E-Mail-Adresse speichern" + +#: forum/skins/default/templates/authopenid/changeemail.html:16 +#, python-format +msgid "change %(email)s info" +msgstr "" +"Geben Sie Ihre E-Mail-Adresse in untenstehende " +"Box ein falls Sie sie für Ihre Benachrichtigungs-E-Mails ändern " +"möchten.
Im Moment verwenden Sie %(email)s" + +#: forum/skins/default/templates/authopenid/changeemail.html:18 +#, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "" +"Bitte geben Sie unten Ihre E-Mail-Adresse ein. Eine gültige E-Mail-Adresse wird für dieses Forum benötigt. Falls Sie " +"möchten, können Sie Benachrichtigungsmails zu Sie besonders " +"interessierenden Fragen, oder Neuzugängen abonnieren. Ihre E-Mail-Adresse " +"wird auch benutzt, um ein individuelles sogenanntes Gravatar-Bild für Ihr Konto " +"anzuzeigen. E-Mail-Adressen werden niemals öffentlich angezeigt." + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your new Email" +msgstr "" +"Ihre neue E-Mail-Adresse: (wirdnicht " +"öffentlich angezeigt; muß eine gültige Adresse sein)" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your Email" +msgstr "" +"Ihre E-Mail-Adresse (wirdnicht öffentlich " +"angezeigt; muß eine gültige Adresse sein)" + +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Save Email" +msgstr "E-Mail-Adresse speichern" + +#: forum/skins/default/templates/authopenid/changeemail.html:49 +msgid "Validate email" +msgstr "E-Mail-Adresse überprüfen" + +#: forum/skins/default/templates/authopenid/changeemail.html:52 +#, python-format +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "" +"Eine E-Mail mit einem Bestätigungslink wurde an %" +"(email)s versandt. Bitte klicken Sie auf den Link in der E-" +"Mail oder geben Sie ihn via Kopieren+Einfügen in Ihren Internet-" +"Browser ein. Die E-Mail-Überprüfung dient Ihrem und unserem Schutz vor Spam. " +"Falls Sie eine andere E-Mail-Adresse verwenden möchten, " +"können Sie sie erneut ändern." + +#: forum/skins/default/templates/authopenid/changeemail.html:57 +msgid "Email not changed" +msgstr "E-Mail-Adresse nicht geändert" + +#: forum/skins/default/templates/authopenid/changeemail.html:60 +#, python-format +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" +"Ihre E-Mail-Adresse %(email)s wurde nicht " +"geändert. Falls Sie sie später ändern möchten, können Sie dieses " +"jederzeit in Ihrem Benutzerprofil oder im vorigen Formular tun." + +#: forum/skins/default/templates/authopenid/changeemail.html:65 +msgid "Email changed" +msgstr "E-Mail-Adresse geändert" + +#: forum/skins/default/templates/authopenid/changeemail.html:68 +#, python-format +msgid "your current %(email)s can be used for this" +msgstr "" +"Ihre E-Mail-Adresse wurde auf %(email)s verändert. Sie erhalten alle eventuell abonnierten E-Mail-Benachrichtigungen nun " +"an diese Adresse." + +#: forum/skins/default/templates/authopenid/changeemail.html:73 +msgid "Email verified" +msgstr "E-Mail-Adresse bestätigt" + +#: forum/skins/default/templates/authopenid/changeemail.html:76 +msgid "thanks for verifying email" +msgstr "" +"Vielen Dank für die Bestätigung Ihrer E-Mail-" +"Adresse! Sie können jetzt Fragen stellen und " +"beantworten. Sie können bei interessanten Fragen auch " +"eine E-Mail-Benachrichtigung abonnieren, die Sie einmal " +"täglich oder seltener über neue Entwicklungen wie Antworten und Kommentare " +"informiert." + +#: forum/skins/default/templates/authopenid/changeemail.html:81 +msgid "email key not sent" +msgstr "Bestätigungs-E-Mail nicht versandt" + +#: forum/skins/default/templates/authopenid/changeemail.html:84 +#, python-format +msgid "email key not sent %(email)s change email here %(change_link)s" +msgstr "" +"Ihre momentane E-Mail-Adresse %(email)s wurde " +"bereits bestätigt. Es wurde keine neue Bestätigungsmail versandt. Sie " +"können Ihre E-Mail-Adresse bei Bedarf ändern." + +#: forum/skins/default/templates/authopenid/changeopenid.html:8 +msgid "Account: change OpenID URL" +msgstr "Zugang: OpenID-URL ändern" + +#: forum/skins/default/templates/authopenid/changeopenid.html:12 +msgid "" +"This is where you can change your OpenID URL. Make sure you remember it!" +msgstr "Hier können Sie Ihre OpenID-URL ändern. Merken Sie sie sich gut!" + +#: forum/skins/default/templates/authopenid/changeopenid.html:14 +#: forum/skins/default/templates/authopenid/delete.html:14 +#: forum/skins/default/templates/authopenid/delete.html:24 +msgid "Please correct errors below:" +msgstr "Bitte folgende Eingaben korrigieren:" + +#: forum/skins/default/templates/authopenid/changeopenid.html:29 +msgid "OpenID URL:" +msgstr "OpenID-URL:" + +#: forum/skins/default/templates/authopenid/changepw.html:7 +msgid "Account: change password" +msgstr "Passwort ändern" + +#: forum/skins/default/templates/authopenid/changepw.html:8 +msgid "This is where you can change your password. Make sure you remember it!" +msgstr "" +"Um Ihr Passwort zu ändern, füllen Sie bitte " +"dieses Formular aus und senden Sie es ab." + +#: forum/skins/default/templates/authopenid/complete.html:19 +msgid "Connect your OpenID with this site" +msgstr "Als neuer OpenID-Benutzer anmelden" + +#: forum/skins/default/templates/authopenid/complete.html:22 +msgid "Connect your OpenID with your account on this site" +msgstr "Neue OpenID mit einem bestehenden Benutzerzugang verknüpfen" + +#: forum/skins/default/templates/authopenid/complete.html:27 +#, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

Sie sind zum ersten Mal mit Ihrem OpenID-" +"Zugang von %(provider)s eingeloggt. Bitte geben Sie einen " +"Benutzernamen ein und hinterlegen Sie Ihre E-Mail-" +"Adresse. Die E-Mail-Adresse ermöglicht Benachrichtigungen " +"bei besonders interessanten Fragen und wird als Grundlage für Ihr " +"Individuelles Benutzerbild, den Gravatar, benutzt.

" + +#: forum/skins/default/templates/authopenid/complete.html:31 +#, fuzzy, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" +"

Der Benutzername %(username)s ist leider nicht " +"mehr frei.

Eine gültige E-Mail-Adresse ist ebenfalls " +"erforderlich - an sie senden wir (optionale) Benachrichtigungsmails, und mit " +"ihr zeigen wir Ihr Benutzerbild (Gravatar) an. E-Mail-Adressen werden nicht " +"öffentlich angezeigt und auch nicht an Dritte weitergegeben.

" + +#: forum/skins/default/templates/authopenid/complete.html:35 +#, python-format +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

Sie sind zum ersten Mal mit Ihrem OpenID-" +"Zugang von %(provider)s eingeloggt. Sie können einen " +"Benutzernamen eingeben oder Ihren Benutzernamen bei %" +"(provider)s verwenden. Bitte hinterlegen Sie auch Ihre E-Mail-" +"Adresse. Die E-Mail-Adresse ermöglicht Benachrichtigungen " +"bei besonders interessanten Fragen und wird als Grundlage für Ihr " +"Individuelles Benutzerbild, den Gravatar, benutzt.

" + +#: forum/skins/default/templates/authopenid/complete.html:38 +#, python-format +msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" +msgstr "" +"

Sie sind hier zum ersten Mal mit Ihrem " +"Facebook-Login. Bitte legen Sie einen Benutzernamen " +"fest und hinterlegen Sie Ihre E-Mail-Adresse. Die E-Mail-" +"Adresse ermöglicht Benachrichtigungen bei besonders interessanten " +"Fragen und wird als Grundlage für Ihr Individuelles Benutzerbild, " +"den Gravatar, benutzt." + +#: forum/skins/default/templates/authopenid/complete.html:42 +msgid "This account already exists, please use another." +msgstr "" +"Dieser Benutzername existiert leider bereits, bitte wählen Sie einen anderen." + +#: forum/skins/default/templates/authopenid/complete.html:57 +msgid "Sorry, looks like we have some errors:" +msgstr "Bitte korrigieren Sie folgende Eingabe(n):" + +#: forum/skins/default/templates/authopenid/complete.html:82 +msgid "Screen name label" +msgstr "Benutzername (wird öffentlich angezeigt)" + +#: forum/skins/default/templates/authopenid/complete.html:89 +msgid "Email address label" +msgstr "" +"E-Mail-Adresse (wird nicht öffentlich " +"angezeigt; muß gültig sein)" + +#: forum/skins/default/templates/authopenid/complete.html:95 +#: forum/skins/default/templates/authopenid/signup.html:18 +msgid "receive updates motivational blurb" +msgstr "" +"Benachrichtigungen per E-Mail abonnieren Das Abonnieren von " +"E-Mail-Benachrichtigungen ist freiwillig.
Das Forum versenden bis zu " +"einer Benachrichtigung pro Woche - nur wenn es auch " +"wirklich Neues gibt.
Sie können die Benachrichtigungshäufigkeit " +"jederzeit in Ihrem Benutzerprofil anpassen." + +#: forum/skins/default/templates/authopenid/complete.html:99 +#: forum/skins/default/templates/authopenid/signup.html:22 +msgid "please select one of the options above" +msgstr "Bitte wählen Sie eine der oben genannten Optionen" + +#: forum/skins/default/templates/authopenid/complete.html:102 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" +"Das Tag-Filterwerkzeug finden Sie nach dem Einloggen in der rechten Spalte." + +#: forum/skins/default/templates/authopenid/complete.html:103 +msgid "create account" +msgstr "Zugang anlegen" + +#: forum/skins/default/templates/authopenid/complete.html:112 +msgid "Existing account" +msgstr "Existierender Zugang" + +#: forum/skins/default/templates/authopenid/complete.html:113 +msgid "user name" +msgstr "Benutzername" + +#: forum/skins/default/templates/authopenid/complete.html:114 +msgid "password" +msgstr "Passwort" + +#: forum/skins/default/templates/authopenid/complete.html:121 +msgid "Register" +msgstr "Registrieren" + +#: forum/skins/default/templates/authopenid/complete.html:122 +#: forum/skins/default/templates/authopenid/signin.html:168 +msgid "Forgot your password?" +msgstr "Passwort vergessen?" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:2 +msgid "Thank you for registering at our Q&A forum!" +msgstr "Vielen Dank für Ihre Registrierung!" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:4 +msgid "Your account details are:" +msgstr "Ihre Zugangsdaten:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:6 +msgid "Username:" +msgstr "Benutzername:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:7 +#: forum/skins/default/templates/authopenid/delete.html:19 +msgid "Password:" +msgstr "Passwort:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:9 +msgid "Please sign in here:" +msgstr "Bitte hier anmelden:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:12 +#: forum/skins/default/templates/authopenid/email_validation.txt:14 +#: forum/skins/default/templates/authopenid/sendpw_email.txt:8 +msgid "" +"Sincerely,\n" +"Forum Administrator" +msgstr "Ihr Forumsteam" + +#: forum/skins/default/templates/authopenid/delete.html:8 +msgid "Account: delete account" +msgstr "Zugang löschen" + +#: forum/skins/default/templates/authopenid/delete.html:12 +msgid "" +"Note: After deleting your account, anyone will be able to register this " +"username." +msgstr "" +"Achtung: Nach einer Löschung kann Ihr Benutzername von Jedermann registriert " +"werden." + +#: forum/skins/default/templates/authopenid/delete.html:16 +msgid "Check confirm box, if you want delete your account." +msgstr "Bitte aktivieren Sie das Häkchen, um die Löschung zu bestätigen." + +#: forum/skins/default/templates/authopenid/delete.html:31 +msgid "I am sure I want to delete my account." +msgstr "Ich bin sicher, daß ich meinen Zugang endgültig löschen möchte." + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "Password/OpenID URL" +msgstr "Passwort / OpenID-URL" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "(required for your security)" +msgstr "(Wird zu Ihrer Sicherheit benötigt)" + +#: forum/skins/default/templates/authopenid/delete.html:34 +msgid "Delete account permanently" +msgstr "Zugang endgültig löschen" + +#: forum/skins/default/templates/authopenid/email_validation.txt:2 +msgid "Greetings from the Q&A forum" +msgstr "Grüße vom Forumsteam" + +#: forum/skins/default/templates/authopenid/email_validation.txt:4 +msgid "To make use of the Forum, please follow the link below:" +msgstr "Um das Forum zu benutzen, klicken Sie auf untenstehenden Link:" + +#: forum/skins/default/templates/authopenid/email_validation.txt:8 +msgid "Following the link above will help us verify your email address." +msgstr "" +"Die Bestätigung der E-Mail-Adresse durch den Link hilft uns, Spam zu " +"vermeiden." + +#: forum/skins/default/templates/authopenid/email_validation.txt:10 +msgid "" +"If you beleive that this message was sent in mistake - \n" +"no further action is needed. Just ingore this email, we apologize\n" +"for any inconvenience" +msgstr "" +"Falls Sie diese Nachricht irrtümlich erhalten haben, brauchen Sie nichts zu " +"unternehmen. Bitte ignorieren Sie diese E-Mail einfach - wir entschuldigen " +"uns für die Unannehmlichkeiten." + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:4 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:7 +msgid "Traditional login information" +msgstr "Klassische Login-Information" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:12 +#, python-format +msgid "" +"how to login with password through external login website or use %" +"(feedback_url)s" +msgstr "" +"Mit Passwort durch externen Login einloggen oder %(feedback_url)s benutzen" + +#: forum/skins/default/templates/authopenid/sendpw.html:4 +#: forum/skins/default/templates/authopenid/sendpw.html:7 +msgid "Send new password" +msgstr "Neues Passwort versenden" + +#: forum/skins/default/templates/authopenid/sendpw.html:10 +msgid "password recovery information" +msgstr "" +"Passwort vergessen? Kein Problem - einfach ein " +"neues anfordern!
Bitte tun Sie folgendes:
• geben Sie " +"Ihren Benutzernamen unten ein und überprüfen Sie Ihren Posteingang
Folgen Sie dem Aktivierungslink um ein neues " +"Passwort zu erhalten
• bitte ändern Sie das erhaltene Passwort " +"möglichst in ein Passwort Ihrer Wahl." + +#: forum/skins/default/templates/authopenid/sendpw.html:21 +msgid "Reset password" +msgstr "Neues Passwort zusenden" + +#: forum/skins/default/templates/authopenid/sendpw.html:22 +msgid "return to login" +msgstr "Zurück zum Login" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:2 +#, python-format +msgid "" +"Someone has requested to reset your password on %(site_url)s.\n" +"If it were not you, it is safe to ignore this email." +msgstr "" +"Jemand hat für Ihren Zugang auf %(site_url)s ein neues Passwort an dieses E-" +"Mail-Postfach angefordert.\n" +"Falls die Anforderung nicht von Ihnen kam, gibt es nichts zu tun: Das " +"Passwort wird nicht geändert; die Person erfährt Ihr Passwort nicht." + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:5 +#, python-format +msgid "" +"email explanation how to use new %(password)s for %(username)s\n" +"with the %(key_link)s" +msgstr "" +"Um Ihr Passwort zu ändern, tun Sie bitte folgendes:\n" +"\n" +"* Öffnen Sie diesen Link: %(key_link)s\n" +"* Loggen Sie sich mit dem Benutzernamen %(username)s und dem Passwort %" +"(password)s ein\n" +"* Öffnen Sie Ihr Benutzerprofil und ändern Sie Ihr Passwort" + +#: forum/skins/default/templates/authopenid/signin.html:5 +#: forum/skins/default/templates/authopenid/signin.html:21 +msgid "User login" +msgstr "Benutzerlogin" + +#: forum/skins/default/templates/authopenid/signin.html:28 +#, python-format +msgid "" +"\n" +" Your answer to %(title)s %(summary)s will be posted once you " +"log in\n" +" " +msgstr "" +"\n" +"Ihre Antwort auf \"%(title)s %(summary)s...\" wurde gespeichert " +"und wird veröffentlicht, sobald Sie sich einloggen." + +#: forum/skins/default/templates/authopenid/signin.html:35 +#, python-format +msgid "" +"Your question \n" +" %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" +"Ihre Frage \"%(title)s " +"%(summary)s...\" wurde gespeichert und wird " +"veröffentlicht, sobald Sie sich einloggen." + +#: forum/skins/default/templates/authopenid/signin.html:42 +msgid "Click to sign in through any of these services." +msgstr "" +"

Bitte wählen Sie Ihre bevorzugte Login-Methode." +"

Externe Login-Anbieter nutzen die OpenID-Technologie, bei der Sie sich nur " +"einen Benutzernamen und ein Passwort merken müssen, und mit der Sie sich auf " +"dutzenden Internetseiten einloggen können.

" + +# msgid "Click to sign in through any of these services." +# msgstr "" +# "

Please select your favorite login method +# below." +# "

External login services use OpenID technology, where your password " +# "always stays confidential between you and your login provider and you don't +# " +# "have to remember another one. " +# "Askbot option requires your login name and " +# "password entered here.

" +#: forum/skins/default/templates/authopenid/signin.html:144 +msgid "Enter your Provider user name" +msgstr "" +"Geben Sie Ihren Benutzernamen beim Provider ein
(oder wählen Sie oben eine andere Login-Methode)" + +#: forum/skins/default/templates/authopenid/signin.html:151 +msgid "" +"Enter your OpenID " +"web address" +msgstr "" +"Geben Sie IhreOpenID-Internetadresse an
(oder wählen Sie oben eine andere Login-Methode)" + +#: forum/skins/default/templates/authopenid/signin.html:153 +#: forum/skins/default/templates/authopenid/signin.html:166 +msgid "Login" +msgstr "Login" + +#: forum/skins/default/templates/authopenid/signin.html:157 +msgid "Enter your login name and password" +msgstr "" +"Geben Sie Ihren Askbot-Benutzernamen und Ihr " +"Passwort ein
(oder wählen Sie oben den OpenID-" +"Login aus)" + +#: forum/skins/default/templates/authopenid/signin.html:161 +msgid "Login name" +msgstr "Benutzername" + +#: forum/skins/default/templates/authopenid/signin.html:163 +msgid "Password" +msgstr "Passwort" + +#: forum/skins/default/templates/authopenid/signin.html:167 +msgid "Create account" +msgstr "Zugang anlegen" + +#: forum/skins/default/templates/authopenid/signin.html:178 +msgid "Why use OpenID?" +msgstr "Warum OpenID verwenden?" + +#: forum/skins/default/templates/authopenid/signin.html:181 +msgid "with openid it is easier" +msgstr "Mit OpenID müssen Sie keinen neuen Account anlegen." + +#: forum/skins/default/templates/authopenid/signin.html:184 +msgid "reuse openid" +msgstr "" +"Sie können sich ohne Bedenken mit dem selben OpenID-Zugang auf unbegrenzt " +"vielen Webseiten einloggen." + +#: forum/skins/default/templates/authopenid/signin.html:187 +msgid "openid is widely adopted" +msgstr "" +"Es gibt mehr als 160 Millionen OpenID-Zugänge und mehr als 10.000 Seiten, " +"die OpenID akzeptieren." + +#: forum/skins/default/templates/authopenid/signin.html:190 +msgid "openid is supported open standard" +msgstr "" +"OpenID basiert auf einem international anerkannten Standard und wird von " +"zahlreichen großen Firmen unterstützt." + +#: forum/skins/default/templates/authopenid/signin.html:195 +msgid "Find out more" +msgstr "Mehr Informationen" + +#: forum/skins/default/templates/authopenid/signin.html:196 +msgid "Get OpenID" +msgstr "Einen OpenID-Zugang anlegen" + +#: forum/skins/default/templates/authopenid/signup.html:4 +msgid "Signup" +msgstr "Registrieren" + +#: forum/skins/default/templates/authopenid/signup.html:8 +msgid "Create login name and password" +msgstr "Benutzernamen und Passwort anlegen" + +#: forum/skins/default/templates/authopenid/signup.html:10 +msgid "Traditional signup info" +msgstr "" +"Falls Sie möchten, können Sie auch einen " +"Benutzernamen und ein Passwort hier im Forum anmelden. Wir unterstützen aber " +"auch OpenID, eine Technik, mit der Sie sich nur einmal z.B. " +"bei Ihrem Internet-Provider registrieren müssen. Mit der bei Ihrem Provider " +"angelegten OpenID können Sie sich dann hier einloggen. Wenn Sie z.B. einen " +"Zugang bei Google haben, haben Sie bereits auch einen OpenID-Zugang." + +#: forum/skins/default/templates/authopenid/signup.html:25 +msgid "" +"Please read and type in the two words below to help us prevent automated " +"account creation." +msgstr "" +"Bitte geben Sie zum Schutz vor Spam die untenstehenden zwei Wörter ein." + +#: forum/skins/default/templates/authopenid/signup.html:27 +msgid "Create Account" +msgstr "Zugang anlegen" + +#: forum/skins/default/templates/authopenid/signup.html:28 +msgid "or" +msgstr "oder" + +#: forum/skins/default/templates/authopenid/signup.html:29 +msgid "return to OpenID login" +msgstr "zum OpenID-Login zurückkehren" + +#: forum/skins/default/templates/fbconnect/xd_receiver.html:5 +#, python-format +msgid "Connect to %(APP_SHORT_NAME)s with Facebook!" +msgstr "Mit Facebook mit %(APP_SHORT_NAME)s verbinden!" + +#: forum/templatetags/extra_filters.py:100 +msgid "no items in counter" +msgstr "no" + +#: forum/templatetags/extra_tags.py:53 +#, python-format +msgid "%(username)s gravatar image" +msgstr "%(username)s Gravatar-Bild" + +#: forum/templatetags/extra_tags.py:178 forum/templatetags/extra_tags.py:205 +msgid "reputation points" +msgstr "Punkte" + +#: forum/templatetags/extra_tags.py:265 +msgid "2 days ago" +msgstr "vor 2 Tagen" + +#: forum/templatetags/extra_tags.py:267 +msgid "yesterday" +msgstr "gestern" + +#: forum/templatetags/extra_tags.py:269 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "vor %(hr)d Stunde" +msgstr[1] "vor %(hr)d Stunden" + +#: forum/templatetags/extra_tags.py:271 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "vor %(min)d Minute" +msgstr[1] "vor %(min)d Minuten" + +#: forum/utils/forms.py:30 +msgid "this field is required" +msgstr "Dieses Feld wird benötigt" + +#: forum/utils/forms.py:45 +msgid "choose a username" +msgstr "Bitte einen Benutzernamen eingeben" + +#: forum/utils/forms.py:50 +msgid "user name is required" +msgstr "Der Benutzername wird benötigt" + +#: forum/utils/forms.py:51 +msgid "sorry, this name is taken, please choose another" +msgstr "" +"Dieser Benutzername ist bereits vergeben. Bitte wählen Sie einen anderen" + +#: forum/utils/forms.py:52 +msgid "sorry, this name is not allowed, please choose another" +msgstr "Dieser Benutzername ist nicht erlaubt. Bitte wählen Sie einen anderen" + +#: forum/utils/forms.py:53 +msgid "sorry, there is no user with this name" +msgstr "Es gibt keinen Benutzer dieses Namens" + +#: forum/utils/forms.py:54 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" +"Interner Fehler: Derselbe Benutzername ist von mehreren Benutzern " +"registriert. Bitte melden Sie diesen Fehler dem Administrator. Vielen Dank." + +#: forum/utils/forms.py:55 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "" +"Der Benutzername kann aus Buchstaben, Leerzeichen und Unterstrichen bestehen" + +#: forum/utils/forms.py:109 +msgid "your email address" +msgstr "Ihre E-Mail-Adresse (wird nie veröffentlicht)" + +#: forum/utils/forms.py:110 +msgid "email address is required" +msgstr "Eine E-Mail-Adresse wird benötigt" + +#: forum/utils/forms.py:111 +msgid "please enter a valid email address" +msgstr "Bitte geben Sie eine gültige E-Mail-Adresse ein" + +#: forum/utils/forms.py:112 +msgid "this email is already used by someone else, please choose another" +msgstr "" +"Diese E-Mail-Adresse ist bereits in Benutzung, bitte geben Sie eine andere " +"ein" + +#: forum/utils/forms.py:140 +msgid "choose password" +msgstr "Passwort" + +#: forum/utils/forms.py:141 +msgid "password is required" +msgstr "Ein Passwort wird benötigt" + +#: forum/utils/forms.py:144 +msgid "retype password" +msgstr "Passwort (bitte neu eingeben)" + +#: forum/utils/forms.py:145 +msgid "please, retype your password" +msgstr "Bitte geben Sie Ihr Passwort erneut ein" + +#: forum/utils/forms.py:146 +msgid "sorry, entered passwords did not match, please try again" +msgstr "" +"Die beiden eingegebenen Passwörter stimmen nicht überein, bitte erneut " +"versuchen" + +#: forum/views/commands.py:209 +#, python-format +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "" +"Ihre Abonnementeinstellungen wurden gespeichert, aber %(email)s muß noch " +"bestätigt werden. Details hier." + +#: forum/views/commands.py:217 +msgid "email update frequency has been set to daily" +msgstr "Die Häufigkeit der Benachrichtigungen wurde auf \"täglich\" gesetzt." + +#: forum/views/meta.py:35 +msgid "Q&A forum feedback" +msgstr "Forums-Feedback" + +#: forum/views/meta.py:36 +msgid "Thanks for the feedback!" +msgstr "Vielen Dank für Ihr Feedback!" + +#: forum/views/meta.py:44 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "Wir freuen uns auf Ihr Feedback! Gerne auch nächstes Mal :)" + +#: forum/views/users.py:867 forum/views/users.py:871 +msgid "changes saved" +msgstr "Veränderungen gespeichert" + +#: forum/views/users.py:877 +msgid "email updates canceled" +msgstr "E-Mail-Benachrichtigungen abgestellt" + +#: forum/views/users.py:908 +msgid "user profile" +msgstr "Benutzerprofil" + +#: forum/views/users.py:909 +msgid "user profile overview" +msgstr "Benutzerprofil-Übersicht" + +#: forum/views/users.py:916 +msgid "recent user activity" +msgstr "Neueste Aktivitäten" + +#: forum/views/users.py:917 +msgid "profile - recent activity" +msgstr "Profil - neueste Aktivitäten" + +#: forum/views/users.py:926 +msgid "profile - responses" +msgstr "Profil - Reaktionen" + +#: forum/views/users.py:934 +msgid "user reputation in the community" +msgstr "Punktestand des Benutzers" + +#: forum/views/users.py:935 +msgid "profile - user reputation" +msgstr "Profil - Punktestand des Benutzers" + +#: forum/views/users.py:941 +msgid "favorite questions" +msgstr "Fragen in der Favoritenliste" + +#: forum/views/users.py:942 +msgid "users favorite questions" +msgstr "Fragen in der Favoritenliste des Benutzers" + +#: forum/views/users.py:943 +msgid "profile - favorite questions" +msgstr "Fragen in der Favoritenliste" + +#: forum/views/users.py:952 +msgid "profile - votes" +msgstr "Abgegebene Bewertungen" + +#: forum/views/users.py:961 +msgid "profile - email subscriptions" +msgstr "E-Mail-Abonnements" + +#: forum/views/writers.py:70 +msgid "uploading images is limited to users with >60 reputation points" +msgstr "Das Hochladen von Dateien benötigt 60 Punkte oder mehr" + +#: forum/views/writers.py:72 +msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" +msgstr "Erlaubte Dateitypen: 'jpg', 'jpeg', 'gif', 'bmp', 'png' und 'tiff'" + +#: forum/views/writers.py:74 +#, python-format +msgid "maximum upload file size is %sK" +msgstr "Die Maximalgröße beim Hochladen beträgt %s Kilobyte." + +#: forum/views/writers.py:76 +#, python-format +msgid "" +"Error uploading file. Please contact the site administrator. Thank you. %s" +msgstr "" +"Fehler beim Hochladen der Datei. Bitte nehmen Sie Kontakt mit dem " +"Administrator auf. %s" + +#: forum_modules/authentication/auth.py:27 +msgid "Email Validation" +msgstr "E-Mail-Bestätigung" + +#: forum_modules/authentication/auth.py:38 +msgid "Thank you, your email is now validated." +msgstr "Vielen Dank, Ihre E-Mail-Adresse wurde bestätigt." + +#: forum_modules/authentication/auth.py:62 +msgid "Your password was changed" +msgstr "Ihr Passwort wurde geändert." + +#: forum_modules/authentication/auth.py:64 +msgid "New password set" +msgstr "Neues Passwort angelegt" + +#: forum_modules/authentication/auth.py:130 +#, python-format +msgid "Welcome back %s, you are now logged in" +msgstr "Willkommen %s, Sie sind jetzt eingeloggt" + +#: forum_modules/books/urls.py:7 forum_modules/books/urls.py:8 +#: forum_modules/books/urls.py:9 +msgid "books/" +msgstr "buecher/" + +#~ msgid "please login" +#~ msgstr "Bitte einloggen" + +#~ msgid " One question found" +#~ msgid_plural "%(q_num)s questions found" +#~ msgstr[0] "Eine Frage gefunden" +#~ msgstr[1] "%(q_num)s Fragen gefunden" + +#~ msgid "one revision" +#~ msgid_plural "%(rev_count)s revisions" +#~ msgstr[0] "1 Version" +#~ msgstr[1] "%(rev_count)s Versionen" + +#~ msgid "account_settings" +#~ msgstr "einstellungen" + +#~ msgid "The users have been awarded with badges:" +#~ msgstr "Die Benutzer sind ausgezeichnet worden:" + +#~ msgid "" +#~ "\n" +#~ " one revision\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " %(rev_count)s revisions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "Eine Version" +#~ msgstr[1] "" +#~ "\n" +#~ "%(rev_count)s Versionen" + +#~ msgid "" +#~ "\n" +#~ " see one " +#~ "more \n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " see %(counter)s more\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "ein weiterer " +#~ msgstr[1] "" +#~ "\n" +#~ "%(counter)s weitere " + +#~ msgid "" +#~ "\n" +#~ " see one more " +#~ "comment\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " see %(counter)s more comments\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "ein weiterer Kommentar" +#~ msgstr[1] "" +#~ "\n" +#~ "%(counter)s weitere Kommentar" + +#~ msgid "" +#~ "\n" +#~ " see one more \n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " see %" +#~ "(counter)s more\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "Einen weiteren anschauen" +#~ msgstr[1] "" +#~ "\n" +#~ "%(counter)s weitere anschauen" + +#~ msgid "" +#~ "\n" +#~ " see one more comment\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " see %" +#~ "(counter)s more comments\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "Einen weiteren Kommentar anschauen" +#~ msgstr[1] "" +#~ "\n" +#~ "%(counter)s weitere Kommentare anschauen" + +#~ msgid "" +#~ "\n" +#~ " (one comment)\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " the answer has been commented %(comment_count)s " +#~ "times\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "(Ein Kommentar)" +#~ msgstr[1] "" +#~ "\n" +#~ "(%(comment_count)s Kommentare)" + +#~ msgid "" +#~ "\n" +#~ " 1 Vote\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " %(cnt)s Votes\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "1 Bewertung" +#~ msgstr[1] "" +#~ "\n" +#~ "%(cnt)s Bewertungen" + +#~ msgid "" +#~ "\n" +#~ " 1 Tag\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " %(counter)s Tags\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "1 Tag" +#~ msgstr[1] "" +#~ "\n" +#~ "%(counter)s Tags" + +#~ msgid "welcome to website" +#~ msgstr "Welcome to Q&A forum" + +#~ msgid "Recent awards" +#~ msgstr "Recent badges" + +#~ msgid "all awards" +#~ msgstr "all badges" + +#~ msgid "complete list of questions" +#~ msgstr "list of all questions" + +#~ msgid "popular tags" +#~ msgstr "tags" + +#~ msgid "list of unanswered questions" +#~ msgstr "unanswered questions" + +#~ msgid "" +#~ " have total %(q_num)s questions containing %(searchtitle)s in full text " +#~ msgid_plural "" +#~ " have total %(q_num)s questions containing %(searchtitle)s in full text " +#~ msgstr[0] "" +#~ "
%(q_num)s

question containing " +#~ "%(searchtitle)s

" +#~ msgstr[1] "" +#~ "
%(q_num)s

questions containing " +#~ "%(searchtitle)s

" + +#~ msgid " have total %(q_num)s questions containing %(searchtitle)s " +#~ msgid_plural " have total %(q_num)s questions containing %(searchtitle)s " +#~ msgstr[0] "" +#~ "
%(q_num)s

question with title " +#~ "containing %(searchtitle)s

" +#~ msgstr[1] "" +#~ "
%(q_num)s

questions with title " +#~ "containing %(searchtitle)s

" + +#~ msgid " have total %(q_num)s unanswered questions " +#~ msgid_plural " have total %(q_num)s unanswered questions " +#~ msgstr[0] "" +#~ "
%(q_num)s
questions without " +#~ "accepted answers" +#~ msgstr[1] "" +#~ "
%(q_num)s
questions without " +#~ "accepted answers" + +#~ msgid "Most recently answered ones are shown first." +#~ msgstr "Most recently answered questions are shown first." + +#~ msgid "Questions sorted by number of responses." +#~ msgstr "Questions sorted by the number of answers." + +#~ msgid "Most answered questions are shown first." +#~ msgstr " " + +#~ msgid "avatar, see %(gravatar_faq_url)s" +#~ msgstr "gravatar" + +#~ msgid "" +#~ "Sincerely,
\n" +#~ " Forum Administrator" +#~ msgstr "" +#~ "Sincerely,\n" +#~ "Q&A Forum Administrator" + +#~ msgid "" +#~ "\n" +#~ " have total %(q_num)s unanswered questions\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " have total %(q_num)s unanswered questions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "
%(q_num)s

question without an " +#~ "accepted answer

" +#~ msgstr[1] "" +#~ "\n" +#~ "
%(q_num)s

questions without an " +#~ "accepted answer

" + +#~ msgid "" +#~ "\n" +#~ " have total %(q_num)s questions\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " have total %(q_num)s questions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "
%(q_num)s

question

" +#~ msgstr[1] "" +#~ "\n" +#~ "
%(q_num)s

questions

" diff --git a/askbot/locale/en/LC_MESSAGES/django.mo b/askbot/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 00000000..eacc102a Binary files /dev/null and b/askbot/locale/en/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/en/LC_MESSAGES/django.po b/askbot/locale/en/LC_MESSAGES/django.po new file mode 100644 index 00000000..3da33966 --- /dev/null +++ b/askbot/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,4803 @@ +# English translation for CNPROG package. +# Copyright (C) 2009 Gang Chen, 2010 Askbot +# This file is distributed under the same license as the CNPROG package. +# Evgeny Fadeev , 2009. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-06-03 18:48-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Evgeny Fadeev \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: django_authopenid/forms.py:72 django_authopenid/views.py:134 +msgid "i-names are not supported" +msgstr "" + +#: django_authopenid/forms.py:135 +msgid "Account with this name already exists on the forum" +msgstr "" + +#: django_authopenid/forms.py:136 +msgid "can't have two logins to the same account yet, sorry." +msgstr "" + +#: django_authopenid/forms.py:158 +msgid "Please enter valid username and password (both are case-sensitive)." +msgstr "" + +#: django_authopenid/forms.py:161 django_authopenid/forms.py:211 +msgid "This account is inactive." +msgstr "" + +#: django_authopenid/forms.py:163 +msgid "Login failed." +msgstr "" + +#: django_authopenid/forms.py:165 +msgid "Please enter username and password" +msgstr "" + +#: django_authopenid/forms.py:167 +msgid "Please enter your password" +msgstr "" + +#: django_authopenid/forms.py:169 +msgid "Please enter user name" +msgstr "" + +#: django_authopenid/forms.py:207 +msgid "" +"Please enter a valid username and password. Note that " +"both fields are case-sensitive." +msgstr "" + +#: django_authopenid/forms.py:230 +msgid "Current password" +msgstr "" + +#: django_authopenid/forms.py:241 +msgid "" +"Old password is incorrect. Please enter the correct " +"password." +msgstr "" + +#: django_authopenid/forms.py:306 +msgid "Your user name (required)" +msgstr "" + +#: django_authopenid/forms.py:321 +msgid "Incorrect username." +msgstr "sorry, there is no such user name" + +#: django_authopenid/urls.py:23 django_authopenid/urls.py:24 +#: django_authopenid/urls.py:25 django_authopenid/urls.py:27 +#: fbconnect/urls.py:14 fbconnect/urls.py:15 fbconnect/urls.py:16 +msgid "signin/" +msgstr "" + +#: django_authopenid/urls.py:24 fbconnect/urls.py:15 fbconnect/urls.py:19 +msgid "newquestion/" +msgstr "" + +#: django_authopenid/urls.py:25 fbconnect/urls.py:16 fbconnect/urls.py:20 +msgid "newanswer/" +msgstr "" + +#: django_authopenid/urls.py:26 +msgid "signout/" +msgstr "" + +#: django_authopenid/urls.py:27 +msgid "complete/" +msgstr "" + +#: django_authopenid/urls.py:29 fbconnect/urls.py:18 fbconnect/urls.py:19 +#: fbconnect/urls.py:20 +msgid "register/" +msgstr "" + +#: django_authopenid/urls.py:30 +msgid "signup/" +msgstr "" + +#: django_authopenid/urls.py:32 +msgid "sendpw/" +msgstr "" + +#: django_authopenid/urls.py:33 django_authopenid/urls.py:37 +msgid "password/" +msgstr "" + +#: django_authopenid/urls.py:33 +msgid "confirm/" +msgstr "" + +#: django_authopenid/urls.py:38 django_authopenid/urls.py:39 +#: django_authopenid/urls.py:40 django_authopenid/urls.py:41 +msgid "email/" +msgstr "" + +#: django_authopenid/urls.py:38 +msgid "validate/" +msgstr "" + +#: django_authopenid/urls.py:39 +msgid "change/" +msgstr "" + +#: django_authopenid/urls.py:40 +msgid "sendkey/" +msgstr "" + +#: django_authopenid/urls.py:41 +msgid "verify/" +msgstr "" + +#: django_authopenid/urls.py:42 +msgid "openid/" +msgstr "" + +#: django_authopenid/urls.py:43 forum/urls.py:113 forum/urls.py:120 +msgid "delete/" +msgstr "" + +#: django_authopenid/urls.py:51 +msgid "external-login/forgot-password/" +msgstr "" + +#: django_authopenid/urls.py:54 +msgid "external-login/signup/" +msgstr "" + +#: django_authopenid/views.py:141 +#, python-format +msgid "OpenID %(openid_url)s is invalid" +msgstr "" + +#: django_authopenid/views.py:616 +msgid "Welcome email subject line" +msgstr "Welcome to the Q&A forum" + +#: django_authopenid/views.py:722 +msgid "Password changed." +msgstr "" + +#: django_authopenid/views.py:734 django_authopenid/views.py:740 +#, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" +"Your email needs to be validated. Please see details here." + +#: django_authopenid/views.py:761 +msgid "Email verification subject line" +msgstr "Verification Email from Q&A forum" + +#: django_authopenid/views.py:852 +msgid "your email was not changed" +msgstr "" + +#: django_authopenid/views.py:900 django_authopenid/views.py:1058 +#, python-format +msgid "No OpenID %s found associated in our database" +msgstr "" + +#: django_authopenid/views.py:904 django_authopenid/views.py:1065 +#, python-format +msgid "The OpenID %s isn't associated to current user logged in" +msgstr "" + +#: django_authopenid/views.py:912 +msgid "Email Changed." +msgstr "" + +#: django_authopenid/views.py:990 +msgid "This OpenID is already associated with another account." +msgstr "" + +#: django_authopenid/views.py:995 +#, python-format +msgid "OpenID %s is now associated with your account." +msgstr "" + +#: django_authopenid/views.py:1068 +msgid "Account deleted." +msgstr "" + +#: django_authopenid/views.py:1120 +msgid "Request for new password" +msgstr "" + +#: django_authopenid/views.py:1134 +msgid "A new password and the activation link were sent to your email address." +msgstr "" + +#: django_authopenid/views.py:1166 +#, python-format +msgid "" +"Could not change password. Confirmation key '%s' is not " +"registered." +msgstr "" + +#: django_authopenid/views.py:1176 +msgid "" +"Can not change password. User don't exist anymore in our " +"database." +msgstr "" + +#: django_authopenid/views.py:1186 +#, python-format +msgid "Password changed for %s. You may now sign in." +msgstr "" + +#: forum/auth.py:528 +msgid "Your question and all of it's answers have been deleted" +msgstr "" + +#: forum/auth.py:531 +msgid "Your question has been deleted" +msgstr "" + +#: forum/auth.py:535 +msgid "The question and all of it's answers have been deleted" +msgstr "" + +#: forum/auth.py:538 +msgid "The question has been deleted" +msgstr "" + +#: forum/feed.py:22 +msgid " - " +msgstr "" + +#: forum/feed.py:22 +msgid "latest questions" +msgstr "" + +#: forum/forms.py:23 forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "title" +msgstr "" + +#: forum/forms.py:24 +msgid "please enter a descriptive title for your question" +msgstr "" + +#: forum/forms.py:29 +msgid "title must be > 10 characters" +msgstr "" + +#: forum/forms.py:38 +msgid "content" +msgstr "" + +#: forum/forms.py:44 +msgid "question content must be > 10 characters" +msgstr "" + +#: forum/forms.py:53 forum/skins/default/templates/header.html:28 +msgid "tags" +msgstr "" + +#: forum/forms.py:55 +msgid "" +"Tags are short keywords, with no spaces within. Up to five tags can be used." +msgstr "" + +#: forum/forms.py:62 forum/skins/default/templates/question_retag.html:39 +msgid "tags are required" +msgstr "" + +#: forum/forms.py:71 +#, python-format +msgid "please use %(tag_count)d tag or less" +msgid_plural "please use %(tag_count)d tags or less" +msgstr[0] "" +msgstr[1] "" + +#: forum/forms.py:80 +#, python-format +msgid "each tag must be shorter than %(max_chars)d character" +msgid_plural "each tag must be shorter than %(max_chars)d characters" +msgstr[0] "" +msgstr[1] "" + +#: forum/forms.py:88 +msgid "use-these-chars-in-tags" +msgstr "" + +#: forum/forms.py:98 +#: forum/skins/default/templates/post_contributor_info.html:7 +#: forum/skins/default/templates/question_summary_list_roll.html:26 +#: forum/skins/default/templates/question_summary_list_roll.html:38 +msgid "community wiki" +msgstr "" + +#: forum/forms.py:99 +msgid "" +"if you choose community wiki option, the question and answer do not generate " +"points and name of author will not be shown" +msgstr "" + +#: forum/forms.py:115 +msgid "update summary:" +msgstr "" + +#: forum/forms.py:116 +msgid "" +"enter a brief summary of your revision (e.g. fixed spelling, grammar, " +"improved style, this field is optional)" +msgstr "" + +#: forum/forms.py:119 +msgid "Automatically accept user's contributions for the email updates" +msgstr "" + +#: forum/forms.py:210 +msgid "Your name:" +msgstr "" + +#: forum/forms.py:211 +msgid "Email (not shared with anyone):" +msgstr "" + +#: forum/forms.py:212 +msgid "Your message:" +msgstr "" + +#: forum/forms.py:295 +msgid "this email does not have to be linked to gravatar" +msgstr "" + +#: forum/forms.py:297 +msgid "Screen name" +msgstr "" + +#: forum/forms.py:298 +msgid "Real name" +msgstr "" + +#: forum/forms.py:299 +msgid "Website" +msgstr "" + +#: forum/forms.py:300 +msgid "Location" +msgstr "" + +#: forum/forms.py:301 +msgid "Date of birth" +msgstr "" + +#: forum/forms.py:301 +msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" +msgstr "" + +#: forum/forms.py:302 forum/skins/default/templates/account_settings.html:21 +#: forum/skins/default/templates/authopenid/settings.html:21 +msgid "Profile" +msgstr "" + +#: forum/forms.py:333 forum/forms.py:334 +msgid "this email has already been registered, please use another one" +msgstr "" + +#: forum/forms.py:340 +msgid "Choose email tag filter" +msgstr "" + +#: forum/forms.py:379 +msgid "Asked by me" +msgstr "" + +#: forum/forms.py:382 +msgid "Answered by me" +msgstr "" + +#: forum/forms.py:385 +msgid "Individually selected" +msgstr "" + +#: forum/forms.py:388 +msgid "Entire forum (tag filtered)" +msgstr "" + +#: forum/forms.py:392 +msgid "Comments and posts mentioning me" +msgstr "" + +#: forum/forms.py:450 +msgid "okay, let's try!" +msgstr "" + +#: forum/forms.py:451 +msgid "no community email please, thanks" +msgstr "no askbot email please, thanks" + +#: forum/forms.py:455 +msgid "please choose one of the options above" +msgstr "" + +#: forum/urls.py:37 +msgid "upfiles/" +msgstr "" + +#: forum/urls.py:42 +msgid "about/" +msgstr "" + +#: forum/urls.py:43 forum/conf/site_settings.py:75 +msgid "faq/" +msgstr "" + +#: forum/urls.py:44 +msgid "privacy/" +msgstr "" + +#: forum/urls.py:45 +msgid "logout/" +msgstr "" + +#: forum/urls.py:47 forum/urls.py:52 forum/urls.py:57 forum/urls.py:120 +msgid "answers/" +msgstr "" + +#: forum/urls.py:47 forum/urls.py:102 forum/urls.py:113 forum/urls.py:120 +msgid "comments/" +msgstr "" + +#: forum/urls.py:52 forum/urls.py:72 forum/urls.py:166 +#: forum/skins/default/templates/user_info.html:47 +msgid "edit/" +msgstr "" + +#: forum/urls.py:57 forum/urls.py:97 +msgid "revisions/" +msgstr "" + +#: forum/urls.py:62 forum/urls.py:67 forum/urls.py:72 forum/urls.py:77 +#: forum/urls.py:82 forum/urls.py:87 forum/urls.py:92 forum/urls.py:97 +#: forum/urls.py:102 forum/urls.py:113 +msgid "questions/" +msgstr "" + +#: forum/urls.py:67 forum_modules/books/urls.py:8 +msgid "ask/" +msgstr "" + +#: forum/urls.py:77 +msgid "close/" +msgstr "" + +#: forum/urls.py:82 +msgid "reopen/" +msgstr "" + +#: forum/urls.py:87 +msgid "answer/" +msgstr "" + +#: forum/urls.py:92 +msgid "vote/" +msgstr "" + +#: forum/urls.py:107 +msgid "command/" +msgstr "" + +#: forum/urls.py:127 forum/views/readers.py:256 +msgid "question/" +msgstr "" + +#: forum/urls.py:132 +msgid "tags/" +msgstr "" + +#: forum/urls.py:137 forum/urls.py:143 +msgid "mark-tag/" +msgstr "" + +#: forum/urls.py:137 +msgid "interesting/" +msgstr "" + +#: forum/urls.py:143 +msgid "ignored/" +msgstr "" + +#: forum/urls.py:149 +msgid "unmark-tag/" +msgstr "" + +#: forum/urls.py:155 forum/urls.py:166 forum/urls.py:171 +msgid "users/" +msgstr "" + +#: forum/urls.py:160 +msgid "moderate-user/" +msgstr "" + +#: forum/urls.py:176 forum/urls.py:181 +msgid "badges/" +msgstr "" + +#: forum/urls.py:186 +msgid "messages/" +msgstr "" + +#: forum/urls.py:186 +msgid "markread/" +msgstr "" + +#: forum/urls.py:197 +msgid "upload/" +msgstr "" + +#: forum/urls.py:198 +msgid "search/" +msgstr "" + +#: forum/urls.py:199 +msgid "feedback/" +msgstr "" + +#: forum/urls.py:200 +msgid "account/" +msgstr "" + +#: forum/conf/email.py:12 +msgid "Email and email alert settings" +msgstr "" + +#: forum/conf/email.py:20 +msgid "Maximum number of news entries in an email alert" +msgstr "" + +#: forum/conf/email.py:30 +msgid "Default news notification frequency" +msgstr "" + +#: forum/conf/email.py:32 +msgid "" +"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" +msgstr "" + +#: forum/conf/email.py:47 +msgid "Require email verification before allowing to post" +msgstr "" + +#: forum/conf/email.py:48 +msgid "" +"Active email verification is done by sending a verification key in email" +msgstr "" + +#: forum/conf/email.py:57 +msgid "Allow only one account per email address" +msgstr "" + +#: forum/conf/email.py:66 +msgid "Fake email for anonymous user" +msgstr "" + +#: forum/conf/email.py:67 +msgid "Use this setting to control gravatar for email-less user" +msgstr "" + +#: forum/conf/external_keys.py:11 +msgid "Keys to connect the site with external services like Facebook, etc." +msgstr "" + +#: forum/conf/external_keys.py:18 +msgid "Google site verification key" +msgstr "" + +#: forum/conf/external_keys.py:20 +#, python-format +msgid "" +"This key helps google index your site please obtain is at google webmasters tools site" +msgstr "" + +#: forum/conf/external_keys.py:34 +msgid "Google Analytics key" +msgstr "" + +#: forum/conf/external_keys.py:36 +#, python-format +msgid "" +"Obtain is at Google Analytics site, if you wish " +"to use Google Analytics to monitor your site" +msgstr "" + +#: forum/conf/external_keys.py:49 +msgid "Recaptcha private key" +msgstr "" + +#: forum/conf/external_keys.py:52 +msgid "" +"Recaptcha is a tool that helps distinguish real people from annoying spam " +"robots. Please get this and a public key at the recaptcha.net" +msgstr "" + +#: forum/conf/external_keys.py:65 +msgid "Recaptcha public key" +msgstr "" + +#: forum/conf/external_keys.py:73 +msgid "Facebook public API key" +msgstr "" + +#: forum/conf/external_keys.py:76 +msgid "" +"Facebook API key and Facebook secret allow to use Facebook Connect login " +"method at your site. Please obtain these keys at facebook create app site" +msgstr "" + +#: forum/conf/external_keys.py:91 +msgid "Facebook secret key" +msgstr "" + +#: forum/conf/flatpages.py:10 +msgid "Flatpages - about, privacy policy, etc." +msgstr "" + +#: forum/conf/flatpages.py:17 +msgid "Text the Q&A forum About page (html format)" +msgstr "" + +#: forum/conf/flatpages.py:20 +msgid "" +"Save, then use HTML validator on " +"the \"about\" page to check your input." +msgstr "" + +#: forum/conf/flatpages.py:30 +msgid "Text the Q&A forum Privacy Policy (html format)" +msgstr "" + +#: forum/conf/flatpages.py:33 +msgid "" +"Save, then use HTML validator on " +"the \"privacy\" page to check your input." +msgstr "" + +#: forum/conf/forum_data_rules.py:12 +msgid "Settings for forum data entry and display" +msgstr "" + +#: forum/conf/forum_data_rules.py:20 +msgid "Check to enable community wiki feature" +msgstr "" + +#: forum/conf/forum_data_rules.py:29 +msgid "Maximum length of tag (number of characters)" +msgstr "" + +#: forum/conf/forum_data_rules.py:38 +msgid "Maximum number of tags per question" +msgstr "" + +#: forum/conf/forum_data_rules.py:50 +msgid "Number of questions to list by default" +msgstr "" + +#: forum/conf/forum_data_rules.py:60 +msgid "What should \"unanswered question\" mean?" +msgstr "" + +#: forum/conf/minimum_reputation.py:11 +msgid "Minimum reputation required to perform actions" +msgstr "" + +#: forum/conf/minimum_reputation.py:20 +msgid "Upvote" +msgstr "" + +#: forum/conf/minimum_reputation.py:29 +msgid "Downvote" +msgstr "" + +#: forum/conf/minimum_reputation.py:38 +msgid "Flag offensive" +msgstr "" + +#: forum/conf/minimum_reputation.py:47 +msgid "Leave comments" +msgstr "" + +#: forum/conf/minimum_reputation.py:56 +msgid "Delete comments posted by others" +msgstr "" + +#: forum/conf/minimum_reputation.py:65 +msgid "Upload files" +msgstr "" + +#: forum/conf/minimum_reputation.py:74 +msgid "Close own questions" +msgstr "" + +#: forum/conf/minimum_reputation.py:83 +msgid "Retag questions posted by other people" +msgstr "" + +#: forum/conf/minimum_reputation.py:92 +msgid "Reopen own questions" +msgstr "" + +#: forum/conf/minimum_reputation.py:101 +msgid "Edit community wiki posts" +msgstr "" + +#: forum/conf/minimum_reputation.py:110 +msgid "Edit posts authored by other people" +msgstr "" + +#: forum/conf/minimum_reputation.py:119 +msgid "View offensive flags" +msgstr "" + +#: forum/conf/minimum_reputation.py:128 +msgid "Disable nofollow directive on links" +msgstr "" + +#: forum/conf/minimum_reputation.py:137 +msgid "Close questions asked by others" +msgstr "" + +#: forum/conf/minimum_reputation.py:146 +msgid "Lock posts" +msgstr "" + +#: forum/conf/reputation_changes.py:12 +msgid "Reputaion loss and gain rules" +msgstr "" + +#: forum/conf/reputation_changes.py:21 +msgid "Maximum daily reputation gain per user" +msgstr "" + +#: forum/conf/reputation_changes.py:30 +msgid "Gain for receiving an upvote" +msgstr "" + +#: forum/conf/reputation_changes.py:39 +msgid "Gain for the author of accepted answer" +msgstr "" + +#: forum/conf/reputation_changes.py:48 +msgid "Gain for accepting best answer" +msgstr "" + +#: forum/conf/reputation_changes.py:57 +msgid "Gain for post owner on canceled downvote" +msgstr "" + +#: forum/conf/reputation_changes.py:66 +msgid "Gain for voter on canceling downvote" +msgstr "" + +#: forum/conf/reputation_changes.py:76 +msgid "Loss for voter for canceling of answer acceptance" +msgstr "" + +#: forum/conf/reputation_changes.py:86 +msgid "Loss for author whose answer was \"un-accepted\"" +msgstr "" + +#: forum/conf/reputation_changes.py:96 +msgid "Loss for giving a downvote" +msgstr "" + +#: forum/conf/reputation_changes.py:106 +msgid "Loss for owner of post that was flagged offensive" +msgstr "" + +#: forum/conf/reputation_changes.py:116 +msgid "Loss for owner of post that was downvoted" +msgstr "" + +#: forum/conf/reputation_changes.py:126 +msgid "Loss for owner of post that was flagged 3 times per same revision" +msgstr "" + +#: forum/conf/reputation_changes.py:136 +msgid "Loss for owner of post that was flagged 5 times per same revision" +msgstr "" + +#: forum/conf/reputation_changes.py:146 +msgid "Loss for post owner when upvote is canceled" +msgstr "" + +#: forum/conf/site_settings.py:13 +msgid "Q&A forum website parameters and urls" +msgstr "" + +#: forum/conf/site_settings.py:21 +msgid "Site title for the Q&A forum" +msgstr "" + +#: forum/conf/site_settings.py:30 +msgid "Comma separated list of Q&A site keywords" +msgstr "" + +#: forum/conf/site_settings.py:39 +msgid "Copyright message to show in the footer" +msgstr "" + +#: forum/conf/site_settings.py:48 +msgid "Site description for the search engines" +msgstr "" + +#: forum/conf/site_settings.py:56 +msgid "Askbot" +msgstr "" + +#: forum/conf/site_settings.py:58 +msgid "Short name for your Q&A forum" +msgstr "" + +#: forum/conf/site_settings.py:67 +msgid "Base URL for your Q&A forum, must start with http or https" +msgstr "" + +#: forum/conf/site_settings.py:77 +msgid "Link shown in the greeting message shown to the anonymous user" +msgstr "" + +#: forum/conf/site_settings.py:78 +msgid "" +"If you change this url from the default - then you will also probably want " +"to adjust translation of the following string: " +msgstr "" + +#: forum/conf/site_settings.py:91 +msgid "Feedback site URL" +msgstr "" + +#: forum/conf/site_settings.py:92 +msgid "If left empty, a simple internal feedback form will be used instead" +msgstr "" + +#: forum/conf/skin_counter_settings.py:11 +msgid "Skin: view, vote and answer counters" +msgstr "" + +#: forum/conf/skin_counter_settings.py:19 +msgid "Vote counter value to give \"full color\"" +msgstr "" + +#: forum/conf/skin_counter_settings.py:28 +msgid "Background color for votes = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:29 +#: forum/conf/skin_counter_settings.py:39 +#: forum/conf/skin_counter_settings.py:49 +#: forum/conf/skin_counter_settings.py:59 +#: forum/conf/skin_counter_settings.py:69 +#: forum/conf/skin_counter_settings.py:81 +#: forum/conf/skin_counter_settings.py:100 +#: forum/conf/skin_counter_settings.py:110 +#: forum/conf/skin_counter_settings.py:120 +#: forum/conf/skin_counter_settings.py:132 +#: forum/conf/skin_counter_settings.py:142 +#: forum/conf/skin_counter_settings.py:154 +#: forum/conf/skin_counter_settings.py:175 +#: forum/conf/skin_counter_settings.py:185 +#: forum/conf/skin_counter_settings.py:195 +#: forum/conf/skin_counter_settings.py:205 +#: forum/conf/skin_counter_settings.py:217 +#: forum/conf/skin_counter_settings.py:227 +#: forum/conf/skin_counter_settings.py:239 +#: forum/conf/skin_counter_settings.py:249 +msgid "HTML color name of hex value" +msgstr "" + +#: forum/conf/skin_counter_settings.py:38 +msgid "Foreground color for votes = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:48 +msgid "Background color for votes = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:58 +msgid "Foreground color for votes = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:68 +msgid "Background color for votes = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:80 +msgid "Foreground color for votes = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:90 +msgid "View counter value to give \"full color\"" +msgstr "" + +#: forum/conf/skin_counter_settings.py:99 +msgid "Background color for views = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:109 +msgid "Foreground color for views = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:119 +msgid "Background color for views = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:131 +msgid "Foreground color for views = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:141 +msgid "Background color for views = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:153 +msgid "Foreground color for views = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:163 +msgid "Answer counter value to give \"full color\"" +msgstr "" + +#: forum/conf/skin_counter_settings.py:174 +msgid "Background color for answers = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:184 +msgid "Foreground color for answers = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:194 +msgid "Background color for answers = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:204 +msgid "Foreground color for answers = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:216 +msgid "Background color for answers = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:226 +msgid "Foreground color for answers = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:238 +msgid "Background color for accepted" +msgstr "" + +#: forum/conf/skin_counter_settings.py:248 +msgid "Foreground color for accepted answer" +msgstr "" + +#: forum/conf/skin_general_settings.py:11 +msgid "Skin: general settings" +msgstr "" + +#: forum/conf/skin_general_settings.py:20 +msgid "Select skin" +msgstr "" + +#: forum/conf/skin_general_settings.py:29 +msgid "Skin media revision number" +msgstr "" + +#: forum/conf/skin_general_settings.py:31 +msgid "" +"Increment this number when you change image in skin media or stylesheet. " +"This helps avoid showing your users outdated images from their browser cache." +msgstr "" + +#: forum/conf/user_settings.py:10 +msgid "User policy settings" +msgstr "" + +#: forum/conf/user_settings.py:18 +msgid "Allow editing user screen name" +msgstr "" + +#: forum/conf/user_settings.py:28 +msgid "Minimum allowed length for screen name" +msgstr "" + +#: forum/conf/vote_rules.py:13 +msgid "Limits applicable to votes and moderation flags" +msgstr "" + +#: forum/conf/vote_rules.py:22 +msgid "Number of votes a user can cast per day" +msgstr "" + +#: forum/conf/vote_rules.py:31 +msgid "Maximum number of flags per user per day" +msgstr "" + +#: forum/conf/vote_rules.py:40 +msgid "Threshold for warning about remaining daily votes" +msgstr "" + +#: forum/conf/vote_rules.py:49 +msgid "Number of days to allow canceling votes" +msgstr "" + +#: forum/conf/vote_rules.py:58 +msgid "Number of flags required to automatically hide posts" +msgstr "" + +#: forum/conf/vote_rules.py:67 +msgid "Number of flags required to automatically delete posts" +msgstr "" + +#: forum/const/__init__.py:9 +msgid "duplicate question" +msgstr "" + +#: forum/const/__init__.py:10 +msgid "question is off-topic or not relevant" +msgstr "" + +#: forum/const/__init__.py:11 +msgid "too subjective and argumentative" +msgstr "" + +#: forum/const/__init__.py:12 +msgid "not a real question" +msgstr "" + +#: forum/const/__init__.py:13 +msgid "the question is answered, right answer was accepted" +msgstr "" + +#: forum/const/__init__.py:14 +msgid "question is not relevant or outdated" +msgstr "" + +#: forum/const/__init__.py:15 +msgid "question contains offensive or malicious remarks" +msgstr "" + +#: forum/const/__init__.py:16 +msgid "spam or advertising" +msgstr "" + +#: forum/const/__init__.py:17 +msgid "too localized" +msgstr "" + +#: forum/const/__init__.py:38 forum/skins/default/templates/questions.html:70 +#: forum/skins/default/templates/questions.html:75 +msgid "newest" +msgstr "" + +#: forum/const/__init__.py:39 forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/users.html:28 +msgid "oldest" +msgstr "" + +#: forum/const/__init__.py:40 forum/skins/default/templates/questions.html:89 +#: forum/skins/default/templates/questions.html:94 +msgid "active" +msgstr "" + +#: forum/const/__init__.py:41 forum/skins/default/templates/questions.html:83 +msgid "inactive" +msgstr "" + +#: forum/const/__init__.py:42 +msgid "hottest" +msgstr "" + +#: forum/const/__init__.py:43 +msgid "coldest" +msgstr "" + +#: forum/const/__init__.py:44 +msgid "most voted" +msgstr "" + +#: forum/const/__init__.py:45 +msgid "least voted" +msgstr "" + +#: forum/const/__init__.py:46 +msgid "relevance" +msgstr "" + +#: forum/const/__init__.py:53 forum/skins/default/templates/questions.html:52 +msgid "all" +msgstr "" + +#: forum/const/__init__.py:54 forum/skins/default/templates/questions.html:53 +msgid "unanswered" +msgstr "" + +#: forum/const/__init__.py:55 forum/skins/default/templates/questions.html:55 +msgid "favorite" +msgstr "" + +#: forum/const/__init__.py:67 +msgid "Question has no answers" +msgstr "" + +#: forum/const/__init__.py:68 +msgid "Question has no accepted answers" +msgstr "" + +#: forum/const/__init__.py:106 +msgid "question" +msgstr "" + +#: forum/const/__init__.py:107 forum/skins/default/templates/book.html:110 +msgid "answer" +msgstr "" + +#: forum/const/__init__.py:108 +msgid "commented question" +msgstr "" + +#: forum/const/__init__.py:109 +msgid "commented answer" +msgstr "" + +#: forum/const/__init__.py:110 +msgid "edited question" +msgstr "" + +#: forum/const/__init__.py:111 +msgid "edited answer" +msgstr "" + +#: forum/const/__init__.py:112 +msgid "received award" +msgstr "received badge" + +#: forum/const/__init__.py:113 +msgid "marked best answer" +msgstr "" + +#: forum/const/__init__.py:114 +msgid "upvoted" +msgstr "" + +#: forum/const/__init__.py:115 +msgid "downvoted" +msgstr "" + +#: forum/const/__init__.py:116 +msgid "canceled vote" +msgstr "" + +#: forum/const/__init__.py:117 +msgid "deleted question" +msgstr "" + +#: forum/const/__init__.py:118 +msgid "deleted answer" +msgstr "" + +#: forum/const/__init__.py:119 +msgid "marked offensive" +msgstr "" + +#: forum/const/__init__.py:120 +msgid "updated tags" +msgstr "" + +#: forum/const/__init__.py:121 +msgid "selected favorite" +msgstr "" + +#: forum/const/__init__.py:122 +msgid "completed user profile" +msgstr "" + +#: forum/const/__init__.py:123 +msgid "email update sent to user" +msgstr "" + +#: forum/const/__init__.py:124 +msgid "mentioned in the post" +msgstr "" + +#: forum/const/__init__.py:171 +msgid "question_answered" +msgstr "answered question" + +#: forum/const/__init__.py:172 +msgid "question_commented" +msgstr "commented question" + +#: forum/const/__init__.py:173 +msgid "answer_commented" +msgstr "" + +#: forum/const/__init__.py:174 +msgid "answer_accepted" +msgstr "" + +#: forum/const/__init__.py:178 +msgid "[closed]" +msgstr "" + +#: forum/const/__init__.py:179 +msgid "[deleted]" +msgstr "" + +#: forum/const/__init__.py:180 forum/views/readers.py:387 +#: forum/views/readers.py:408 +msgid "initial version" +msgstr "" + +#: forum/const/__init__.py:181 +msgid "retagged" +msgstr "" + +#: forum/const/__init__.py:186 +msgid "exclude ignored tags" +msgstr "" + +#: forum/const/__init__.py:187 +msgid "allow only selected tags" +msgstr "" + +#: forum/const/__init__.py:191 +msgid "instantly" +msgstr "" + +#: forum/const/__init__.py:192 +msgid "daily" +msgstr "" + +#: forum/const/__init__.py:193 +msgid "weekly" +msgstr "" + +#: forum/const/__init__.py:194 +msgid "no email" +msgstr "" + +#: forum/const/message_keys.py:19 +#, python-format +msgid "First time here? Check out the FAQ!" +msgstr "" + +#: forum/importers/stackexchange/management/commands/load_stackexchange.py:124 +msgid "Congratulations, you are now an Administrator" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:380 +#: forum/models/__init__.py:320 +msgid "email update message subject" +msgstr "news from Q&A forum" + +#: forum/management/commands/send_email_alerts.py:382 +#, python-format +msgid "%(name)s, this is an update message header for %(num)d question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "" +"

Dear %(name)s,

The following question has been updated on the Q&A " +"forum:

" +msgstr[1] "" +"

Dear %(name)s,

The following %(num)d questions have been updated on " +"the Q&A forum:

" + +#: forum/management/commands/send_email_alerts.py:399 +msgid "new question" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:416 +msgid "" +"Please visit the forum and see what's new! Could you spread the word about " +"it - can somebody you know help answering those questions or benefit from " +"posting one?" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:428 +msgid "" +"Your most frequent subscription setting is 'daily' on selected questions. If " +"you are receiving more than one email per dayplease tell about this issue to " +"the forum administrator." +msgstr "" + +#: forum/management/commands/send_email_alerts.py:434 +msgid "" +"Your most frequent subscription setting is 'weekly' if you are receiving " +"this email more than once a week please report this issue to the forum " +"administrator." +msgstr "" + +#: forum/management/commands/send_email_alerts.py:440 +msgid "" +"There is a chance that you may be receiving links seen before - due to a " +"technicality that will eventually go away. " +msgstr "" + +#: forum/management/commands/send_email_alerts.py:455 +#, python-format +msgid "" +"go to %(email_settings_link)s to change frequency of email updates or %" +"(admin_email)s administrator" +msgstr "" +"

Please remember that you can always adjust " +"frequency of the email updates or turn them off entirely.
If you believe " +"that this message was sent in an error, please email about it the forum " +"administrator at %(admin_email)s.

Sincerely,

Your friendly Q&A forum " +"server.

" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Deleted own post with score of 3 or higher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Peer Pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "peer-pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Deleted own post with score of -3 or lower" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Nice answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +msgid "nice-answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Answer voted up 10 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Nice Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "nice-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Question voted up 10 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Pundit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "pundit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Left 10 comments with score of 10 or more" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Popular Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "popular-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Asked a question with 1,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "Citizen patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "citizen-patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "First flagged post" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "Cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "First rollback" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "Critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "First down vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "Editor" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "editor" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "First edit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "Organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "First retag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "Scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "First accepted answer on your own question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Asked first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "Supporter" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "supporter" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "First up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Teacher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "teacher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Answered first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Completed all user profile fields" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Self-Learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "self-learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Answered your own question with at least 3 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Great Answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "great-answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Answer voted up 100 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Great Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "great-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Question voted up 100 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Stellar Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "stellar-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Question favorited by 100 users" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Famous question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "famous-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Asked a question with 10,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Actively participated in the private alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Good Answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "good-answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Answer voted up 25 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Good Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "good-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Question voted up 25 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Favorite Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "favorite-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Question favorited by 25 users" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Civic duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "civic-duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Voted 300 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Strunk & White" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "strunk-and-white" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Edited 100 entries" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Active in many different tags" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Expert" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "expert" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Very active in one tag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Active member for a year" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Notable Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "notable-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Asked a question with 2,500 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "Enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "First answer was accepted with at least 10 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Actively participated in the private beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Accepted answer and voted up 40 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Answered a question more than 60 days later with at least 5 votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Created a tag used by 50 questions" +msgstr "" + +#: forum/models/question.py:531 +#, python-format +msgid "%(author)s modified the question" +msgstr "" + +#: forum/models/question.py:535 +#, python-format +msgid "%(people)s posted %(new_answer_count)s new answers" +msgstr "" + +#: forum/models/question.py:540 +#, python-format +msgid "%(people)s commented the question" +msgstr "" + +#: forum/models/question.py:545 +#, python-format +msgid "%(people)s commented answers" +msgstr "" + +#: forum/models/question.py:547 +#, python-format +msgid "%(people)s commented an answer" +msgstr "" + +#: forum/models/repute.py:16 forum/skins/default/templates/badges.html:54 +msgid "gold" +msgstr "" + +#: forum/models/repute.py:17 forum/skins/default/templates/badges.html:62 +msgid "silver" +msgstr "" + +#: forum/models/repute.py:18 forum/skins/default/templates/badges.html:69 +msgid "bronze" +msgstr "" + +#: forum/models/tag.py:84 +msgid "interesting" +msgstr "" + +#: forum/models/tag.py:84 +msgid "ignored" +msgstr "" + +#: forum/models/user.py:212 +msgid "Entire forum" +msgstr "" + +#: forum/models/user.py:213 +msgid "Questions that I asked" +msgstr "" + +#: forum/models/user.py:214 +msgid "Questions that I answered" +msgstr "" + +#: forum/models/user.py:215 +msgid "Individually selected questions" +msgstr "" + +#: forum/models/user.py:216 +msgid "Mentions and comment responses" +msgstr "" + +#: forum/models/user.py:219 +msgid "Instantly" +msgstr "" + +#: forum/models/user.py:220 +msgid "Daily" +msgstr "" + +#: forum/models/user.py:221 +msgid "Weekly" +msgstr "" + +#: forum/models/user.py:222 +msgid "No email" +msgstr "" + +#: forum/skins/default/templates/404.html:24 +msgid "Sorry, could not find the page you requested." +msgstr "" + +#: forum/skins/default/templates/404.html:26 +msgid "This might have happened for the following reasons:" +msgstr "" + +#: forum/skins/default/templates/404.html:28 +msgid "this question or answer has been deleted;" +msgstr "" + +#: forum/skins/default/templates/404.html:29 +msgid "url has error - please check it;" +msgstr "" + +#: forum/skins/default/templates/404.html:30 +msgid "" +"the page you tried to visit is protected or you don't have sufficient " +"points, see" +msgstr "" + +#: forum/skins/default/templates/404.html:31 +msgid "if you believe this error 404 should not have occured, please" +msgstr "" + +#: forum/skins/default/templates/404.html:32 +msgid "report this problem" +msgstr "" + +#: forum/skins/default/templates/404.html:41 +#: forum/skins/default/templates/500.html:27 +msgid "back to previous page" +msgstr "" + +#: forum/skins/default/templates/404.html:42 +#: forum/skins/default/templates/questions.html:52 +msgid "see all questions" +msgstr "" + +#: forum/skins/default/templates/404.html:43 +msgid "see all tags" +msgstr "" + +#: forum/skins/default/templates/500.html:22 +msgid "sorry, system error" +msgstr "" + +#: forum/skins/default/templates/500.html:24 +msgid "system error log is recorded, error will be fixed as soon as possible" +msgstr "" + +#: forum/skins/default/templates/500.html:25 +msgid "please report the error to the site administrators if you wish" +msgstr "" + +#: forum/skins/default/templates/500.html:28 +msgid "see latest questions" +msgstr "" + +#: forum/skins/default/templates/500.html:29 +msgid "see tags" +msgstr "" + +#: forum/skins/default/templates/about.html:6 +#: forum/skins/default/templates/about.html:11 +msgid "About" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:4 +#: forum/skins/default/templates/authopenid/settings.html:4 +msgid "Account functions" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:29 +#: forum/skins/default/templates/authopenid/changepw.html:5 +#: forum/skins/default/templates/authopenid/changepw.html:14 +#: forum/skins/default/templates/authopenid/settings.html:29 +#: livesettings/templates/livesettings/group_settings.html:11 +#: livesettings/templates/livesettings/site_settings.html:23 +msgid "Change password" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:30 +#: forum/skins/default/templates/authopenid/settings.html:30 +msgid "Give your account a new password." +msgstr "" + +#: forum/skins/default/templates/account_settings.html:32 +#: forum/skins/default/templates/authopenid/settings.html:31 +msgid "Change email " +msgstr "" + +#: forum/skins/default/templates/account_settings.html:33 +#: forum/skins/default/templates/authopenid/settings.html:32 +msgid "Add or update the email address associated with your account." +msgstr "" + +#: forum/skins/default/templates/account_settings.html:35 +#: forum/skins/default/templates/authopenid/changeopenid.html:4 +#: forum/skins/default/templates/authopenid/changeopenid.html:30 +#: forum/skins/default/templates/authopenid/settings.html:34 +msgid "Change OpenID" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:36 +#: forum/skins/default/templates/authopenid/settings.html:35 +msgid "Change openid associated to your account" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:39 +#: forum/skins/default/templates/authopenid/delete.html:4 +#: forum/skins/default/templates/authopenid/settings.html:38 +msgid "Delete account" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:40 +#: forum/skins/default/templates/authopenid/settings.html:39 +msgid "Erase your username and all your data from website" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:5 +#: forum/skins/default/templates/answer_edit.html:48 +msgid "Edit answer" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:25 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:26 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:48 +#: forum/skins/default/templates/question.html:51 +#: forum/skins/default/templates/question_edit.html:25 +#: forum/skins/default/templates/question_edit.html:28 +msgid "hide preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:51 +#: forum/skins/default/templates/question_edit.html:28 +msgid "show preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:48 +#: forum/skins/default/templates/question_edit.html:66 +#: forum/skins/default/templates/question_retag.html:53 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "back" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:53 +#: forum/skins/default/templates/question_edit.html:71 +#: forum/skins/default/templates/revisions_answer.html:52 +#: forum/skins/default/templates/revisions_question.html:52 +msgid "revision" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:56 +#: forum/skins/default/templates/question_edit.html:75 +msgid "select revision" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:420 +#: forum/skins/default/templates/question_edit.html:92 +msgid "Toggle the real time Markdown editor preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:421 +#: forum/skins/default/templates/question_edit.html:92 +msgid "toggle preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:72 +#: forum/skins/default/templates/question_edit.html:118 +#: forum/skins/default/templates/question_retag.html:74 +msgid "Save edit" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:73 +#: forum/skins/default/templates/close.html:29 +#: forum/skins/default/templates/feedback.html:50 +#: forum/skins/default/templates/question_edit.html:119 +#: forum/skins/default/templates/question_retag.html:75 +#: forum/skins/default/templates/reopen.html:30 +#: forum/skins/default/templates/user_edit.html:90 +#: forum/skins/default/templates/authopenid/changeemail.html:40 +msgid "Cancel" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:4 +msgid "answer tips" +msgstr "Tips" + +#: forum/skins/default/templates/answer_edit_tips.html:7 +msgid "please make your answer relevant to this community" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:10 +msgid "try to give an answer, rather than engage into a discussion" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:13 +msgid "please try to provide details" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:16 +#: forum/skins/default/templates/question_edit_tips.html:13 +msgid "be clear and concise" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:20 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "see frequently asked questions" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:26 +#: forum/skins/default/templates/question_edit_tips.html:23 +msgid "Markdown tips" +msgstr "Markdown basics" + +#: forum/skins/default/templates/answer_edit_tips.html:29 +#: forum/skins/default/templates/question_edit_tips.html:26 +msgid "*italic* or __italic__" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:29 +msgid "**bold** or __bold__" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/question_edit_tips.html:32 +msgid "link" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "text" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "image" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:43 +#: forum/skins/default/templates/question_edit_tips.html:41 +msgid "numbered list:" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:48 +#: forum/skins/default/templates/question_edit_tips.html:46 +msgid "basic HTML tags are also supported" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:52 +#: forum/skins/default/templates/question_edit_tips.html:50 +msgid "learn more about Markdown" +msgstr "" + +#: forum/skins/default/templates/ask.html:5 +#: forum/skins/default/templates/ask.html:62 +msgid "Ask a question" +msgstr "" + +#: forum/skins/default/templates/ask.html:69 +#: forum/skins/default/templates/ask_form.html:11 +msgid "login to post question info" +msgstr "" +"You are welcome to start submitting your question " +"anonymously. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: forum/skins/default/templates/ask.html:75 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Looks like your email address, %(email)s has not " +"yet been validated. To post messages you must verify your email, " +"please see more details here." +"
You can submit your question now and validate email after that. Your " +"question will saved as pending meanwhile. " + +#: forum/skins/default/templates/ask.html:113 +#: forum/skins/default/templates/ask_form.html:54 +msgid "(required)" +msgstr "" + +#: forum/skins/default/templates/ask.html:120 +#: forum/skins/default/templates/ask_form.html:61 +msgid "Login/signup to post your question" +msgstr "Login/Signup to Post" + +#: forum/skins/default/templates/ask.html:122 +#: forum/skins/default/templates/ask_form.html:63 +msgid "Ask your question" +msgstr "Ask Your Question" + +#: forum/skins/default/templates/ask_form.html:15 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Looks like your email address, %(email)s has not " +"yet been validated. To post messages you must verify your email, " +"please see more details here." +"
You can submit your question now and validate email after that. Your " +"question will saved as pending meanwhile. " + +#: forum/skins/default/templates/badge.html:6 +#: forum/skins/default/templates/badge.html:17 +msgid "Badge" +msgstr "" + +#: forum/skins/default/templates/badge.html:26 +msgid "user received this badge:" +msgid_plural "users received this badge:" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/badges.html:6 +msgid "Badges summary" +msgstr "" + +#: forum/skins/default/templates/badges.html:17 +msgid "Badges" +msgstr "" + +#: forum/skins/default/templates/badges.html:21 +msgid "Community gives you awards for your questions, answers and votes." +msgstr "" +"If your questions and answers are highly voted, your contribution to this " +"Q&A community will be recognized with the variety of badges." + +#: forum/skins/default/templates/badges.html:22 +#, python-format +msgid "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +" " +msgstr "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Have ideas about fun " +"badges? Please, give us your feedback" + +#: forum/skins/default/templates/badges.html:51 +msgid "Community badges" +msgstr "Badge levels" + +#: forum/skins/default/templates/badges.html:57 +msgid "gold badge description" +msgstr "" +"Gold badge is the highest award in this community. To obtain it have to show " +"profound knowledge and ability in addition to your active participation." + +#: forum/skins/default/templates/badges.html:65 +msgid "silver badge description" +msgstr "" +"Obtaining silver badge requires significant patience. If you have received " +"one, that means you have greatly contributed to this community." + +#: forum/skins/default/templates/badges.html:68 +msgid "bronze badge: often given as a special honor" +msgstr "" + +#: forum/skins/default/templates/badges.html:72 +msgid "bronze badge description" +msgstr "" +"If you are an active participant in this community, you will be recognized " +"with this badge." + +#: forum/skins/default/templates/book.html:7 +msgid "reading channel" +msgstr "" + +#: forum/skins/default/templates/book.html:26 +msgid "[author]" +msgstr "" + +#: forum/skins/default/templates/book.html:30 +msgid "[publisher]" +msgstr "" + +#: forum/skins/default/templates/book.html:34 +msgid "[publication date]" +msgstr "" + +#: forum/skins/default/templates/book.html:38 +msgid "[price]" +msgstr "" + +#: forum/skins/default/templates/book.html:39 +msgid "currency unit" +msgstr "" + +#: forum/skins/default/templates/book.html:42 +msgid "[pages]" +msgstr "" + +#: forum/skins/default/templates/book.html:43 +msgid "pages abbreviation" +msgstr "" + +#: forum/skins/default/templates/book.html:46 +msgid "[tags]" +msgstr "" + +#: forum/skins/default/templates/book.html:56 +msgid "author blog" +msgstr "" + +#: forum/skins/default/templates/book.html:62 +msgid "book directory" +msgstr "" + +#: forum/skins/default/templates/book.html:66 +msgid "buy online" +msgstr "" + +#: forum/skins/default/templates/book.html:79 +msgid "reader questions" +msgstr "" + +#: forum/skins/default/templates/book.html:82 +msgid "ask the author" +msgstr "" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:18 +msgid "this question was selected as favorite" +msgstr "" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:18 +msgid "number of times" +msgstr "" + +#: forum/skins/default/templates/book.html:105 +#: forum/skins/default/templates/question_summary_list_roll.html:14 +msgid "votes" +msgstr "" + +#: forum/skins/default/templates/book.html:108 +msgid "the answer has been accepted to be correct" +msgstr "" + +#: forum/skins/default/templates/book.html:115 +#: forum/skins/default/templates/question_summary_list_roll.html:15 +msgid "views" +msgstr "" + +#: forum/skins/default/templates/book.html:125 +#: forum/skins/default/templates/question.html:138 +#: forum/skins/default/templates/question_list.html:19 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/tags.html:50 +#: forum/skins/default/templates/users_questions.html:34 +#, python-format +msgid "see questions tagged '%(tag)s'" +msgstr "" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to book RSS feed" +msgstr "" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to the questions feed" +msgstr "" + +#: forum/skins/default/templates/close.html:6 +#: forum/skins/default/templates/close.html:16 +msgid "Close question" +msgstr "" + +#: forum/skins/default/templates/close.html:19 +msgid "Close the question" +msgstr "" + +#: forum/skins/default/templates/close.html:25 +msgid "Reasons" +msgstr "" + +#: forum/skins/default/templates/close.html:28 +msgid "OK to close" +msgstr "" + +#: forum/skins/default/templates/email_base.html:11 +msgid "home" +msgstr "" + +#: forum/skins/default/templates/faq.html:12 +msgid "Frequently Asked Questions " +msgstr "" + +#: forum/skins/default/templates/faq.html:17 +msgid "What kinds of questions can I ask here?" +msgstr "" + +#: forum/skins/default/templates/faq.html:18 +msgid "" +"Most importanly - questions should be relevant to this " +"community." +msgstr "" + +#: forum/skins/default/templates/faq.html:19 +msgid "" +"Before asking the question - please make sure to use search to see whether " +"your question has alredy been answered." +msgstr "" +"Before you ask - please make sure to search for a similar question. You can " +"search questions by their title or tags." + +#: forum/skins/default/templates/faq.html:22 +msgid "What questions should I avoid asking?" +msgstr "What kinds of questions should be avoided?" + +#: forum/skins/default/templates/faq.html:23 +msgid "" +"Please avoid asking questions that are not relevant to this community, too " +"subjective and argumentative." +msgstr "" + +#: forum/skins/default/templates/faq.html:28 +msgid "What should I avoid in my answers?" +msgstr "" + +#: forum/skins/default/templates/faq.html:29 +msgid "" +"is a Q&A site, not a discussion group. Therefore - please avoid having " +"discussions in your answers, comment facility allows some space for brief " +"discussions." +msgstr "" +"is a question and answer site - it is not a " +"discussion group. Please avoid holding debates in your answers as " +"they tend to dilute the essense of questions and answers. For the brief " +"discussions please use commenting facility." + +#: forum/skins/default/templates/faq.html:33 +msgid "Who moderates this community?" +msgstr "" + +#: forum/skins/default/templates/faq.html:34 +msgid "The short answer is: you." +msgstr "" + +#: forum/skins/default/templates/faq.html:35 +msgid "This website is moderated by the users." +msgstr "" + +#: forum/skins/default/templates/faq.html:36 +msgid "" +"The reputation system allows users earn the authorization to perform a " +"variety of moderation tasks." +msgstr "" +"Karma system allows users to earn rights to perform a variety of moderation " +"tasks" + +#: forum/skins/default/templates/faq.html:41 +msgid "How does reputation system work?" +msgstr "How does karma system work?" + +#: forum/skins/default/templates/faq.html:42 +msgid "Rep system summary" +msgstr "" +"When a question or answer is upvoted, the user who posted them will gain " +"some points, which are called \"karma points\". These points serve as a " +"rough measure of the community trust to him/her. Various moderation tasks " +"are gradually assigned to the users based on those points." + +#: forum/skins/default/templates/faq.html:43 +#, python-format +msgid "" +"For example, if you ask an interesting question or give a helpful answer, " +"your input will be upvoted. On the other hand if the answer is misleading - " +"it will be downvoted. Each vote in favor will generate %" +"(REP_GAIN_FOR_RECEIVING_UPVOTE)s points, each vote against will " +"subtract %(REP_LOSS_FOR_RECEIVING_DOWNVOTE)s points. There " +"is a limit of %(MAX_REP_GAIN_PER_USER_PER_DAY)s points that " +"can be accumulated for a question or answer per day. The table below " +"explains reputation point requirements for each type of moderation task." +msgstr "" + +#: forum/skins/default/templates/faq.html:53 +#: forum/skins/default/templates/user_votes.html:15 +msgid "upvote" +msgstr "" + +#: forum/skins/default/templates/faq.html:58 +msgid "use tags" +msgstr "" + +#: forum/skins/default/templates/faq.html:63 +msgid "add comments" +msgstr "" + +#: forum/skins/default/templates/faq.html:67 +#: forum/skins/default/templates/user_votes.html:17 +msgid "downvote" +msgstr "" + +#: forum/skins/default/templates/faq.html:70 +msgid "open and close own questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:74 +msgid "retag questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:79 +msgid "edit community wiki questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:84 +msgid "edit any answer" +msgstr "" + +#: forum/skins/default/templates/faq.html:88 +msgid "delete any comment" +msgstr "" + +#: forum/skins/default/templates/faq.html:95 +msgid "how to validate email title" +msgstr "How to validate email and why?" + +#: forum/skins/default/templates/faq.html:97 +#, python-format +msgid "" +"how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" +msgstr "" +"

How? If you have just set or changed your " +"email address - check your email and click the included link.
The link contains a key generated specifically for you. You can " +"also and check your email again.

Why? Email validation is required to make sure that " +"only you can post messages on your behalf and to " +"minimize spam posts.
With email you can " +"subscribe for updates on the most interesting questions. " +"Also, when you sign up for the first time - create a unique gravatar personal image.

" + +#: forum/skins/default/templates/faq.html:102 +msgid "what is gravatar" +msgstr "How to change my picture (gravatar) and what is gravatar?" + +#: forum/skins/default/templates/faq.html:103 +msgid "gravatar faq info" +msgstr "" +"

The picture that appears on the users profiles is called " +"gravatar (which means globally recognized avatar).

Here is how it works: a " +"cryptographic key (unbreakable code) is calculated from " +"your email address. You upload your picture (or your favorite alter ego " +"image) the website gravatar.com from where we later retreive your image using the key.

This way all the websites you trust can show your image next to your " +"posts and your email address remains private.

Please " +"personalize your account with an image - just register at " +"gravatar.com (just please " +"be sure to use the same email address that you used to register with us). " +"Default image that looks like a kitchen tile is generated automatically.

" + +#: forum/skins/default/templates/faq.html:106 +msgid "To register, do I need to create new password?" +msgstr "" + +#: forum/skins/default/templates/faq.html:107 +msgid "" +"No, you don't have to. You can login through any service that supports " +"OpenID, e.g. Google, Yahoo, AOL, etc." +msgstr "" + +#: forum/skins/default/templates/faq.html:108 +msgid "Login now!" +msgstr "" + +#: forum/skins/default/templates/faq.html:113 +msgid "Why other people can edit my questions/answers?" +msgstr "" + +#: forum/skins/default/templates/faq.html:114 +msgid "Goal of this site is..." +msgstr "" + +#: forum/skins/default/templates/faq.html:114 +msgid "" +"So questions and answers can be edited like wiki pages by experienced users " +"of this site and this improves the overall quality of the knowledge base " +"content." +msgstr "" + +#: forum/skins/default/templates/faq.html:115 +msgid "If this approach is not for you, we respect your choice." +msgstr "" + +#: forum/skins/default/templates/faq.html:119 +msgid "Still have questions?" +msgstr "" + +#: forum/skins/default/templates/faq.html:120 +#, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "" +"Please ask your question, help make our " +"community better!" + +#: forum/skins/default/templates/faq.html:122 +#: forum/skins/default/templates/header.html:27 +msgid "questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:122 +msgid "." +msgstr "" + +#: forum/skins/default/templates/feedback.html:6 +msgid "Feedback" +msgstr "" + +#: forum/skins/default/templates/feedback.html:11 +msgid "Give us your feedback!" +msgstr "" + +#: forum/skins/default/templates/feedback.html:17 +#, python-format +msgid "" +"\n" +" Dear %(user_name)s, we look " +"forward to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: forum/skins/default/templates/feedback.html:24 +msgid "" +"\n" +" Dear visitor, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: forum/skins/default/templates/feedback.html:41 +msgid "(this field is required)" +msgstr "" + +#: forum/skins/default/templates/feedback.html:49 +msgid "Send Feedback" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:3 +#, python-format +msgid "" +"\n" +"Hello, this is a %(site_title)s forum feedback message\n" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:9 +msgid "Sender is" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:11 +#: forum/skins/default/templates/feedback_email.txt:14 +msgid "email" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:13 +msgid "anonymous" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:19 +msgid "Message body:" +msgstr "" + +#: forum/skins/default/templates/footer.html:8 +#: forum/skins/default/templates/header.html:14 +msgid "about" +msgstr "" + +#: forum/skins/default/templates/footer.html:9 +#: forum/skins/default/templates/header.html:15 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "faq" +msgstr "" + +#: forum/skins/default/templates/footer.html:10 +msgid "privacy policy" +msgstr "" + +#: forum/skins/default/templates/footer.html:19 +msgid "give feedback" +msgstr "" + +#: forum/skins/default/templates/header.html:10 +msgid "logout" +msgstr "sign out" + +#: forum/skins/default/templates/header.html:12 +msgid "login" +msgstr "Hi, there! Please sign in" + +#: forum/skins/default/templates/header.html:22 +msgid "back to home page" +msgstr "" + +#: forum/skins/default/templates/header.html:29 +msgid "users" +msgstr "people" + +#: forum/skins/default/templates/header.html:30 +#: forum/templatetags/extra_tags.py:177 forum/templatetags/extra_tags.py:206 +msgid "badges" +msgstr "" + +#: forum/skins/default/templates/header.html:31 +msgid "ask a question" +msgstr "" + +#: forum/skins/default/templates/input_bar.html:33 +msgid "search" +msgstr "" + +#: forum/skins/default/templates/instant_notification.html:3 +#, python-format +msgid "

Dear %(receiving_user_name)s,

" +msgstr "" + +#: forum/skins/default/templates/instant_notification.html:6 +#, python-format +msgid "" +"\n" +"

%(update_author_name)s left a new comment\n" +"for question \"%(origin_post_title)s\"

\n" +msgstr "" + +#: forum/skins/default/templates/instant_notification.html:12 +#, python-format +msgid "" +"\n" +"

%(update_author_name)s left a new comment\n" +" for an answer to question \"%(origin_post_title)s\"

\n" +msgstr "" + +#: forum/skins/default/templates/instant_notification.html:18 +#, python-format +msgid "" +"\n" +"

%(update_author_name)s answered a question \n" +"%(origin_post_title)s

\n" +msgstr "" + +#: forum/skins/default/templates/instant_notification.html:24 +#, python-format +msgid "" +"\n" +"

%(update_author_name)s asked a question \n" +"%(origin_post_title)s

\n" +msgstr "" + +#: forum/skins/default/templates/instant_notification.html:29 +#, python-format +msgid "" +"\n" +"

%(update_author_name)s updated an answer to the question\n" +"%(origin_post_title)s

\n" +msgstr "" + +#: forum/skins/default/templates/instant_notification.html:34 +#, python-format +msgid "" +"\n" +"

%(update_author_name)s updated a question \n" +"%(origin_post_title)s

\n" +msgstr "" + +#: forum/skins/default/templates/instant_notification.html:40 +#, python-format +msgid "" +"\n" +"

Please note - you can easily change\n" +"how often you receive these notifications.

\n" +msgstr "" + +#: forum/skins/default/templates/instant_notification.html:44 +msgid "

Sincerely,
Forum Administrator

" +msgstr "" + +#: forum/skins/default/templates/logout.html:6 +#: forum/skins/default/templates/logout.html:16 +msgid "Logout" +msgstr "" + +#: forum/skins/default/templates/logout.html:19 +msgid "" +"As a registered user you can login with your OpenID, log out of the site or " +"permanently remove your account." +msgstr "" +"Clicking Logout will log you out from the forumbut will not " +"sign you off from your OpenID provider.

If you wish to sign off " +"completely - please make sure to log out from your OpenID provider as well." + +#: forum/skins/default/templates/logout.html:20 +msgid "Logout now" +msgstr "Logout Now" + +#: forum/skins/default/templates/notarobot.html:3 +msgid "Please prove that you are a Human Being" +msgstr "" + +#: forum/skins/default/templates/notarobot.html:10 +msgid "I am a Human Being" +msgstr "" + +#: forum/skins/default/templates/pagesize.html:6 +msgid "posts per page" +msgstr "" + +#: forum/skins/default/templates/paginator.html:6 +#: forum/skins/default/templates/paginator.html:7 +msgid "previous" +msgstr "" + +#: forum/skins/default/templates/paginator.html:19 +msgid "current page" +msgstr "" + +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 +#, python-format +msgid "page number %(num)s" +msgstr "page %(num)s" + +#: forum/skins/default/templates/paginator.html:33 +msgid "next page" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:9 +#, python-format +msgid "%(rev_count)s revision" +msgid_plural "%(rev_count)s revisions" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/post_contributor_info.html:15 +msgid "asked" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:18 +msgid "answered" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:20 +msgid "posted" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:41 +msgid "updated" +msgstr "" + +#: forum/skins/default/templates/privacy.html:6 +#: forum/skins/default/templates/privacy.html:11 +msgid "Privacy policy" +msgstr "" + +#: forum/skins/default/templates/question.html:80 +#: forum/skins/default/templates/question.html:81 +#: forum/skins/default/templates/question.html:97 +#: forum/skins/default/templates/question.html:99 +msgid "i like this post (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:83 +#: forum/skins/default/templates/question.html:101 +#: forum/skins/default/templates/question.html:253 +msgid "current number of votes" +msgstr "" + +#: forum/skins/default/templates/question.html:92 +#: forum/skins/default/templates/question.html:93 +#: forum/skins/default/templates/question.html:106 +#: forum/skins/default/templates/question.html:107 +msgid "i dont like this post (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:111 +#: forum/skins/default/templates/question.html:112 +msgid "mark this question as favorite (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:118 +#: forum/skins/default/templates/question.html:119 +msgid "remove favorite mark from this question (click again to restore mark)" +msgstr "" + +#: forum/skins/default/templates/question.html:143 +#: forum/skins/default/templates/question.html:290 +#: forum/skins/default/templates/revisions_answer.html:58 +#: forum/skins/default/templates/revisions_question.html:58 +msgid "edit" +msgstr "" + +#: forum/skins/default/templates/question.html:148 +msgid "reopen" +msgstr "" + +#: forum/skins/default/templates/question.html:152 +msgid "close" +msgstr "" + +#: forum/skins/default/templates/question.html:158 +#: forum/skins/default/templates/question.html:295 +msgid "" +"report as offensive (i.e containing spam, advertising, malicious text, etc.)" +msgstr "" + +#: forum/skins/default/templates/question.html:159 +#: forum/skins/default/templates/question.html:296 +msgid "flag offensive" +msgstr "" + +#: forum/skins/default/templates/question.html:167 +#: forum/skins/default/templates/question.html:307 +msgid "delete" +msgstr "" + +#: forum/skins/default/templates/question.html:185 +#: forum/skins/default/templates/question.html:327 +msgid "delete this comment" +msgstr "" + +#: forum/skins/default/templates/question.html:196 +#: forum/skins/default/templates/question.html:338 +msgid "add comment" +msgstr "post a comment" + +#: forum/skins/default/templates/question.html:200 +#: forum/skins/default/templates/question.html:342 +#, python-format +msgid "see %(counter)s more" +msgid_plural "see %(counter)s more" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question.html:202 +#: forum/skins/default/templates/question.html:344 +#, python-format +msgid "see %(counter)s more comment" +msgid_plural "" +"see %(counter)s more comments\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question.html:215 +#, python-format +msgid "" +"The question has been closed for the following reason \"%(close_reason)s\" by" +msgstr "" + +#: forum/skins/default/templates/question.html:217 +#, python-format +msgid "close date %(closed_at)s" +msgstr "" + +#: forum/skins/default/templates/question.html:225 +#, python-format +msgid "" +"\n" +" %(counter)s Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question.html:233 +msgid "oldest answers will be shown first" +msgstr "" + +#: forum/skins/default/templates/question.html:233 +msgid "oldest answers" +msgstr "oldest" + +#: forum/skins/default/templates/question.html:235 +msgid "newest answers will be shown first" +msgstr "" + +#: forum/skins/default/templates/question.html:235 +msgid "newest answers" +msgstr "newest" + +#: forum/skins/default/templates/question.html:237 +msgid "most voted answers will be shown first" +msgstr "" + +#: forum/skins/default/templates/question.html:237 +msgid "popular answers" +msgstr "most voted" + +#: forum/skins/default/templates/question.html:251 +#: forum/skins/default/templates/question.html:252 +msgid "i like this answer (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:258 +#: forum/skins/default/templates/question.html:259 +msgid "i dont like this answer (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:264 +#: forum/skins/default/templates/question.html:265 +msgid "mark this answer as favorite (click again to undo)" +msgstr "" + +#: forum/skins/default/templates/question.html:270 +#: forum/skins/default/templates/question.html:271 +msgid "the author of the question has selected this answer as correct" +msgstr "" + +#: forum/skins/default/templates/question.html:284 +msgid "answer permanent link" +msgstr "" + +#: forum/skins/default/templates/question.html:285 +msgid "permanent link" +msgstr "link" + +#: forum/skins/default/templates/question.html:307 +msgid "undelete" +msgstr "" + +#: forum/skins/default/templates/question.html:366 +#: forum/skins/default/templates/question.html:369 +msgid "Notify me once a day when there are any new answers" +msgstr "" +"Notify me once a day by email when there are any new " +"answers or updates" + +#: forum/skins/default/templates/question.html:372 +msgid "Notify me weekly when there are any new answers" +msgstr "" +"Notify me weekly when there are any new answers or updates" + +#: forum/skins/default/templates/question.html:377 +#, python-format +msgid "" +"You can always adjust frequency of email updates from your %(profile_url)s" +msgstr "" +"(note: you can always change how often you receive updates)" + +#: forum/skins/default/templates/question.html:382 +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "" +"Here (once you log in) you will be able to sign " +"up for the periodic email updates about this question." + +#: forum/skins/default/templates/question.html:393 +msgid "Your answer" +msgstr "" + +#: forum/skins/default/templates/question.html:395 +msgid "Be the first one to answer this question!" +msgstr "" + +#: forum/skins/default/templates/question.html:401 +msgid "you can answer anonymously and then login" +msgstr "" +"Please start posting your answer anonymously " +"- your answer will be saved within the current session and published after " +"you log in or create a new account. Please try to give a substantial " +"answer, for discussions, please use comments and " +"please do remember to vote (after you log in)!" + +#: forum/skins/default/templates/question.html:405 +msgid "answer your own question only to give an answer" +msgstr "" +"You are welcome to answer your own question, " +"but please make sure to give an answer. Remember that you " +"can always revise your original question. Please " +"use comments for discussions and please don't " +"forget to vote :) for the answers that you liked (or perhaps did " +"not like)! " + +#: forum/skins/default/templates/question.html:407 +msgid "please only give an answer, no discussions" +msgstr "" +"Please try to give a substantial answer. If " +"you wanted to comment on the question or answer, just use the " +"commenting tool. Please remember that you can always revise " +"your answers - no need to answer the same question twice. Also, " +"please don't forget to vote - it really helps to select the " +"best questions and answers!" + +#: forum/skins/default/templates/question.html:443 +msgid "Login/Signup to Post Your Answer" +msgstr "" + +#: forum/skins/default/templates/question.html:446 +msgid "Answer Your Own Question" +msgstr "" + +#: forum/skins/default/templates/question.html:448 +msgid "Answer the question" +msgstr "Post Your Answer" + +#: forum/skins/default/templates/question.html:462 +msgid "Question tags" +msgstr "Tags" + +#: forum/skins/default/templates/question.html:467 +#: forum/skins/default/templates/questions.html:261 +#: forum/skins/default/templates/tag_selector.html:11 +#: forum/skins/default/templates/tag_selector.html:28 +#, python-format +msgid "see questions tagged '%(tag_name)s'" +msgstr "" + +#: forum/skins/default/templates/question.html:473 +msgid "question asked" +msgstr "Asked" + +#: forum/skins/default/templates/question.html:476 +msgid "question was seen" +msgstr "Seen" + +#: forum/skins/default/templates/question.html:476 +msgid "times" +msgstr "" + +#: forum/skins/default/templates/question.html:479 +msgid "last updated" +msgstr "Last updated" + +#: forum/skins/default/templates/question.html:485 +msgid "Related questions" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:6 +msgid "Please decide if you like this question or not by voting" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:12 +msgid "" +"\n" +" vote\n" +" " +msgid_plural "" +"\n" +" votes\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_counter_widget.html:21 +msgid "this answer has been accepted to be correct" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:27 +msgid "" +"\n" +" answer \n" +" " +msgid_plural "" +"\n" +" answers \n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_counter_widget.html:39 +msgid "" +"\n" +" view\n" +" " +msgid_plural "" +"\n" +" views\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_edit.html:5 +#: forum/skins/default/templates/question_edit.html:66 +msgid "Edit question" +msgstr "" + +#: forum/skins/default/templates/question_edit_tips.html:4 +msgid "question tips" +msgstr "Tips" + +#: forum/skins/default/templates/question_edit_tips.html:7 +msgid "please ask a relevant question" +msgstr "ask a question interesting to this community" + +#: forum/skins/default/templates/question_edit_tips.html:10 +msgid "please try provide enough details" +msgstr "provide enough details" + +#: forum/skins/default/templates/question_retag.html:4 +#: forum/skins/default/templates/question_retag.html:53 +msgid "Change tags" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:40 +msgid "up to 5 tags, less than 20 characters each" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:83 +msgid "Why use and modify tags?" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:86 +msgid "tags help us keep Questions organized" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:94 +msgid "tag editors receive special awards from the community" +msgstr "" + +#: forum/skins/default/templates/question_summary_list_roll.html:13 +msgid "answers" +msgstr "" + +#: forum/skins/default/templates/questions.html:8 +msgid "Questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:32 +msgid "Found by tags" +msgstr "Tagged questions" + +#: forum/skins/default/templates/questions.html:36 +msgid "Search results" +msgstr "" + +#: forum/skins/default/templates/questions.html:38 +msgid "Found by title" +msgstr "" + +#: forum/skins/default/templates/questions.html:42 +msgid "Unanswered questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:44 +msgid "All questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:51 +msgid "In:" +msgstr "" + +#: forum/skins/default/templates/questions.html:53 +msgid "see unanswered questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:55 +msgid "see your favorite questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:59 +msgid "Sort by:" +msgstr "" + +#: forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/questions.html:75 +msgid "click to see the newest questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:70 +msgid "click to see the oldest questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:83 +#: forum/skins/default/templates/questions.html:94 +msgid "click to see the most recently updated questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:89 +msgid "click to see the least recently updated questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:102 +#: forum/skins/default/templates/questions.html:113 +msgid "click to see hottest questions" +msgstr "questions with most answers" + +#: forum/skins/default/templates/questions.html:102 +msgid "less answers" +msgstr "" + +#: forum/skins/default/templates/questions.html:108 +msgid "click to see coldest questions" +msgstr "questions with fewest answers" + +#: forum/skins/default/templates/questions.html:108 +#: forum/skins/default/templates/questions.html:113 +msgid "more answers" +msgstr "" + +#: forum/skins/default/templates/questions.html:121 +#: forum/skins/default/templates/questions.html:132 +msgid "click to see most voted questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:121 +msgid "unpopular" +msgstr "" + +#: forum/skins/default/templates/questions.html:127 +msgid "click to see least voted questions" +msgstr "least voted questions" + +#: forum/skins/default/templates/questions.html:127 +#: forum/skins/default/templates/questions.html:132 +msgid "popular" +msgstr "" + +#: forum/skins/default/templates/questions.html:141 +#, python-format +msgid "" +"\n" +" %(q_num)s question found\n" +" " +msgid_plural "" +"\n" +" %(q_num)s questions found\n" +" " +msgstr[0] "" +"\n" +"

%(q_num)s

question

" +msgstr[1] "" +"\n" +"
%(q_num)s

questions

" + +#: forum/skins/default/templates/questions.html:147 +#, python-format +msgid "%(q_num)s question" +msgid_plural "%(q_num)s questions" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/questions.html:151 +#, python-format +msgid "with %(author_name)s's contributions" +msgstr "" + +#: forum/skins/default/templates/questions.html:155 +msgid "tagged" +msgstr "" + +#: forum/skins/default/templates/questions.html:161 +msgid "Search tips:" +msgstr "" + +#: forum/skins/default/templates/questions.html:165 +msgid "reset author" +msgstr "" + +#: forum/skins/default/templates/questions.html:169 +msgid "reset tags" +msgstr "" + +#: forum/skins/default/templates/questions.html:173 +#: forum/skins/default/templates/questions.html:177 +msgid "start over" +msgstr "" + +#: forum/skins/default/templates/questions.html:179 +msgid " - to expand, or dig in by adding more tags and revising the query." +msgstr "" + +#: forum/skins/default/templates/questions.html:182 +msgid "Search tip:" +msgstr "" + +#: forum/skins/default/templates/questions.html:182 +msgid "add tags and a query to focus your search" +msgstr "" + +#: forum/skins/default/templates/questions.html:194 +msgid "There are no unanswered questions here" +msgstr "" + +#: forum/skins/default/templates/questions.html:197 +msgid "No favorite questions here. " +msgstr "" + +#: forum/skins/default/templates/questions.html:198 +msgid "Please start (bookmark) some questions when you visit them" +msgstr "" + +#: forum/skins/default/templates/questions.html:203 +msgid "You can expand your search by " +msgstr "" + +#: forum/skins/default/templates/questions.html:207 +msgid "resetting author" +msgstr "" + +#: forum/skins/default/templates/questions.html:211 +msgid "resetting tags" +msgstr "" + +#: forum/skins/default/templates/questions.html:215 +#: forum/skins/default/templates/questions.html:219 +msgid "starting over" +msgstr "" + +#: forum/skins/default/templates/questions.html:224 +msgid "Please always feel free to ask your question!" +msgstr "" + +#: forum/skins/default/templates/questions.html:228 +msgid "Did not find what you were looking for?" +msgstr "" + +#: forum/skins/default/templates/questions.html:229 +msgid "Please, post your question!" +msgstr "" + +#: forum/skins/default/templates/questions.html:245 +msgid "Contributors" +msgstr "" + +#: forum/skins/default/templates/questions.html:258 +msgid "Related tags" +msgstr "Tags" + +#: forum/skins/default/templates/reopen.html:6 +#: forum/skins/default/templates/reopen.html:16 +msgid "Reopen question" +msgstr "" + +#: forum/skins/default/templates/reopen.html:19 +msgid "Open the previously closed question" +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "The question was closed for the following reason " +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "reason - leave blank in english" +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "on " +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "date closed" +msgstr "" + +#: forum/skins/default/templates/reopen.html:29 +msgid "Reopen this question" +msgstr "" + +#: forum/skins/default/templates/revisions_answer.html:7 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:8 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "Revision history" +msgstr "" + +#: forum/skins/default/templates/revisions_answer.html:50 +#: forum/skins/default/templates/revisions_question.html:50 +msgid "click to hide/show revision" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:5 +msgid "Interesting tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:15 +#, python-format +msgid "remove '%(tag_name)s' from the list of interesting tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:21 +#: forum/skins/default/templates/tag_selector.html:38 +msgid "Add" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:22 +msgid "Ignored tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:32 +#, python-format +msgid "remove '%(tag_name)s' from the list of ignored tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:41 +msgid "keep ignored questions hidden" +msgstr "" + +#: forum/skins/default/templates/tags.html:6 +#: forum/skins/default/templates/tags.html:30 +msgid "Tag list" +msgstr "" + +#: forum/skins/default/templates/tags.html:32 +msgid "sorted alphabetically" +msgstr "" + +#: forum/skins/default/templates/tags.html:32 +msgid "by name" +msgstr "" + +#: forum/skins/default/templates/tags.html:33 +msgid "sorted by frequency of tag use" +msgstr "" + +#: forum/skins/default/templates/tags.html:33 +msgid "by popularity" +msgstr "" + +#: forum/skins/default/templates/tags.html:39 +#, python-format +msgid "" +"All tags matching '%(stag)s'" +msgstr "" + +#: forum/skins/default/templates/tags.html:42 +msgid "Nothing found" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:6 +msgid "Edit user profile" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:19 +msgid "edit profile" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:33 +#: forum/skins/default/templates/user_info.html:53 +msgid "Registered user" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:40 +msgid "Screen Name" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:89 +#: forum/skins/default/templates/user_email_subscriptions.html:20 +msgid "Update" +msgstr "" + +#: forum/skins/default/templates/user_email_subscriptions.html:8 +msgid "Email subscription settings" +msgstr "" + +#: forum/skins/default/templates/user_email_subscriptions.html:9 +msgid "email subscription settings info" +msgstr "" +"Adjust frequency of email updates. Receive " +"updates on interesting questions by email,
help the community by answering questions of your colleagues. If you do not wish to " +"receive emails - select 'no email' on all items below.
Updates are only " +"sent when there is any new activity on selected items." + +#: forum/skins/default/templates/user_email_subscriptions.html:21 +msgid "Stop sending email" +msgstr "Stop Email" + +#: forum/skins/default/templates/user_info.html:18 +msgid "change picture" +msgstr "" + +#: forum/skins/default/templates/user_info.html:25 +#: forum/skins/default/templates/users.html:26 forum/views/users.py:959 +msgid "reputation" +msgstr "karma" + +#: forum/skins/default/templates/user_info.html:35 +msgid "Moderate this user" +msgstr "" + +#: forum/skins/default/templates/user_info.html:47 +msgid "update profile" +msgstr "" + +#: forum/skins/default/templates/user_info.html:57 +msgid "real name" +msgstr "" + +#: forum/skins/default/templates/user_info.html:62 +msgid "member for" +msgstr "member since" + +#: forum/skins/default/templates/user_info.html:67 +msgid "last seen" +msgstr "" + +#: forum/skins/default/templates/user_info.html:73 +msgid "user website" +msgstr "" + +#: forum/skins/default/templates/user_info.html:79 +msgid "location" +msgstr "" + +#: forum/skins/default/templates/user_info.html:86 +msgid "age" +msgstr "" + +#: forum/skins/default/templates/user_info.html:87 +msgid "age unit" +msgstr "years old" + +#: forum/skins/default/templates/user_info.html:93 +msgid "todays unused votes" +msgstr "" + +#: forum/skins/default/templates/user_info.html:94 +msgid "votes left" +msgstr "" + +#: forum/skins/default/templates/user_reputation.html:29 +msgid "Your karma change log." +msgstr "" + +#: forum/skins/default/templates/user_reputation.html:31 +#, python-format +msgid "%(user_name)s's karma change log" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:11 +#, python-format +msgid "%(counter)s Question" +msgid_plural "%(counter)s Questions" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:16 +#, python-format +msgid "%(counter)s Answer" +msgid_plural "%(counter)s Answers" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:24 +#, python-format +msgid "the answer has been voted for %(answer_score)s times" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:24 +msgid "this answer has been selected as correct" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:34 +#, python-format +msgid "(%(comment_count)s comment)" +msgid_plural "the answer has been commented %(comment_count)s times" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:44 +#, python-format +msgid "%(cnt)s Vote" +msgid_plural "%(cnt)s Votes " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:50 +msgid "thumb up" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:51 +msgid "user has voted up this many times" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:55 +msgid "thumb down" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:56 +msgid "user voted down this many times" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:64 +#, python-format +msgid "%(counter)s Tag" +msgid_plural "%(counter)s Tags" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:72 +#, python-format +msgid "" +"see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " +msgstr "" + +#: forum/skins/default/templates/user_stats.html:86 +#, python-format +msgid "%(counter)s Badge" +msgid_plural "%(counter)s Badges" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_tabs.html:7 +msgid "User profile" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:7 forum/views/users.py:933 +msgid "overview" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:9 forum/views/users.py:941 +msgid "recent activity" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:12 forum/views/users.py:951 +msgid "comments and answers to others questions" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:13 forum/views/users.py:950 +msgid "responses" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:16 +msgid "graph of user reputation" +msgstr "Graph of user karma" + +#: forum/skins/default/templates/user_tabs.html:17 +msgid "reputation history" +msgstr "karma history" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:977 +msgid "user vote record" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:976 +msgid "casted votes" +msgstr "votes" + +#: forum/skins/default/templates/user_tabs.html:23 +msgid "questions that user selected as his/her favorite" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:24 +msgid "favorites" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:27 forum/views/users.py:986 +msgid "email subscription settings" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:28 forum/views/users.py:985 +msgid "email subscriptions" +msgstr "subscriptions" + +#: forum/skins/default/templates/users.html:6 +#: forum/skins/default/templates/users.html:24 +msgid "Users" +msgstr "" + +#: forum/skins/default/templates/users.html:27 +msgid "recent" +msgstr "" + +#: forum/skins/default/templates/users.html:29 +msgid "by username" +msgstr "" + +#: forum/skins/default/templates/users.html:35 +#, python-format +msgid "users matching query %(suser)s:" +msgstr "" + +#: forum/skins/default/templates/users.html:39 +msgid "Nothing found." +msgstr "" + +#: forum/skins/default/templates/users_questions.html:11 +msgid "this questions was selected as favorite" +msgstr "" + +#: forum/skins/default/templates/users_questions.html:12 +msgid "thumb-up on" +msgstr "" + +#: forum/skins/default/templates/users_questions.html:19 +msgid "thumb-up off" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:3 +#: forum/skins/default/templates/authopenid/changeemail.html:9 +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Change email" +msgstr "Change Email" + +#: forum/skins/default/templates/authopenid/changeemail.html:11 +msgid "Save your email address" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:16 +#, python-format +msgid "change %(email)s info" +msgstr "" +"Enter your new email into the box below if " +"you'd like to use another email for update subscriptions." +"
Currently you are using %(email)s" + +#: forum/skins/default/templates/authopenid/changeemail.html:18 +#, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "" +"Please enter your email address in the box below. Valid email address is required on this Q&A forum. If you like, " +"you can receive updates on interesting questions or entire " +"forum via email. Also, your email is used to create a unique gravatar image for your account. " +"Email addresses are never shown or otherwise shared with anybody else." + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your new Email" +msgstr "" +"Your new Email: (will not be shown to " +"anyone, must be valid)" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your Email" +msgstr "" +"Your Email (must be valid, never shown to others)" + +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Save Email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:49 +msgid "Validate email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:52 +#, python-format +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "" +"An email with a validation link has been sent to %" +"(email)s. Please follow the emailed link with your " +"web browser. Email validation is necessary to help insure the proper use of " +"email on Q&A. If you would like to use " +"another email, please change it again." + +#: forum/skins/default/templates/authopenid/changeemail.html:57 +msgid "Email not changed" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:60 +#, python-format +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" +"Your email address %(email)s has not been changed." +" If you decide to change it later - you can always do it by editing " +"it in your user profile or by using the previous form again." + +#: forum/skins/default/templates/authopenid/changeemail.html:65 +msgid "Email changed" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:68 +#, python-format +msgid "your current %(email)s can be used for this" +msgstr "" +"Your email address is now set to %(email)s. " +"Updates on the questions that you like most will be sent to this address. " +"Email notifications are sent once a day or less frequently - only when there " +"are any news." + +#: forum/skins/default/templates/authopenid/changeemail.html:73 +msgid "Email verified" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:76 +msgid "thanks for verifying email" +msgstr "" +"Thank you for verifying your email! Now " +"you can ask and answer questions. Also if " +"you find a very interesting question you can subscribe for the " +"updates - then will be notified about changes once a day or less frequently." + +#: forum/skins/default/templates/authopenid/changeemail.html:81 +msgid "email key not sent" +msgstr "Validation email not sent" + +#: forum/skins/default/templates/authopenid/changeemail.html:84 +#, python-format +msgid "email key not sent %(email)s change email here %(change_link)s" +msgstr "" +"Your current email address %(email)s has been " +"validated before so the new key was not sent. You can change email used for update subscriptions if necessary." + +#: forum/skins/default/templates/authopenid/changeopenid.html:8 +msgid "Account: change OpenID URL" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:12 +msgid "" +"This is where you can change your OpenID URL. Make sure you remember it!" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:14 +#: forum/skins/default/templates/authopenid/delete.html:14 +#: forum/skins/default/templates/authopenid/delete.html:24 +msgid "Please correct errors below:" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:29 +msgid "OpenID URL:" +msgstr "" + +#: forum/skins/default/templates/authopenid/changepw.html:7 +msgid "Account: change password" +msgstr "Change your password" + +#: forum/skins/default/templates/authopenid/changepw.html:8 +msgid "This is where you can change your password. Make sure you remember it!" +msgstr "" +"To change your password please fill out and " +"submit this form" + +#: forum/skins/default/templates/authopenid/complete.html:19 +msgid "Connect your OpenID with this site" +msgstr "New user signup" + +#: forum/skins/default/templates/authopenid/complete.html:22 +msgid "Connect your OpenID with your account on this site" +msgstr "New user signup" + +#: forum/skins/default/templates/authopenid/complete.html:27 +#, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your %" +"(provider)s login. Please create your screen name " +"and save your email address. Saved email address will let " +"you subscribe for the updates on the most interesting " +"questions and will be used to create and retrieve your unique avatar image - " +"gravatar.

" + +#: forum/skins/default/templates/authopenid/complete.html:31 +#, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" +"

Oops... looks like screen name %(username)s is " +"already used in another account.

Please choose another screen " +"name to use with your %(provider)s login. Also, a valid email address is " +"required on the Q&A forum. Your email is " +"used to create a unique gravatar image for your account. If you like, you can receive " +"updates on the interesting questions or entire forum by email. " +"Email addresses are never shown or otherwise shared with anybody else.

" + +#: forum/skins/default/templates/authopenid/complete.html:35 +#, python-format +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your %" +"(provider)s login.

You can either keep your screen " +"name the same as your %(provider)s login name or choose some other " +"nickname.

Also, please save a valid email address. " +"With the email you can subscribe for the updates on the " +"most interesting questions. Email address is also used to create and " +"retrieve your unique avatar image - gravatar.

" + +#: forum/skins/default/templates/authopenid/complete.html:38 +#, python-format +msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your " +"Facebook login. Please create your screen name and " +"save your email address. Saved email address will let you " +"subscribe for the updates on the most interesting questions " +"and will be used to create and retrieve your unique avatar image - gravatar.

" + +#: forum/skins/default/templates/authopenid/complete.html:42 +msgid "This account already exists, please use another." +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:57 +msgid "Sorry, looks like we have some errors:" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:82 +msgid "Screen name label" +msgstr "Screen Name (will be shown to others)" + +#: forum/skins/default/templates/authopenid/complete.html:89 +msgid "Email address label" +msgstr "" +"Email Address (will not be shared with " +"anyone, must be valid)" + +#: forum/skins/default/templates/authopenid/complete.html:95 +#: forum/skins/default/templates/authopenid/signup.html:18 +msgid "receive updates motivational blurb" +msgstr "" +"Receive forum updates by email - this will help our " +"community grow and become more useful.
By default Q&A forum sends up to one email digest per " +"week - only when there is anything new.
If you like, please " +"adjust this now or any time later from your user account." + +#: forum/skins/default/templates/authopenid/complete.html:99 +#: forum/skins/default/templates/authopenid/signup.html:22 +msgid "please select one of the options above" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:102 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:103 +msgid "create account" +msgstr "Signup" + +#: forum/skins/default/templates/authopenid/complete.html:112 +msgid "Existing account" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:113 +msgid "user name" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:114 +msgid "password" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:121 +msgid "Register" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:122 +#: forum/skins/default/templates/authopenid/signin.html:168 +msgid "Forgot your password?" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:2 +msgid "Thank you for registering at our Q&A forum!" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:4 +msgid "Your account details are:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:6 +msgid "Username:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:7 +#: forum/skins/default/templates/authopenid/delete.html:19 +msgid "Password:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:9 +msgid "Please sign in here:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:12 +#: forum/skins/default/templates/authopenid/email_validation.txt:14 +#: forum/skins/default/templates/authopenid/sendpw_email.txt:8 +msgid "" +"Sincerely,\n" +"Forum Administrator" +msgstr "" +"Sincerely,\n" +"Q&A Forum Administrator" + +#: forum/skins/default/templates/authopenid/delete.html:8 +msgid "Account: delete account" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:12 +msgid "" +"Note: After deleting your account, anyone will be able to register this " +"username." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:16 +msgid "Check confirm box, if you want delete your account." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:31 +msgid "I am sure I want to delete my account." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "Password/OpenID URL" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "(required for your security)" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:34 +msgid "Delete account permanently" +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:2 +msgid "Greetings from the Q&A forum" +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:4 +msgid "To make use of the Forum, please follow the link below:" +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:8 +msgid "Following the link above will help us verify your email address." +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:10 +msgid "" +"If you beleive that this message was sent in mistake - \n" +"no further action is needed. Just ingore this email, we apologize\n" +"for any inconvenience" +msgstr "" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:4 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:7 +msgid "Traditional login information" +msgstr "" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:12 +#, python-format +msgid "" +"how to login with password through external login website or use %" +"(feedback_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw.html:4 +#: forum/skins/default/templates/authopenid/sendpw.html:7 +msgid "Send new password" +msgstr "Recover password" + +#: forum/skins/default/templates/authopenid/sendpw.html:10 +msgid "password recovery information" +msgstr "" +"Forgot you password? No problems - just get a new " +"one!
Please follow the following steps:
• submit your " +"user name below and check your email
follow the " +"activation link for the new password - sent to you by email and " +"login with the suggested password
• at this you might want to " +"change your password to something you can remember better" + +#: forum/skins/default/templates/authopenid/sendpw.html:21 +msgid "Reset password" +msgstr "Send me a new password" + +#: forum/skins/default/templates/authopenid/sendpw.html:22 +msgid "return to login" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:2 +#, python-format +msgid "" +"Someone has requested to reset your password on %(site_url)s.\n" +"If it were not you, it is safe to ignore this email." +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:5 +#, python-format +msgid "" +"email explanation how to use new %(password)s for %(username)s\n" +"with the %(key_link)s" +msgstr "" +"To change your password, please follow these steps:\n" +"* visit this link: %(key_link)s\n" +"* login with user name %(username)s and password %(password)s\n" +"* go to your user profile and set the password to something you can remember" + +#: forum/skins/default/templates/authopenid/signin.html:5 +#: forum/skins/default/templates/authopenid/signin.html:21 +msgid "User login" +msgstr "User login" + +#: forum/skins/default/templates/authopenid/signin.html:28 +#, python-format +msgid "" +"\n" +" Your answer to %(title)s %(summary)s will be posted once you " +"log in\n" +" " +msgstr "" +"\n" +"Your answer to \"%(title)s %(summary)s...\" is saved and will be " +"posted once you log in." + +#: forum/skins/default/templates/authopenid/signin.html:35 +#, python-format +msgid "" +"Your question \n" +" %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" +"Your question \"%(title)s %(summary)s...\" is saved and will be " +"posted once you log in." + +#: forum/skins/default/templates/authopenid/signin.html:42 +msgid "Click to sign in through any of these services." +msgstr "" +"

Please select your favorite login method below." +"

External login services use OpenID technology, where your password " +"always stays confidential between you and your login provider and you don't " +"have to remember another one.

" + +# msgid "Click to sign in through any of these services." +# msgstr "" +# "

Please select your favorite login method below." +# "

External login services use OpenID technology, where your password " +# "always stays confidential between you and your login provider and you don't " +# "have to remember another one. " +# "Askbot option requires your login name and " +# "password entered here.

" +#: forum/skins/default/templates/authopenid/signin.html:144 +msgid "Enter your Provider user name" +msgstr "" +"Enter your Provider user name
(or " +"select another login method above)" + +#: forum/skins/default/templates/authopenid/signin.html:151 +msgid "" +"Enter your OpenID " +"web address" +msgstr "" +"Enter your OpenID web address
(or choose " +"another login method above)" + +#: forum/skins/default/templates/authopenid/signin.html:153 +#: forum/skins/default/templates/authopenid/signin.html:166 +msgid "Login" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:157 +msgid "Enter your login name and password" +msgstr "" +"Enter your Askbot login and password
(or select your OpenID provider above)" + +#: forum/skins/default/templates/authopenid/signin.html:161 +msgid "Login name" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:163 +msgid "Password" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:167 +msgid "Create account" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:178 +msgid "Why use OpenID?" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:181 +msgid "with openid it is easier" +msgstr "With the OpenID you don't need to create new username and password." + +#: forum/skins/default/templates/authopenid/signin.html:184 +msgid "reuse openid" +msgstr "You can safely re-use the same login for all OpenID-enabled websites." + +#: forum/skins/default/templates/authopenid/signin.html:187 +msgid "openid is widely adopted" +msgstr "" +"There are > 160,000,000 OpenID account in use. Over 10,000 sites are OpenID-" +"enabled." + +#: forum/skins/default/templates/authopenid/signin.html:190 +msgid "openid is supported open standard" +msgstr "OpenID is based on an open standard, supported by many organizations." + +#: forum/skins/default/templates/authopenid/signin.html:195 +msgid "Find out more" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:196 +msgid "Get OpenID" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:4 +msgid "Signup" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:8 +msgid "Create login name and password" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:10 +msgid "Traditional signup info" +msgstr "" +"If you prefer, create your forum login name and " +"password here. However, please keep in mind that we also support " +"OpenID login method. With OpenID you can " +"simply reuse your external login (e.g. Gmail or AOL) without ever sharing " +"your login details with anyone and having to remember yet another password." + +#: forum/skins/default/templates/authopenid/signup.html:25 +msgid "" +"Please read and type in the two words below to help us prevent automated " +"account creation." +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:27 +msgid "Create Account" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:28 +msgid "or" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:29 +msgid "return to OpenID login" +msgstr "" + +#: forum/skins/default/templates/fbconnect/xd_receiver.html:5 +#, python-format +msgid "Connect to %(settings.APP_SHORT_NAME)s with Facebook!" +msgstr "" + +#: forum/templatetags/extra_filters.py:100 +msgid "no items in counter" +msgstr "no" + +#: forum/templatetags/extra_tags.py:53 +#, python-format +msgid "%(username)s gravatar image" +msgstr "" + +#: forum/templatetags/extra_tags.py:178 forum/templatetags/extra_tags.py:205 +msgid "reputation points" +msgstr "karma" + +#: forum/templatetags/extra_tags.py:265 +msgid "2 days ago" +msgstr "" + +#: forum/templatetags/extra_tags.py:267 +msgid "yesterday" +msgstr "" + +#: forum/templatetags/extra_tags.py:269 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/templatetags/extra_tags.py:271 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/utils/forms.py:32 +msgid "this field is required" +msgstr "" + +#: forum/utils/forms.py:46 +msgid "choose a username" +msgstr "Choose screen name" + +#: forum/utils/forms.py:52 +msgid "user name is required" +msgstr "" + +#: forum/utils/forms.py:53 +msgid "sorry, this name is taken, please choose another" +msgstr "" + +#: forum/utils/forms.py:54 +msgid "sorry, this name is not allowed, please choose another" +msgstr "" + +#: forum/utils/forms.py:55 +msgid "sorry, there is no user with this name" +msgstr "" + +#: forum/utils/forms.py:56 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" + +#: forum/utils/forms.py:57 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "" + +#: forum/utils/forms.py:118 +msgid "your email address" +msgstr "Your email (never shared)" + +#: forum/utils/forms.py:119 +msgid "email address is required" +msgstr "" + +#: forum/utils/forms.py:120 +msgid "please enter a valid email address" +msgstr "" + +#: forum/utils/forms.py:121 +msgid "this email is already used by someone else, please choose another" +msgstr "" + +#: forum/utils/forms.py:149 +msgid "choose password" +msgstr "Password" + +#: forum/utils/forms.py:150 +msgid "password is required" +msgstr "" + +#: forum/utils/forms.py:153 +msgid "retype password" +msgstr "Password (please retype)" + +#: forum/utils/forms.py:154 +msgid "please, retype your password" +msgstr "" + +#: forum/utils/forms.py:155 +msgid "sorry, entered passwords did not match, please try again" +msgstr "" + +#: forum/views/commands.py:218 +#, python-format +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "" +"Your subscription is saved, but email address %(email)s needs to be " +"validated, please see more details here" + +#: forum/views/commands.py:226 +msgid "email update frequency has been set to daily" +msgstr "" + +#: forum/views/meta.py:35 +msgid "Q&A forum feedback" +msgstr "" + +#: forum/views/meta.py:36 +msgid "Thanks for the feedback!" +msgstr "" + +#: forum/views/meta.py:44 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "" + +#: forum/views/users.py:893 forum/views/users.py:897 +msgid "changes saved" +msgstr "" + +#: forum/views/users.py:903 +msgid "email updates canceled" +msgstr "" + +#: forum/views/users.py:934 +msgid "user profile" +msgstr "" + +#: forum/views/users.py:935 +msgid "user profile overview" +msgstr "" + +#: forum/views/users.py:942 +msgid "recent user activity" +msgstr "" + +#: forum/views/users.py:943 +msgid "profile - recent activity" +msgstr "" + +#: forum/views/users.py:952 +msgid "profile - responses" +msgstr "" + +#: forum/views/users.py:960 +msgid "user reputation in the community" +msgstr "user karma" + +#: forum/views/users.py:961 +msgid "profile - user reputation" +msgstr "Profile - User's Karma" + +#: forum/views/users.py:967 +msgid "favorite questions" +msgstr "" + +#: forum/views/users.py:968 +msgid "users favorite questions" +msgstr "" + +#: forum/views/users.py:969 +msgid "profile - favorite questions" +msgstr "" + +#: forum/views/users.py:978 +msgid "profile - votes" +msgstr "" + +#: forum/views/users.py:987 +msgid "profile - email subscriptions" +msgstr "" + +#: forum/views/writers.py:67 +msgid "uploading images is limited to users with >60 reputation points" +msgstr "sorry, file uploading requires karma >60" + +#: forum/views/writers.py:69 +msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" +msgstr "" + +#: forum/views/writers.py:71 +#, python-format +msgid "maximum upload file size is %sK" +msgstr "" + +#: forum/views/writers.py:73 +#, python-format +msgid "" +"Error uploading file. Please contact the site administrator. Thank you. %s" +msgstr "" + +#: forum_modules/authentication/auth.py:27 +msgid "Email Validation" +msgstr "" + +#: forum_modules/authentication/auth.py:38 +msgid "Thank you, your email is now validated." +msgstr "" + +#: forum_modules/authentication/auth.py:62 +msgid "Your password was changed" +msgstr "" + +#: forum_modules/authentication/auth.py:64 +msgid "New password set" +msgstr "New password created" + +#: forum_modules/authentication/auth.py:130 +#, python-format +msgid "Welcome back %s, you are now logged in" +msgstr "" + +#: forum_modules/books/urls.py:7 forum_modules/books/urls.py:8 +#: forum_modules/books/urls.py:9 +msgid "books/" +msgstr "" + +#: keyedcache/views.py:14 +msgid "Yes" +msgstr "" + +#: keyedcache/views.py:15 +msgid "No" +msgstr "" + +#: keyedcache/views.py:19 +msgid "Key to delete" +msgstr "" + +#: keyedcache/views.py:20 +msgid "Include Children?" +msgstr "" + +#: keyedcache/views.py:21 +msgid "Delete all keys?" +msgstr "" + +#: keyedcache/templates/keyedcache/delete.html:6 +#: keyedcache/templates/keyedcache/stats.html:6 +#: keyedcache/templates/keyedcache/view.html:6 +#: livesettings/templates/livesettings/group_settings.html:14 +#: livesettings/templates/livesettings/site_settings.html:26 +msgid "Home" +msgstr "" + +#: keyedcache/templates/keyedcache/delete.html:7 +#: keyedcache/templates/keyedcache/view.html:7 +msgid "Cache" +msgstr "" + +#: keyedcache/templates/keyedcache/delete.html:8 +msgid "Cache Delete" +msgstr "" + +#: keyedcache/templates/keyedcache/stats.html:7 +msgid "Cache Stats" +msgstr "" + +#: keyedcache/templates/keyedcache/view.html:8 +msgid "Cache View" +msgstr "" + +#: livesettings/models.py:101 livesettings/models.py:140 +msgid "Site" +msgstr "" + +#: livesettings/values.py:103 +msgid "Base Settings" +msgstr "" + +#: livesettings/values.py:210 +msgid "Default value: \"\"" +msgstr "" + +#: livesettings/values.py:217 +msgid "Default value: " +msgstr "" + +#: livesettings/values.py:220 +#, python-format +msgid "Default value: %s" +msgstr "" + +#: livesettings/templates/livesettings/_admin_site_views.html:4 +msgid "Sites" +msgstr "" + +#: livesettings/templates/livesettings/group_settings.html:11 +#: livesettings/templates/livesettings/site_settings.html:23 +msgid "Documentation" +msgstr "" + +#: livesettings/templates/livesettings/group_settings.html:11 +#: livesettings/templates/livesettings/site_settings.html:23 +msgid "Log out" +msgstr "" + +#: livesettings/templates/livesettings/group_settings.html:15 +msgid "Edit Group Settings" +msgstr "" + +#: livesettings/templates/livesettings/group_settings.html:22 +#: livesettings/templates/livesettings/site_settings.html:50 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#: livesettings/templates/livesettings/group_settings.html:28 +#, python-format +msgid "Settings included in %(name)s." +msgstr "" + +#: livesettings/templates/livesettings/group_settings.html:62 +#: livesettings/templates/livesettings/site_settings.html:97 +msgid "You don't have permission to edit values." +msgstr "" + +#: livesettings/templates/livesettings/group_settings.html:68 +msgid "Setting groups" +msgstr "" + +#: livesettings/templates/livesettings/site_settings.html:27 +msgid "Edit Site Settings" +msgstr "" + +#: livesettings/templates/livesettings/site_settings.html:43 +msgid "Livesettings are disabled for this site." +msgstr "" + +#: livesettings/templates/livesettings/site_settings.html:44 +msgid "All configuration options must be edited in the site settings.py file" +msgstr "" + +#: livesettings/templates/livesettings/site_settings.html:66 +#, python-format +msgid "Group settings: %(name)s" +msgstr "" + +#: livesettings/templates/livesettings/site_settings.html:93 +msgid "Uncollapse all" +msgstr "" + +#, fuzzy +#~ msgid "user_subscriptions_url" +#~ msgstr "subscriptions" + +#, fuzzy +#~ msgid "" +#~ "go to %(email_settings_url)s to change frequency of email updates or %" +#~ "(admin_email)s administrator" +#~ msgstr "" +#~ "

Please remember that you can always adjust " +#~ "frequency of the email updates or turn them off entirely.
If you " +#~ "believe that this message was sent in an error, please email about it the " +#~ "forum administrator at %(email)s.

Sincerely,

Your friendly " +#~ "Q&A forum server.

" + +#~ msgid "%(q_num)s question found" +#~ msgid_plural "%(q_num)s questions found" +#~ msgstr[0] "One question found" +#~ msgstr[1] "" + +#~ msgid "unanswered questions" +#~ msgstr "unanswered" + +#~ msgid "general message about privacy" +#~ msgstr "" +#~ "Respecting users privacy is an important core principle of this Q&A " +#~ "forum. Information on this page details how this forum protects your " +#~ "privacy, and what type of information is collected." + +#~ msgid "what technical information is collected about visitors" +#~ msgstr "" +#~ "Information on question views, revisions of questions and answers - both " +#~ "times and content are recorded for each user in order to correctly count " +#~ "number of views, maintain data integrity and report relevant updates." + +#~ msgid "details on personal information policies" +#~ msgstr "" +#~ "Members of this community may choose to display personally identifiable " +#~ "information in their profiles. Forum will never display such information " +#~ "without a request from the user." + +#~ msgid "details on sharing data with third parties" +#~ msgstr "" +#~ "None of the data that is not openly shown on the forum by the choice of " +#~ "the user is shared with any third party." + +#~ msgid "how privacy policies can be changed" +#~ msgstr "" +#~ "These policies may be adjusted to improve protection of user's privacy. " +#~ "Whenever such changes occur, users will be notified via the internal " +#~ "messaging system. " + +#~ msgid "welcome to website" +#~ msgstr "Welcome to Q&A forum" + +#~ msgid "Recent awards" +#~ msgstr "Recent badges" + +#~ msgid "all awards" +#~ msgstr "all badges" + +#~ msgid "popular tags" +#~ msgstr "tags" + +#~ msgid "" +#~ " have total %(q_num)s questions containing %(searchtitle)s in full text " +#~ msgid_plural "" +#~ " have total %(q_num)s questions containing %(searchtitle)s in full text " +#~ msgstr[0] "" +#~ "
%(q_num)s

question containing " +#~ "%(searchtitle)s

" +#~ msgstr[1] "" +#~ "
%(q_num)s

questions containing " +#~ "%(searchtitle)s

" + +#~ msgid " have total %(q_num)s questions containing %(searchtitle)s " +#~ msgid_plural " have total %(q_num)s questions containing %(searchtitle)s " +#~ msgstr[0] "" +#~ "
%(q_num)s

question with title " +#~ "containing %(searchtitle)s

" +#~ msgstr[1] "" +#~ "
%(q_num)s

questions with title " +#~ "containing %(searchtitle)s

" + +#~ msgid " have total %(q_num)s unanswered questions " +#~ msgid_plural " have total %(q_num)s unanswered questions " +#~ msgstr[0] "" +#~ "
%(q_num)s
questions without " +#~ "accepted answers" +#~ msgstr[1] "" +#~ "
%(q_num)s
questions without " +#~ "accepted answers" + +#~ msgid "Most recently answered ones are shown first." +#~ msgstr "Most recently answered questions are shown first." + +#~ msgid "Questions sorted by number of responses." +#~ msgstr "Questions sorted by the number of answers." + +#~ msgid "Most answered questions are shown first." +#~ msgstr " " + +#~ msgid "avatar, see %(gravatar_faq_url)s" +#~ msgstr "gravatar" + +#~ msgid "" +#~ "\n" +#~ " have total %(q_num)s unanswered questions\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " have total %(q_num)s unanswered questions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "
%(q_num)s

question without an " +#~ "accepted answer

" +#~ msgstr[1] "" +#~ "\n" +#~ "
%(q_num)s

questions without an " +#~ "accepted answer

" diff --git a/askbot/locale/es/LC_MESSAGES/django.mo b/askbot/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 00000000..27fb5837 Binary files /dev/null and b/askbot/locale/es/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/es/LC_MESSAGES/django.po b/askbot/locale/es/LC_MESSAGES/django.po new file mode 100644 index 00000000..5d5019d5 --- /dev/null +++ b/askbot/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,4358 @@ +# Spanish translation for CNPROG package. +# Copyright (C) 2009 Gang Chen +# This file is distributed under the same license as the CNPROG package. +# Adolfo Fitoria, Bruno Sarlo, Francisco Espinosa 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: Askbot\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-09 19:42-0400\n" +"PO-Revision-Date: 2010-03-28 22:15-0600\n" +"Last-Translator: Francisco Espinoza \n" +"Language-Team: Hasked Team \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: NICARAGUA\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: django_authopenid/forms.py:71 django_authopenid/views.py:132 +#, fuzzy +msgid "i-names are not supported" +msgstr "HTML básico es soportado" + +#: django_authopenid/forms.py:134 +msgid "Account with this name already exists on the forum" +msgstr "" + +#: django_authopenid/forms.py:135 +msgid "can't have two logins to the same account yet, sorry." +msgstr "" + +#: django_authopenid/forms.py:157 +msgid "Please enter valid username and password (both are case-sensitive)." +msgstr "Ingrese su nombre de usuario y contraseña (sensible a las mayusculas)" + +#: django_authopenid/forms.py:160 django_authopenid/forms.py:210 +msgid "This account is inactive." +msgstr "Esta cuenta está inactiva." + +#: django_authopenid/forms.py:162 +msgid "Login failed." +msgstr "Ingreso fallido." + +#: django_authopenid/forms.py:164 +msgid "Please enter username and password" +msgstr "Ingrese su nombre de usuario y contraseña." + +#: django_authopenid/forms.py:166 +msgid "Please enter your password" +msgstr "Ingrese su contraseña" + +#: django_authopenid/forms.py:168 +msgid "Please enter user name" +msgstr "Ingrese su nombre de usuario" + +#: django_authopenid/forms.py:206 +#, fuzzy +msgid "" +"Please enter a valid username and password. Note that " +"both fields are case-sensitive." +msgstr "Ingrese su nombre de usuario y contraseña (sensible a las mayusculas)" + +#: django_authopenid/forms.py:229 +msgid "Current password" +msgstr "Contraseña actual" + +#: django_authopenid/forms.py:240 +msgid "" +"Old password is incorrect. Please enter the correct " +"password." +msgstr "" +"Contraseña antigua es incorrecta. Por favor ingrese la " +"contraseña correcta." + +#: django_authopenid/forms.py:305 +#, fuzzy +msgid "Your user name (required)" +msgstr "nombre de usuario es requerido" + +#: django_authopenid/forms.py:320 +#, fuzzy +msgid "Incorrect username." +msgstr "seleccione un nombre de usuario" + +#: django_authopenid/urls.py:23 django_authopenid/urls.py:24 +#: django_authopenid/urls.py:25 django_authopenid/urls.py:27 +#: fbconnect/urls.py:12 fbconnect/urls.py:13 fbconnect/urls.py:14 +msgid "signin/" +msgstr "ingresar/" + +#: django_authopenid/urls.py:24 fbconnect/urls.py:13 fbconnect/urls.py:17 +#, fuzzy +msgid "newquestion/" +msgstr "nueva pregunta" + +#: django_authopenid/urls.py:25 fbconnect/urls.py:14 fbconnect/urls.py:18 +#, fuzzy +msgid "newanswer/" +msgstr "responder/" + +#: django_authopenid/urls.py:26 +msgid "signout/" +msgstr "eliminar-cuenta/" + +#: django_authopenid/urls.py:27 +#, fuzzy +msgid "complete/" +msgstr "comentarios/" + +#: django_authopenid/urls.py:29 fbconnect/urls.py:16 fbconnect/urls.py:17 +#: fbconnect/urls.py:18 +msgid "register/" +msgstr "registrar/" + +#: django_authopenid/urls.py:30 +#, fuzzy +msgid "signup/" +msgstr "eliminar-cuenta/" + +#: django_authopenid/urls.py:32 +msgid "sendpw/" +msgstr "" + +#: django_authopenid/urls.py:33 django_authopenid/urls.py:37 +#, fuzzy +msgid "password/" +msgstr "contraseña" + +#: django_authopenid/urls.py:33 +msgid "confirm/" +msgstr "" + +#: django_authopenid/urls.py:38 django_authopenid/urls.py:39 +#: django_authopenid/urls.py:40 django_authopenid/urls.py:41 +#, fuzzy +msgid "email/" +msgstr "no enviar emails" + +#: django_authopenid/urls.py:38 +msgid "validate/" +msgstr "validar/" + +#: django_authopenid/urls.py:39 +#, fuzzy +msgid "change/" +msgstr "edad" + +#: django_authopenid/urls.py:40 +msgid "sendkey/" +msgstr "" + +#: django_authopenid/urls.py:41 +msgid "verify/" +msgstr "" + +#: django_authopenid/urls.py:42 +#, fuzzy +msgid "openid/" +msgstr "reabrir/" + +#: django_authopenid/urls.py:43 forum/urls.py:52 forum/urls.py:56 +msgid "delete/" +msgstr "eliminar/" + +#: django_authopenid/urls.py:51 +msgid "external-login/forgot-password/" +msgstr "" + +#: django_authopenid/urls.py:54 +msgid "external-login/signup/" +msgstr "" + +#: django_authopenid/views.py:139 +#, python-format +msgid "OpenID %(openid_url)s is invalid" +msgstr "" + +#: django_authopenid/views.py:614 +msgid "Welcome email subject line" +msgstr "" + +#: django_authopenid/views.py:720 +#, fuzzy +msgid "Password changed." +msgstr "Tu contraseña ha sido cambiada." + +#: django_authopenid/views.py:732 django_authopenid/views.py:738 +#, fuzzy, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" +"subscrición guardada, necesitamos una validación de %(email)s , mira %" +"(details_url)s" + +#: django_authopenid/views.py:759 +#, fuzzy +msgid "Email verification subject line" +msgstr "Configuración de suscripciones por email" + +#: django_authopenid/views.py:850 +#, fuzzy +msgid "your email was not changed" +msgstr "Tu contraseña ha sido cambiada." + +#: django_authopenid/views.py:898 django_authopenid/views.py:1056 +#, python-format +msgid "No OpenID %s found associated in our database" +msgstr "" + +#: django_authopenid/views.py:902 django_authopenid/views.py:1063 +#, python-format +msgid "The OpenID %s isn't associated to current user logged in" +msgstr "" + +#: django_authopenid/views.py:910 +msgid "Email Changed." +msgstr "" + +#: django_authopenid/views.py:988 +#, fuzzy +msgid "This OpenID is already associated with another account." +msgstr "Estas credenciales ya están asociadas con tu cuenta." + +#: django_authopenid/views.py:993 +#, fuzzy, python-format +msgid "OpenID %s is now associated with your account." +msgstr "Las nuevas credenciales están ahora asociadas con tu cuenta." + +#: django_authopenid/views.py:1066 +#, fuzzy +msgid "Account deleted." +msgstr "revivir" + +#: django_authopenid/views.py:1118 +#, fuzzy +msgid "Request for new password" +msgstr "Crear contraseña" + +#: django_authopenid/views.py:1132 +#, fuzzy +msgid "A new password and the activation link were sent to your email address." +msgstr "Un correo de validación ha sido enviado a tu dirección de email." + +#: django_authopenid/views.py:1164 +#, python-format +msgid "" +"Could not change password. Confirmation key '%s' is not " +"registered." +msgstr "" + +#: django_authopenid/views.py:1174 +msgid "" +"Can not change password. User don't exist anymore in our " +"database." +msgstr "" + +#: django_authopenid/views.py:1184 +#, python-format +msgid "Password changed for %s. You may now sign in." +msgstr "" + +#: forum/auth.py:505 +msgid "Your question and all of it's answers have been deleted" +msgstr "Tu pregunta y todas sus respuestas han sido eliminadas" + +#: forum/auth.py:507 +msgid "Your question has been deleted" +msgstr "Tu pregunta ha sido eliminada" + +#: forum/auth.py:510 +msgid "The question and all of it's answers have been deleted" +msgstr "La pregunta y todas sus respuestas han sido eliminadas" + +#: forum/auth.py:512 +msgid "The question has been deleted" +msgstr "La pregunta ha sido eliminada" + +#: forum/const.py:8 +msgid "duplicate question" +msgstr "pregunta duplicada" + +#: forum/const.py:9 +msgid "question is off-topic or not relevant" +msgstr "la pregunta esta fuera de luga o no es relevante" + +#: forum/const.py:10 +msgid "too subjective and argumentative" +msgstr "demasiado subjetivo y argumentativo" + +#: forum/const.py:11 +#, fuzzy +msgid "not a real question" +msgstr "preguntar" + +#: forum/const.py:12 +msgid "the question is answered, right answer was accepted" +msgstr "la pregunta ha sido respondida, la respuesta correcta ha sido aceptada" + +#: forum/const.py:13 +#, fuzzy +msgid "question is not relevant or outdated" +msgstr "no es reproducible o esta desactualizado" + +#: forum/const.py:14 +#, fuzzy +msgid "question contains offensive or malicious remarks" +msgstr "la pregunta contiene comentarios inapropiados, ofensivo o malicioso" + +#: forum/const.py:15 +msgid "spam or advertising" +msgstr "spam o publicidad" + +#: forum/const.py:16 +msgid "too localized" +msgstr "" + +#: forum/const.py:37 forum/skins/default/templates/questions.html:70 +#: forum/skins/default/templates/questions.html:75 +msgid "newest" +msgstr "nuevas" + +#: forum/const.py:38 forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/users.html:28 +msgid "oldest" +msgstr "viejos" + +#: forum/const.py:39 forum/skins/default/templates/questions.html:89 +#: forum/skins/default/templates/questions.html:94 +msgid "active" +msgstr "activa" + +#: forum/const.py:40 forum/skins/default/templates/questions.html:83 +#, fuzzy +msgid "inactive" +msgstr "activa" + +#: forum/const.py:41 +msgid "hottest" +msgstr "lo más caliente" + +#: forum/const.py:42 +#, fuzzy +msgid "coldest" +msgstr "viejos" + +#: forum/const.py:43 +msgid "most voted" +msgstr "más votado" + +#: forum/const.py:44 +#, fuzzy +msgid "least voted" +msgstr "más votado" + +#: forum/const.py:45 +msgid "relevance" +msgstr "" + +#: forum/const.py:52 forum/skins/default/templates/questions.html:52 +msgid "all" +msgstr "" + +#: forum/const.py:53 forum/skins/default/templates/questions.html:53 +#, fuzzy +msgid "unanswered" +msgstr "sinrespuesta/" + +#: forum/const.py:54 forum/skins/default/templates/questions.html:55 +#, fuzzy +msgid "favorite" +msgstr "favoritos" + +#: forum/const.py:97 +msgid "question" +msgstr "pregunta" + +#: forum/const.py:98 forum/skins/default/templates/book.html:110 +msgid "answer" +msgstr "respuesta" + +#: forum/const.py:99 +msgid "commented question" +msgstr "comentar pregunta" + +#: forum/const.py:100 +msgid "commented answer" +msgstr "comentar respuesta" + +#: forum/const.py:101 +msgid "edited question" +msgstr "editar pregunta" + +#: forum/const.py:102 +msgid "edited answer" +msgstr "editar respuesta" + +#: forum/const.py:103 +msgid "received award" +msgstr "recibió un trofeo" + +#: forum/const.py:104 +msgid "marked best answer" +msgstr "la mejor respuesta fue marcada" + +#: forum/const.py:105 +msgid "upvoted" +msgstr "voto positivo" + +#: forum/const.py:106 +msgid "downvoted" +msgstr "voto negativo" + +#: forum/const.py:107 +msgid "canceled vote" +msgstr "voto cancelado" + +#: forum/const.py:108 +msgid "deleted question" +msgstr "eliminar pregunta" + +#: forum/const.py:109 +msgid "deleted answer" +msgstr "eliminar respuesta" + +#: forum/const.py:110 +msgid "marked offensive" +msgstr "marcar como ofensivo" + +#: forum/const.py:111 +msgid "updated tags" +msgstr "actualizar etiquetas" + +#: forum/const.py:112 +msgid "selected favorite" +msgstr "seleccionar favorito" + +#: forum/const.py:113 +msgid "completed user profile" +msgstr "completar perfil de usuario" + +#: forum/const.py:114 +msgid "email update sent to user" +msgstr "enviar actualizaciones al usuario" + +#: forum/const.py:118 +msgid "question_answered" +msgstr "pregunta_respondida" + +#: forum/const.py:119 +msgid "question_commented" +msgstr "pregunta_comentada" + +#: forum/const.py:120 +msgid "answer_commented" +msgstr "respuesta_comentada" + +#: forum/const.py:121 +msgid "answer_accepted" +msgstr "respuesta_aceptada" + +#: forum/const.py:125 +msgid "[closed]" +msgstr "[cerrado]" + +#: forum/const.py:126 +msgid "[deleted]" +msgstr "[eliminado]" + +#: forum/const.py:127 forum/views/readers.py:396 forum/views/readers.py:417 +msgid "initial version" +msgstr "versión inicial" + +#: forum/const.py:128 +msgid "retagged" +msgstr "re-etiquetado" + +#: forum/const.py:132 +msgid "exclude ignored tags" +msgstr "excluir etiquetas ignoradas" + +#: forum/const.py:132 +msgid "allow only selected tags" +msgstr "permitir unicamente etiquetas seleccionadas" + +#: forum/feed.py:18 +msgid " - " +msgstr "-" + +#: forum/feed.py:18 +msgid "latest questions" +msgstr "últimas preguntas" + +#: forum/forms.py:23 forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "title" +msgstr "título" + +#: forum/forms.py:24 +msgid "please enter a descriptive title for your question" +msgstr "por favor ingrese un título descriptivo para su pregunta" + +#: forum/forms.py:29 +msgid "title must be > 10 characters" +msgstr "el título debe contener más de 10 carácteres" + +#: forum/forms.py:38 +msgid "content" +msgstr "contenido" + +#: forum/forms.py:44 +msgid "question content must be > 10 characters" +msgstr "la pregunta debe contener más de 10 carácteres" + +#: forum/forms.py:53 forum/skins/default/templates/header.html:28 +msgid "tags" +msgstr "etiquetas" + +#: forum/forms.py:55 +msgid "" +"Tags are short keywords, with no spaces within. Up to five tags can be used." +msgstr "" +"Las etiquetas son claves cortas, con o sin espacios. Puedes usar más de 5 " +"etiquetas." + +#: forum/forms.py:62 forum/skins/default/templates/question_retag.html:39 +msgid "tags are required" +msgstr "etiquetas requeridas" + +#: forum/forms.py:70 +#, fuzzy, python-format +msgid "please use %(tag_count)d tag or less" +msgid_plural "please use %(tag_count)d tags or less" +msgstr[0] "por favor, use 5 etiquetas o menos" +msgstr[1] "por favor, use 5 etiquetas o menos" + +#: forum/forms.py:79 +#, fuzzy, python-format +msgid "each tag must be shorter than %(max_chars)d character" +msgid_plural "each tag must be shorter than %(max_chars)d characters" +msgstr[0] "las etiquetas deben contener menos de 20 carácteres" +msgstr[1] "las etiquetas deben contener menos de 20 carácteres" + +#: forum/forms.py:87 +msgid "use-these-chars-in-tags" +msgstr "" + +#: forum/forms.py:97 +#: forum/skins/default/templates/post_contributor_info.html:7 +#: forum/skins/default/templates/question_summary_list_roll.html:26 +#: forum/skins/default/templates/question_summary_list_roll.html:38 +msgid "community wiki" +msgstr "wiki" + +#: forum/forms.py:98 +msgid "" +"if you choose community wiki option, the question and answer do not generate " +"points and name of author will not be shown" +msgstr "" +"si marcas la opción Wiki, la pregunta y las respuestas no generan puntos y " +"el nombre del autor no se muestra" + +#: forum/forms.py:114 +msgid "update summary:" +msgstr "actualizar resúmen:" + +#: forum/forms.py:115 +msgid "" +"enter a brief summary of your revision (e.g. fixed spelling, grammar, " +"improved style, this field is optional)" +msgstr "" +"ingrese un breve resumen de su revisión (por ejemplo, corregir la " +"ortografía, la gramática, el estilo mejorado, este campo es opcional)" + +#: forum/forms.py:118 +msgid "Automatically accept user's contributions for the email updates" +msgstr "" +"Aceptar automáticamente las contribuciones de los usuarios para las " +"actualizaciones de correo electrónico" + +#: forum/forms.py:209 +msgid "Your name:" +msgstr "Tu nombre:" + +#: forum/forms.py:210 +msgid "Email (not shared with anyone):" +msgstr "Email (no lo compartiremos con nadie):" + +#: forum/forms.py:211 +msgid "Your message:" +msgstr "Tu mensaje:" + +#: forum/forms.py:294 +msgid "this email does not have to be linked to gravatar" +msgstr "este email no esta vinculado con gravatar" + +#: forum/forms.py:296 +msgid "Screen name" +msgstr "Nombre para mostrar" + +#: forum/forms.py:297 +msgid "Real name" +msgstr "Nombre Real" + +#: forum/forms.py:298 +msgid "Website" +msgstr "Sitio Web" + +#: forum/forms.py:299 +msgid "Location" +msgstr "Localización" + +#: forum/forms.py:300 +msgid "Date of birth" +msgstr "Fecha de nacimiento" + +#: forum/forms.py:300 +msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" +msgstr "no será mostrada, se usa para calcular la edad, formato: Año-Mes-Dia" + +#: forum/forms.py:301 forum/skins/default/templates/account_settings.html:21 +#: forum/skins/default/templates/authopenid/settings.html:21 +msgid "Profile" +msgstr "Perfil" + +#: forum/forms.py:332 forum/forms.py:333 +msgid "this email has already been registered, please use another one" +msgstr "" +"esta dirección de email ya ha sido registrada, por favor utiliza una " +"diferente" + +#: forum/forms.py:339 +msgid "Choose email tag filter" +msgstr "Seleccione una etiqueta de filtro para el email" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "weekly" +msgstr "semanal" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "no email" +msgstr "no enviar emails" + +#: forum/forms.py:356 +msgid "daily" +msgstr "diario" + +#: forum/forms.py:371 +msgid "Asked by me" +msgstr "Preguntadas por mi" + +#: forum/forms.py:374 +msgid "Answered by me" +msgstr "Respondidas por mi" + +#: forum/forms.py:377 +msgid "Individually selected" +msgstr "Selección individual" + +#: forum/forms.py:380 +msgid "Entire forum (tag filtered)" +msgstr "Foro completo (filtrado por etiqueta)" + +#: forum/forms.py:434 +msgid "okay, let's try!" +msgstr "bien, vamos a probar!" + +#: forum/forms.py:435 +msgid "no community email please, thanks" +msgstr "no usar un email de la comunidad, por favor" + +#: forum/forms.py:438 +msgid "please choose one of the options above" +msgstr "por favor seleccione una de las siguientes opciones" + +#: forum/urls.py:28 +msgid "upfiles/" +msgstr "archivos-subidos/" + +#: forum/urls.py:33 +msgid "about/" +msgstr "acerca-de/" + +#: forum/urls.py:34 +msgid "faq/" +msgstr "faq/" + +#: forum/urls.py:35 +msgid "privacy/" +msgstr "privacidad/" + +#: forum/urls.py:36 +msgid "logout/" +msgstr "salir/" + +#: forum/urls.py:37 forum/urls.py:38 forum/urls.py:39 forum/urls.py:56 +msgid "answers/" +msgstr "respuestas/" + +#: forum/urls.py:37 forum/urls.py:49 forum/urls.py:52 forum/urls.py:56 +msgid "comments/" +msgstr "comentarios/" + +#: forum/urls.py:38 forum/urls.py:43 forum/urls.py:78 +#: forum/skins/default/templates/user_info.html:47 +msgid "edit/" +msgstr "editar/" + +#: forum/urls.py:39 forum/urls.py:48 +msgid "revisions/" +msgstr "revisiones/" + +#: forum/urls.py:40 forum/urls.py:41 forum/urls.py:42 forum/urls.py:43 +#: forum/urls.py:44 forum/urls.py:45 forum/urls.py:46 forum/urls.py:47 +#: forum/urls.py:48 forum/urls.py:49 forum/urls.py:52 +msgid "questions/" +msgstr "preguntas/" + +#: forum/urls.py:41 forum_modules/books/urls.py:8 +msgid "ask/" +msgstr "preguntar/" + +#: forum/urls.py:42 +msgid "unanswered/" +msgstr "sinrespuesta/" + +#: forum/urls.py:44 +msgid "close/" +msgstr "cerrar/" + +#: forum/urls.py:45 +msgid "reopen/" +msgstr "reabrir/" + +#: forum/urls.py:46 +msgid "answer/" +msgstr "responder/" + +#: forum/urls.py:47 +msgid "vote/" +msgstr "votar/" + +#: forum/urls.py:50 +msgid "command/" +msgstr "comando/" + +#: forum/urls.py:60 forum/views/readers.py:265 +msgid "question/" +msgstr "pregunta/" + +#: forum/urls.py:61 forum/urls.py:62 +msgid "tags/" +msgstr "etiquetas/" + +#: forum/urls.py:64 forum/urls.py:68 +msgid "mark-tag/" +msgstr "marcar-etiqueta/" + +#: forum/urls.py:64 +msgid "interesting/" +msgstr "interesante/" + +#: forum/urls.py:68 +msgid "ignored/" +msgstr "ignorada/" + +#: forum/urls.py:72 +msgid "unmark-tag/" +msgstr "desmarcar-etiqueta/" + +#: forum/urls.py:76 forum/urls.py:78 forum/urls.py:79 +msgid "users/" +msgstr "usuarios/" + +#: forum/urls.py:77 +msgid "moderate-user/" +msgstr "moderar-usuario/" + +#: forum/urls.py:80 forum/urls.py:81 +msgid "badges/" +msgstr "trofeos/" + +#: forum/urls.py:82 +msgid "messages/" +msgstr "mensajes/" + +#: forum/urls.py:82 +msgid "markread/" +msgstr "marcar-como-leidos/" + +#: forum/urls.py:84 +#, fuzzy +msgid "nimda/" +msgstr "nimda/" + +#: forum/urls.py:86 +msgid "upload/" +msgstr "subir/" + +#: forum/urls.py:87 +msgid "search/" +msgstr "buscar/" + +#: forum/urls.py:88 +msgid "feedback/" +msgstr "feedback/" + +#: forum/urls.py:89 forum/urls.py:90 +msgid "account/" +msgstr "cuenta/" + +#: forum/importers/stackexchange/management/commands/load_stackexchange.py:124 +msgid "Congratulations, you are now an Administrator" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:236 +msgid "email update message subject" +msgstr "asunto del email" + +#: forum/management/commands/send_email_alerts.py:238 +#, python-format +msgid "%(name)s, this is an update message header for %(num)d question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "" +msgstr[1] "" + +#: forum/management/commands/send_email_alerts.py:255 +msgid "new question" +msgstr "nueva pregunta" + +#: forum/management/commands/send_email_alerts.py:272 +msgid "" +"Please visit the forum and see what's new! Could you spread the word about " +"it - can somebody you know help answering those questions or benefit from " +"posting one?" +msgstr "" +"Por favor, visita el foro y mira lo que hay de nuevo. ¿Podría correr la voz " +"sobre ello - conoce a alguien que sepa la respuesta a las preguntas?" + +#: forum/management/commands/send_email_alerts.py:284 +msgid "" +"Your most frequent subscription setting is 'daily' on selected questions. If " +"you are receiving more than one email per dayplease tell about this issue to " +"the forum administrator." +msgstr "" +"Usted ha configurado recibir un email 'diario' sobre las preguntas " +"seleccionadas. Si usted está recibiendo más de un correo electrónico al día, " +"por favor no dude en reportar acerca de este problema al administrador del " +"foro." + +#: forum/management/commands/send_email_alerts.py:290 +msgid "" +"Your most frequent subscription setting is 'weekly' if you are receiving " +"this email more than once a week please report this issue to the forum " +"administrator." +msgstr "" +"Usted ha configurado recibir un email 'semanal' sobre las preguntas " +"seleccionadas. Si usted está recibiendo más de un correo electrónico a la " +"semana, por favor no dude en reportar acerca de este problema al " +"administrador del foro." + +#: forum/management/commands/send_email_alerts.py:296 +msgid "" +"There is a chance that you may be receiving links seen before - due to a " +"technicality that will eventually go away. " +msgstr "" +"Existe la posibilidad de que usted puede estar recibiendo enlaces visto " +"antes - debido a un tecnicismo que a la larga va a desaparecer." + +#: forum/management/commands/send_email_alerts.py:311 +#, fuzzy, python-format +msgid "" +"go to %(link)s to change frequency of email updates or %(email)s " +"administrator" +msgstr "" +"ir a %(link)s para cambiar la frecuencia de notificaciones por email o " +"contacte al administrador" + +#: forum/middleware/anon_user.py:34 +#, python-format +msgid "First time here? Check out the FAQ!" +msgstr "Primera vez? Lee nuestra Preguntas Mas Frecuentes!" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +#, fuzzy +msgid "Deleted own post with score of 3 or higher" +msgstr "Eliminó su propio post con %s puntos o superior" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Peer Pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "peer-pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +#, fuzzy +msgid "Deleted own post with score of -3 or lower" +msgstr "Elminió su propio post con %s puntos o inferior" + +#: forum/migrations/0005_install_badges.py:12 +#, fuzzy +msgid "Nice answer" +msgstr "editar respuesta" + +#: forum/migrations/0005_install_badges.py:12 +#, fuzzy +msgid "nice-answer" +msgstr "respuesta" + +#: forum/migrations/0005_install_badges.py:12 +#, fuzzy +msgid "Answer voted up 10 times" +msgstr "Respuesta votada %s veces" + +#: forum/migrations/0005_install_badges.py:13 +#, fuzzy +msgid "Nice Question" +msgstr "Preguntas" + +#: forum/migrations/0005_install_badges.py:13 +#, fuzzy +msgid "nice-question" +msgstr "nueva pregunta" + +#: forum/migrations/0005_install_badges.py:13 +#, fuzzy +msgid "Question voted up 10 times" +msgstr "Pregunta votada %s veces" + +#: forum/migrations/0005_install_badges.py:14 +#, fuzzy +msgid "Pundit" +msgstr "editar" + +#: forum/migrations/0005_install_badges.py:14 +#, fuzzy +msgid "pundit" +msgstr "editar" + +#: forum/migrations/0005_install_badges.py:14 +#, fuzzy +msgid "Left 10 comments with score of 10 or more" +msgstr "Elminió su propio post con %s puntos o inferior" + +#: forum/migrations/0005_install_badges.py:15 +#, fuzzy +msgid "Popular Question" +msgstr "Formula tu pregunta" + +#: forum/migrations/0005_install_badges.py:15 +#, fuzzy +msgid "popular-question" +msgstr "pregunta" + +#: forum/migrations/0005_install_badges.py:15 +#, fuzzy +msgid "Asked a question with 1,000 views" +msgstr "Hizo una pregunta con %s visitas" + +#: forum/migrations/0005_install_badges.py:16 +msgid "Citizen patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "citizen-patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "First flagged post" +msgstr "Primer comentario reportado" + +#: forum/migrations/0005_install_badges.py:17 +msgid "Cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "First rollback" +msgstr "Reversión Primera" + +#: forum/migrations/0005_install_badges.py:18 +msgid "Critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "First down vote" +msgstr "Primer voto negativo" + +#: forum/migrations/0005_install_badges.py:19 +#, fuzzy +msgid "Editor" +msgstr "editar" + +#: forum/migrations/0005_install_badges.py:19 +#, fuzzy +msgid "editor" +msgstr "editar" + +#: forum/migrations/0005_install_badges.py:19 +msgid "First edit" +msgstr "Primer edicion" + +#: forum/migrations/0005_install_badges.py:20 +msgid "Organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +#, fuzzy +msgid "organizer" +msgstr "Tu respuesta" + +#: forum/migrations/0005_install_badges.py:20 +msgid "First retag" +msgstr "Primer re-etiquetado" + +#: forum/migrations/0005_install_badges.py:21 +msgid "Scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "First accepted answer on your own question" +msgstr "Primer respuesta aceptada a un pregunta tuya" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Asked first question with at least one up vote" +msgstr "Primera pregunta con al menos un voto" + +#: forum/migrations/0005_install_badges.py:23 +#, fuzzy +msgid "Supporter" +msgstr "voto positivo" + +#: forum/migrations/0005_install_badges.py:23 +#, fuzzy +msgid "supporter" +msgstr "voto positivo" + +#: forum/migrations/0005_install_badges.py:23 +msgid "First up vote" +msgstr "Primer voto positivo" + +#: forum/migrations/0005_install_badges.py:24 +#, fuzzy +msgid "Teacher" +msgstr "buscar" + +#: forum/migrations/0005_install_badges.py:24 +#, fuzzy +msgid "teacher" +msgstr "buscar" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Answered first question with at least one up vote" +msgstr "La primera pregunta respondió con al menos un voto" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Completed all user profile fields" +msgstr "Completar todos los campos del perfil de usuario" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Self-Learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "self-learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +#, fuzzy +msgid "Answered your own question with at least 3 up votes" +msgstr "Respondido a su propia pregunta con un mínimo de hasta %s votos" + +#: forum/migrations/0005_install_badges.py:27 +#, fuzzy +msgid "Great Answer" +msgstr "respuesta" + +#: forum/migrations/0005_install_badges.py:27 +#, fuzzy +msgid "great-answer" +msgstr "respuesta" + +#: forum/migrations/0005_install_badges.py:27 +#, fuzzy +msgid "Answer voted up 100 times" +msgstr "Respuesta votada %s veces" + +#: forum/migrations/0005_install_badges.py:28 +#, fuzzy +msgid "Great Question" +msgstr "re-etiquetar preguntas" + +#: forum/migrations/0005_install_badges.py:28 +#, fuzzy +msgid "great-question" +msgstr "re-etiquetar preguntas" + +#: forum/migrations/0005_install_badges.py:28 +#, fuzzy +msgid "Question voted up 100 times" +msgstr "Pregunta votada %s veces" + +#: forum/migrations/0005_install_badges.py:29 +#, fuzzy +msgid "Stellar Question" +msgstr "Aún tiene preguntas?" + +#: forum/migrations/0005_install_badges.py:29 +#, fuzzy +msgid "stellar-question" +msgstr "ver todas las preguntas" + +#: forum/migrations/0005_install_badges.py:29 +#, fuzzy +msgid "Question favorited by 100 users" +msgstr "Pregunta marcada como favorita por %s usuarios" + +#: forum/migrations/0005_install_badges.py:30 +#, fuzzy +msgid "Famous question" +msgstr "Cerrar pregunta" + +#: forum/migrations/0005_install_badges.py:30 +#, fuzzy +msgid "famous-question" +msgstr "pregunta" + +#: forum/migrations/0005_install_badges.py:30 +#, fuzzy +msgid "Asked a question with 10,000 views" +msgstr "Hizo una pregunta con %s visitas" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Actively participated in the private alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +#, fuzzy +msgid "Good Answer" +msgstr "antiguar respuestas" + +#: forum/migrations/0005_install_badges.py:32 +#, fuzzy +msgid "good-answer" +msgstr "respuesta" + +#: forum/migrations/0005_install_badges.py:32 +#, fuzzy +msgid "Answer voted up 25 times" +msgstr "Respuesta votada %s veces" + +#: forum/migrations/0005_install_badges.py:33 +#, fuzzy +msgid "Good Question" +msgstr "Preguntas" + +#: forum/migrations/0005_install_badges.py:33 +#, fuzzy +msgid "good-question" +msgstr "pregunta" + +#: forum/migrations/0005_install_badges.py:33 +#, fuzzy +msgid "Question voted up 25 times" +msgstr "Pregunta votada %s veces" + +#: forum/migrations/0005_install_badges.py:34 +#, fuzzy +msgid "Favorite Question" +msgstr "preguntas favoritas" + +#: forum/migrations/0005_install_badges.py:34 +#, fuzzy +msgid "favorite-question" +msgstr "preguntas favoritas" + +#: forum/migrations/0005_install_badges.py:34 +#, fuzzy +msgid "Question favorited by 25 users" +msgstr "Pregunta marcada como favorita por %s usuarios" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Civic duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "civic-duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +#, fuzzy +msgid "Voted 300 times" +msgstr "Votado %s veces" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Strunk & White" +msgstr "Strunk & White" + +#: forum/migrations/0005_install_badges.py:36 +#, fuzzy +msgid "strunk-and-white" +msgstr "Strunk & White" + +#: forum/migrations/0005_install_badges.py:36 +#, fuzzy +msgid "Edited 100 entries" +msgstr "Ha editado %s entradas" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Active in many different tags" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Expert" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +#, fuzzy +msgid "expert" +msgstr "texto" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Very active in one tag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Active member for a year" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +#, fuzzy +msgid "Notable Question" +msgstr "todas las preguntas" + +#: forum/migrations/0005_install_badges.py:40 +#, fuzzy +msgid "notable-question" +msgstr "nueva pregunta" + +#: forum/migrations/0005_install_badges.py:40 +#, fuzzy +msgid "Asked a question with 2,500 views" +msgstr "Hizo una pregunta con %s visitas" + +#: forum/migrations/0005_install_badges.py:41 +msgid "Enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +#, fuzzy +msgid "First answer was accepted with at least 10 up votes" +msgstr "Primera respuesta que fue aceptada con un mínimo de %s votos" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Actively participated in the private beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +#, fuzzy +msgid "Accepted answer and voted up 40 times" +msgstr "Respuesta acetada y votada %s veces" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +#, fuzzy +msgid "Answered a question more than 60 days later with at least 5 votes" +msgstr "" +"Respondio una pregunta más de `%(dif_days)s` días con al menos `%(up_votes)" +"s` votos" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +#, fuzzy +msgid "Created a tag used by 50 questions" +msgstr "Creo una etiqueta usada por %s preguntas" + +#: forum/models/question.py:499 +#, fuzzy, python-format +msgid "%(author)s modified the question" +msgstr "%(author)s modificaron la pregunta" + +#: forum/models/question.py:503 +#, fuzzy, python-format +msgid "%(people)s posted %(new_answer_count)s new answers" +msgstr "%(people)s publicaron %(new_answer_count)s nuevas respuestas" + +#: forum/models/question.py:508 +#, fuzzy, python-format +msgid "%(people)s commented the question" +msgstr "%(people)s comentaron la pregunta" + +#: forum/models/question.py:513 +#, fuzzy, python-format +msgid "%(people)s commented answers" +msgstr "%(people)s comentaron respuestas" + +#: forum/models/question.py:515 +#, python-format +msgid "%(people)s commented an answer" +msgstr "%(people)s comentaron una respuesta" + +#: forum/models/repute.py:13 forum/skins/default/templates/badges.html:54 +msgid "gold" +msgstr "oro" + +#: forum/models/repute.py:14 forum/skins/default/templates/badges.html:62 +msgid "silver" +msgstr "plata" + +#: forum/models/repute.py:15 forum/skins/default/templates/badges.html:69 +msgid "bronze" +msgstr "bronce" + +#: forum/models/tag.py:81 +msgid "interesting" +msgstr "interesante" + +#: forum/models/tag.py:81 +msgid "ignored" +msgstr "ignorado" + +#: forum/models/user.py:36 +msgid "Entire forum" +msgstr "Foro entero" + +#: forum/models/user.py:37 +msgid "Questions that I asked" +msgstr "Preguntas que he formulado" + +#: forum/models/user.py:38 +msgid "Questions that I answered" +msgstr "Preguntas que he respondido" + +#: forum/models/user.py:39 +msgid "Individually selected questions" +msgstr "Selección individual de preguntas" + +#: forum/models/user.py:42 +msgid "Weekly" +msgstr "Semanal" + +#: forum/models/user.py:43 +msgid "Daily" +msgstr "Diario" + +#: forum/models/user.py:44 +msgid "No email" +msgstr "No enviar email" + +#: forum/skins/default/templates/404.html:24 +msgid "Sorry, could not find the page you requested." +msgstr "Lo sentimos, no hemos encontrado la pagina que haz solicitado" + +#: forum/skins/default/templates/404.html:26 +msgid "This might have happened for the following reasons:" +msgstr "Estas son las posibles razones:" + +#: forum/skins/default/templates/404.html:28 +msgid "this question or answer has been deleted;" +msgstr "la pregunta o respuesta ha sido eliminada;" + +#: forum/skins/default/templates/404.html:29 +msgid "url has error - please check it;" +msgstr "la url es errónea - por favor verificala;" + +#: forum/skins/default/templates/404.html:30 +msgid "" +"the page you tried to visit is protected or you don't have sufficient " +"points, see" +msgstr "" +"la pagina a la que estás intentando acceder esta protegida y no tienes los " +"suficientes puntos para verla" + +#: forum/skins/default/templates/404.html:31 +msgid "if you believe this error 404 should not have occured, please" +msgstr "Si usted cree que este error 404 no debería haber ocurrido, por favor" + +#: forum/skins/default/templates/404.html:32 +msgid "report this problem" +msgstr "reporte este problema" + +#: forum/skins/default/templates/404.html:41 +#: forum/skins/default/templates/500.html:27 +msgid "back to previous page" +msgstr "regrese a la pagina anterior" + +#: forum/skins/default/templates/404.html:42 +#: forum/skins/default/templates/questions.html:52 +msgid "see all questions" +msgstr "ver todas las preguntas" + +#: forum/skins/default/templates/404.html:43 +msgid "see all tags" +msgstr "ver todas las etiquetas" + +#: forum/skins/default/templates/500.html:22 +msgid "sorry, system error" +msgstr "lo sentimos, ocurrió un error del sistema" + +#: forum/skins/default/templates/500.html:24 +msgid "system error log is recorded, error will be fixed as soon as possible" +msgstr "" +"cada error del sistema es registrado, el error será corregido tan pronto " +"como sea posible" + +#: forum/skins/default/templates/500.html:25 +msgid "please report the error to the site administrators if you wish" +msgstr "por favor reporte el error con el administrador de este sitio" + +#: forum/skins/default/templates/500.html:28 +msgid "see latest questions" +msgstr "ver las últimas preguntas" + +#: forum/skins/default/templates/500.html:29 +msgid "see tags" +msgstr "ver las etiquetas" + +#: forum/skins/default/templates/about.html:6 +#: forum/skins/default/templates/about.html:11 +msgid "About" +msgstr "Acerca de" + +#: forum/skins/default/templates/account_settings.html:4 +#: forum/skins/default/templates/authopenid/settings.html:4 +msgid "Account functions" +msgstr "Funciones de la Cuenta" + +#: forum/skins/default/templates/account_settings.html:29 +#: forum/skins/default/templates/authopenid/changepw.html:5 +#: forum/skins/default/templates/authopenid/changepw.html:14 +#: forum/skins/default/templates/authopenid/settings.html:29 +msgid "Change password" +msgstr "Cambiar Contraseña" + +#: forum/skins/default/templates/account_settings.html:30 +#: forum/skins/default/templates/authopenid/settings.html:30 +msgid "Give your account a new password." +msgstr "Obtener una nueva contraseña" + +#: forum/skins/default/templates/account_settings.html:32 +#: forum/skins/default/templates/authopenid/settings.html:31 +msgid "Change email " +msgstr "Cambiar email" + +#: forum/skins/default/templates/account_settings.html:33 +#: forum/skins/default/templates/authopenid/settings.html:32 +msgid "Add or update the email address associated with your account." +msgstr "Agregar o actualizar la dirección de email asociada a tu cuenta." + +#: forum/skins/default/templates/account_settings.html:35 +#: forum/skins/default/templates/authopenid/changeopenid.html:4 +#: forum/skins/default/templates/authopenid/changeopenid.html:30 +#: forum/skins/default/templates/authopenid/settings.html:34 +msgid "Change OpenID" +msgstr "Cambiar OpenID" + +#: forum/skins/default/templates/account_settings.html:36 +#: forum/skins/default/templates/authopenid/settings.html:35 +msgid "Change openid associated to your account" +msgstr "Cambiar el OpenID asociado a tu cuenta" + +#: forum/skins/default/templates/account_settings.html:39 +#: forum/skins/default/templates/authopenid/delete.html:4 +#: forum/skins/default/templates/authopenid/settings.html:38 +msgid "Delete account" +msgstr "Eliminar cuenta" + +#: forum/skins/default/templates/account_settings.html:40 +#: forum/skins/default/templates/authopenid/settings.html:39 +msgid "Erase your username and all your data from website" +msgstr "Eliminar tu nombre de usuario y todos tus datos de este sitio" + +#: forum/skins/default/templates/answer_edit.html:5 +#: forum/skins/default/templates/answer_edit.html:48 +msgid "Edit answer" +msgstr "Editar respuesta" + +#: forum/skins/default/templates/answer_edit.html:25 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:26 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:46 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:25 +#: forum/skins/default/templates/question_edit.html:28 +msgid "hide preview" +msgstr "ocultar vista previa" + +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:28 +msgid "show preview" +msgstr "mostrar vista previa" + +#: forum/skins/default/templates/answer_edit.html:48 +#: forum/skins/default/templates/question_edit.html:66 +#: forum/skins/default/templates/question_retag.html:53 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "back" +msgstr "regresar" + +#: forum/skins/default/templates/answer_edit.html:53 +#: forum/skins/default/templates/question_edit.html:71 +#: forum/skins/default/templates/revisions_answer.html:52 +#: forum/skins/default/templates/revisions_question.html:52 +msgid "revision" +msgstr "revisión" + +#: forum/skins/default/templates/answer_edit.html:56 +#: forum/skins/default/templates/question_edit.html:75 +msgid "select revision" +msgstr "seleccionar revisión" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:418 +#: forum/skins/default/templates/question_edit.html:92 +msgid "Toggle the real time Markdown editor preview" +msgstr "Vista preliminar en tiempo real del editor Markdown" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:419 +#: forum/skins/default/templates/question_edit.html:92 +msgid "toggle preview" +msgstr "Vista preliminar" + +#: forum/skins/default/templates/answer_edit.html:72 +#: forum/skins/default/templates/question_edit.html:118 +#: forum/skins/default/templates/question_retag.html:74 +msgid "Save edit" +msgstr "Guardar edición" + +#: forum/skins/default/templates/answer_edit.html:73 +#: forum/skins/default/templates/close.html:29 +#: forum/skins/default/templates/feedback.html:50 +#: forum/skins/default/templates/question_edit.html:119 +#: forum/skins/default/templates/question_retag.html:75 +#: forum/skins/default/templates/reopen.html:30 +#: forum/skins/default/templates/user_edit.html:90 +#: forum/skins/default/templates/authopenid/changeemail.html:40 +msgid "Cancel" +msgstr "Cancelar" + +#: forum/skins/default/templates/answer_edit_tips.html:4 +msgid "answer tips" +msgstr "responder tips" + +#: forum/skins/default/templates/answer_edit_tips.html:7 +msgid "please make your answer relevant to this community" +msgstr "por favor intenta que tu respuesta sea relevante para la comunidad" + +#: forum/skins/default/templates/answer_edit_tips.html:10 +msgid "try to give an answer, rather than engage into a discussion" +msgstr "trata de dar una respuesta, en lugar de iniciar un debate" + +#: forum/skins/default/templates/answer_edit_tips.html:13 +msgid "please try to provide details" +msgstr "intenta dar algunos detalles" + +#: forum/skins/default/templates/answer_edit_tips.html:16 +#: forum/skins/default/templates/question_edit_tips.html:13 +msgid "be clear and concise" +msgstr "se claro y conciso" + +#: forum/skins/default/templates/answer_edit_tips.html:20 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "see frequently asked questions" +msgstr "mira las preguntas más frecuentes" + +#: forum/skins/default/templates/answer_edit_tips.html:26 +#: forum/skins/default/templates/question_edit_tips.html:23 +msgid "Markdown tips" +msgstr "Markdown tips" + +#: forum/skins/default/templates/answer_edit_tips.html:29 +#: forum/skins/default/templates/question_edit_tips.html:26 +msgid "*italic* or __italic__" +msgstr "*italic* o __italic__" + +#: forum/skins/default/templates/answer_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:29 +msgid "**bold** or __bold__" +msgstr "**bold** o __bold__" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/question_edit_tips.html:32 +msgid "link" +msgstr "enlace" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "text" +msgstr "texto" + +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "image" +msgstr "imagen" + +#: forum/skins/default/templates/answer_edit_tips.html:43 +#: forum/skins/default/templates/question_edit_tips.html:41 +msgid "numbered list:" +msgstr "numerar:" + +#: forum/skins/default/templates/answer_edit_tips.html:48 +#: forum/skins/default/templates/question_edit_tips.html:46 +msgid "basic HTML tags are also supported" +msgstr "HTML básico es soportado" + +#: forum/skins/default/templates/answer_edit_tips.html:52 +#: forum/skins/default/templates/question_edit_tips.html:50 +msgid "learn more about Markdown" +msgstr "lee acerca de Markdown" + +#: forum/skins/default/templates/ask.html:5 +#: forum/skins/default/templates/ask.html:62 +msgid "Ask a question" +msgstr "Formula una pregunta" + +#: forum/skins/default/templates/ask.html:69 +#: forum/skins/default/templates/ask_form.html:11 +msgid "login to post question info" +msgstr "ingresa para publicar información de la pregunta" + +#: forum/skins/default/templates/ask.html:75 +#, fuzzy, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " + +#: forum/skins/default/templates/ask.html:113 +#: forum/skins/default/templates/ask_form.html:54 +msgid "(required)" +msgstr "(requerido)" + +#: forum/skins/default/templates/ask.html:120 +#: forum/skins/default/templates/ask_form.html:61 +msgid "Login/signup to post your question" +msgstr "Ingresa/registrate para publicar tu pregunta" + +#: forum/skins/default/templates/ask.html:122 +#: forum/skins/default/templates/ask_form.html:63 +msgid "Ask your question" +msgstr "Formula tu pregunta" + +#: forum/skins/default/templates/ask_form.html:15 +#, fuzzy, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " + +#: forum/skins/default/templates/badge.html:6 +#: forum/skins/default/templates/badge.html:17 +msgid "Badge" +msgstr "Medalla" + +#: forum/skins/default/templates/badge.html:26 +msgid "user received this badge:" +msgid_plural "users received this badge:" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/badges.html:6 +msgid "Badges summary" +msgstr "Resúmen de medallas" + +#: forum/skins/default/templates/badges.html:17 +msgid "Badges" +msgstr "Medallas" + +#: forum/skins/default/templates/badges.html:21 +msgid "Community gives you awards for your questions, answers and votes." +msgstr "La comunidad le da premios a sus preguntas, respuestas y votos." + +#: forum/skins/default/templates/badges.html:22 +#, python-format +msgid "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +" " +msgstr "" +"A continuación se muestra una lista de las medallas disponibles y el " +"numero \n" +" de veces que ha sido otorgada. Dinos que piensas al respecto en %" +"(feedback_faq_url)s.\n" +" " + +#: forum/skins/default/templates/badges.html:51 +msgid "Community badges" +msgstr "Medallas de la comunidad" + +#: forum/skins/default/templates/badges.html:57 +msgid "gold badge description" +msgstr "descripción de la medalla de oro" + +#: forum/skins/default/templates/badges.html:65 +msgid "silver badge description" +msgstr "descripción de la medalla de plata" + +#: forum/skins/default/templates/badges.html:68 +msgid "bronze badge: often given as a special honor" +msgstr "medalla de bronce: a menudo como un honor especial" + +#: forum/skins/default/templates/badges.html:72 +msgid "bronze badge description" +msgstr "descripción de la medalla de bronce" + +#: forum/skins/default/templates/book.html:7 +msgid "reading channel" +msgstr "leyendo canal" + +#: forum/skins/default/templates/book.html:26 +msgid "[author]" +msgstr "[autor]" + +#: forum/skins/default/templates/book.html:30 +msgid "[publisher]" +msgstr "[publicada por]" + +#: forum/skins/default/templates/book.html:34 +msgid "[publication date]" +msgstr "[fecha de publicación]" + +#: forum/skins/default/templates/book.html:38 +msgid "[price]" +msgstr "[precio]" + +#: forum/skins/default/templates/book.html:39 +msgid "currency unit" +msgstr "unidad de medida" + +#: forum/skins/default/templates/book.html:42 +msgid "[pages]" +msgstr "[paginas]" + +#: forum/skins/default/templates/book.html:43 +msgid "pages abbreviation" +msgstr "abreviacions de pagina" + +#: forum/skins/default/templates/book.html:46 +msgid "[tags]" +msgstr "[etiquetas]" + +#: forum/skins/default/templates/book.html:56 +msgid "author blog" +msgstr "blog del autor" + +#: forum/skins/default/templates/book.html:62 +msgid "book directory" +msgstr "directorio de libros" + +#: forum/skins/default/templates/book.html:66 +msgid "buy online" +msgstr "comprar online" + +#: forum/skins/default/templates/book.html:79 +msgid "reader questions" +msgstr "leer preguntas" + +#: forum/skins/default/templates/book.html:82 +msgid "ask the author" +msgstr "preguntar al autor" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:18 +msgid "this question was selected as favorite" +msgstr "esta pregunta ha sido seleccionada como la favorita" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:18 +msgid "number of times" +msgstr "número de veces" + +#: forum/skins/default/templates/book.html:105 +#: forum/skins/default/templates/question_summary_list_roll.html:14 +msgid "votes" +msgstr "votos" + +#: forum/skins/default/templates/book.html:108 +msgid "the answer has been accepted to be correct" +msgstr "la respuesta ha sido aceptada como la correcta" + +#: forum/skins/default/templates/book.html:115 +#: forum/skins/default/templates/question_summary_list_roll.html:15 +msgid "views" +msgstr "vistas" + +#: forum/skins/default/templates/book.html:125 +#: forum/skins/default/templates/question.html:136 +#: forum/skins/default/templates/question_list.html:19 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/tags.html:50 +#: forum/skins/default/templates/users_questions.html:34 +#, fuzzy, python-format +msgid "see questions tagged '%(tag)s'" +msgstr "ver preguntas etiquetadas con '%(tagname)s'" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to book RSS feed" +msgstr "suscribirse al feed de este libro" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to the questions feed" +msgstr "suscribirse al feed de esta pregunta" + +#: forum/skins/default/templates/close.html:6 +#: forum/skins/default/templates/close.html:16 +msgid "Close question" +msgstr "Cerrar pregunta" + +#: forum/skins/default/templates/close.html:19 +msgid "Close the question" +msgstr "Cerrar la pregunta" + +#: forum/skins/default/templates/close.html:25 +msgid "Reasons" +msgstr "Razones" + +#: forum/skins/default/templates/close.html:28 +msgid "OK to close" +msgstr "Ok cerrar" + +#: forum/skins/default/templates/email_base.html:11 +msgid "home" +msgstr "inicio" + +#: forum/skins/default/templates/faq.html:11 +msgid "Frequently Asked Questions " +msgstr "Preguntas más frecuentes" + +#: forum/skins/default/templates/faq.html:16 +msgid "What kinds of questions can I ask here?" +msgstr "Que tipo de preguntas puedo hacer aquí?" + +#: forum/skins/default/templates/faq.html:17 +msgid "" +"Most importanly - questions should be relevant to this " +"community." +msgstr "" +"Los más importante - las preguntas debe de ser relevantes " +"para esta comunidad." + +#: forum/skins/default/templates/faq.html:18 +msgid "" +"Before asking the question - please make sure to use search to see whether " +"your question has alredy been answered." +msgstr "" +"Antes de hacer una pregunta - asegurate de haber buscado sobre ella, quizas " +"ya encuentres una respuesta concreta." + +#: forum/skins/default/templates/faq.html:21 +msgid "What questions should I avoid asking?" +msgstr "¿Qué preguntas debo evitar hacer?" + +#: forum/skins/default/templates/faq.html:22 +msgid "" +"Please avoid asking questions that are not relevant to this community, too " +"subjective and argumentative." +msgstr "" +"Por favor, evite hacer preguntas que no son relevantes para esta comunidad, " +"demasiado subjetivas y argumentativas." + +#: forum/skins/default/templates/faq.html:27 +msgid "What should I avoid in my answers?" +msgstr "¿Qué debo evitar en mis respuestas?" + +#: forum/skins/default/templates/faq.html:28 +msgid "" +"is a Q&A site, not a discussion group. Therefore - please avoid having " +"discussions in your answers, comment facility allows some space for brief " +"discussions." +msgstr "" +"es un un sitio de Preguntas y Respuestas, no un grupo de discusión. Si " +"quieres discutir, hazlo en los comentarios sobrelas respuestas." + +#: forum/skins/default/templates/faq.html:32 +msgid "Who moderates this community?" +msgstr "Quien modera esta comunidad?" + +#: forum/skins/default/templates/faq.html:33 +msgid "The short answer is: you." +msgstr "La respuesta corta es: tu." + +#: forum/skins/default/templates/faq.html:34 +msgid "This website is moderated by the users." +msgstr "Este sitio es moderado por los usuarios." + +#: forum/skins/default/templates/faq.html:35 +msgid "" +"The reputation system allows users earn the authorization to perform a " +"variety of moderation tasks." +msgstr "" +"El sistema de reputación/karma permite a los usuarios obtener la " +"autorización para realizar una variedad de tareas de moderación." + +#: forum/skins/default/templates/faq.html:40 +msgid "How does reputation system work?" +msgstr "Cómo funciona este sistema de reputación?" + +#: forum/skins/default/templates/faq.html:41 +msgid "Rep system summary" +msgstr "Resumen de reputación del sistema" + +#: forum/skins/default/templates/faq.html:42 +msgid "" +"For example, if you ask an interesting question or give a helpful answer, " +"your input will be upvoted. On the other hand if the answer is misleading - " +"it will be downvoted. Each vote in favor will generate 10 " +"points, each vote against will subtract 2 points. There is " +"a limit of 200 points that can be accumulated per question " +"or answer. The table below explains reputation point requirements for each " +"type of moderation task." +msgstr "" +"Por ejemplo, si una pregunta es interesante o da una respuesta útil, su " +"entrada será votada positiva. Por otra parte, si la respuesta es engañosa - " +"será votada negativa. Cada voto a favor generará 10 " +"puntos, cada voto en contra resta 2 puntos. Hay un límite " +"de 200 puntos que se pueden acumular por cada pregunta o " +"respuesta. La siguiente tabla muestra los puntos necesarios en la reputación " +"para obtener autorización de realizar diversas tareas de moderación." + +#: forum/skins/default/templates/faq.html:53 +#: forum/skins/default/templates/user_votes.html:15 +msgid "upvote" +msgstr "voto positivo" + +#: forum/skins/default/templates/faq.html:57 +msgid "use tags" +msgstr "usar etiquetas" + +#: forum/skins/default/templates/faq.html:62 +msgid "add comments" +msgstr "comentar" + +#: forum/skins/default/templates/faq.html:66 +#: forum/skins/default/templates/user_votes.html:17 +msgid "downvote" +msgstr "voto negativo" + +#: forum/skins/default/templates/faq.html:69 +msgid "open and close own questions" +msgstr "abrir y cerrar preguntas propias" + +#: forum/skins/default/templates/faq.html:73 +msgid "retag questions" +msgstr "re-etiquetar preguntas" + +#: forum/skins/default/templates/faq.html:78 +msgid "edit community wiki questions" +msgstr "editar preguntas wiki" + +#: forum/skins/default/templates/faq.html:83 +msgid "edit any answer" +msgstr "editar cualquier respuesta" + +#: forum/skins/default/templates/faq.html:87 +msgid "open any closed question" +msgstr "abrir y cerrar preguntas" + +#: forum/skins/default/templates/faq.html:91 +msgid "delete any comment" +msgstr "eliminar cualquier comentario" + +#: forum/skins/default/templates/faq.html:95 +msgid "delete any questions and answers and perform other moderation tasks" +msgstr "" +"eliminar cualquier pregunta y respuesta, y agregar otras tareas de moderación" + +#: forum/skins/default/templates/faq.html:103 +msgid "how to validate email title" +msgstr "Cómo validar una email" + +#: forum/skins/default/templates/faq.html:105 +#, fuzzy, python-format +msgid "" +"how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" +msgstr "como validar una email con %(send_email_key_url)s %(gravatar_faq_url)s" + +#: forum/skins/default/templates/faq.html:110 +msgid "what is gravatar" +msgstr "que es gravatar" + +#: forum/skins/default/templates/faq.html:111 +msgid "gravatar faq info" +msgstr "información de gravatar" + +#: forum/skins/default/templates/faq.html:114 +msgid "To register, do I need to create new password?" +msgstr "Para registrarme, necesito crear una contraseña?" + +#: forum/skins/default/templates/faq.html:115 +msgid "" +"No, you don't have to. You can login through any service that supports " +"OpenID, e.g. Google, Yahoo, AOL, etc." +msgstr "" +"No, no la necesitas. Puedes usar los datos de tus servicios que son " +"compatibles con OpenID, como Google, Yahoo, AOL, etc." + +#: forum/skins/default/templates/faq.html:116 +msgid "Login now!" +msgstr "Ingresar ahora!" + +#: forum/skins/default/templates/faq.html:121 +msgid "Why other people can edit my questions/answers?" +msgstr "Por que otras personas puede editar mis preguntas/respuestas?" + +#: forum/skins/default/templates/faq.html:122 +msgid "Goal of this site is..." +msgstr "Objetivo de este sitio es ..." + +#: forum/skins/default/templates/faq.html:122 +msgid "" +"So questions and answers can be edited like wiki pages by experienced users " +"of this site and this improves the overall quality of the knowledge base " +"content." +msgstr "" +"Entonces, la presguntas y respuestas pueden ser editas comos los sitios wiki " +"(como Wikipedia) por usuarios con experiencia en ese sitio, y todo con el " +"objetivo de aumentar la calidad del contenido." + +#: forum/skins/default/templates/faq.html:123 +msgid "If this approach is not for you, we respect your choice." +msgstr "Si este enfoque no es para usted, nosotros respetaremos su opción." + +#: forum/skins/default/templates/faq.html:127 +msgid "Still have questions?" +msgstr "Aún tiene preguntas?" + +#: forum/skins/default/templates/faq.html:128 +#, fuzzy, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "" +"Por favor formula tus inquietudes en %(ask_question_url)s, ayudanos a ser " +"una mejor comunidad!" + +#: forum/skins/default/templates/faq.html:130 +#: forum/skins/default/templates/header.html:27 +msgid "questions" +msgstr "preguntas" + +#: forum/skins/default/templates/faq.html:130 +msgid "." +msgstr "." + +#: forum/skins/default/templates/feedback.html:6 +msgid "Feedback" +msgstr "Sugerencias" + +#: forum/skins/default/templates/feedback.html:11 +msgid "Give us your feedback!" +msgstr "Danos tu Feedback!" + +#: forum/skins/default/templates/feedback.html:17 +#, fuzzy, python-format +msgid "" +"\n" +" Dear %(user_name)s, we look " +"forward to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" +"\n" +" Querido %(user_name)s, esperamos " +"con entusiasmo tus sugerencias. \n" +" Por favor escriba y nos envíe su mensaje a continuación.\n" +" " + +#: forum/skins/default/templates/feedback.html:24 +msgid "" +"\n" +" Dear visitor, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" +"\n" +" Querido visitante, esperamos con " +"entusiasmo tus sugerencias.\n" +" Por favor escriba y nos envíe su mensaje a continuación.\n" +" " + +#: forum/skins/default/templates/feedback.html:41 +msgid "(this field is required)" +msgstr "(este campo es requerido)" + +#: forum/skins/default/templates/feedback.html:49 +msgid "Send Feedback" +msgstr "Enviar sugerencias" + +#: forum/skins/default/templates/feedback_email.txt:3 +#, python-format +msgid "" +"\n" +"Hello, this is a %(site_title)s forum feedback message\n" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:9 +#, fuzzy +msgid "Sender is" +msgstr "Enviar enlace" + +#: forum/skins/default/templates/feedback_email.txt:11 +#: forum/skins/default/templates/feedback_email.txt:14 +#, fuzzy +msgid "email" +msgstr "no enviar emails" + +#: forum/skins/default/templates/feedback_email.txt:13 +msgid "anonymous" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:19 +msgid "Message body:" +msgstr "" + +#: forum/skins/default/templates/footer.html:8 +#: forum/skins/default/templates/header.html:14 +msgid "about" +msgstr "acerca de" + +#: forum/skins/default/templates/footer.html:9 +#: forum/skins/default/templates/header.html:15 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "faq" +msgstr "faq" + +#: forum/skins/default/templates/footer.html:10 +msgid "privacy policy" +msgstr "políticas de privacidad" + +#: forum/skins/default/templates/footer.html:19 +msgid "give feedback" +msgstr "enviar sugerencias" + +#: forum/skins/default/templates/header.html:10 +msgid "logout" +msgstr "salir" + +#: forum/skins/default/templates/header.html:12 +msgid "login" +msgstr "ingresar" + +#: forum/skins/default/templates/header.html:22 +msgid "back to home page" +msgstr "volver a inicio" + +#: forum/skins/default/templates/header.html:29 +msgid "users" +msgstr "usuarios" + +#: forum/skins/default/templates/header.html:31 +msgid "books" +msgstr "libros" + +#: forum/skins/default/templates/header.html:33 +#: forum/templatetags/extra_tags.py:177 forum/templatetags/extra_tags.py:206 +msgid "badges" +msgstr "medallas" + +#: forum/skins/default/templates/header.html:34 +#: forum/skins/default/templates/header.html:38 +msgid "ask a question" +msgstr "preguntar" + +#: forum/skins/default/templates/header.html:36 +msgid "unanswered questions" +msgstr "preguntas sin contestar" + +#: forum/skins/default/templates/input_bar.html:33 +msgid "search" +msgstr "buscar" + +#: forum/skins/default/templates/logout.html:6 +#: forum/skins/default/templates/logout.html:16 +msgid "Logout" +msgstr "Salir" + +#: forum/skins/default/templates/logout.html:19 +msgid "" +"As a registered user you can login with your OpenID, log out of the site or " +"permanently remove your account." +msgstr "" +"Como usuario registrado, puedes ingresar con tu perfil OpenID, salir del " +"sitio o eliminar permanentemente tu cuenta." + +#: forum/skins/default/templates/logout.html:20 +msgid "Logout now" +msgstr "Salir ahora" + +#: forum/skins/default/templates/notarobot.html:3 +msgid "Please prove that you are a Human Being" +msgstr "Demuestranos que eres humano de verdad" + +#: forum/skins/default/templates/notarobot.html:10 +msgid "I am a Human Being" +msgstr "Soy un humano de verdad" + +#: forum/skins/default/templates/pagesize.html:6 +msgid "posts per page" +msgstr "artículos por pagina" + +#: forum/skins/default/templates/paginator.html:6 +#: forum/skins/default/templates/paginator.html:7 +msgid "previous" +msgstr "anterior" + +#: forum/skins/default/templates/paginator.html:19 +msgid "current page" +msgstr "pagina actual" + +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 +#, fuzzy, python-format +msgid "page number %(num)s" +msgstr "numero de pagina" + +#: forum/skins/default/templates/paginator.html:33 +msgid "next page" +msgstr "pagina siguiente" + +#: forum/skins/default/templates/post_contributor_info.html:9 +#, fuzzy, python-format +msgid "%(rev_count)s revision" +msgid_plural "%(rev_count)s revisions" +msgstr[0] "seleccionar revisión" +msgstr[1] "seleccionar revisión" + +#: forum/skins/default/templates/post_contributor_info.html:15 +msgid "asked" +msgstr "preguntado" + +#: forum/skins/default/templates/post_contributor_info.html:18 +msgid "answered" +msgstr "respondido" + +#: forum/skins/default/templates/post_contributor_info.html:20 +msgid "posted" +msgstr "publicado" + +#: forum/skins/default/templates/post_contributor_info.html:41 +msgid "updated" +msgstr "actualizado" + +#: forum/skins/default/templates/privacy.html:6 +#: forum/skins/default/templates/privacy.html:11 +msgid "Privacy policy" +msgstr "Políticas de privacidad" + +#: forum/skins/default/templates/privacy.html:15 +msgid "general message about privacy" +msgstr "mensaje general sobre las privacidad" + +#: forum/skins/default/templates/privacy.html:18 +msgid "Site Visitors" +msgstr "Visitas del sitio" + +#: forum/skins/default/templates/privacy.html:20 +msgid "what technical information is collected about visitors" +msgstr "Que información técnica es recolectada de los visitantes?" + +#: forum/skins/default/templates/privacy.html:23 +msgid "Personal Information" +msgstr "Información personal" + +#: forum/skins/default/templates/privacy.html:25 +msgid "details on personal information policies" +msgstr "detalles de las políticas de información personal" + +#: forum/skins/default/templates/privacy.html:28 +msgid "Other Services" +msgstr "Otros Servicios" + +#: forum/skins/default/templates/privacy.html:30 +msgid "details on sharing data with third parties" +msgstr "detalles sobre compartir datos con terceros" + +#: forum/skins/default/templates/privacy.html:35 +msgid "cookie policy details" +msgstr "politicas de las cookies" + +#: forum/skins/default/templates/privacy.html:37 +msgid "Policy Changes" +msgstr "Cambios de Políticas" + +#: forum/skins/default/templates/privacy.html:38 +msgid "how privacy policies can be changed" +msgstr "como han cambiado las políticas" + +#: forum/skins/default/templates/question.html:78 +#: forum/skins/default/templates/question.html:79 +#: forum/skins/default/templates/question.html:95 +#: forum/skins/default/templates/question.html:97 +msgid "i like this post (click again to cancel)" +msgstr "me gusta este artículo (clic de nuevo para cancelar)" + +#: forum/skins/default/templates/question.html:81 +#: forum/skins/default/templates/question.html:99 +#: forum/skins/default/templates/question.html:251 +msgid "current number of votes" +msgstr "numero actual de votos" + +#: forum/skins/default/templates/question.html:90 +#: forum/skins/default/templates/question.html:91 +#: forum/skins/default/templates/question.html:104 +#: forum/skins/default/templates/question.html:105 +msgid "i dont like this post (click again to cancel)" +msgstr "no me gusta este artículo (clic de nuevo para cancelar)" + +#: forum/skins/default/templates/question.html:109 +#: forum/skins/default/templates/question.html:110 +msgid "mark this question as favorite (click again to cancel)" +msgstr "marcar esta pregunta como favorita (clic de nuevo para cancelar)" + +#: forum/skins/default/templates/question.html:116 +#: forum/skins/default/templates/question.html:117 +msgid "remove favorite mark from this question (click again to restore mark)" +msgstr "" +"remover la marca de favorito de esta pregunta (clic de nuevo para restaurar " +"marca)" + +#: forum/skins/default/templates/question.html:141 +#: forum/skins/default/templates/question.html:288 +#: forum/skins/default/templates/revisions_answer.html:58 +#: forum/skins/default/templates/revisions_question.html:58 +msgid "edit" +msgstr "editar" + +#: forum/skins/default/templates/question.html:146 +msgid "reopen" +msgstr "reabrir" + +#: forum/skins/default/templates/question.html:150 +msgid "close" +msgstr "cerrar" + +#: forum/skins/default/templates/question.html:156 +#: forum/skins/default/templates/question.html:293 +msgid "" +"report as offensive (i.e containing spam, advertising, malicious text, etc.)" +msgstr "" +"reportar como ofensivo (por ej. si tiene spam, pubicidad, material " +"malicioso, etc.)" + +#: forum/skins/default/templates/question.html:157 +#: forum/skins/default/templates/question.html:294 +msgid "flag offensive" +msgstr "marcar como ofensivo" + +#: forum/skins/default/templates/question.html:165 +#: forum/skins/default/templates/question.html:305 +msgid "delete" +msgstr "eliminar" + +#: forum/skins/default/templates/question.html:183 +#: forum/skins/default/templates/question.html:325 +msgid "delete this comment" +msgstr "eliminar este comentario" + +#: forum/skins/default/templates/question.html:194 +#: forum/skins/default/templates/question.html:336 +msgid "add comment" +msgstr "comentar" + +#: forum/skins/default/templates/question.html:198 +#: forum/skins/default/templates/question.html:340 +#, python-format +msgid "see %(counter)s more" +msgid_plural "see %(counter)s more" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question.html:200 +#: forum/skins/default/templates/question.html:342 +#, python-format +msgid "see %(counter)s more comment" +msgid_plural "" +"see %(counter)s more comments\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question.html:213 +#, fuzzy, python-format +msgid "" +"The question has been closed for the following reason \"%(close_reason)s\" by" +msgstr "" +"Esta pregunta ha sido cerrada por las siguientes razones \"%(close_reason)s" +"\" por" + +#: forum/skins/default/templates/question.html:215 +#, fuzzy, python-format +msgid "close date %(closed_at)s" +msgstr "tiempo %(closed_at)s" + +#: forum/skins/default/templates/question.html:223 +#, python-format +msgid "" +"\n" +" %(counter)s Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers will be shown first" +msgstr "antiguar respuestas serán mostradas primero" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers" +msgstr "antiguar respuestas" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers will be shown first" +msgstr "nuevas respuestas serán mostradas primero" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers" +msgstr "nuevas respuestas" + +#: forum/skins/default/templates/question.html:235 +msgid "most voted answers will be shown first" +msgstr "respuestas mejor valoradas serán mostradas primero" + +#: forum/skins/default/templates/question.html:235 +msgid "popular answers" +msgstr "respuestas populares" + +#: forum/skins/default/templates/question.html:249 +#: forum/skins/default/templates/question.html:250 +msgid "i like this answer (click again to cancel)" +msgstr "me gusta esta respuesta (clic de nuevo para cancelar)" + +#: forum/skins/default/templates/question.html:256 +#: forum/skins/default/templates/question.html:257 +msgid "i dont like this answer (click again to cancel)" +msgstr "no me gusta esta respuesta (clic de nuevo para cancelar)" + +#: forum/skins/default/templates/question.html:262 +#: forum/skins/default/templates/question.html:263 +msgid "mark this answer as favorite (click again to undo)" +msgstr "marcar esta respuesta como la favorita (clic de nuevo para deshacer)" + +#: forum/skins/default/templates/question.html:268 +#: forum/skins/default/templates/question.html:269 +msgid "the author of the question has selected this answer as correct" +msgstr "" +"el autor de esta pregunta ha seleccionado esta respuesta como la correcta" + +#: forum/skins/default/templates/question.html:282 +msgid "answer permanent link" +msgstr "enlace permanente a esta respuesta" + +#: forum/skins/default/templates/question.html:283 +msgid "permanent link" +msgstr "enlace permanente" + +#: forum/skins/default/templates/question.html:305 +msgid "undelete" +msgstr "revivir" + +#: forum/skins/default/templates/question.html:364 +#: forum/skins/default/templates/question.html:367 +msgid "Notify me once a day when there are any new answers" +msgstr "Notificarme una vez al día cuando tenga nuevas respuestas" + +#: forum/skins/default/templates/question.html:370 +msgid "Notify me weekly when there are any new answers" +msgstr "Notificarme semanalmente cuando tenga alguna nueva respuesta" + +#: forum/skins/default/templates/question.html:375 +#, fuzzy, python-format +msgid "" +"You can always adjust frequency of email updates from your %(profile_url)s" +msgstr "" +"\n" +" Puedes ajustar la frecuencia de emails recibidos en tu %" +"(profile_url)s\n" +" " + +#: forum/skins/default/templates/question.html:380 +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "" +"una vez que inicie sesión serás capaz de suscribirte para recibir " +"actualizaciones" + +#: forum/skins/default/templates/question.html:391 +msgid "Your answer" +msgstr "Tu respuesta" + +#: forum/skins/default/templates/question.html:393 +msgid "Be the first one to answer this question!" +msgstr "Se el primero en contestar esta pregunta" + +#: forum/skins/default/templates/question.html:399 +msgid "you can answer anonymously and then login" +msgstr "tu puedes contestar anonimamente y luego ingresar" + +#: forum/skins/default/templates/question.html:403 +msgid "answer your own question only to give an answer" +msgstr "responder a tu pregunta sólo para dar una respuesta" + +#: forum/skins/default/templates/question.html:405 +msgid "please only give an answer, no discussions" +msgstr "por favor intenta responder, no discutir" + +#: forum/skins/default/templates/question.html:441 +msgid "Login/Signup to Post Your Answer" +msgstr "Ingresa/Registrate para publicar tu respuesta" + +#: forum/skins/default/templates/question.html:444 +msgid "Answer Your Own Question" +msgstr "Responde tu pregunta" + +#: forum/skins/default/templates/question.html:446 +msgid "Answer the question" +msgstr "Responde la pregunta" + +#: forum/skins/default/templates/question.html:460 +msgid "Question tags" +msgstr "Etiquetas de la pregunta" + +#: forum/skins/default/templates/question.html:465 +#: forum/skins/default/templates/questions.html:257 +#: forum/skins/default/templates/tag_selector.html:11 +#: forum/skins/default/templates/tag_selector.html:28 +#, python-format +msgid "see questions tagged '%(tag_name)s'" +msgstr "ver etiquetas de la pregunta '%(tag_name)s'" + +#: forum/skins/default/templates/question.html:471 +msgid "question asked" +msgstr "pregunta formulada" + +#: forum/skins/default/templates/question.html:474 +msgid "question was seen" +msgstr "la pregunta ha sido vista" + +#: forum/skins/default/templates/question.html:474 +msgid "times" +msgstr "veces" + +#: forum/skins/default/templates/question.html:477 +msgid "last updated" +msgstr "última actualización" + +#: forum/skins/default/templates/question.html:483 +msgid "Related questions" +msgstr "Preguntas relacionadas" + +#: forum/skins/default/templates/question_counter_widget.html:6 +msgid "Please decide if you like this question or not by voting" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:12 +msgid "" +"\n" +" vote\n" +" " +msgid_plural "" +"\n" +" votes\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_counter_widget.html:21 +msgid "this answer has been accepted to be correct" +msgstr "Esta respuesta ha sido aceptada como la correcta" + +#: forum/skins/default/templates/question_counter_widget.html:27 +msgid "" +"\n" +" answer \n" +" " +msgid_plural "" +"\n" +" answers \n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_counter_widget.html:39 +msgid "" +"\n" +" view\n" +" " +msgid_plural "" +"\n" +" views\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_edit.html:5 +#: forum/skins/default/templates/question_edit.html:66 +msgid "Edit question" +msgstr "Editar pregunta" + +#: forum/skins/default/templates/question_edit_tips.html:4 +msgid "question tips" +msgstr "tips para preguntar" + +#: forum/skins/default/templates/question_edit_tips.html:7 +msgid "please ask a relevant question" +msgstr "por favor, haz que tu pregunta sea relevante" + +#: forum/skins/default/templates/question_edit_tips.html:10 +msgid "please try provide enough details" +msgstr "intenta dar todos los detalles" + +#: forum/skins/default/templates/question_retag.html:4 +#: forum/skins/default/templates/question_retag.html:53 +msgid "Change tags" +msgstr "Cambiar etiquetas" + +#: forum/skins/default/templates/question_retag.html:40 +msgid "up to 5 tags, less than 20 characters each" +msgstr "más de 5 etiquetas, con menos de 20 caraácteres cada una" + +#: forum/skins/default/templates/question_retag.html:83 +msgid "Why use and modify tags?" +msgstr "Por que usar o modificar etiquetas?" + +#: forum/skins/default/templates/question_retag.html:86 +msgid "tags help us keep Questions organized" +msgstr "las etiquetas ayudan a mantener las preguntas ordenadas" + +#: forum/skins/default/templates/question_retag.html:94 +msgid "tag editors receive special awards from the community" +msgstr "quienes etiquetan sus preguntas, son premiados por la comunidad" + +#: forum/skins/default/templates/question_summary_list_roll.html:13 +msgid "answers" +msgstr "respuestas" + +#: forum/skins/default/templates/questions.html:8 +msgid "Questions" +msgstr "Preguntas" + +#: forum/skins/default/templates/questions.html:32 +msgid "Found by tags" +msgstr "Buscar etiquetas" + +#: forum/skins/default/templates/questions.html:36 +msgid "Search results" +msgstr "Resultados de busqueda" + +#: forum/skins/default/templates/questions.html:38 +msgid "Found by title" +msgstr "Encontrar por título" + +#: forum/skins/default/templates/questions.html:42 +msgid "Unanswered questions" +msgstr "Preguntas sin responder" + +#: forum/skins/default/templates/questions.html:44 +msgid "All questions" +msgstr "Todas las preguntas" + +#: forum/skins/default/templates/questions.html:51 +msgid "In:" +msgstr "" + +#: forum/skins/default/templates/questions.html:53 +#, fuzzy +msgid "see unanswered questions" +msgstr "preguntas sin contestar" + +#: forum/skins/default/templates/questions.html:55 +#, fuzzy +msgid "see your favorite questions" +msgstr "preguntas favoritas del usuario" + +#: forum/skins/default/templates/questions.html:59 +msgid "Sort by:" +msgstr "" + +#: forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/questions.html:75 +#, fuzzy +msgid "click to see the newest questions" +msgstr "ver las últimas preguntas" + +#: forum/skins/default/templates/questions.html:70 +#, fuzzy +msgid "click to see the oldest questions" +msgstr "ver las últimas preguntas" + +#: forum/skins/default/templates/questions.html:83 +#: forum/skins/default/templates/questions.html:94 +#, fuzzy +msgid "click to see the most recently updated questions" +msgstr "últimas preguntas actualizadas" + +#: forum/skins/default/templates/questions.html:89 +#, fuzzy +msgid "click to see the least recently updated questions" +msgstr "últimas preguntas actualizadas" + +#: forum/skins/default/templates/questions.html:102 +#: forum/skins/default/templates/questions.html:113 +#, fuzzy +msgid "click to see hottest questions" +msgstr "preguntas calientes" + +#: forum/skins/default/templates/questions.html:102 +#, fuzzy +msgid "less answers" +msgstr "antiguar respuestas" + +#: forum/skins/default/templates/questions.html:108 +#, fuzzy +msgid "click to see coldest questions" +msgstr "ver las últimas preguntas" + +#: forum/skins/default/templates/questions.html:108 +#: forum/skins/default/templates/questions.html:113 +#, fuzzy +msgid "more answers" +msgstr "Tu respuesta" + +#: forum/skins/default/templates/questions.html:121 +#: forum/skins/default/templates/questions.html:132 +#, fuzzy +msgid "click to see most voted questions" +msgstr "preguntas más votadas" + +#: forum/skins/default/templates/questions.html:121 +#, fuzzy +msgid "unpopular" +msgstr "etiquetas populars" + +#: forum/skins/default/templates/questions.html:127 +#, fuzzy +msgid "click to see least voted questions" +msgstr "preguntas más votadas" + +#: forum/skins/default/templates/questions.html:127 +#: forum/skins/default/templates/questions.html:132 +#, fuzzy +msgid "popular" +msgstr "etiquetas populars" + +#: forum/skins/default/templates/questions.html:141 +#, python-format +msgid " %(q_num)s question found" +msgid_plural "%(q_num)s questions found" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/questions.html:143 +#, fuzzy, python-format +msgid "%(q_num)s question" +msgid_plural "%(q_num)s questions" +msgstr[0] "nueva pregunta" +msgstr[1] "nueva pregunta" + +#: forum/skins/default/templates/questions.html:147 +#, python-format +msgid "with %(author_name)s's contributions" +msgstr "" + +#: forum/skins/default/templates/questions.html:151 +#, fuzzy +msgid "tagged" +msgstr "re-etiquetado" + +#: forum/skins/default/templates/questions.html:157 +#, fuzzy +msgid "Search tips:" +msgstr "Resultados de busqueda" + +#: forum/skins/default/templates/questions.html:161 +#, fuzzy +msgid "reset author" +msgstr "preguntar al autor" + +#: forum/skins/default/templates/questions.html:165 +#, fuzzy +msgid "reset tags" +msgstr "ver las etiquetas" + +#: forum/skins/default/templates/questions.html:169 +#: forum/skins/default/templates/questions.html:173 +msgid "start over" +msgstr "" + +#: forum/skins/default/templates/questions.html:175 +msgid " - to expand, or dig in by adding more tags and revising the query." +msgstr "" + +#: forum/skins/default/templates/questions.html:178 +#, fuzzy +msgid "Search tip:" +msgstr "Resultados de busqueda" + +#: forum/skins/default/templates/questions.html:178 +msgid "add tags and a query to focus your search" +msgstr "" + +#: forum/skins/default/templates/questions.html:190 +#, fuzzy +msgid "There are no unanswered questions here" +msgstr "lista de preguntas sin contestar" + +#: forum/skins/default/templates/questions.html:193 +#, fuzzy +msgid "No favorite questions here. " +msgstr "preguntas favoritas" + +#: forum/skins/default/templates/questions.html:194 +msgid "Please start (bookmark) some questions when you visit them" +msgstr "" + +#: forum/skins/default/templates/questions.html:199 +msgid "You can expand your search by " +msgstr "" + +#: forum/skins/default/templates/questions.html:203 +#, fuzzy +msgid "resetting author" +msgstr "preguntar al autor" + +#: forum/skins/default/templates/questions.html:207 +#, fuzzy +msgid "resetting tags" +msgstr "Etiquetas de interes" + +#: forum/skins/default/templates/questions.html:211 +#: forum/skins/default/templates/questions.html:215 +msgid "starting over" +msgstr "" + +#: forum/skins/default/templates/questions.html:220 +#, fuzzy +msgid "Please always feel free to ask your question!" +msgstr "por favor, haz que tu pregunta sea relevante" + +#: forum/skins/default/templates/questions.html:224 +msgid "Did not find what you were looking for?" +msgstr "" + +#: forum/skins/default/templates/questions.html:225 +#, fuzzy +msgid "Please, post your question!" +msgstr "Formula tu pregunta" + +#: forum/skins/default/templates/questions.html:241 +msgid "Contributors" +msgstr "" + +#: forum/skins/default/templates/questions.html:254 +msgid "Related tags" +msgstr "Etiquetas relacionadas" + +#: forum/skins/default/templates/reopen.html:6 +#: forum/skins/default/templates/reopen.html:16 +msgid "Reopen question" +msgstr "Re-abrir pregunta" + +#: forum/skins/default/templates/reopen.html:19 +msgid "Open the previously closed question" +msgstr "Abrir pregunta previamente cerrada" + +#: forum/skins/default/templates/reopen.html:22 +msgid "The question was closed for the following reason " +msgstr "La pregunta se cerro por las siguientes razones" + +#: forum/skins/default/templates/reopen.html:22 +msgid "reason - leave blank in english" +msgstr "razones" + +#: forum/skins/default/templates/reopen.html:22 +msgid "on " +msgstr "en" + +#: forum/skins/default/templates/reopen.html:22 +msgid "date closed" +msgstr "cerrada el" + +#: forum/skins/default/templates/reopen.html:29 +msgid "Reopen this question" +msgstr "Reabrir esta pregunta" + +#: forum/skins/default/templates/revisions_answer.html:7 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:8 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "Revision history" +msgstr "Historial de revisiones" + +#: forum/skins/default/templates/revisions_answer.html:50 +#: forum/skins/default/templates/revisions_question.html:50 +msgid "click to hide/show revision" +msgstr "clic para mostrar u ocultar revision" + +#: forum/skins/default/templates/tag_selector.html:5 +msgid "Interesting tags" +msgstr "Etiquetas de interes" + +#: forum/skins/default/templates/tag_selector.html:15 +#, python-format +msgid "remove '%(tag_name)s' from the list of interesting tags" +msgstr "remover '%(tag_name)s' de la lista de etiquetas interesante" + +#: forum/skins/default/templates/tag_selector.html:21 +#: forum/skins/default/templates/tag_selector.html:38 +msgid "Add" +msgstr "Agregar" + +#: forum/skins/default/templates/tag_selector.html:22 +msgid "Ignored tags" +msgstr "Ignorar etiqueta" + +#: forum/skins/default/templates/tag_selector.html:32 +#, python-format +msgid "remove '%(tag_name)s' from the list of ignored tags" +msgstr "remover '%(tag_name)s' de la lista de etiquetas ignoradas" + +#: forum/skins/default/templates/tag_selector.html:41 +msgid "keep ignored questions hidden" +msgstr "mantener ocultas las etiquetas ignoradas" + +#: forum/skins/default/templates/tags.html:6 +#: forum/skins/default/templates/tags.html:30 +msgid "Tag list" +msgstr "Lista de etiquetas" + +#: forum/skins/default/templates/tags.html:32 +msgid "sorted alphabetically" +msgstr "mostrar alfabeticamente" + +#: forum/skins/default/templates/tags.html:32 +msgid "by name" +msgstr "por nombre" + +#: forum/skins/default/templates/tags.html:33 +msgid "sorted by frequency of tag use" +msgstr "ordenar etiquetas por frecuencia de uso" + +#: forum/skins/default/templates/tags.html:33 +msgid "by popularity" +msgstr "por popularidad" + +#: forum/skins/default/templates/tags.html:39 +#, python-format +msgid "" +"All tags matching '%(stag)s'" +msgstr "" + +#: forum/skins/default/templates/tags.html:42 +msgid "Nothing found" +msgstr "Nada encontrado" + +#: forum/skins/default/templates/user_edit.html:6 +msgid "Edit user profile" +msgstr "Editar perfil de usuario" + +#: forum/skins/default/templates/user_edit.html:19 +msgid "edit profile" +msgstr "editar perfil" + +#: forum/skins/default/templates/user_edit.html:33 +#: forum/skins/default/templates/user_info.html:53 +msgid "Registered user" +msgstr "Usuario registrado" + +#: forum/skins/default/templates/user_edit.html:40 +msgid "Screen Name" +msgstr "Nombre para mostrar" + +#: forum/skins/default/templates/user_edit.html:89 +#: forum/skins/default/templates/user_email_subscriptions.html:20 +msgid "Update" +msgstr "Actualizar" + +#: forum/skins/default/templates/user_email_subscriptions.html:8 +msgid "Email subscription settings" +msgstr "Configuración de suscripciones por email" + +#: forum/skins/default/templates/user_email_subscriptions.html:9 +msgid "email subscription settings info" +msgstr "información de suscripciones por email" + +#: forum/skins/default/templates/user_email_subscriptions.html:21 +msgid "Stop sending email" +msgstr "Detener el envió de emails" + +#: forum/skins/default/templates/user_info.html:18 +msgid "change picture" +msgstr "" + +#: forum/skins/default/templates/user_info.html:25 +#: forum/skins/default/templates/users.html:26 forum/views/users.py:933 +msgid "reputation" +msgstr "reputación" + +#: forum/skins/default/templates/user_info.html:35 +msgid "Moderate this user" +msgstr "Moderar este usuario" + +#: forum/skins/default/templates/user_info.html:47 +msgid "update profile" +msgstr "actualizar perfil" + +#: forum/skins/default/templates/user_info.html:57 +msgid "real name" +msgstr "nombre real" + +#: forum/skins/default/templates/user_info.html:62 +msgid "member for" +msgstr "miembro desde" + +#: forum/skins/default/templates/user_info.html:67 +msgid "last seen" +msgstr "últimas visita" + +#: forum/skins/default/templates/user_info.html:73 +msgid "user website" +msgstr "sitio web del usuario" + +#: forum/skins/default/templates/user_info.html:79 +msgid "location" +msgstr "localización" + +#: forum/skins/default/templates/user_info.html:86 +msgid "age" +msgstr "edad" + +#: forum/skins/default/templates/user_info.html:87 +msgid "age unit" +msgstr "medida de unidad" + +#: forum/skins/default/templates/user_info.html:93 +msgid "todays unused votes" +msgstr "votos no utilizados el día de hoy" + +#: forum/skins/default/templates/user_info.html:94 +msgid "votes left" +msgstr "votos restantes" + +#: forum/skins/default/templates/user_reputation.html:29 +#, fuzzy +msgid "Your karma change log." +msgstr "Tu contraseña ha sido cambiada." + +#: forum/skins/default/templates/user_reputation.html:31 +#, python-format +msgid "%(user_name)s's karma change log" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:11 +#, python-format +msgid "%(counter)s Question" +msgid_plural "%(counter)s Questions" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:16 +#, python-format +msgid "%(counter)s Answer" +msgid_plural "%(counter)s Answers" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:24 +#, fuzzy, python-format +msgid "the answer has been voted for %(answer_score)s times" +msgstr "la respuesta ha sido votada %(vote_count)s veces" + +#: forum/skins/default/templates/user_stats.html:24 +msgid "this answer has been selected as correct" +msgstr "esta respuesta ha sido seleccionada como la correcta" + +#: forum/skins/default/templates/user_stats.html:34 +#, python-format +msgid "(%(comment_count)s comment)" +msgid_plural "the answer has been commented %(comment_count)s times" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:44 +#, python-format +msgid "%(cnt)s Vote" +msgid_plural "%(cnt)s Votes " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:50 +msgid "thumb up" +msgstr "pulgar hacia arriba" + +#: forum/skins/default/templates/user_stats.html:51 +msgid "user has voted up this many times" +msgstr "usuarios han votado positivo esto varias veces" + +#: forum/skins/default/templates/user_stats.html:55 +msgid "thumb down" +msgstr "pulgar hacia abajo" + +#: forum/skins/default/templates/user_stats.html:56 +msgid "user voted down this many times" +msgstr "usuarios han votado negativo esto varias veces" + +#: forum/skins/default/templates/user_stats.html:64 +#, python-format +msgid "%(counter)s Tag" +msgid_plural "%(counter)s Tags" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:72 +#, fuzzy, python-format +msgid "" +"see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " +msgstr "" +"ver otras preguntas con %(view_user)s's que ha etiquetado con '%(tag_name)s' " + +#: forum/skins/default/templates/user_stats.html:86 +#, python-format +msgid "%(counter)s Badge" +msgid_plural "%(counter)s Badges" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_tabs.html:7 +msgid "User profile" +msgstr "Pefil de usuario" + +#: forum/skins/default/templates/user_tabs.html:7 forum/views/users.py:907 +msgid "overview" +msgstr "descripción general" + +#: forum/skins/default/templates/user_tabs.html:9 forum/views/users.py:915 +msgid "recent activity" +msgstr "actividad reciente" + +#: forum/skins/default/templates/user_tabs.html:12 forum/views/users.py:925 +msgid "comments and answers to others questions" +msgstr "comentar y responder otras preguntas" + +#: forum/skins/default/templates/user_tabs.html:13 forum/views/users.py:924 +msgid "responses" +msgstr "respuestas" + +#: forum/skins/default/templates/user_tabs.html:16 +msgid "graph of user reputation" +msgstr "grafica de la reputación de este usuario" + +#: forum/skins/default/templates/user_tabs.html:17 +msgid "reputation history" +msgstr "historial de reputación" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:951 +msgid "user vote record" +msgstr "registro de votos de este usuario" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:950 +msgid "casted votes" +msgstr "votos emitidos" + +#: forum/skins/default/templates/user_tabs.html:23 +msgid "questions that user selected as his/her favorite" +msgstr "preguntas que el usuario seleccione como su favorito" + +#: forum/skins/default/templates/user_tabs.html:24 +msgid "favorites" +msgstr "favoritos" + +#: forum/skins/default/templates/user_tabs.html:27 forum/views/users.py:960 +msgid "email subscription settings" +msgstr "configuraciones de suscripción por email" + +#: forum/skins/default/templates/user_tabs.html:28 forum/views/users.py:959 +msgid "email subscriptions" +msgstr "suscripción por email" + +#: forum/skins/default/templates/users.html:6 +#: forum/skins/default/templates/users.html:24 +msgid "Users" +msgstr "Usuarios" + +#: forum/skins/default/templates/users.html:27 +msgid "recent" +msgstr "reciente" + +#: forum/skins/default/templates/users.html:29 +msgid "by username" +msgstr "por nombre de usuario" + +#: forum/skins/default/templates/users.html:35 +#, python-format +msgid "users matching query %(suser)s:" +msgstr "usurios que coinciden con la consulta %(suser)s:" + +#: forum/skins/default/templates/users.html:39 +msgid "Nothing found." +msgstr "Nada encontrado." + +#: forum/skins/default/templates/users_questions.html:11 +msgid "this questions was selected as favorite" +msgstr "esta pregunta ha sido seleccionada como favorita" + +#: forum/skins/default/templates/users_questions.html:12 +#, fuzzy +msgid "thumb-up on" +msgstr "thumb-up on" + +#: forum/skins/default/templates/users_questions.html:19 +#, fuzzy +msgid "thumb-up off" +msgstr "thumb-up off" + +#: forum/skins/default/templates/authopenid/changeemail.html:3 +#: forum/skins/default/templates/authopenid/changeemail.html:9 +#: forum/skins/default/templates/authopenid/changeemail.html:38 +#, fuzzy +msgid "Change email" +msgstr "Cambiar email" + +#: forum/skins/default/templates/authopenid/changeemail.html:11 +#, fuzzy +msgid "Save your email address" +msgstr "tu dirección de email" + +#: forum/skins/default/templates/authopenid/changeemail.html:16 +#, fuzzy, python-format +msgid "change %(email)s info" +msgstr "Cambiar email" + +#: forum/skins/default/templates/authopenid/changeemail.html:18 +#, fuzzy, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "avatar, ver información %(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +#, fuzzy +msgid "Your new Email" +msgstr "Tu cuenta de email" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +#, fuzzy +msgid "Your Email" +msgstr "no enviar emails" + +#: forum/skins/default/templates/authopenid/changeemail.html:38 +#, fuzzy +msgid "Save Email" +msgstr "Guardar edición" + +#: forum/skins/default/templates/authopenid/changeemail.html:49 +#, fuzzy +msgid "Validate email" +msgstr "Cómo validar una email" + +#: forum/skins/default/templates/authopenid/changeemail.html:52 +#, python-format +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:57 +#, fuzzy +msgid "Email not changed" +msgstr "notificaciones por email cancelada" + +#: forum/skins/default/templates/authopenid/changeemail.html:60 +#, python-format +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:65 +msgid "Email changed" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:68 +#, python-format +msgid "your current %(email)s can be used for this" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:73 +msgid "Email verified" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:76 +msgid "thanks for verifying email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:81 +#, fuzzy +msgid "email key not sent" +msgstr "enviar actualizaciones al usuario" + +#: forum/skins/default/templates/authopenid/changeemail.html:84 +#, python-format +msgid "email key not sent %(email)s change email here %(change_link)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:8 +#, fuzzy +msgid "Account: change OpenID URL" +msgstr "Cambiar OpenID" + +#: forum/skins/default/templates/authopenid/changeopenid.html:12 +#, fuzzy +msgid "" +"This is where you can change your OpenID URL. Make sure you remember it!" +msgstr "Aquí puedes cambiar tu contraseña. Asegurate de recordarla!" + +#: forum/skins/default/templates/authopenid/changeopenid.html:14 +#: forum/skins/default/templates/authopenid/delete.html:14 +#: forum/skins/default/templates/authopenid/delete.html:24 +msgid "Please correct errors below:" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:29 +msgid "OpenID URL:" +msgstr "" + +#: forum/skins/default/templates/authopenid/changepw.html:7 +#, fuzzy +msgid "Account: change password" +msgstr "Cambiar Contraseña" + +#: forum/skins/default/templates/authopenid/changepw.html:8 +msgid "This is where you can change your password. Make sure you remember it!" +msgstr "Aquí puedes cambiar tu contraseña. Asegurate de recordarla!" + +#: forum/skins/default/templates/authopenid/complete.html:19 +msgid "Connect your OpenID with this site" +msgstr "Conectar tu OpenID con este sitio" + +#: forum/skins/default/templates/authopenid/complete.html:22 +msgid "Connect your OpenID with your account on this site" +msgstr "Conectar tu OpenID con tu cuenta en este sitio" + +#: forum/skins/default/templates/authopenid/complete.html:27 +#, fuzzy, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "avatar, ver información %(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/complete.html:31 +#, fuzzy, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " + +#: forum/skins/default/templates/authopenid/complete.html:35 +#, python-format +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:38 +#, python-format +msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:42 +msgid "This account already exists, please use another." +msgstr "Esta cuenta ya existe, por favor use otra." + +#: forum/skins/default/templates/authopenid/complete.html:57 +msgid "Sorry, looks like we have some errors:" +msgstr "Lo sentimos, ocurrieron algunos errores con:" + +#: forum/skins/default/templates/authopenid/complete.html:82 +msgid "Screen name label" +msgstr "Nombre de usuario" + +#: forum/skins/default/templates/authopenid/complete.html:89 +msgid "Email address label" +msgstr "Dirección de correo electrónico" + +#: forum/skins/default/templates/authopenid/complete.html:95 +#: forum/skins/default/templates/authopenid/signup.html:18 +msgid "receive updates motivational blurb" +msgstr "recibir actualizaciones de motivación" + +#: forum/skins/default/templates/authopenid/complete.html:99 +#: forum/skins/default/templates/authopenid/signup.html:22 +msgid "please select one of the options above" +msgstr "selecciona una de las siguientes opciones" + +#: forum/skins/default/templates/authopenid/complete.html:102 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" +"Una herramienta para filtrar por etiquetas será mostrada cuando ingreses" + +#: forum/skins/default/templates/authopenid/complete.html:103 +msgid "create account" +msgstr "crear cuenta" + +#: forum/skins/default/templates/authopenid/complete.html:112 +msgid "Existing account" +msgstr "Cuenta existente" + +#: forum/skins/default/templates/authopenid/complete.html:113 +msgid "user name" +msgstr "nombr de usuario" + +#: forum/skins/default/templates/authopenid/complete.html:114 +msgid "password" +msgstr "contraseña" + +#: forum/skins/default/templates/authopenid/complete.html:121 +msgid "Register" +msgstr "Registrar" + +#: forum/skins/default/templates/authopenid/complete.html:122 +#: forum/skins/default/templates/authopenid/signin.html:168 +msgid "Forgot your password?" +msgstr "Recordar contraseña" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:2 +msgid "Thank you for registering at our Q&A forum!" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:4 +#, fuzzy +msgid "Your account details are:" +msgstr "Tu cuenta de email" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:6 +#, fuzzy +msgid "Username:" +msgstr "nombr de usuario" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:7 +#: forum/skins/default/templates/authopenid/delete.html:19 +#, fuzzy +msgid "Password:" +msgstr "contraseña" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:9 +msgid "Please sign in here:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:12 +#: forum/skins/default/templates/authopenid/email_validation.txt:14 +#: forum/skins/default/templates/authopenid/sendpw_email.txt:8 +#, fuzzy +msgid "" +"Sincerely,\n" +"Forum Administrator" +msgstr "" +"Sinceramente,
\n" +" Administrador del Foro" + +#: forum/skins/default/templates/authopenid/delete.html:8 +#, fuzzy +msgid "Account: delete account" +msgstr "Eliminar cuenta" + +#: forum/skins/default/templates/authopenid/delete.html:12 +msgid "" +"Note: After deleting your account, anyone will be able to register this " +"username." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:16 +msgid "Check confirm box, if you want delete your account." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:31 +msgid "I am sure I want to delete my account." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "Password/OpenID URL" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "(required for your security)" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:34 +#, fuzzy +msgid "Delete account permanently" +msgstr "Eliminar cuenta" + +#: forum/skins/default/templates/authopenid/email_validation.txt:2 +msgid "Greetings from the Q&A forum" +msgstr "Agradecer desde foro de P&R" + +#: forum/skins/default/templates/authopenid/email_validation.txt:4 +msgid "To make use of the Forum, please follow the link below:" +msgstr "Para usar este foro, ingresa al siguiente enlace:" + +#: forum/skins/default/templates/authopenid/email_validation.txt:8 +msgid "Following the link above will help us verify your email address." +msgstr "" +"El enlace de arriba nos ayudará a verificar su dirección de correo " +"electrónico." + +#: forum/skins/default/templates/authopenid/email_validation.txt:10 +#, fuzzy +msgid "" +"If you beleive that this message was sent in mistake - \n" +"no further action is needed. Just ingore this email, we apologize\n" +"for any inconvenience" +msgstr "" +"Si crees que este mensaje ha sido enviado por error -\n" +" no es necesario que tomes acción alguna. Solo ignoralo, y disculpa\n" +" por los iconvenientes" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:4 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:7 +#, fuzzy +msgid "Traditional login information" +msgstr "Registro tradicional" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:12 +#, python-format +msgid "" +"how to login with password through external login website or use %" +"(feedback_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw.html:4 +#: forum/skins/default/templates/authopenid/sendpw.html:7 +#, fuzzy +msgid "Send new password" +msgstr "Cambiar Contraseña" + +#: forum/skins/default/templates/authopenid/sendpw.html:10 +msgid "password recovery information" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw.html:21 +#, fuzzy +msgid "Reset password" +msgstr "Crear contraseña" + +#: forum/skins/default/templates/authopenid/sendpw.html:22 +#, fuzzy +msgid "return to login" +msgstr "regresar a la pagina de ingreso" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:2 +#, python-format +msgid "" +"Someone has requested to reset your password on %(site_url)s.\n" +"If it were not you, it is safe to ignore this email." +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:5 +#, python-format +msgid "" +"email explanation how to use new %(password)s for %(username)s\n" +"with the %(key_link)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:5 +#: forum/skins/default/templates/authopenid/signin.html:21 +msgid "User login" +msgstr "Nombre de usuario" + +#: forum/skins/default/templates/authopenid/signin.html:28 +#, fuzzy, python-format +msgid "" +"\n" +" Your answer to %(title)s %(summary)s will be posted once you " +"log in\n" +" " +msgstr "" +"\n" +" Puedes ajustar la frecuencia de emails recibidos en tu %" +"(profile_url)s\n" +" " + +#: forum/skins/default/templates/authopenid/signin.html:35 +#, python-format +msgid "" +"Your question \n" +" %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:42 +msgid "Click to sign in through any of these services." +msgstr "Haz clic sobre uno de estos servicios para ingresar" + +#: forum/skins/default/templates/authopenid/signin.html:144 +msgid "Enter your Provider user name" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:151 +msgid "" +"Enter your OpenID " +"web address" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:153 +#: forum/skins/default/templates/authopenid/signin.html:166 +#, fuzzy +msgid "Login" +msgstr "ingresar" + +#: forum/skins/default/templates/authopenid/signin.html:157 +#, fuzzy +msgid "Enter your login name and password" +msgstr "Crear nombre de usuario y contraseña" + +#: forum/skins/default/templates/authopenid/signin.html:161 +#, fuzzy +msgid "Login name" +msgstr "Ingresar ahora!" + +#: forum/skins/default/templates/authopenid/signin.html:163 +#, fuzzy +msgid "Password" +msgstr "contraseña" + +#: forum/skins/default/templates/authopenid/signin.html:167 +#, fuzzy +msgid "Create account" +msgstr "crear cuenta" + +#: forum/skins/default/templates/authopenid/signin.html:178 +msgid "Why use OpenID?" +msgstr "Por que usar OpenID?" + +#: forum/skins/default/templates/authopenid/signin.html:181 +msgid "with openid it is easier" +msgstr "con OpenID es más fácil" + +#: forum/skins/default/templates/authopenid/signin.html:184 +msgid "reuse openid" +msgstr "re-usar openid" + +#: forum/skins/default/templates/authopenid/signin.html:187 +msgid "openid is widely adopted" +msgstr "openID es ampliamente adoptado" + +#: forum/skins/default/templates/authopenid/signin.html:190 +msgid "openid is supported open standard" +msgstr "openID es un estándar abierto" + +#: forum/skins/default/templates/authopenid/signin.html:195 +msgid "Find out more" +msgstr "Para saber más" + +#: forum/skins/default/templates/authopenid/signin.html:196 +msgid "Get OpenID" +msgstr "Obetener OpenID" + +#: forum/skins/default/templates/authopenid/signup.html:4 +msgid "Signup" +msgstr "Darte de alta" + +#: forum/skins/default/templates/authopenid/signup.html:8 +msgid "Create login name and password" +msgstr "Crear nombre de usuario y contraseña" + +#: forum/skins/default/templates/authopenid/signup.html:10 +msgid "Traditional signup info" +msgstr "Registro tradicional" + +#: forum/skins/default/templates/authopenid/signup.html:25 +msgid "" +"Please read and type in the two words below to help us prevent automated " +"account creation." +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:27 +msgid "Create Account" +msgstr "Crear cuenta" + +#: forum/skins/default/templates/authopenid/signup.html:28 +msgid "or" +msgstr "o" + +#: forum/skins/default/templates/authopenid/signup.html:29 +#, fuzzy +msgid "return to OpenID login" +msgstr "regresar a la pagina de ingreso" + +#: forum/skins/default/templates/fbconnect/xd_receiver.html:5 +#, fuzzy, python-format +msgid "Connect to %(APP_SHORT_NAME)s with Facebook!" +msgstr "Conectar con %(APP_SHORT_NAME)s Facebook!" + +#: forum/templatetags/extra_filters.py:100 +msgid "no items in counter" +msgstr "" + +#: forum/templatetags/extra_tags.py:53 +#, python-format +msgid "%(username)s gravatar image" +msgstr "" + +#: forum/templatetags/extra_tags.py:178 forum/templatetags/extra_tags.py:205 +msgid "reputation points" +msgstr "puntos de reputación" + +#: forum/templatetags/extra_tags.py:265 +msgid "2 days ago" +msgstr "2 días atrás" + +#: forum/templatetags/extra_tags.py:267 +msgid "yesterday" +msgstr "ayer" + +#: forum/templatetags/extra_tags.py:269 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/templatetags/extra_tags.py:271 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/utils/forms.py:30 +msgid "this field is required" +msgstr "este campo es requerido" + +#: forum/utils/forms.py:45 +msgid "choose a username" +msgstr "seleccione un nombre de usuario" + +#: forum/utils/forms.py:50 +msgid "user name is required" +msgstr "nombre de usuario es requerido" + +#: forum/utils/forms.py:51 +msgid "sorry, this name is taken, please choose another" +msgstr "lo sentimos, el nombre que haz elegido ya esta usado, selecciona otro" + +#: forum/utils/forms.py:52 +msgid "sorry, this name is not allowed, please choose another" +msgstr "" +"lo sentimos, el nombre que haz elegido no está permitido, seleciona otro" + +#: forum/utils/forms.py:53 +msgid "sorry, there is no user with this name" +msgstr "los sentimos, no hay usuarios con este nombre" + +#: forum/utils/forms.py:54 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" +"lo sentimos, tenermos un serio error - el nombre de usuario ha sido tomado " +"por varios usuarios" + +#: forum/utils/forms.py:55 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "" +"nombre de usuario sólo puede constar de letras, espacio vacío y subrayado" + +#: forum/utils/forms.py:109 +msgid "your email address" +msgstr "tu dirección de email" + +#: forum/utils/forms.py:110 +msgid "email address is required" +msgstr "dirección de email requerida" + +#: forum/utils/forms.py:111 +msgid "please enter a valid email address" +msgstr "ingresa una dirección de email valida" + +#: forum/utils/forms.py:112 +msgid "this email is already used by someone else, please choose another" +msgstr "" +"este email está siendo utilizado por algún usuario, por favor selecciona otro" + +#: forum/utils/forms.py:140 +msgid "choose password" +msgstr "seleccionar contraseña" + +#: forum/utils/forms.py:141 +msgid "password is required" +msgstr "una contraseña es requerida" + +#: forum/utils/forms.py:144 +msgid "retype password" +msgstr "re-escribir contraseña" + +#: forum/utils/forms.py:145 +msgid "please, retype your password" +msgstr "por favor, re-escribe tu contraseña" + +#: forum/utils/forms.py:146 +msgid "sorry, entered passwords did not match, please try again" +msgstr "" +"lo sentimos, las contraseñas que haz ingresado no coinciden, intenta de nuevo" + +#: forum/views/commands.py:209 +#, python-format +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "" +"subscrición guardada, necesitamos una validación de %(email)s , mira %" +"(details_url)s" + +#: forum/views/commands.py:217 +msgid "email update frequency has been set to daily" +msgstr "la frecuencia de notificaciones por email ha sido cambiada a diario" + +#: forum/views/meta.py:35 +msgid "Q&A forum feedback" +msgstr "Foro de sugerencias" + +#: forum/views/meta.py:36 +msgid "Thanks for the feedback!" +msgstr "Gracias por tus sugerencias" + +#: forum/views/meta.py:44 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "Esperamos con interés escuchar sus comentarios! :)" + +#: forum/views/users.py:867 forum/views/users.py:871 +msgid "changes saved" +msgstr "cambios guardados" + +#: forum/views/users.py:877 +msgid "email updates canceled" +msgstr "notificaciones por email cancelada" + +#: forum/views/users.py:908 +msgid "user profile" +msgstr "perfil de usuario" + +#: forum/views/users.py:909 +msgid "user profile overview" +msgstr "vista del perfil de usuario" + +#: forum/views/users.py:916 +msgid "recent user activity" +msgstr "actividad reciente del usuario" + +#: forum/views/users.py:917 +msgid "profile - recent activity" +msgstr "perfil - actividad reciente" + +#: forum/views/users.py:926 +msgid "profile - responses" +msgstr "perfil - respuestas" + +#: forum/views/users.py:934 +msgid "user reputation in the community" +msgstr "reputación del usuario en la comunidad" + +#: forum/views/users.py:935 +msgid "profile - user reputation" +msgstr "perfil - reputación del usuario" + +#: forum/views/users.py:941 +msgid "favorite questions" +msgstr "preguntas favoritas" + +#: forum/views/users.py:942 +msgid "users favorite questions" +msgstr "preguntas favoritas del usuario" + +#: forum/views/users.py:943 +msgid "profile - favorite questions" +msgstr "pefil - preguntas favoritas" + +#: forum/views/users.py:952 +msgid "profile - votes" +msgstr "pefil - votos" + +#: forum/views/users.py:961 +msgid "profile - email subscriptions" +msgstr "perfil - notificación por email" + +#: forum/views/writers.py:70 +msgid "uploading images is limited to users with >60 reputation points" +msgstr "" + +#: forum/views/writers.py:72 +msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" +msgstr "" + +#: forum/views/writers.py:74 +#, python-format +msgid "maximum upload file size is %sK" +msgstr "" + +#: forum/views/writers.py:76 +#, python-format +msgid "" +"Error uploading file. Please contact the site administrator. Thank you. %s" +msgstr "" +"Error al subir el archivo. Por favor contacte el administrador del sitio. " +"Gracias. %s" + +#: forum_modules/authentication/auth.py:27 +msgid "Email Validation" +msgstr "Email de validación" + +#: forum_modules/authentication/auth.py:38 +msgid "Thank you, your email is now validated." +msgstr "Gracias, tu email ha sido validado." + +#: forum_modules/authentication/auth.py:62 +msgid "Your password was changed" +msgstr "Tu contraseña ha sido cambiada." + +#: forum_modules/authentication/auth.py:64 +msgid "New password set" +msgstr "Seleccionar nueva contraseña" + +#: forum_modules/authentication/auth.py:130 +#, fuzzy, python-format +msgid "Welcome back %s, you are now logged in" +msgstr "Bienvenido de vuelta %s, ahora has ingresado" + +#: forum_modules/books/urls.py:7 forum_modules/books/urls.py:8 +#: forum_modules/books/urls.py:9 +msgid "books/" +msgstr "libros/" + +#~ msgid "is not an answer to the question" +#~ msgstr "no es una respuesa a la pregunta" + +#~ msgid "" +#~ "please use following characters in tags: letters 'a-z', numbers, and " +#~ "characters '.-_#'" +#~ msgstr "" +#~ "puedes utilizar los siguientes carácteres en las tags: letras 'a-z', " +#~ "numeros, y carácteres ',-_#'" + +#~ msgid "done/" +#~ msgstr "hecho/" + +#~ msgid "tempsignin/" +#~ msgstr "tiempo-de-ingreso/" + +#~ msgid "authsettings/" +#~ msgstr "authsettings/" + +#~ msgid "providers/" +#~ msgstr "proveedores/" + +#~ msgid "remove/" +#~ msgstr "remover/" + +#~ msgid "add/" +#~ msgstr "agregar/" + +#~ msgid "admin/" +#~ msgstr "admin/" + +#~ msgid "You cannot leave this field blank" +#~ msgstr "No puedes dejar este espacio en blanco" + +#~ msgid "Sorry, but this email is not on our database." +#~ msgstr "Lo sentimos, pero este email no esta en nuestra base de datos" + +#~ msgid "The users have been awarded with badges:" +#~ msgstr "Los usuarios pueden ser premiado con los siguientes medallas:" + +#~ msgid "using tags" +#~ msgstr "usando las siguientes etiquetas" + +#~ msgid "administration" +#~ msgstr "administración" + +#~ msgid "Home" +#~ msgstr "Inicio" + +#~ msgid "last updated questions" +#~ msgstr "últimas respuestas" + +#~ msgid "welcome to website" +#~ msgstr "bienvenido al sitio" + +#~ msgid "Recent tags" +#~ msgstr "Etiquetas recientes" + +#~ msgid "Recent awards" +#~ msgstr "Medallas recientes" + +#~ msgid "all awards" +#~ msgstr "todas las medallas" + +#~ msgid "subscribe to last 30 questions by RSS" +#~ msgstr "suscribirse a las últimas 30 preguntas por RSS" + +#~ msgid "Still looking for more? See" +#~ msgstr "Buscas más? Mira" + +#~ msgid "complete list of questions" +#~ msgstr "lista completa de preguntas" + +#~ msgid "Please help us answer" +#~ msgstr "Ayudanos a contestar preguntas" + +#~ msgid "see questions tagged" +#~ msgstr "ver preguntas etiquetadas" + +#~ msgid "number - make blank in english" +#~ msgstr "numero" + +#~ msgid "most recently asked questions" +#~ msgstr "últimas preguntas respondidas" + +#~ msgid "latest questions info" +#~ msgstr "última información de la pregunta" + +#~ msgid "Questions are sorted by the time of last update." +#~ msgstr "" +#~ "Las preguntas han sido ordenadas según el tiempo de su última " +#~ "actualización." + +#~ msgid "Most recently answered ones are shown first." +#~ msgstr "Las preguntas contestadas recientemente serán mostradas primero." + +#~ msgid "Questions sorted by number of responses." +#~ msgstr "Preguntas ordenadas por el numero de respuestas." + +#~ msgid "Most answered questions are shown first." +#~ msgstr "Las preguntas con más respuestas serán mostradas primero." + +#~ msgid "Questions are sorted by the number of votes." +#~ msgstr "Preguntas serán ordenadas por el numero de votos." + +#~ msgid "Most voted questions are shown first." +#~ msgstr "Las preguntas mejor valoradas serán mostradas primero." + +#~ msgid "All tags matching query" +#~ msgstr "Mostrar todas las etiquetas usadas" + +#~ msgid "all tags - make this empty in english" +#~ msgstr "todas las etiquetas" + +#~ msgid "image associated with your email address" +#~ msgstr "imagen asociada con tu dirección de email" + +#~ msgid "Authentication settings" +#~ msgstr "Parametros de autentificación" + +#~ msgid "" +#~ "These are the external authentication providers currently associated with " +#~ "your account." +#~ msgstr "" +#~ "Estos son los proveedores de autenticación externa asociada a su cuenta." + +#~ msgid "remove" +#~ msgstr "remover" + +#~ msgid "" +#~ "You currently have no external authentication provider associated with " +#~ "your account." +#~ msgstr "" +#~ "Actualmente tu cuenta no esta asociada a ningún proveedor de " +#~ "autenticación externa." + +#~ msgid "Add new provider" +#~ msgstr "Agregar nuevo proveedor" + +#~ msgid "" +#~ "You can set up a password for your account, so you can login using " +#~ "standard username and password!" +#~ msgstr "" +#~ "Haz configurado la contraseña para tu cuenta, puedes usarla para ingresar " +#~ "con el método estandar: nombre de usuario y contraseña!" + +#~ msgid "You are here for the first time with " +#~ msgstr "Usted está aquí por primera vez con" + +#~ msgid "" +#~ "Please create your screen name and save your email address. Saved email " +#~ "address will let you subscribe for the updates on the most interesting " +#~ "questions and will be used to create and retrieve your unique avatar " +#~ "image. " +#~ msgstr "" +#~ "Por favor, escriba su nombre de usuario y su dirección de correo " +#~ "electrónico. Su dirección de correo electrónico le permitirá suscribirse " +#~ "a las actualizaciones de las preguntas más interesantes y se utilizará " +#~ "para crear y recuperar la imagen de su avatar." + +#~ msgid "Or..." +#~ msgstr "o" + +#~ msgid "" +#~ "Take the oppurtunity to validate my email next to the external provider I " +#~ "choose." +#~ msgstr "" +#~ "Tomar la oportunidad de validad mi email con el proveedor que he " +#~ "seleccionado." + +#~ msgid "Click" +#~ msgstr "Click" + +#~ msgid "if you're having troubles signing in." +#~ msgstr "si estas teniendo problemas para ingresar." + +#~ msgid "Enter your " +#~ msgstr "Ingresar tu" + +#~ msgid "You're seeing this because someone requested a temporary login link" +#~ msgstr "" +#~ "Estás viendo esto porque alguien ha solicitado un enlace de conexión " +#~ "temporal" + +#~ msgid "Following the link above will give you access to your account." +#~ msgstr "Sigue el siguiente enlace para acceder a tu cuenta." + +#~ msgid "Request temporary login key" +#~ msgstr "Solicitar clave de acceso temporal" + +#~ msgid "Account: request temporary login key" +#~ msgstr "Cuenta: solicitar clave de acceso temporal" + +#~ msgid "" +#~ "\n" +#~ " If you're experiencing problems accessing your account, or if you " +#~ "forgot your password,\n" +#~ " here you can request a temporary login key. Fill out your account " +#~ "email and we'll send you a temporary access link that\n" +#~ " will enable you to access your account. This token is valid only once " +#~ "and for a limited period of time.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Si estas teniendo problemas de acceo a tu cuenta, u olvidaste tu " +#~ "contraseña,\n" +#~ " aqui puedes solicitar una clave de acceso temporal. Ingresa la " +#~ "dirección de email asociada a tu cuenta y te enviaremos un enlace " +#~ "temporal\n" +#~ " para que tengas acceso a tu cuenta. Este será valido una sola vez y " +#~ "por un período de tiempo limitado.\n" +#~ " " + +#~ msgid "administration area" +#~ msgstr "Ãrea de Administración" + +#~ msgid "Administration menu" +#~ msgstr "Menú de administración" + +#~ msgid "Basic settings" +#~ msgstr "Configuraciones básicas" + +#~ msgid "Welcome to the administration area." +#~ msgstr "Bienvenido al área de adminstración" + +#~ msgid "" +#~ "Sorry, these login credentials belong to anoother user. Plese terminate " +#~ "your current session and try again." +#~ msgstr "" +#~ "Lo sentimos, las credenciales que haz ingresado pertenecen a otro " +#~ "usuario. Por favor termina tu sesión actual e intenta de nuevo." + +#~ msgid "You are already logged in with that user." +#~ msgstr "Ya haz ingresado con este usuario." + +#~ msgid "" +#~ "Oops, something went wrong in the middle of this process. Please try " +#~ "again." +#~ msgstr "" +#~ "Lo sentimos, algo falló en medio del proceso. Por favor intentalo de " +#~ "nuevo." + +#~ msgid "Temporary login link" +#~ msgstr "Enlace temporal para ingresar" + +#~ msgid "An email has been sent with your temporary login key" +#~ msgstr "Un email te ha sido enviado con una clave de acceso temporal" + +#~ msgid "" +#~ "You are logged in with a temporary access key, please take the time to " +#~ "fix your issue with authentication." +#~ msgstr "" +#~ "Haz ingresado con una clave de acceso temporal, tomate tu tiempo para " +#~ "solucionar el problema de autenticación (OpenID o contraseña)." + +#, fuzzy +#~ msgid "You removed the association with %s" +#~ msgstr "Haz removido la asociación con %s" + +#, fuzzy +#~ msgid "Left %s comments" +#~ msgstr "%s comentarios dejados" + +#~ msgid "Sorry, your Facebook session has expired, please try again" +#~ msgstr "Lo sentimos, su sesión de Facebook ha experido, intentelo de nuevo" + +#~ msgid "" +#~ "The authentication with Facebook connect failed due to an invalid " +#~ "signature" +#~ msgstr "La autentificación con Facebook ha fallado por un perfil invalido" + +#~ msgid "" +#~ "The authentication with Facebook connect failed, cannot find " +#~ "authentication tokens" +#~ msgstr "" +#~ "La autentificación con Facebook ha fallado, no podemos encontrar una " +#~ "cuenta asociada" + +#~ msgid "local/" +#~ msgstr "local/" + +#~ msgid "Error, the oauth token is not on the server" +#~ msgstr "Error, esta cuenta no esta registrada en nuestro servidor" + +#~ msgid "Something went wrong! Auth tokens do not match" +#~ msgstr "Algo esta fallando! Tu cuenta no parece coincidir" + +#~ msgid "Sorry, but your input is not a valid OpenId" +#~ msgstr "Lo sentimos pero no es una cuenta OpenID valida" + +#~ msgid "The OpenId authentication request was canceled" +#~ msgstr "La solicitud de autenticación OpenID ha sido cancelada" + +#~ msgid "The OpenId authentication failed: " +#~ msgstr "La autenticación OpenID ha fallado:" + +#~ msgid "Setup needed" +#~ msgstr "Es necesario configurar" + +#~ msgid "The OpenId authentication failed with an unknown status: " +#~ msgstr "La autenticación OpenID ha fallado por razones desconocidas:" + +#~ msgid "Enter your OpenId Url" +#~ msgstr "Ingresa la URL de tu OpenID" + +#, fuzzy +#~ msgid "Got %s upvotes in a question tagged with \"bug\"" +#~ msgstr "Obtuvo %s votos en la pregunta marcada con \"bug\"" + +#~ msgid "Invalid captcha" +#~ msgstr "Validación incorrecta" diff --git a/askbot/locale/ru/LC_MESSAGES/django.mo b/askbot/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 00000000..c7d6035c Binary files /dev/null and b/askbot/locale/ru/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/ru/LC_MESSAGES/django.po b/askbot/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 00000000..110460d6 --- /dev/null +++ b/askbot/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,4651 @@ +# Russian translation of messa and 2010 Askbot +# Copyright (C) 2009 Gang Chen +# This file is distributed under the same license as the Askbot package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-13 17:17-0400\n" +"PO-Revision-Date: 2010-05-11 04:27\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\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" + +#: django_authopenid/forms.py:72 django_authopenid/views.py:133 +msgid "i-names are not supported" +msgstr "извините, но i-names не поддерживаютÑÑ" + +#: django_authopenid/forms.py:135 +msgid "Account with this name already exists on the forum" +msgstr "аккаунт Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует на форуме" + +#: django_authopenid/forms.py:136 +msgid "can't have two logins to the same account yet, sorry." +msgstr "извините, но пока Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒ в аккаунт больше чем одним методом" + +#: django_authopenid/forms.py:158 +msgid "Please enter valid username and password (both are case-sensitive)." +msgstr "ПожалуйÑта введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль (Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра букв)" + +#: django_authopenid/forms.py:161 django_authopenid/forms.py:211 +msgid "This account is inactive." +msgstr "Этот аккаунт деактивирован" + +#: django_authopenid/forms.py:163 +msgid "Login failed." +msgstr "Логин неудачен" + +#: django_authopenid/forms.py:165 +msgid "Please enter username and password" +msgstr "ПожалуйÑта, введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль" + +#: django_authopenid/forms.py:167 +msgid "Please enter your password" +msgstr "ПожалуйÑта, введите пароль" + +#: django_authopenid/forms.py:169 +msgid "Please enter user name" +msgstr "ПожалуйÑта, введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + +#: django_authopenid/forms.py:207 +msgid "" +"Please enter a valid username and password. Note that " +"both fields are case-sensitive." +msgstr "" +"ПожалуйÑта введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль (обратите внимание - региÑÑ‚Ñ€ " +"букв важен Ð´Ð»Ñ Ð¾Ð±Ð¾Ð¸Ñ… параметров)" + +#: django_authopenid/forms.py:230 +msgid "Current password" +msgstr "ÐаÑтоÑщий пароль" + +#: django_authopenid/forms.py:241 +msgid "" +"Old password is incorrect. Please enter the correct " +"password." +msgstr "Старый пароль неверен. ПожалуйÑта, введите правильный пароль." + +#: django_authopenid/forms.py:306 +msgid "Your user name (required)" +msgstr "Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (обÑзательно)" + +#: django_authopenid/forms.py:321 +msgid "Incorrect username." +msgstr "Ðеправильное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ." + +#: django_authopenid/urls.py:23 django_authopenid/urls.py:24 +#: django_authopenid/urls.py:25 django_authopenid/urls.py:27 +#: fbconnect/urls.py:14 fbconnect/urls.py:15 fbconnect/urls.py:16 +msgid "signin/" +msgstr "войти/" + +#: django_authopenid/urls.py:24 fbconnect/urls.py:15 fbconnect/urls.py:19 +msgid "newquestion/" +msgstr "новый-вопроÑ/" + +#: django_authopenid/urls.py:25 fbconnect/urls.py:16 fbconnect/urls.py:20 +msgid "newanswer/" +msgstr "новый-ответ/" + +#: django_authopenid/urls.py:26 +msgid "signout/" +msgstr "выйти/" + +#: django_authopenid/urls.py:27 +msgid "complete/" +msgstr "завершить/" + +#: django_authopenid/urls.py:29 fbconnect/urls.py:18 fbconnect/urls.py:19 +#: fbconnect/urls.py:20 +msgid "register/" +msgstr "региÑтрациÑ/" + +#: django_authopenid/urls.py:30 +msgid "signup/" +msgstr "Ñоздать-аккаунт/" + +#: django_authopenid/urls.py:32 +msgid "sendpw/" +msgstr "поÑлать-пароль/" + +#: django_authopenid/urls.py:33 django_authopenid/urls.py:37 +msgid "password/" +msgstr "пароль/" + +#: django_authopenid/urls.py:33 +msgid "confirm/" +msgstr "подтвердить/" + +#: django_authopenid/urls.py:38 django_authopenid/urls.py:39 +#: django_authopenid/urls.py:40 django_authopenid/urls.py:41 +msgid "email/" +msgstr "адреÑ-Ñлектронной-почты/" + +#: django_authopenid/urls.py:38 +msgid "validate/" +msgstr "проверить/" + +#: django_authopenid/urls.py:39 +msgid "change/" +msgstr "заменить/" + +#: django_authopenid/urls.py:40 +msgid "sendkey/" +msgstr "поÑлать-ключ/" + +#: django_authopenid/urls.py:41 +msgid "verify/" +msgstr "проверить-ключ/" + +#: django_authopenid/urls.py:42 +msgid "openid/" +msgstr "openid/" + +#: django_authopenid/urls.py:43 forum/urls.py:52 forum/urls.py:56 +msgid "delete/" +msgstr "удалить/" + +#: django_authopenid/urls.py:51 +msgid "external-login/forgot-password/" +msgstr "вход-Ñ-партнерÑкого-Ñайта/напомпнить-пароль/" + +#: django_authopenid/urls.py:54 +msgid "external-login/signup/" +msgstr "вход-Ñ-партнерÑкого-Ñайта/Ñоздать-аккаунт/" + +#: django_authopenid/views.py:140 +#, python-format +msgid "OpenID %(openid_url)s is invalid" +msgstr "OpenID %(openid_url)s недейÑтвителен" + +#: django_authopenid/views.py:615 +msgid "Welcome email subject line" +msgstr "добро пожаловать на форум!" + +#: django_authopenid/views.py:721 +msgid "Password changed." +msgstr "Пароль изменен." + +#: django_authopenid/views.py:733 django_authopenid/views.py:739 +#, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" +"пожалуйÑта подтвердите Ð°Ð´Ñ€ÐµÑ Ð’Ð°ÑˆÐµÐ¹ Ñлектронной почты (Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð´ÐµÑÑŒ)" + +#: django_authopenid/views.py:760 +msgid "Email verification subject line" +msgstr "[форум]: подтвердите Ð°Ð´Ñ€ÐµÑ Ð’Ð°ÑˆÐµÐ¹ Ñлектронной почты" + +#: django_authopenid/views.py:851 +msgid "your email was not changed" +msgstr "Ð°Ð´Ñ€ÐµÑ Ð’Ð°ÑˆÐµÐ¹ Ñлектронной почты не изменён" + +#: django_authopenid/views.py:899 django_authopenid/views.py:1057 +#, python-format +msgid "No OpenID %s found associated in our database" +msgstr "в нашей базе данных нет OpenID %s" + +#: django_authopenid/views.py:903 django_authopenid/views.py:1064 +#, python-format +msgid "The OpenID %s isn't associated to current user logged in" +msgstr "OpenID %s не принадлежит данному пользователю" + +#: django_authopenid/views.py:911 +msgid "Email Changed." +msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты изменён." + +#: django_authopenid/views.py:989 +msgid "This OpenID is already associated with another account." +msgstr "Этот OpenID уже изпользуетÑÑ Ð² другом аккаунте." + +#: django_authopenid/views.py:994 +#, python-format +msgid "OpenID %s is now associated with your account." +msgstr "Ваш аккаунт теперь Ñоединен Ñ OpenID %s" + +#: django_authopenid/views.py:1067 +msgid "Account deleted." +msgstr "Ðккаунт удален." + +#: django_authopenid/views.py:1119 +msgid "Request for new password" +msgstr "[форум]: замена паролÑ" + +#: django_authopenid/views.py:1133 +msgid "A new password and the activation link were sent to your email address." +msgstr "" +"Ðовый пароль и ÑÑылка Ð´Ð»Ñ ÐµÐ³Ð¾ активации были выÑланы по Вашему адреÑу " +"Ñлектронной почты." + +#: django_authopenid/views.py:1165 +#, python-format +msgid "" +"Could not change password. Confirmation key '%s' is not " +"registered." +msgstr "Пароль не был изменён, Ñ‚.к. ключ '%s' в нашей базе данных не найден." + +#: django_authopenid/views.py:1175 +msgid "" +"Can not change password. User don't exist anymore in our " +"database." +msgstr "" +"Пароль изменить невозоможно, Ñ‚.к. запиÑÑŒ данного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ‹Ð»Ð° удалена." + +#: django_authopenid/views.py:1185 +#, python-format +msgid "Password changed for %s. You may now sign in." +msgstr "Пароль Ð´Ð»Ñ %s изменен. Теперь вы можете Ñ Ð½Ð¸Ð¼ войти в Ñайт." + +#: forum/auth.py:470 +msgid "Your question and all of it's answers have been deleted" +msgstr "Ваш Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¸ вÑе оветы на него были удалены" + +#: forum/auth.py:472 +msgid "Your question has been deleted" +msgstr "Ваш Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» удалён" + +#: forum/auth.py:475 +msgid "The question and all of it's answers have been deleted" +msgstr "Ð’Ð¾Ð¿Ñ€Ð¾Ñ Ð¸ вÑе оветы на него были удалены" + +#: forum/auth.py:477 +msgid "The question has been deleted" +msgstr "Ð’Ð¾Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» удалён" + +#: forum/feed.py:18 +msgid " - " +msgstr "-" + +#: forum/feed.py:18 +msgid "latest questions" +msgstr "Ñамые новые вопроÑÑ‹" + +#: forum/forms.py:24 forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "title" +msgstr "заголовок" + +#: forum/forms.py:25 +msgid "please enter a descriptive title for your question" +msgstr "пожалуйÑта введите подробный заголовок Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ вопроÑа" + +#: forum/forms.py:30 +msgid "title must be > 10 characters" +msgstr "заголовок должен иметь более 10-ти букв" + +#: forum/forms.py:39 +msgid "content" +msgstr "оÑновное Ñодержание" + +#: forum/forms.py:45 +msgid "question content must be > 10 characters" +msgstr "Ñодержание вопроÑа должно быть более 10-ти букв" + +#: forum/forms.py:54 forum/skins/default/templates/header.html:28 +msgid "tags" +msgstr "темы" + +#: forum/forms.py:56 +msgid "" +"Tags are short keywords, with no spaces within. Up to five tags can be used." +msgstr "" +"ТематичеÑкие отметкы Ñто короткие ключевые Ñлова, не Ñодержащие внутри " +"пробелов. ПожалуйÑта иÑпользуйте не более пÑти отметок." + +#: forum/forms.py:63 forum/skins/default/templates/question_retag.html:39 +msgid "tags are required" +msgstr "тематичеÑкие отметки (ключевые Ñлова) обÑзательны" + +#: forum/forms.py:72 +#, python-format +msgid "please use %(tag_count)d tag or less" +msgid_plural "please use %(tag_count)d tags or less" +msgstr[0] "пожалуйÑта введите не более %(tag_count)d Ñлов" +msgstr[1] "пожалуйÑта введите не более %(tag_count)d Ñлова" +msgstr[2] "пожалуйÑта введите не более %(tag_count)d Ñлов" + +#: forum/forms.py:81 +#, python-format +msgid "each tag must be shorter than %(max_chars)d character" +msgid_plural "each tag must be shorter than %(max_chars)d characters" +msgstr[0] "каждое Ñлово должно быть не более %(max_chars)d букв" +msgstr[1] "каждое Ñлово должно быть не более %(max_chars)d буквы" +msgstr[2] "каждое Ñлово должно быть не более %(max_chars)d букв" + +#: forum/forms.py:89 +msgid "use-these-chars-in-tags" +msgstr "пожалуйÑта иÑпользуйте только Ñледующие Ñимволы" + +#: forum/forms.py:99 +#: forum/skins/default/templates/post_contributor_info.html:7 +#: forum/skins/default/templates/question_summary_list_roll.html:26 +#: forum/skins/default/templates/question_summary_list_roll.html:38 +msgid "community wiki" +msgstr "общее вики" + +#: forum/forms.py:100 +msgid "" +"if you choose community wiki option, the question and answer do not generate " +"points and name of author will not be shown" +msgstr "" +"еÑли вы отметите \"общее вики\", то голоÑа на ответ и Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð½Ðµ принеÑут " +"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² репутации" + +#: forum/forms.py:116 +msgid "update summary:" +msgstr "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± обновлениÑÑ…:" + +#: forum/forms.py:117 +msgid "" +"enter a brief summary of your revision (e.g. fixed spelling, grammar, " +"improved style, this field is optional)" +msgstr "" +"еÑли у Ð’Ð°Ñ ÐµÑÑ‚ÑŒ желание, то кратко опишите здеÑÑŒ Ñуть вашей правки (например " +"- иÑправление орфографии, грамматики, ÑтилÑ)" + +#: forum/forms.py:120 +msgid "Automatically accept user's contributions for the email updates" +msgstr "" +"ÐвоматичеÑки принÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñ€Ð°ÑÑылки по " +"Ñлетронной почте" + +#: forum/forms.py:211 +msgid "Your name:" +msgstr "Ваше имÑ:" + +#: forum/forms.py:212 +msgid "Email (not shared with anyone):" +msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты (держитÑÑ Ð² Ñекрете):" + +#: forum/forms.py:213 +msgid "Your message:" +msgstr "Ваше Ñообщение:" + +#: forum/forms.py:296 +msgid "this email does not have to be linked to gravatar" +msgstr "" +"Этот Ð°Ð´Ñ€ÐµÑ Ð½Ðµ обÑзательно должен быть аÑÑоциирован Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¼ аватаром " +"(gravatar)" + +#: forum/forms.py:298 +msgid "Screen name" +msgstr "Ð˜Ð¼Ñ Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ¸" + +#: forum/forms.py:299 +msgid "Real name" +msgstr "ÐаÑтоÑщее имÑ" + +#: forum/forms.py:300 +msgid "Website" +msgstr "ВебÑайт" + +#: forum/forms.py:301 +msgid "Location" +msgstr "МеÑтоположение" + +#: forum/forms.py:302 +msgid "Date of birth" +msgstr "День рождениÑ" + +#: forum/forms.py:302 +msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" +msgstr "показываетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ возраÑÑ‚, формат ГГГГ-ММ-ДД" + +#: forum/forms.py:303 forum/skins/default/templates/account_settings.html:21 +#: forum/skins/default/templates/authopenid/settings.html:21 +msgid "Profile" +msgstr "Профиль" + +#: forum/forms.py:334 forum/forms.py:335 +msgid "this email has already been registered, please use another one" +msgstr "Ñтот Ð°Ð´Ñ€ÐµÑ ÑƒÐ¶Ðµ зарегиÑтрирован, пожалуйÑта введите другой" + +#: forum/forms.py:341 +msgid "Choose email tag filter" +msgstr "Выберите тип фильтра по темам (ключевым Ñловам)" + +#: forum/forms.py:357 forum/forms.py:358 +msgid "weekly" +msgstr "еженедельно" + +#: forum/forms.py:357 forum/forms.py:358 +msgid "no email" +msgstr "не поÑылать Ñлектронную почту" + +#: forum/forms.py:358 +msgid "daily" +msgstr "ежедневно" + +#: forum/forms.py:373 +msgid "Asked by me" +msgstr "Заданные мной" + +#: forum/forms.py:376 +msgid "Answered by me" +msgstr "Отвеченные мной" + +#: forum/forms.py:379 +msgid "Individually selected" +msgstr "Выбранные индивидуально" + +#: forum/forms.py:382 +msgid "Entire forum (tag filtered)" +msgstr "ВеÑÑŒ форум (фильтрованный по темам)" + +#: forum/forms.py:436 +msgid "okay, let's try!" +msgstr "ну хорошо, давайте попробуем!" + +#: forum/forms.py:437 +msgid "no community email please, thanks" +msgstr "ÑпаÑибо, но не надо" + +#: forum/forms.py:440 +msgid "please choose one of the options above" +msgstr "пожалуйÑта Ñделайте Ваш выбор (Ñм. выше)" + +#: forum/urls.py:28 +msgid "upfiles/" +msgstr "загруженные-файлы/" + +#: forum/urls.py:33 +msgid "about/" +msgstr "о-наÑ/" + +#: forum/urls.py:34 forum/conf/site_settings.py:76 +msgid "faq/" +msgstr "чаÑто-задаваемые-вопроÑÑ‹/" + +#: forum/urls.py:35 +msgid "privacy/" +msgstr "правила-о-личной-информации/" + +#: forum/urls.py:36 +msgid "logout/" +msgstr "выйти/" + +#: forum/urls.py:37 forum/urls.py:38 forum/urls.py:39 forum/urls.py:56 +msgid "answers/" +msgstr "ответы/" + +#: forum/urls.py:37 forum/urls.py:49 forum/urls.py:52 forum/urls.py:56 +msgid "comments/" +msgstr "комментарии/" + +#: forum/urls.py:38 forum/urls.py:43 forum/urls.py:78 +#: forum/skins/default/templates/user_info.html:47 +msgid "edit/" +msgstr "править/" + +#: forum/urls.py:39 forum/urls.py:48 +msgid "revisions/" +msgstr "правки/" + +#: forum/urls.py:40 forum/urls.py:41 forum/urls.py:42 forum/urls.py:43 +#: forum/urls.py:44 forum/urls.py:45 forum/urls.py:46 forum/urls.py:47 +#: forum/urls.py:48 forum/urls.py:49 forum/urls.py:52 +msgid "questions/" +msgstr "вопроÑÑ‹/" + +#: forum/urls.py:41 forum_modules/books/urls.py:8 +msgid "ask/" +msgstr "ÑпроÑить/" + +#: forum/urls.py:42 +msgid "unanswered/" +msgstr "неотвеченные/" + +#: forum/urls.py:44 +msgid "close/" +msgstr "закрыть/" + +#: forum/urls.py:45 +msgid "reopen/" +msgstr "открыть-Ñнова/" + +#: forum/urls.py:46 +msgid "answer/" +msgstr "ответить/" + +#: forum/urls.py:47 +msgid "vote/" +msgstr "голоÑовать/" + +#: forum/urls.py:50 +msgid "command/" +msgstr "комманда/" + +#: forum/urls.py:60 forum/views/readers.py:264 +msgid "question/" +msgstr "вопроÑ/" + +#: forum/urls.py:61 forum/urls.py:62 +msgid "tags/" +msgstr "темы/" + +#: forum/urls.py:64 forum/urls.py:68 +msgid "mark-tag/" +msgstr "отметить-тему/" + +#: forum/urls.py:64 +msgid "interesting/" +msgstr "интереÑнаÑ/" + +#: forum/urls.py:68 +msgid "ignored/" +msgstr "неинтереÑнаÑ/" + +#: forum/urls.py:72 +msgid "unmark-tag/" +msgstr "отменить-отметку-темы/" + +#: forum/urls.py:76 forum/urls.py:78 forum/urls.py:79 +msgid "users/" +msgstr "люди/" + +#: forum/urls.py:77 +msgid "moderate-user/" +msgstr "модерировать-пользователÑ/" + +#: forum/urls.py:80 forum/urls.py:81 +msgid "badges/" +msgstr "награды/" + +#: forum/urls.py:82 +msgid "messages/" +msgstr "ÑообщениÑ/" + +#: forum/urls.py:82 +msgid "markread/" +msgstr "отметить-прочитанное/" + +#: forum/urls.py:85 +msgid "upload/" +msgstr "загрузить-файл/" + +#: forum/urls.py:86 +msgid "search/" +msgstr "иÑкать/" + +#: forum/urls.py:87 +msgid "feedback/" +msgstr "обратнаÑ-ÑвÑзь/" + +#: forum/urls.py:88 forum/urls.py:89 +msgid "account/" +msgstr "аккаунт/" + +#: forum/conf/email.py:11 +msgid "Email and email alert settings" +msgstr "" + +#: forum/conf/email.py:19 +msgid "Maximum number of news entries in an email alert" +msgstr "" + +#: forum/conf/email.py:29 +msgid "Require email verification before allowing to post" +msgstr "" + +#: forum/conf/email.py:30 +msgid "" +"Active email verification is done by sending a verification key in email" +msgstr "" + +#: forum/conf/email.py:39 +#, fuzzy +msgid "Allow only one account per email address" +msgstr "ваш email" + +#: forum/conf/email.py:48 +msgid "Fake email for anonymous user" +msgstr "" + +#: forum/conf/email.py:49 +msgid "Use this setting to control gravatar for email-less user" +msgstr "" + +#: forum/conf/external_keys.py:11 +msgid "Keys to connect the site with external services like Facebook, etc." +msgstr "" + +#: forum/conf/external_keys.py:18 +msgid "Google site verification key" +msgstr "" + +#: forum/conf/external_keys.py:20 +#, python-format +msgid "" +"This key helps google index your site please obtain is at google webmasters tools site" +msgstr "" + +#: forum/conf/external_keys.py:34 +msgid "Google Analytics key" +msgstr "" + +#: forum/conf/external_keys.py:36 +#, python-format +msgid "" +"Obtain is at Google Analytics site, if you wish " +"to use Google Analytics to monitor your site" +msgstr "" + +#: forum/conf/external_keys.py:49 +msgid "Recaptcha private key" +msgstr "" + +#: forum/conf/external_keys.py:52 +msgid "" +"Recaptcha is a tool that helps distinguish real people from annoying spam " +"robots. Please get this and a public key at the recaptcha.net" +msgstr "" + +#: forum/conf/external_keys.py:65 +msgid "Recaptcha public key" +msgstr "" + +#: forum/conf/external_keys.py:73 +msgid "Facebook public API key" +msgstr "" + +#: forum/conf/external_keys.py:76 +msgid "" +"Facebook API key and Facebook secret allow to use Facebook Connect login " +"method at your site. Please obtain these keys at facebook create app site" +msgstr "" + +#: forum/conf/external_keys.py:91 +msgid "Facebook secret key" +msgstr "" + +#: forum/conf/flatpages.py:10 +msgid "Flatpages - about, privacy policy, etc." +msgstr "" + +#: forum/conf/flatpages.py:17 +msgid "Text the Q&A forum About page (html format)" +msgstr "" + +#: forum/conf/flatpages.py:20 +msgid "" +"Save, then use HTML validator on " +"the \"about\" page to check your input." +msgstr "" + +#: forum/conf/flatpages.py:30 +msgid "Text the Q&A forum Privacy Policy (html format)" +msgstr "" + +#: forum/conf/flatpages.py:33 +msgid "" +"Save, then use HTML validator on " +"the \"privacy\" page to check your input." +msgstr "" + +#: forum/conf/forum_data_rules.py:12 +msgid "Settings for forum data entry and display" +msgstr "" + +#: forum/conf/forum_data_rules.py:20 +msgid "Check to enable community wiki feature" +msgstr "" + +#: forum/conf/forum_data_rules.py:29 +msgid "Maximum length of tag (number of characters)" +msgstr "" + +#: forum/conf/forum_data_rules.py:38 +msgid "Maximum number of tags per question" +msgstr "" + +#: forum/conf/forum_data_rules.py:50 +msgid "Number of questions to list by default" +msgstr "" + +#: forum/conf/forum_data_rules.py:60 +#, fuzzy +msgid "What should \"unanswered question\" mean?" +msgstr "ÑпиÑок неотвеченных вопроÑов" + +#: forum/conf/minimum_reputation.py:11 +msgid "Minimum reputation required to perform actions" +msgstr "" + +#: forum/conf/minimum_reputation.py:20 +#, fuzzy +msgid "Upvote" +msgstr "проголоÑовать \"за\"" + +#: forum/conf/minimum_reputation.py:29 +#, fuzzy +msgid "Downvote" +msgstr "проголоÑовать \"против\"" + +#: forum/conf/minimum_reputation.py:38 +#, fuzzy +msgid "Flag offensive" +msgstr "Ñпам" + +#: forum/conf/minimum_reputation.py:47 +#, fuzzy +msgid "Leave comments" +msgstr "добавить комментарии" + +#: forum/conf/minimum_reputation.py:56 +msgid "Delete comments posted by others" +msgstr "" + +#: forum/conf/minimum_reputation.py:65 +#, fuzzy +msgid "Upload files" +msgstr "загруженные-файлы/" + +#: forum/conf/minimum_reputation.py:74 +#, fuzzy +msgid "Close own questions" +msgstr "Закрыть вопроÑ" + +#: forum/conf/minimum_reputation.py:83 +msgid "Retag questions posted by other people" +msgstr "" + +#: forum/conf/minimum_reputation.py:92 +#, fuzzy +msgid "Reopen own questions" +msgstr "Переоткрыть вопроÑ" + +#: forum/conf/minimum_reputation.py:101 +#, fuzzy +msgid "Edit community wiki posts" +msgstr "редактировать вопроÑÑ‹ в вики ÑообщеÑтва " + +#: forum/conf/minimum_reputation.py:110 +msgid "Edit posts authored by other people" +msgstr "" + +#: forum/conf/minimum_reputation.py:119 +#, fuzzy +msgid "View offensive flags" +msgstr "отметка неумеÑтного контента" + +#: forum/conf/minimum_reputation.py:128 +msgid "Disable nofollow directive on links" +msgstr "" + +#: forum/conf/minimum_reputation.py:137 +#, fuzzy +msgid "Close questions asked by others" +msgstr "вопроÑÑ‹ по теме '%(tag)s'" + +#: forum/conf/minimum_reputation.py:146 +msgid "Lock posts" +msgstr "" + +#: forum/conf/reputation_changes.py:12 +msgid "Reputaion loss and gain rules" +msgstr "" + +#: forum/conf/reputation_changes.py:21 +msgid "Maximum daily reputation gain per user" +msgstr "" + +#: forum/conf/reputation_changes.py:30 +msgid "Gain for receiving an upvote" +msgstr "" + +#: forum/conf/reputation_changes.py:39 +msgid "Gain for the author of accepted answer" +msgstr "" + +#: forum/conf/reputation_changes.py:48 +#, fuzzy +msgid "Gain for accepting best answer" +msgstr "отметка лучшего ответа" + +#: forum/conf/reputation_changes.py:57 +msgid "Gain for post owner on canceled downvote" +msgstr "" + +#: forum/conf/reputation_changes.py:66 +msgid "Gain for voter on canceling downvote" +msgstr "" + +#: forum/conf/reputation_changes.py:76 +msgid "Loss for voter for canceling of answer acceptance" +msgstr "" + +#: forum/conf/reputation_changes.py:86 +msgid "Loss for author whose answer was \"un-accepted\"" +msgstr "" + +#: forum/conf/reputation_changes.py:96 +msgid "Loss for giving a downvote" +msgstr "" + +#: forum/conf/reputation_changes.py:106 +msgid "Loss for owner of post that was flagged offensive" +msgstr "" + +#: forum/conf/reputation_changes.py:116 +msgid "Loss for owner of post that was downvoted" +msgstr "" + +#: forum/conf/reputation_changes.py:126 +msgid "Loss for owner of post that was flagged 3 times per same revision" +msgstr "" + +#: forum/conf/reputation_changes.py:136 +msgid "Loss for owner of post that was flagged 5 times per same revision" +msgstr "" + +#: forum/conf/reputation_changes.py:146 +msgid "Loss for post owner when upvote is canceled" +msgstr "" + +#: forum/conf/site_settings.py:14 +msgid "Q&A forum website parameters and urls" +msgstr "" + +#: forum/conf/site_settings.py:22 +#, fuzzy +msgid "Site title for the Q&A forum" +msgstr "С Уважением, Q/A форум" + +#: forum/conf/site_settings.py:31 +msgid "Comma separated list of Q&A site keywords" +msgstr "" + +#: forum/conf/site_settings.py:40 +msgid "Copyright message to show in the footer" +msgstr "" + +#: forum/conf/site_settings.py:49 +msgid "Site description for the search engines" +msgstr "" + +#: forum/conf/site_settings.py:57 +#, fuzzy +msgid "Askbot" +msgstr "О наÑ" + +#: forum/conf/site_settings.py:59 +msgid "Short name for your Q&A forum" +msgstr "" + +#: forum/conf/site_settings.py:68 +msgid "Base URL for your Q&A forum, must start with http or https" +msgstr "" + +#: forum/conf/site_settings.py:78 +msgid "Link shown in the greeting message shown to the anonymous user" +msgstr "" + +#: forum/conf/site_settings.py:79 +msgid "" +"If you change this url from the default - then you will also probably want " +"to adjust translation of the following string: " +msgstr "" + +#: forum/conf/site_settings.py:92 +#, fuzzy +msgid "Feedback site URL" +msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑвÑзь" + +#: forum/conf/site_settings.py:93 +msgid "If left empty, a simple internal feedback form will be used instead" +msgstr "" + +#: forum/conf/skin_counter_settings.py:11 +msgid "Skin: view, vote and answer counters" +msgstr "" + +#: forum/conf/skin_counter_settings.py:19 +msgid "Vote counter value to give \"full color\"" +msgstr "" + +#: forum/conf/skin_counter_settings.py:28 +msgid "Background color for votes = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:29 +#: forum/conf/skin_counter_settings.py:39 +#: forum/conf/skin_counter_settings.py:49 +#: forum/conf/skin_counter_settings.py:59 +#: forum/conf/skin_counter_settings.py:69 +#: forum/conf/skin_counter_settings.py:81 +#: forum/conf/skin_counter_settings.py:100 +#: forum/conf/skin_counter_settings.py:110 +#: forum/conf/skin_counter_settings.py:120 +#: forum/conf/skin_counter_settings.py:132 +#: forum/conf/skin_counter_settings.py:142 +#: forum/conf/skin_counter_settings.py:154 +#: forum/conf/skin_counter_settings.py:175 +#: forum/conf/skin_counter_settings.py:185 +#: forum/conf/skin_counter_settings.py:195 +#: forum/conf/skin_counter_settings.py:205 +#: forum/conf/skin_counter_settings.py:217 +#: forum/conf/skin_counter_settings.py:227 +#: forum/conf/skin_counter_settings.py:239 +#: forum/conf/skin_counter_settings.py:249 +msgid "HTML color name of hex value" +msgstr "" + +#: forum/conf/skin_counter_settings.py:38 +msgid "Foreground color for votes = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:48 +msgid "Background color for votes = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:58 +msgid "Foreground color for votes = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:68 +msgid "Background color for votes = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:80 +msgid "Foreground color for votes = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:90 +msgid "View counter value to give \"full color\"" +msgstr "" + +#: forum/conf/skin_counter_settings.py:99 +msgid "Background color for views = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:109 +msgid "Foreground color for views = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:119 +msgid "Background color for views = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:131 +msgid "Foreground color for views = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:141 +msgid "Background color for views = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:153 +msgid "Foreground color for views = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:163 +msgid "Answer counter value to give \"full color\"" +msgstr "" + +#: forum/conf/skin_counter_settings.py:174 +msgid "Background color for answers = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:184 +msgid "Foreground color for answers = 0" +msgstr "" + +#: forum/conf/skin_counter_settings.py:194 +msgid "Background color for answers = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:204 +msgid "Foreground color for answers = 1" +msgstr "" + +#: forum/conf/skin_counter_settings.py:216 +msgid "Background color for answers = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:226 +msgid "Foreground color for answers = MAX" +msgstr "" + +#: forum/conf/skin_counter_settings.py:238 +msgid "Background color for accepted" +msgstr "" + +#: forum/conf/skin_counter_settings.py:248 +msgid "Foreground color for accepted answer" +msgstr "" + +#: forum/conf/skin_general_settings.py:11 +msgid "Skin: general settings" +msgstr "" + +#: forum/conf/skin_general_settings.py:20 +#, fuzzy +msgid "Select skin" +msgstr "выбрать верÑию" + +#: forum/conf/skin_general_settings.py:29 +msgid "Skin media revision number" +msgstr "" + +#: forum/conf/skin_general_settings.py:31 +msgid "" +"Increment this number when you change image in skin media or stylesheet. " +"This helps avoid showing your users outdated images from their browser cache." +msgstr "" + +#: forum/conf/user_settings.py:10 +#, fuzzy +msgid "User policy settings" +msgstr "политика в отношении cookie" + +#: forum/conf/user_settings.py:18 +msgid "Allow editing user screen name" +msgstr "" + +#: forum/conf/user_settings.py:28 +msgid "Minimum allowed length for screen name" +msgstr "" + +#: forum/conf/vote_rules.py:13 +msgid "Limits applicable to votes and moderation flags" +msgstr "" + +#: forum/conf/vote_rules.py:22 +msgid "Number of votes a user can cast per day" +msgstr "" + +#: forum/conf/vote_rules.py:31 +msgid "Maximum number of flags per user per day" +msgstr "" + +#: forum/conf/vote_rules.py:40 +msgid "Threshold for warning about remaining daily votes" +msgstr "" + +#: forum/conf/vote_rules.py:49 +msgid "Number of days to allow canceling votes" +msgstr "" + +#: forum/conf/vote_rules.py:58 +msgid "Number of flags required to automatically hide posts" +msgstr "" + +#: forum/conf/vote_rules.py:67 +msgid "Number of flags required to automatically delete posts" +msgstr "" + +#: forum/const/__init__.py:8 +msgid "duplicate question" +msgstr "такой Ð²Ð¾Ð¿Ñ€Ð¾Ñ ÑƒÐ¶Ðµ был задан" + +#: forum/const/__init__.py:9 +msgid "question is off-topic or not relevant" +msgstr "Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð½Ðµ по теме данного форума" + +#: forum/const/__init__.py:10 +msgid "too subjective and argumentative" +msgstr "Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ñлишком Ñубъективный или Ñпорный" + +#: forum/const/__init__.py:11 +msgid "not a real question" +msgstr "на Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð½Ðµ похоже" + +#: forum/const/__init__.py:12 +msgid "the question is answered, right answer was accepted" +msgstr "на Ñтот Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» дан ответ и он был принÑÑ‚ как правильный" + +#: forum/const/__init__.py:13 +msgid "question is not relevant or outdated" +msgstr "Ð²Ð¾Ð¿Ñ€Ð¾Ñ ÑƒÑтарел или более на актуален" + +#: forum/const/__init__.py:14 +msgid "question contains offensive or malicious remarks" +msgstr "Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ñодержит грубые или злонамеренные заÑвлениÑ" + +#: forum/const/__init__.py:15 +msgid "spam or advertising" +msgstr "Ñпам или реклама" + +#: forum/const/__init__.py:16 +msgid "too localized" +msgstr "Ñлишком Ñпециализированный" + +#: forum/const/__init__.py:37 forum/skins/default/templates/questions.html:70 +#: forum/skins/default/templates/questions.html:75 +msgid "newest" +msgstr "новые" + +#: forum/const/__init__.py:38 forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/users.html:28 +msgid "oldest" +msgstr "Ñтарые" + +#: forum/const/__init__.py:39 forum/skins/default/templates/questions.html:89 +#: forum/skins/default/templates/questions.html:94 +msgid "active" +msgstr "активные" + +#: forum/const/__init__.py:40 forum/skins/default/templates/questions.html:83 +msgid "inactive" +msgstr "неактивные" + +#: forum/const/__init__.py:41 +msgid "hottest" +msgstr "больше ответов" + +#: forum/const/__init__.py:42 +msgid "coldest" +msgstr "меньше ответов" + +#: forum/const/__init__.py:43 +msgid "most voted" +msgstr "больше голоÑов" + +#: forum/const/__init__.py:44 +msgid "least voted" +msgstr "меньше голоÑов" + +#: forum/const/__init__.py:45 +msgid "relevance" +msgstr "умеÑтноÑÑ‚ÑŒ" + +#: forum/const/__init__.py:52 forum/skins/default/templates/questions.html:52 +msgid "all" +msgstr "вÑе" + +#: forum/const/__init__.py:53 forum/skins/default/templates/questions.html:53 +msgid "unanswered" +msgstr "неотвеченные" + +#: forum/const/__init__.py:54 forum/skins/default/templates/questions.html:55 +msgid "favorite" +msgstr "закладки" + +#: forum/const/__init__.py:60 +#, fuzzy +msgid "Question has no answers" +msgstr "ВопроÑÑ‹ отвеченные мной" + +#: forum/const/__init__.py:61 +#, fuzzy +msgid "Question has no accepted answers" +msgstr "ВопроÑÑ‹ отвеченные мной" + +#: forum/const/__init__.py:98 +msgid "question" +msgstr "вопроÑ" + +#: forum/const/__init__.py:99 forum/skins/default/templates/book.html:110 +msgid "answer" +msgstr "ответ" + +#: forum/const/__init__.py:100 +msgid "commented question" +msgstr "комментарий на вопроÑ" + +#: forum/const/__init__.py:101 +msgid "commented answer" +msgstr "комментарий на ответ" + +#: forum/const/__init__.py:102 +msgid "edited question" +msgstr "отредактировали ответ" + +#: forum/const/__init__.py:103 +msgid "edited answer" +msgstr "отредактировали ответ" + +#: forum/const/__init__.py:104 +msgid "received award" +msgstr "получение награды" + +#: forum/const/__init__.py:105 +msgid "marked best answer" +msgstr "отметка лучшего ответа" + +#: forum/const/__init__.py:106 +msgid "upvoted" +msgstr "положительный голоÑ" + +#: forum/const/__init__.py:107 +msgid "downvoted" +msgstr "отрицательный голоÑ" + +#: forum/const/__init__.py:108 +msgid "canceled vote" +msgstr "отмена голоÑа" + +#: forum/const/__init__.py:109 +msgid "deleted question" +msgstr "удаление вопроÑа" + +#: forum/const/__init__.py:110 +msgid "deleted answer" +msgstr "удаление ответа" + +#: forum/const/__init__.py:111 +msgid "marked offensive" +msgstr "отметка неумеÑтного контента" + +#: forum/const/__init__.py:112 +msgid "updated tags" +msgstr "обновление тем" + +#: forum/const/__init__.py:113 +msgid "selected favorite" +msgstr "отметка интереÑного вопроÑа" + +#: forum/const/__init__.py:114 +msgid "completed user profile" +msgstr "полное завершение учётной запиÑи" + +#: forum/const/__init__.py:115 +msgid "email update sent to user" +msgstr "Ñообщение выÑлано по Ñлектронной почте" + +#: forum/const/__init__.py:119 +msgid "question_answered" +msgstr "question_answered" + +#: forum/const/__init__.py:120 +msgid "question_commented" +msgstr "question_commented" + +#: forum/const/__init__.py:121 +msgid "answer_commented" +msgstr "answer_commented" + +#: forum/const/__init__.py:122 +msgid "answer_accepted" +msgstr "answer_accepted" + +#: forum/const/__init__.py:126 +msgid "[closed]" +msgstr "[закрыт]" + +#: forum/const/__init__.py:127 +msgid "[deleted]" +msgstr "[удален]" + +#: forum/const/__init__.py:128 forum/views/readers.py:395 +#: forum/views/readers.py:416 +msgid "initial version" +msgstr "Ð¸Ð·Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ" + +#: forum/const/__init__.py:129 +msgid "retagged" +msgstr "Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ñ‚ÐµÐ¼Ð°Ñ‚Ð¸Ñ‡ÐµÑких отметок" + +#: forum/const/__init__.py:133 +msgid "exclude ignored tags" +msgstr "иÑключить игнорируемые темы" + +#: forum/const/__init__.py:133 +msgid "allow only selected tags" +msgstr "влючить только выбранные темы" + +#: forum/const/message_keys.py:19 +#, python-format +msgid "First time here? Check out the FAQ!" +msgstr "" +"ЗдравÑтвуйте, Ð’Ñ‹ здеÑÑŒ впервые? ПоÑмотрите наши чаÑто " +"задаваемые вопроÑÑ‹!" + +#: forum/importers/stackexchange/management/commands/load_stackexchange.py:124 +msgid "Congratulations, you are now an Administrator" +msgstr "ПоздравлÑем, теперь Ð’Ñ‹ админиÑтратор на нашем форуме" + +#: forum/management/commands/send_email_alerts.py:312 +msgid "email update message subject" +msgstr "новоÑти Ñ Ñ„Ð¾Ñ€ÑƒÐ¼Ð°" + +#: forum/management/commands/send_email_alerts.py:314 +#, fuzzy, python-format +msgid "%(name)s, this is an update message header for %(num)d question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "%(name)s, в Ñтом вопроÑе еÑÑ‚ÑŒ новоÑти" +msgstr[1] "%(name)s, в Ñтих %(num)d вопроÑах еÑÑ‚ÑŒ новоÑти" +msgstr[2] "%(name)s, в Ñтих %(num)d вопроÑах еÑÑ‚ÑŒ новоÑти" + +#: forum/management/commands/send_email_alerts.py:331 +msgid "new question" +msgstr "новый вопроÑ" + +#: forum/management/commands/send_email_alerts.py:348 +msgid "" +"Please visit the forum and see what's new! Could you spread the word about " +"it - can somebody you know help answering those questions or benefit from " +"posting one?" +msgstr "" +"ПожалуйÑта, зайдите на наш форум и поÑмотрите что еÑÑ‚ÑŒ нового. Может быть Ð’Ñ‹ " +"поможете нам раÑÑказать другим о нашем Ñайте или кто-нибудь из Ваших " +"знакомых может ответить на Ñти вопроÑÑ‹ или извлечь пользу из ответов?" + +#: forum/management/commands/send_email_alerts.py:360 +msgid "" +"Your most frequent subscription setting is 'daily' on selected questions. If " +"you are receiving more than one email per dayplease tell about this issue to " +"the forum administrator." +msgstr "" +"Ð’Ñ‹ выбрали получать ежедневные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ новоÑÑ‚ÑÑ… в избранных вопроÑах. " +"ЕÑли Ð’Ñ‹ получаете от Ð½Ð°Ñ Ð±Ð¾Ð»ÐµÐµ чем одно Ñообщение в день, пожалуйÑта дайте " +"об Ñтом знать админиÑтратору форума." + +#: forum/management/commands/send_email_alerts.py:366 +msgid "" +"Your most frequent subscription setting is 'weekly' if you are receiving " +"this email more than once a week please report this issue to the forum " +"administrator." +msgstr "" +"Ð’Ñ‹ выбрали получать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ новоÑÑ‚ÑÑ… в избранных вопроÑах один раз в " +"неделю. ЕÑли Ð’Ñ‹ получаете от Ð½Ð°Ñ Ð±Ð¾Ð»ÐµÐµ одного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² неделю то " +"пожалуйÑта дайте об Ñтом знать админиÑтратору форума." + +#: forum/management/commands/send_email_alerts.py:372 +msgid "" +"There is a chance that you may be receiving links seen before - due to a " +"technicality that will eventually go away. " +msgstr "" +"Ðе иÑключено что здеÑÑŒ еÑÑ‚ÑŒ ÑÑылки которые Ð’Ñ‹ раньше видели. Это результат " +"техничеÑкой детали, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñо временем переÑтанет ÑÐµÐ±Ñ Ð¿Ñ€Ð¾ÑвлÑÑ‚ÑŒ." + +#: forum/management/commands/send_email_alerts.py:387 +#, python-format +msgid "" +"go to %(link)s to change frequency of email updates or %(email)s " +"administrator" +msgstr "" +"ЗдеÑÑŒ Ð’Ñ‹ можете изменить чаÑтоту раÑÑылки. ЕÑли " +"возникнет необходимоÑÑ‚ÑŒ - пожалуйÑта ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором форума по %" +"(email)s." + +#: forum/migrations/0005_install_badges.py:10 +msgid "Disciplined" +msgstr "ДиÑциплина" + +#: forum/migrations/0005_install_badges.py:10 +msgid "disciplined" +msgstr "диÑциплина" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Deleted own post with score of 3 or higher" +msgstr "Удалили Ñвоё Ñообщение Ñ 3-Ð¼Ñ Ð¸Ð»Ð¸ более положительными откликами" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Peer Pressure" +msgstr "Коллегиальное давление" + +#: forum/migrations/0005_install_badges.py:11 +msgid "peer-pressure" +msgstr "коллегиальное-давление" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Deleted own post with score of -3 or lower" +msgstr "Удалили Ñвоё Ñообщение Ñ 3-Ð¼Ñ Ð¸Ð»Ð¸ более негативными откликами" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Nice answer" +msgstr "Хороший ответ" + +#: forum/migrations/0005_install_badges.py:12 +msgid "nice-answer" +msgstr "хороший-ответ" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Answer voted up 10 times" +msgstr "Ответ получил 10 положительных откликов" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Nice Question" +msgstr "Хороший ВопроÑ" + +#: forum/migrations/0005_install_badges.py:13 +msgid "nice-question" +msgstr "хороший-вопоÑ" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Question voted up 10 times" +msgstr "Ð’Ð¾Ð¿Ñ€Ð¾Ñ Ñ 10-ÑŽ или более положительными откликами" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Pundit" +msgstr "Знаток" + +#: forum/migrations/0005_install_badges.py:14 +msgid "pundit" +msgstr "знаток" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Left 10 comments with score of 10 or more" +msgstr "ПомеÑтили 10 ответов Ñ 10-ÑŽ или более положительными откликами" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Popular Question" +msgstr "ПопулÑрный ВопроÑ" + +#: forum/migrations/0005_install_badges.py:15 +msgid "popular-question" +msgstr "популÑрный-вопроÑ" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Asked a question with 1,000 views" +msgstr "Задали Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ñ Ð±Ð¾Ð»ÐµÐµ 1,000 проÑмотров" + +#: forum/migrations/0005_install_badges.py:16 +msgid "Citizen patrol" +msgstr "ГражданÑкий Дозор" + +#: forum/migrations/0005_install_badges.py:16 +msgid "citizen-patrol" +msgstr "гражданÑкий-дозор" + +#: forum/migrations/0005_install_badges.py:16 +msgid "First flagged post" +msgstr "Впервые отметили флажком неумеÑтное Ñообщение" + +#: forum/migrations/0005_install_badges.py:17 +msgid "Cleanup" +msgstr "Уборщик" + +#: forum/migrations/0005_install_badges.py:17 +msgid "cleanup" +msgstr "уборщик" + +#: forum/migrations/0005_install_badges.py:17 +msgid "First rollback" +msgstr "Ð’ первый раз вернули Ñообщение к предыдущей верÑии" + +#: forum/migrations/0005_install_badges.py:18 +msgid "Critic" +msgstr "Критик" + +#: forum/migrations/0005_install_badges.py:18 +msgid "critic" +msgstr "критик" + +#: forum/migrations/0005_install_badges.py:18 +msgid "First down vote" +msgstr "Впервые дали негативный отклик" + +#: forum/migrations/0005_install_badges.py:19 +msgid "Editor" +msgstr "Редактор" + +#: forum/migrations/0005_install_badges.py:19 +msgid "editor" +msgstr "редактор" + +#: forum/migrations/0005_install_badges.py:19 +msgid "First edit" +msgstr "Впервые иÑправили Ñообщение" + +#: forum/migrations/0005_install_badges.py:20 +msgid "Organizer" +msgstr "Организатор" + +#: forum/migrations/0005_install_badges.py:20 +msgid "organizer" +msgstr "организатор" + +#: forum/migrations/0005_install_badges.py:20 +msgid "First retag" +msgstr "Впервые изменили тематичеÑкие отметки" + +#: forum/migrations/0005_install_badges.py:21 +msgid "Scholar" +msgstr "Ученый" + +#: forum/migrations/0005_install_badges.py:21 +msgid "scholar" +msgstr "ученый" + +#: forum/migrations/0005_install_badges.py:21 +msgid "First accepted answer on your own question" +msgstr "Впервые принÑли лучший ответ на ÑобÑтвенный вопроÑ" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Student" +msgstr "Ученик" + +#: forum/migrations/0005_install_badges.py:22 +msgid "student" +msgstr "ученик" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Asked first question with at least one up vote" +msgstr "СпроÑили Ð²Ð¾Ð¿Ð¾Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ð²ÑˆÐ¸Ð¹ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один положительный отклик" + +#: forum/migrations/0005_install_badges.py:23 +msgid "Supporter" +msgstr "Фанат" + +#: forum/migrations/0005_install_badges.py:23 +msgid "supporter" +msgstr "фанат" + +#: forum/migrations/0005_install_badges.py:23 +msgid "First up vote" +msgstr "Ð’ первый раз дали положительный отклик другому поьзователю" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Teacher" +msgstr "Учитель" + +#: forum/migrations/0005_install_badges.py:24 +msgid "teacher" +msgstr "учитель" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Answered first question with at least one up vote" +msgstr "Дали ответ получивший один или более положительных отликов" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Autobiographer" +msgstr "Ðвтобиограф" + +#: forum/migrations/0005_install_badges.py:25 +msgid "autobiographer" +msgstr "автобиограф" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Completed all user profile fields" +msgstr "Заполнили вÑе запиÑи на личной Ñтраничке" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Self-Learner" +msgstr "Самоучка" + +#: forum/migrations/0005_install_badges.py:26 +msgid "self-learner" +msgstr "Ñамоучка" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Answered your own question with at least 3 up votes" +msgstr "" +"ПомеÑтили ответ на ÑобÑтвенный Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¸ получили 3 или более положительных " +"откликов" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Great Answer" +msgstr "Замечательный Ответ" + +#: forum/migrations/0005_install_badges.py:27 +msgid "great-answer" +msgstr "замечательный-ответ" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Answer voted up 100 times" +msgstr "Дали ответ получивший 100 положительных откликов" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Great Question" +msgstr "Замечательный ВопроÑ" + +#: forum/migrations/0005_install_badges.py:28 +msgid "great-question" +msgstr "замечательный-вопроÑ" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Question voted up 100 times" +msgstr "Задали Ð²Ð¾Ð¿Ñ€Ð¾Ñ 100 положительных откликов" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Stellar Question" +msgstr "Гениальный ВопроÑ" + +#: forum/migrations/0005_install_badges.py:29 +msgid "stellar-question" +msgstr "гениальный-вопроÑ" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Question favorited by 100 users" +msgstr "Задали Ð²Ð¾Ñ€Ð¿Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÑ‡ÐµÐ½Ð½Ñ‹Ð¹ закладкой более чем 100 пользователÑми" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Famous question" +msgstr "Знаменитый ВопроÑ" + +#: forum/migrations/0005_install_badges.py:30 +msgid "famous-question" +msgstr "знаменитый-вопроÑ" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Asked a question with 10,000 views" +msgstr "Задали Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¿Ñ€Ð¾Ñомотренный более чем 10,000 раз" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Alpha" +msgstr "Ðльфа ТеÑтер" + +#: forum/migrations/0005_install_badges.py:31 +msgid "alpha" +msgstr "альфа-теÑтер" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Actively participated in the private alpha" +msgstr "Принимали учаÑтие в альфа теÑтировании" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Good Answer" +msgstr "Очень Хороший Ответ" + +#: forum/migrations/0005_install_badges.py:32 +msgid "good-answer" +msgstr "очень-хороший-ответ" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Answer voted up 25 times" +msgstr "Дали ответ получивший 25 положительных откликов" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Good Question" +msgstr "Очень Хороший ВопроÑ" + +#: forum/migrations/0005_install_badges.py:33 +msgid "good-question" +msgstr "очень-хороший-вопроÑ" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Question voted up 25 times" +msgstr "Задали Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ð²ÑˆÐ¸Ð¹ 25 положительных откликов" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Favorite Question" +msgstr "ИнтереÑный ВопроÑ" + +#: forum/migrations/0005_install_badges.py:34 +msgid "favorite-question" +msgstr "интереÑный-вопроÑ" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Question favorited by 25 users" +msgstr "Задали Ð²Ð¾Ñ€Ð¿Ð¾Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ð²ÑˆÐ¸Ð¹ 25 закладок" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Civic duty" +msgstr "ОбщеÑтвенный Долг" + +#: forum/migrations/0005_install_badges.py:35 +msgid "civic-duty" +msgstr "общеÑтвенный долг" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Voted 300 times" +msgstr "Дали 300 откликов" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Strunk & White" +msgstr "Главный Редактор" + +#: forum/migrations/0005_install_badges.py:36 +msgid "strunk-and-white" +msgstr "маÑтер-ÑтараниÑ" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Edited 100 entries" +msgstr "главный-редактор" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Generalist" +msgstr "Полиглот" + +#: forum/migrations/0005_install_badges.py:37 +msgid "generalist" +msgstr "полиглот" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Active in many different tags" +msgstr "ÐктивноÑÑ‚ÑŒ в разнообразных темах" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Expert" +msgstr "ЭкÑперт" + +#: forum/migrations/0005_install_badges.py:38 +msgid "expert" +msgstr "ÑкÑперт" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Very active in one tag" +msgstr "Очень активны в одной теме" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Yearling" +msgstr "Годовщина" + +#: forum/migrations/0005_install_badges.py:39 +msgid "yearling" +msgstr "годовщина" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Active member for a year" +msgstr "Ðктивный пользователь в течение года" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Notable Question" +msgstr "ИзвеÑтные ВопроÑ" + +#: forum/migrations/0005_install_badges.py:40 +msgid "notable-question" +msgstr "заметные-вопроÑ" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Asked a question with 2,500 views" +msgstr "Ð’Ð¾Ð¿Ñ€Ð¾Ñ Ð·Ð°Ð´Ð°Ð½ Ñ 2500 проÑмотров" + +#: forum/migrations/0005_install_badges.py:41 +msgid "Enlightened" +msgstr "ПроÑвещенный" + +#: forum/migrations/0005_install_badges.py:41 +msgid "enlightened" +msgstr "проÑвещенный" + +#: forum/migrations/0005_install_badges.py:41 +msgid "First answer was accepted with at least 10 up votes" +msgstr "Первый ответ был принÑÑ‚, по крайней мере до 10 голоÑов" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Beta" +msgstr "Бета" + +#: forum/migrations/0005_install_badges.py:42 +msgid "beta" +msgstr "бета" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Actively participated in the private beta" +msgstr "Ðктивно учаÑтвовал в закрытой бета-верÑии" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Guru" +msgstr "Гуру" + +#: forum/migrations/0005_install_badges.py:43 +msgid "guru" +msgstr "гуру" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Accepted answer and voted up 40 times" +msgstr "ПринÑÑ‚ ответ и проголоÑовали 40 раз" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Necromancer" +msgstr "Ðекромант" + +#: forum/migrations/0005_install_badges.py:44 +msgid "necromancer" +msgstr "некромант" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Answered a question more than 60 days later with at least 5 votes" +msgstr "Ответ на Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð±Ð¾Ð»ÐµÐµ чем 60 дней ÑпуÑÑ‚Ñ Ñ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ 5 голоÑами" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Taxonomist" +msgstr "ТакÑономиÑÑ‚" + +#: forum/migrations/0005_install_badges.py:45 +msgid "taxonomist" +msgstr "такÑономиÑÑ‚" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Created a tag used by 50 questions" +msgstr "Создал тег, иÑпользованный в 50 вопроÑах" + +#: forum/models/question.py:502 +#, python-format +msgid "%(author)s modified the question" +msgstr "%(author)s отредактировали вопроÑ" + +#: forum/models/question.py:506 +#, python-format +msgid "%(people)s posted %(new_answer_count)s new answers" +msgstr "%(people)s задали новых %(new_answer_count)s вопроÑов" + +#: forum/models/question.py:511 +#, python-format +msgid "%(people)s commented the question" +msgstr "%(people)s оÑтавили комментарии" + +#: forum/models/question.py:516 +#, python-format +msgid "%(people)s commented answers" +msgstr "%(people)s комментировали вопроÑÑ‹" + +#: forum/models/question.py:518 +#, python-format +msgid "%(people)s commented an answer" +msgstr "%(people)s комментировали ответы" + +#: forum/models/repute.py:13 forum/skins/default/templates/badges.html:54 +msgid "gold" +msgstr "золотаÑ" + +#: forum/models/repute.py:14 forum/skins/default/templates/badges.html:62 +msgid "silver" +msgstr "ÑеребрÑнаÑ" + +#: forum/models/repute.py:15 forum/skins/default/templates/badges.html:69 +msgid "bronze" +msgstr "бронзоваÑ" + +#: forum/models/tag.py:81 +msgid "interesting" +msgstr "интереÑные" + +#: forum/models/tag.py:81 +msgid "ignored" +msgstr "игнорируемые" + +#: forum/models/user.py:37 +msgid "Entire forum" +msgstr "ВеÑÑŒ форум" + +#: forum/models/user.py:38 +msgid "Questions that I asked" +msgstr "ВопроÑÑ‹ заданные мной" + +#: forum/models/user.py:39 +msgid "Questions that I answered" +msgstr "ВопроÑÑ‹ отвеченные мной" + +#: forum/models/user.py:40 +msgid "Individually selected questions" +msgstr "Индивидуально избранные вопроÑÑ‹" + +#: forum/models/user.py:43 +msgid "Weekly" +msgstr "Раз в неделю" + +#: forum/models/user.py:44 +msgid "Daily" +msgstr "Раз в день" + +#: forum/models/user.py:45 +msgid "No email" +msgstr "Отменить" + +#: forum/skins/default/templates/404.html:24 +msgid "Sorry, could not find the page you requested." +msgstr "Извините, но запрошенный Вами документ не был найден." + +#: forum/skins/default/templates/404.html:26 +msgid "This might have happened for the following reasons:" +msgstr "Это могло произойти по Ñледующим причинам:" + +#: forum/skins/default/templates/404.html:28 +msgid "this question or answer has been deleted;" +msgstr "Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¸Ð»Ð¸ ответ были удалены;" + +#: forum/skins/default/templates/404.html:29 +msgid "url has error - please check it;" +msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» неверен - пожалуйÑта проверьте;" + +#: forum/skins/default/templates/404.html:30 +msgid "" +"the page you tried to visit is protected or you don't have sufficient " +"points, see" +msgstr "" +"документ который Ð’Ñ‹ запроÑили защищён или у Ð’Ð°Ñ Ð½Ðµ хватает \"репутации\", " +"пожалуйÑта поÑмотрите" + +#: forum/skins/default/templates/404.html:31 +msgid "if you believe this error 404 should not have occured, please" +msgstr "еÑли Ð’Ñ‹ Ñчитаете что Ñта ошибка показана неверно, пожалуйÑта" + +#: forum/skins/default/templates/404.html:32 +msgid "report this problem" +msgstr "Ñообщите об Ñтой проблеме" + +#: forum/skins/default/templates/404.html:41 +#: forum/skins/default/templates/500.html:27 +msgid "back to previous page" +msgstr "вернутьÑÑ Ð½Ð° предыдущую Ñтраницу" + +#: forum/skins/default/templates/404.html:42 +#: forum/skins/default/templates/questions.html:52 +msgid "see all questions" +msgstr "Ñмотреть вÑе вопроÑÑ‹" + +#: forum/skins/default/templates/404.html:43 +msgid "see all tags" +msgstr "Ñмотреть вÑе темы" + +#: forum/skins/default/templates/500.html:22 +msgid "sorry, system error" +msgstr "извините, произошла Ñбой в ÑиÑтеме" + +#: forum/skins/default/templates/500.html:24 +msgid "system error log is recorded, error will be fixed as soon as possible" +msgstr "" +"об Ñтой ошибке была Ñделана запиÑÑŒ в журнале и ÑоответÑтвующие иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ " +"будут вÑкоре Ñделаны" + +#: forum/skins/default/templates/500.html:25 +msgid "please report the error to the site administrators if you wish" +msgstr "" +"еÑли у Ð’Ð°Ñ Ð¸Ð¼ÐµÐµÑ‚ÑÑ Ð¶ÐµÐ»Ð°Ð½Ð¸Ðµ, пожалуйÑта Ñообщите об Ñтой ошибке вебмаÑтеру" + +#: forum/skins/default/templates/500.html:28 +msgid "see latest questions" +msgstr "Ñмотреть Ñамые новые вопроÑÑ‹" + +#: forum/skins/default/templates/500.html:29 +msgid "see tags" +msgstr "Ñмотреть темы" + +#: forum/skins/default/templates/about.html:6 +#: forum/skins/default/templates/about.html:11 +msgid "About" +msgstr "О наÑ" + +#: forum/skins/default/templates/account_settings.html:4 +#: forum/skins/default/templates/authopenid/settings.html:4 +msgid "Account functions" +msgstr "ÐаÑтройки аккаунта" + +#: forum/skins/default/templates/account_settings.html:29 +#: forum/skins/default/templates/authopenid/changepw.html:5 +#: forum/skins/default/templates/authopenid/changepw.html:14 +#: forum/skins/default/templates/authopenid/settings.html:29 +#: livesettings/templates/livesettings/group_settings.html:11 +#: livesettings/templates/livesettings/site_settings.html:23 +msgid "Change password" +msgstr "Сменить пароль" + +#: forum/skins/default/templates/account_settings.html:30 +#: forum/skins/default/templates/authopenid/settings.html:30 +msgid "Give your account a new password." +msgstr "Дайте вашей учетной запиÑи новый пароль." + +#: forum/skins/default/templates/account_settings.html:32 +#: forum/skins/default/templates/authopenid/settings.html:31 +msgid "Change email " +msgstr "Изменить Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" + +#: forum/skins/default/templates/account_settings.html:33 +#: forum/skins/default/templates/authopenid/settings.html:32 +msgid "Add or update the email address associated with your account." +msgstr "" +"Добавить или обновить Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, ÑвÑзанный Ñ Ð²Ð°ÑˆÐ¸Ð¼ аккаунтом." + +#: forum/skins/default/templates/account_settings.html:35 +#: forum/skins/default/templates/authopenid/changeopenid.html:4 +#: forum/skins/default/templates/authopenid/changeopenid.html:30 +#: forum/skins/default/templates/authopenid/settings.html:34 +msgid "Change OpenID" +msgstr "Изменить OpenID" + +#: forum/skins/default/templates/account_settings.html:36 +#: forum/skins/default/templates/authopenid/settings.html:35 +msgid "Change openid associated to your account" +msgstr "Изменить OpenID ÑвÑзанный Ñ Ð²Ð°ÑˆÐ¸Ð¼ аккаунтом" + +#: forum/skins/default/templates/account_settings.html:39 +#: forum/skins/default/templates/authopenid/delete.html:4 +#: forum/skins/default/templates/authopenid/settings.html:38 +msgid "Delete account" +msgstr "Удалить аккаунт" + +#: forum/skins/default/templates/account_settings.html:40 +#: forum/skins/default/templates/authopenid/settings.html:39 +msgid "Erase your username and all your data from website" +msgstr "Удалить Ваше Ð¸Ð¼Ñ Ð¸ вÑе данные о Ð’Ð°Ñ Ð½Ð° Ñайте" + +#: forum/skins/default/templates/answer_edit.html:5 +#: forum/skins/default/templates/answer_edit.html:48 +msgid "Edit answer" +msgstr "Править ответ" + +#: forum/skins/default/templates/answer_edit.html:25 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:26 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:48 +#: forum/skins/default/templates/question.html:51 +#: forum/skins/default/templates/question_edit.html:25 +#: forum/skins/default/templates/question_edit.html:28 +msgid "hide preview" +msgstr "убрать предварительный проÑмотр" + +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:51 +#: forum/skins/default/templates/question_edit.html:28 +msgid "show preview" +msgstr "показать предварительный проÑмотр" + +#: forum/skins/default/templates/answer_edit.html:48 +#: forum/skins/default/templates/question_edit.html:66 +#: forum/skins/default/templates/question_retag.html:53 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "back" +msgstr "назад" + +#: forum/skins/default/templates/answer_edit.html:53 +#: forum/skins/default/templates/question_edit.html:71 +#: forum/skins/default/templates/revisions_answer.html:52 +#: forum/skins/default/templates/revisions_question.html:52 +msgid "revision" +msgstr "верÑÐ¸Ñ Ð¿Ñ€Ð°Ð²ÐºÐ¸" + +#: forum/skins/default/templates/answer_edit.html:56 +#: forum/skins/default/templates/question_edit.html:75 +msgid "select revision" +msgstr "выбрать верÑию" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:420 +#: forum/skins/default/templates/question_edit.html:92 +msgid "Toggle the real time Markdown editor preview" +msgstr "Включить/выключить предварительный проÑмотр текÑта" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:421 +#: forum/skins/default/templates/question_edit.html:92 +msgid "toggle preview" +msgstr "включить/выключить предварительный проÑмотр" + +#: forum/skins/default/templates/answer_edit.html:72 +#: forum/skins/default/templates/question_edit.html:118 +#: forum/skins/default/templates/question_retag.html:74 +msgid "Save edit" +msgstr "Сохранить" + +#: forum/skins/default/templates/answer_edit.html:73 +#: forum/skins/default/templates/close.html:29 +#: forum/skins/default/templates/feedback.html:50 +#: forum/skins/default/templates/question_edit.html:119 +#: forum/skins/default/templates/question_retag.html:75 +#: forum/skins/default/templates/reopen.html:30 +#: forum/skins/default/templates/user_edit.html:90 +#: forum/skins/default/templates/authopenid/changeemail.html:40 +msgid "Cancel" +msgstr "Отменить" + +#: forum/skins/default/templates/answer_edit_tips.html:4 +msgid "answer tips" +msgstr "Советы как лучше давать ответы" + +#: forum/skins/default/templates/answer_edit_tips.html:7 +msgid "please make your answer relevant to this community" +msgstr "" +"пожалуйÑта поÑтарайтеÑÑŒ дать ответ который будет интереÑен коллегам по форуму" + +#: forum/skins/default/templates/answer_edit_tips.html:10 +msgid "try to give an answer, rather than engage into a discussion" +msgstr "поÑтарайтеÑÑŒ на Ñамом деле дать ответ и избегать диÑкуÑÑий" + +#: forum/skins/default/templates/answer_edit_tips.html:13 +msgid "please try to provide details" +msgstr "включите детали в Ваш ответ" + +#: forum/skins/default/templates/answer_edit_tips.html:16 +#: forum/skins/default/templates/question_edit_tips.html:13 +msgid "be clear and concise" +msgstr "поÑтарайтеÑÑŒ выражатьÑÑ ÑÑно и кратко" + +#: forum/skins/default/templates/answer_edit_tips.html:20 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "see frequently asked questions" +msgstr "поÑмотрите на чаÑто задаваемые вопроÑÑ‹" + +#: forum/skins/default/templates/answer_edit_tips.html:26 +#: forum/skins/default/templates/question_edit_tips.html:23 +msgid "Markdown tips" +msgstr "Советы по иÑпользованию Markdown" + +#: forum/skins/default/templates/answer_edit_tips.html:29 +#: forum/skins/default/templates/question_edit_tips.html:26 +msgid "*italic* or __italic__" +msgstr "*курÑив* или _курÑив_" + +#: forum/skins/default/templates/answer_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:29 +msgid "**bold** or __bold__" +msgstr "**жирный шрифт** или __жирный шрифт__" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/question_edit_tips.html:32 +msgid "link" +msgstr "ÑÑылка" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "text" +msgstr "текÑÑ‚" + +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "image" +msgstr "изображение" + +#: forum/skins/default/templates/answer_edit_tips.html:43 +#: forum/skins/default/templates/question_edit_tips.html:41 +msgid "numbered list:" +msgstr "пронумерованный ÑпиÑок:" + +#: forum/skins/default/templates/answer_edit_tips.html:48 +#: forum/skins/default/templates/question_edit_tips.html:46 +msgid "basic HTML tags are also supported" +msgstr "а также, поддерживаютÑÑ Ð¾Ñновные теги HTML" + +#: forum/skins/default/templates/answer_edit_tips.html:52 +#: forum/skins/default/templates/question_edit_tips.html:50 +msgid "learn more about Markdown" +msgstr "узнайте болше про Markdown" + +#: forum/skins/default/templates/ask.html:5 +#: forum/skins/default/templates/ask.html:62 +msgid "Ask a question" +msgstr "СпроÑить" + +#: forum/skins/default/templates/ask.html:69 +#: forum/skins/default/templates/ask_form.html:11 +msgid "login to post question info" +msgstr "" +"ПожалуйÑта, начните задавать Ваш Ð²Ð¾Ñ€Ð¿Ð¾Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾. Когда Ð’Ñ‹ пошлете вопроÑ, Ð’Ñ‹ будете направлены на Ñтраницу " +"авторизации. Ваш Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð±ÑƒÐ´ÐµÑ‚ Ñохранён в текущей ÑеÑÑии и будет опубликован " +"как только Ð’Ñ‹ авторизуетеÑÑŒ. Войти или запиÑатьÑÑ Ð½Ð° наш форум очень легко. " +"ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¹Ð¼ÐµÑ‚ не более полминуты а Ð¸Ð·Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ - приблизительно " +"одну минуту." + +#: forum/skins/default/templates/ask.html:75 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Похоже на то что Ð°Ð´Ñ€ÐµÑ Ð’Ð°ÑˆÐµÐ¹ Ñлектронной почты, %" +"(email)s еще не был проверен. Чтобы публиковать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° форуме " +"Ñначала пожалуйÑта продемонÑтрируйте что Ваша ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° работает, " +"Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± етом здеÑÑŒ.
Ваш Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð±ÑƒÐ´ÐµÑ‚ опубликован Ñразу поÑле того как ваш " +"Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ´ÐµÑ‚ проверен, а до тех пор Ð²Ð¾Ð¿Ð¾Ñ Ð±ÑƒÐ´ÐµÑ‚ Ñохранён в базе данных." + +#: forum/skins/default/templates/ask.html:113 +#: forum/skins/default/templates/ask_form.html:54 +msgid "(required)" +msgstr "(обÑзательно)" + +#: forum/skins/default/templates/ask.html:120 +#: forum/skins/default/templates/ask_form.html:61 +msgid "Login/signup to post your question" +msgstr "Войдите или запишитеÑÑŒ чтобы опубликовать Ваш ворпоÑ" + +#: forum/skins/default/templates/ask.html:122 +#: forum/skins/default/templates/ask_form.html:63 +msgid "Ask your question" +msgstr "Задайте Ваш вопроÑ" + +#: forum/skins/default/templates/ask_form.html:15 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ %(email)s должен быть дейÑтвительным, Ñм. %" +"(email_validation_faq_url)s" + +#: forum/skins/default/templates/badge.html:6 +#: forum/skins/default/templates/badge.html:17 +msgid "Badge" +msgstr "Ðаграда" + +#: forum/skins/default/templates/badge.html:26 +msgid "user received this badge:" +msgid_plural "users received this badge:" +msgstr[0] "пользователь, получивший Ñтот значок" +msgstr[1] "пользователÑ, получивших Ñтот значок" +msgstr[2] "пользователей, получивших Ñтот значок" + +#: forum/skins/default/templates/badges.html:6 +msgid "Badges summary" +msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ знаках Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ (наградах)" + +#: forum/skins/default/templates/badges.html:17 +msgid "Badges" +msgstr "Значки" + +#: forum/skins/default/templates/badges.html:21 +msgid "Community gives you awards for your questions, answers and votes." +msgstr "Ðаграды" + +#: forum/skins/default/templates/badges.html:22 +#, python-format +msgid "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +" " +msgstr "" +"Ðиже приведен ÑпиÑок доÑтупных значков и чиÑло награждений каждым из них. " +"Дайте обратную ÑвÑзь на %(feedback_faq_url)s." + +#: forum/skins/default/templates/badges.html:51 +msgid "Community badges" +msgstr "Значки Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ ÑообщеÑтва" + +#: forum/skins/default/templates/badges.html:57 +msgid "gold badge description" +msgstr "золотой значок" + +#: forum/skins/default/templates/badges.html:65 +msgid "silver badge description" +msgstr "ÑеребрÑный значок" + +#: forum/skins/default/templates/badges.html:68 +msgid "bronze badge: often given as a special honor" +msgstr "бронзовый значок: чаÑто делаютÑÑ Ñ Ð¾Ñобым почетом" + +#: forum/skins/default/templates/badges.html:72 +msgid "bronze badge description" +msgstr "бронзовый значок" + +#: forum/skins/default/templates/book.html:7 +msgid "reading channel" +msgstr "чтение каналов" + +#: forum/skins/default/templates/book.html:26 +msgid "[author]" +msgstr "[автор]" + +#: forum/skins/default/templates/book.html:30 +msgid "[publisher]" +msgstr "[издатель]" + +#: forum/skins/default/templates/book.html:34 +msgid "[publication date]" +msgstr "[дата публикации]" + +#: forum/skins/default/templates/book.html:38 +msgid "[price]" +msgstr "[Цена]" + +#: forum/skins/default/templates/book.html:39 +msgid "currency unit" +msgstr "Ð²Ð°Ð»ÑŽÑ‚Ð½Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°" + +#: forum/skins/default/templates/book.html:42 +msgid "[pages]" +msgstr "[Ñтраницы]" + +#: forum/skins/default/templates/book.html:43 +msgid "pages abbreviation" +msgstr "Ñокращение Ñтраниц" + +#: forum/skins/default/templates/book.html:46 +msgid "[tags]" +msgstr "[теги]" + +#: forum/skins/default/templates/book.html:56 +msgid "author blog" +msgstr "блога автора" + +#: forum/skins/default/templates/book.html:62 +msgid "book directory" +msgstr "каталог книг" + +#: forum/skins/default/templates/book.html:66 +msgid "buy online" +msgstr "купить онлайн" + +#: forum/skins/default/templates/book.html:79 +msgid "reader questions" +msgstr "вопроÑÑ‹ читателей" + +#: forum/skins/default/templates/book.html:82 +msgid "ask the author" +msgstr "ÑпроÑить автора" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:18 +msgid "this question was selected as favorite" +msgstr "к Ñтому вопроÑу был отмечен как интереÑный" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:18 +msgid "number of times" +msgstr "раз" + +#: forum/skins/default/templates/book.html:105 +#: forum/skins/default/templates/question_summary_list_roll.html:14 +msgid "votes" +msgstr "голоÑов" + +#: forum/skins/default/templates/book.html:108 +msgid "the answer has been accepted to be correct" +msgstr "ответ был принÑÑ‚, в качеÑтве правильного" + +#: forum/skins/default/templates/book.html:115 +#: forum/skins/default/templates/question_summary_list_roll.html:15 +msgid "views" +msgstr "проÑмотров" + +#: forum/skins/default/templates/book.html:125 +#: forum/skins/default/templates/question.html:138 +#: forum/skins/default/templates/question_list.html:19 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/tags.html:50 +#: forum/skins/default/templates/users_questions.html:34 +#, python-format +msgid "see questions tagged '%(tag)s'" +msgstr "вопроÑÑ‹ по теме '%(tag)s'" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to book RSS feed" +msgstr "подпиÑатьÑÑ Ð½Ð° RSS-канал Ð´Ð»Ñ ÐºÐ½Ð¸Ð³Ð¸" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to the questions feed" +msgstr "подпиÑатьÑÑ Ð½Ð° RSS-канал Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов" + +#: forum/skins/default/templates/close.html:6 +#: forum/skins/default/templates/close.html:16 +msgid "Close question" +msgstr "Закрыть вопроÑ" + +#: forum/skins/default/templates/close.html:19 +msgid "Close the question" +msgstr "Закрыть вопроÑ" + +#: forum/skins/default/templates/close.html:25 +msgid "Reasons" +msgstr "Причины" + +#: forum/skins/default/templates/close.html:28 +msgid "OK to close" +msgstr "OK, чтобы закрыть" + +#: forum/skins/default/templates/email_base.html:11 +msgid "home" +msgstr "главнаÑ" + +#: forum/skins/default/templates/faq.html:11 +msgid "Frequently Asked Questions " +msgstr "ЧаÑто задаваемые вопроÑÑ‹" + +#: forum/skins/default/templates/faq.html:16 +msgid "What kinds of questions can I ask here?" +msgstr "Какие вопроÑÑ‹ Ñ Ð¼Ð¾Ð³Ñƒ задать здеÑÑŒ?" + +#: forum/skins/default/templates/faq.html:17 +msgid "" +"Most importanly - questions should be relevant to this " +"community." +msgstr "" +"Самое главное - вопроÑÑ‹ должны ÑоответÑтвовать теме Ñайта." + +#: forum/skins/default/templates/faq.html:18 +msgid "" +"Before asking the question - please make sure to use search to see whether " +"your question has alredy been answered." +msgstr "" +"Перед тем как задать Ð²Ð¾Ð¿Ñ€Ð¾Ñ - пожалуйÑта, не забудьте иÑпользовать поиÑк, " +"чтобы убедитьÑÑ, что ваш Ð²Ð¾Ð¿Ñ€Ð¾Ñ ÐµÑ‰Ðµ не имеет ответа." + +#: forum/skins/default/templates/faq.html:21 +msgid "What questions should I avoid asking?" +msgstr "Каких вопроÑов мне Ñледует избегать?" + +#: forum/skins/default/templates/faq.html:22 +msgid "" +"Please avoid asking questions that are not relevant to this community, too " +"subjective and argumentative." +msgstr "" +"ПроÑьба не задавать вопроÑÑ‹, которые не ÑоответÑтвуют теме Ñтого Ñайта, " +"Ñлишком Ñубъективные и очевидные." + +#: forum/skins/default/templates/faq.html:27 +msgid "What should I avoid in my answers?" +msgstr "Чего Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ избегать в Ñвоих ответах?" + +#: forum/skins/default/templates/faq.html:28 +msgid "" +"is a Q&A site, not a discussion group. Therefore - please avoid having " +"discussions in your answers, comment facility allows some space for brief " +"discussions." +msgstr "" +"ÑвлÑетÑÑ Ð¼ÐµÑтом ответов/вопроÑов, а не группой обÑуждениÑ. ПоÑтому - " +"пожалуйÑта, избегайте обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð² Ñвоих ответах. Комментарии позволÑÑŽÑ‚ лишь " +"краткое обÑуждение." + +#: forum/skins/default/templates/faq.html:32 +msgid "Who moderates this community?" +msgstr "Кто модерирует Ñтим ÑообщеÑтвом?" + +#: forum/skins/default/templates/faq.html:33 +msgid "The short answer is: you." +msgstr "Короткий ответ: вы." + +#: forum/skins/default/templates/faq.html:34 +msgid "This website is moderated by the users." +msgstr "Этот Ñайт находитÑÑ Ð¿Ð¾Ð´ управлением Ñамих пользователей." + +#: forum/skins/default/templates/faq.html:35 +msgid "" +"The reputation system allows users earn the authorization to perform a " +"variety of moderation tasks." +msgstr "" +"СиÑтема репутации позволÑет пользователÑм приобретать различные " +"управленчеÑкие права." + +#: forum/skins/default/templates/faq.html:40 +msgid "How does reputation system work?" +msgstr "Как работает карма?" + +#: forum/skins/default/templates/faq.html:41 +msgid "Rep system summary" +msgstr "Суть кармы" + +#: forum/skins/default/templates/faq.html:42 +msgid "" +"For example, if you ask an interesting question or give a helpful answer, " +"your input will be upvoted. On the other hand if the answer is misleading - " +"it will be downvoted. Each vote in favor will generate 10 " +"points, each vote against will subtract 2 points. There is " +"a limit of 200 points that can be accumulated per question " +"or answer. The table below explains reputation point requirements for each " +"type of moderation task." +msgstr "" +"Ðапример, еÑли задать интереÑующий Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¸Ð»Ð¸ дать полный ответ, ваш вклад " +"будет оценен положительно. С другой Ñтороны, еÑли ответ будет вводить в " +"заблуждение - Ñто будет оценено отрицательно. Каждый Ð³Ð¾Ð»Ð¾Ñ Ð² пользу будет " +"генерировать 10 пунктов кармы, каждый Ð³Ð¾Ð»Ð¾Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð² - будет " +"отнимать 2 балла кармы. СущеÑтвует лимит на 200 " +"пунктов кармы, которые могут быть накоплены на каждый Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¸Ð»Ð¸ " +"ответ. Ð’ таблице ниже предÑтавлены вÑе Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº карме Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ типа " +"задачи модерации." + +#: forum/skins/default/templates/faq.html:53 +#: forum/skins/default/templates/user_votes.html:15 +msgid "upvote" +msgstr "проголоÑовать \"за\"" + +#: forum/skins/default/templates/faq.html:57 +msgid "use tags" +msgstr "иÑпользовать теги" + +#: forum/skins/default/templates/faq.html:62 +msgid "add comments" +msgstr "добавить комментарии" + +#: forum/skins/default/templates/faq.html:66 +#: forum/skins/default/templates/user_votes.html:17 +msgid "downvote" +msgstr "проголоÑовать \"против\"" + +#: forum/skins/default/templates/faq.html:69 +msgid "open and close own questions" +msgstr "открывать и закрывать Ñвои вопроÑÑ‹" + +#: forum/skins/default/templates/faq.html:73 +msgid "retag questions" +msgstr "изменÑÑ‚ÑŒ ÑоÑтав Ñ‚Ñгов в вопроÑах" + +#: forum/skins/default/templates/faq.html:78 +msgid "edit community wiki questions" +msgstr "редактировать вопроÑÑ‹ в вики ÑообщеÑтва " + +#: forum/skins/default/templates/faq.html:83 +msgid "edit any answer" +msgstr "редактировать любой ответ" + +#: forum/skins/default/templates/faq.html:87 +msgid "open any closed question" +msgstr "открыть любой закрытый вопроÑ" + +#: forum/skins/default/templates/faq.html:91 +msgid "delete any comment" +msgstr "удалÑÑ‚ÑŒ любые комментарии" + +#: forum/skins/default/templates/faq.html:95 +msgid "delete any questions and answers and perform other moderation tasks" +msgstr "удалить любые вопроÑÑ‹ и ответы и выполнÑÑ‚ÑŒ другие задачи модерации" + +#: forum/skins/default/templates/faq.html:103 +msgid "how to validate email title" +msgstr "как проверить заголовок Ñлектронного ÑообщениÑ" + +#: forum/skins/default/templates/faq.html:105 +#, python-format +msgid "" +"how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" +msgstr "" +"как проверить Ñлектронную почту Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ %(send_email_key_url)s %" +"(gravatar_faq_url)s" + +#: forum/skins/default/templates/faq.html:110 +msgid "what is gravatar" +msgstr "что такое Gravatar" + +#: forum/skins/default/templates/faq.html:111 +msgid "gravatar faq info" +msgstr "gravatar фак" + +#: forum/skins/default/templates/faq.html:114 +msgid "To register, do I need to create new password?" +msgstr "Ðеобходимо ли Ñоздавать новый пароль, чтобы зарегиÑтрироватьÑÑ?" + +#: forum/skins/default/templates/faq.html:115 +msgid "" +"No, you don't have to. You can login through any service that supports " +"OpenID, e.g. Google, Yahoo, AOL, etc." +msgstr "" +"Ðет, Ñтого делать нет необходимоÑти. Ð’Ñ‹ можете Войти через любой ÑервиÑ, " +"который поддерживает OpenID, например, Google, Yahoo, AOL и Ñ‚.д." + +#: forum/skins/default/templates/faq.html:116 +msgid "Login now!" +msgstr "Войти ÑейчаÑ!" + +#: forum/skins/default/templates/faq.html:121 +msgid "Why other people can edit my questions/answers?" +msgstr "Почему другие люди могут изменить вопроÑÑ‹ / ответы?" + +#: forum/skins/default/templates/faq.html:122 +msgid "Goal of this site is..." +msgstr "Цель Ñтого Ñайта ..." + +#: forum/skins/default/templates/faq.html:122 +msgid "" +"So questions and answers can be edited like wiki pages by experienced users " +"of this site and this improves the overall quality of the knowledge base " +"content." +msgstr "" +"Таким образом, более опытные пользователи могут редактировать вопроÑÑ‹ и " +"отвеы как Ñтранички на вики, что в Ñвою очередь улучшает качеÑтво ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ " +"базы данных." + +#: forum/skins/default/templates/faq.html:123 +msgid "If this approach is not for you, we respect your choice." +msgstr "ЕÑли Ñтот подход не Ð´Ð»Ñ Ð²Ð°Ñ, мы уважаем ваш выбор." + +#: forum/skins/default/templates/faq.html:127 +msgid "Still have questions?" +msgstr "ОÑталиÑÑŒ вопроÑÑ‹?" + +#: forum/skins/default/templates/faq.html:128 +#, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "" +"Задайте Ñвой Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð² %(ask_question_url)s, помогайте Ñделать наше " +"ÑообщеÑтво лучше!" + +#: forum/skins/default/templates/faq.html:130 +#: forum/skins/default/templates/header.html:27 +msgid "questions" +msgstr "вопроÑÑ‹" + +#: forum/skins/default/templates/faq.html:130 +msgid "." +msgstr "." + +#: forum/skins/default/templates/feedback.html:6 +msgid "Feedback" +msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑвÑзь" + +#: forum/skins/default/templates/feedback.html:11 +msgid "Give us your feedback!" +msgstr "Ð’Ñ‹Ñкажите Ñвое мнение!" + +#: forum/skins/default/templates/feedback.html:17 +#, python-format +msgid "" +"\n" +" Dear %(user_name)s, we look " +"forward to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" +"\n" +"Уважаемый %(user_name)s, мы Ñ Ð½ÐµÑ‚ÐµÑ€Ð¿ÐµÐ½Ð¸ÐµÐ¼ " +"ждем ваших отзывов. \n" +"ПожалуйÑта, укажите и отправьте нам Ñвое Ñообщение ниже." + +#: forum/skins/default/templates/feedback.html:24 +msgid "" +"\n" +" Dear visitor, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" +"\n" +"Уважаемый поÑетитель, мы Ñ Ð½ÐµÑ‚ÐµÑ€Ð¿ÐµÐ½Ð¸ÐµÐ¼ ждем " +"ваших отзывов. ПожалуйÑта, введите и отправить нам Ñвое Ñообщение ниже." + +#: forum/skins/default/templates/feedback.html:41 +msgid "(this field is required)" +msgstr "(Ñто поле обÑзательно)" + +#: forum/skins/default/templates/feedback.html:49 +msgid "Send Feedback" +msgstr "Отправить отзыв" + +#: forum/skins/default/templates/feedback_email.txt:3 +#, python-format +msgid "" +"\n" +"Hello, this is a %(site_title)s forum feedback message\n" +msgstr "" +"\n" +"ЗдравÑтвуйте, Ñто Ñообщение обратной ÑвÑзи Ñ Ñ„Ð¾Ñ€ÑƒÐ¼Ð°: %(site_title)s\n" + +#: forum/skins/default/templates/feedback_email.txt:9 +msgid "Sender is" +msgstr "Отправитель" + +#: forum/skins/default/templates/feedback_email.txt:11 +#: forum/skins/default/templates/feedback_email.txt:14 +msgid "email" +msgstr "email" + +#: forum/skins/default/templates/feedback_email.txt:13 +msgid "anonymous" +msgstr "анонимный" + +#: forum/skins/default/templates/feedback_email.txt:19 +msgid "Message body:" +msgstr "ТекÑÑ‚ ÑообщениÑ:" + +#: forum/skins/default/templates/footer.html:8 +#: forum/skins/default/templates/header.html:14 +msgid "about" +msgstr "о" + +#: forum/skins/default/templates/footer.html:9 +#: forum/skins/default/templates/header.html:15 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "faq" +msgstr "чаÑто задаваемые вопроÑÑ‹" + +#: forum/skins/default/templates/footer.html:10 +msgid "privacy policy" +msgstr "политика конфиденциальноÑти" + +#: forum/skins/default/templates/footer.html:19 +msgid "give feedback" +msgstr "оÑтавить отзыв" + +#: forum/skins/default/templates/header.html:10 +msgid "logout" +msgstr "выход" + +#: forum/skins/default/templates/header.html:12 +msgid "login" +msgstr "Войти" + +#: forum/skins/default/templates/header.html:22 +msgid "back to home page" +msgstr "вернутьÑÑ Ð½Ð° главную Ñтраницу" + +#: forum/skins/default/templates/header.html:29 +msgid "users" +msgstr "люди" + +#: forum/skins/default/templates/header.html:30 +#: forum/templatetags/extra_tags.py:178 forum/templatetags/extra_tags.py:207 +msgid "badges" +msgstr "значки" + +#: forum/skins/default/templates/header.html:31 +msgid "ask a question" +msgstr "задать вопроÑ" + +#: forum/skins/default/templates/input_bar.html:33 +msgid "search" +msgstr "поиÑк" + +#: forum/skins/default/templates/logout.html:6 +#: forum/skins/default/templates/logout.html:16 +msgid "Logout" +msgstr "Выйти" + +#: forum/skins/default/templates/logout.html:19 +msgid "" +"As a registered user you can login with your OpenID, log out of the site or " +"permanently remove your account." +msgstr "" +"Как зарегиÑтрированный пользователь Ð’Ñ‹ можете Войти Ñ OpenID, выйдите из " +"Ñайта или удалить Ñвой аккаунт." + +#: forum/skins/default/templates/logout.html:20 +msgid "Logout now" +msgstr "Выйти ÑейчаÑ" + +#: forum/skins/default/templates/notarobot.html:3 +msgid "Please prove that you are a Human Being" +msgstr "Ð’Ñ‹ Человек?" + +#: forum/skins/default/templates/notarobot.html:10 +msgid "I am a Human Being" +msgstr "Я Человек" + +#: forum/skins/default/templates/pagesize.html:6 +msgid "posts per page" +msgstr "Ñообщений на Ñтранице" + +#: forum/skins/default/templates/paginator.html:6 +#: forum/skins/default/templates/paginator.html:7 +msgid "previous" +msgstr "предыдущаÑ" + +#: forum/skins/default/templates/paginator.html:19 +msgid "current page" +msgstr "Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ñтраница" + +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 +#, python-format +msgid "page number %(num)s" +msgstr "номер Ñтраницы %(num)s" + +#: forum/skins/default/templates/paginator.html:33 +msgid "next page" +msgstr "ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница" + +#: forum/skins/default/templates/post_contributor_info.html:9 +#, fuzzy, python-format +msgid "%(rev_count)s revision" +msgid_plural "%(rev_count)s revisions" +msgstr[0] "выбрать верÑию" +msgstr[1] "выбрать верÑию" +msgstr[2] "выбрать верÑию" + +#: forum/skins/default/templates/post_contributor_info.html:15 +msgid "asked" +msgstr "ÑпроÑил" + +#: forum/skins/default/templates/post_contributor_info.html:18 +msgid "answered" +msgstr "ответил" + +#: forum/skins/default/templates/post_contributor_info.html:20 +msgid "posted" +msgstr "опубликовал" + +#: forum/skins/default/templates/post_contributor_info.html:41 +msgid "updated" +msgstr "обновил" + +#: forum/skins/default/templates/privacy.html:6 +#: forum/skins/default/templates/privacy.html:11 +msgid "Privacy policy" +msgstr "КонфиденциальноÑÑ‚ÑŒ" + +#: forum/skins/default/templates/question.html:80 +#: forum/skins/default/templates/question.html:81 +#: forum/skins/default/templates/question.html:97 +#: forum/skins/default/templates/question.html:99 +msgid "i like this post (click again to cancel)" +msgstr "мне понравилÑÑ Ñтот поÑÑ‚ (щелкните Ñнова, чтобы отменить)" + +#: forum/skins/default/templates/question.html:83 +#: forum/skins/default/templates/question.html:101 +#: forum/skins/default/templates/question.html:253 +msgid "current number of votes" +msgstr "текущее чиÑло голоÑов" + +#: forum/skins/default/templates/question.html:92 +#: forum/skins/default/templates/question.html:93 +#: forum/skins/default/templates/question.html:106 +#: forum/skins/default/templates/question.html:107 +msgid "i dont like this post (click again to cancel)" +msgstr "Ñ Ð½Ðµ понравилÑÑ Ñтот поÑÑ‚ (нажмите еще раз Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹)" + +#: forum/skins/default/templates/question.html:111 +#: forum/skins/default/templates/question.html:112 +msgid "mark this question as favorite (click again to cancel)" +msgstr "отметьте закладкой (чтобы отменить - отметьте еще раз)" + +#: forum/skins/default/templates/question.html:118 +#: forum/skins/default/templates/question.html:119 +msgid "remove favorite mark from this question (click again to restore mark)" +msgstr "удалить закладку (еще раз - чтобы воÑÑтановить)" + +#: forum/skins/default/templates/question.html:143 +#: forum/skins/default/templates/question.html:290 +#: forum/skins/default/templates/revisions_answer.html:58 +#: forum/skins/default/templates/revisions_question.html:58 +msgid "edit" +msgstr "редактировать" + +#: forum/skins/default/templates/question.html:148 +msgid "reopen" +msgstr "переоткрыть" + +#: forum/skins/default/templates/question.html:152 +msgid "close" +msgstr "закрыть" + +#: forum/skins/default/templates/question.html:158 +#: forum/skins/default/templates/question.html:295 +msgid "" +"report as offensive (i.e containing spam, advertising, malicious text, etc.)" +msgstr "" +"Ñообщить о Ñпаме (Ñ‚.е. Ñодержащих Ñпам, рекламу, вредоноÑные текÑÑ‚ и Ñ‚.д.)" + +#: forum/skins/default/templates/question.html:159 +#: forum/skins/default/templates/question.html:296 +msgid "flag offensive" +msgstr "Ñпам" + +#: forum/skins/default/templates/question.html:167 +#: forum/skins/default/templates/question.html:307 +msgid "delete" +msgstr "удалÑÑ‚ÑŒ" + +#: forum/skins/default/templates/question.html:185 +#: forum/skins/default/templates/question.html:327 +msgid "delete this comment" +msgstr "удалить Ñтот комментарий" + +#: forum/skins/default/templates/question.html:196 +#: forum/skins/default/templates/question.html:338 +msgid "add comment" +msgstr "добавить комментарий" + +#: forum/skins/default/templates/question.html:200 +#: forum/skins/default/templates/question.html:342 +#, fuzzy, python-format +msgid "see %(counter)s more" +msgid_plural "see %(counter)s more" +msgstr[0] "Ñмотреть еще один" +msgstr[1] "Ñмотреть еще %(counter)s" +msgstr[2] "Ñмотреть еще %(counter)s" + +#: forum/skins/default/templates/question.html:202 +#: forum/skins/default/templates/question.html:344 +#, fuzzy, python-format +msgid "see %(counter)s more comment" +msgid_plural "" +"see %(counter)s more comments\n" +" " +msgstr[0] "Ñмотреть еще один комментарий" +msgstr[1] "Ñмотреть еще %(counter)s комментариÑ" +msgstr[2] "Ñмотреть еще %(counter)s комментариев" + +#: forum/skins/default/templates/question.html:215 +#, python-format +msgid "" +"The question has been closed for the following reason \"%(close_reason)s\" by" +msgstr "Ð’Ð¾Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» закрыт по Ñледующим причинам \"%(close_reason)s\", автор:" + +#: forum/skins/default/templates/question.html:217 +#, python-format +msgid "close date %(closed_at)s" +msgstr "дата закрытиÑ: %(closed_at)s" + +#: forum/skins/default/templates/question.html:225 +#, fuzzy, python-format +msgid "" +"\n" +" %(counter)s Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +"\n" +"Один ответ:\n" +" " +msgstr[1] "" +"\n" +"%(counter)s Ответа:" +msgstr[2] "" +"\n" +"%(counter)s Ответов:" + +#: forum/skins/default/templates/question.html:233 +msgid "oldest answers will be shown first" +msgstr "Ñамые Ñтарые ответы будут показаны первыми" + +#: forum/skins/default/templates/question.html:233 +msgid "oldest answers" +msgstr "Ñамые Ñтарые ответы" + +#: forum/skins/default/templates/question.html:235 +msgid "newest answers will be shown first" +msgstr "Ñамые новые ответы будут показаны первыми" + +#: forum/skins/default/templates/question.html:235 +msgid "newest answers" +msgstr "Ñамые новые ответы" + +#: forum/skins/default/templates/question.html:237 +msgid "most voted answers will be shown first" +msgstr "ответы Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ чиÑлом голоÑов будут показаны первыми" + +#: forum/skins/default/templates/question.html:237 +msgid "popular answers" +msgstr "популÑрные ответы" + +#: forum/skins/default/templates/question.html:251 +#: forum/skins/default/templates/question.html:252 +msgid "i like this answer (click again to cancel)" +msgstr "мне нравитÑÑ Ñтот ответ (нажмите еще раз Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹)" + +#: forum/skins/default/templates/question.html:258 +#: forum/skins/default/templates/question.html:259 +msgid "i dont like this answer (click again to cancel)" +msgstr "мне не нравитÑÑ Ñтот ответ (нажмите еще раз Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹)" + +#: forum/skins/default/templates/question.html:264 +#: forum/skins/default/templates/question.html:265 +msgid "mark this answer as favorite (click again to undo)" +msgstr "отметить Ñтот Ð²Ð¾Ð¿Ñ€Ð¾Ñ ÐºÐ°Ðº интереÑный (еще раз - чтобы удалить закладку)" + +#: forum/skins/default/templates/question.html:270 +#: forum/skins/default/templates/question.html:271 +msgid "the author of the question has selected this answer as correct" +msgstr "автор вопроÑа выбрал Ñтот ответ правильным" + +#: forum/skins/default/templates/question.html:284 +msgid "answer permanent link" +msgstr "поÑтоÑÐ½Ð½Ð°Ñ ÑÑылка на ответ" + +#: forum/skins/default/templates/question.html:285 +msgid "permanent link" +msgstr "поÑтоÑÐ½Ð½Ð°Ñ ÑÑылка" + +#: forum/skins/default/templates/question.html:307 +msgid "undelete" +msgstr "воÑÑтановить" + +#: forum/skins/default/templates/question.html:366 +#: forum/skins/default/templates/question.html:369 +msgid "Notify me once a day when there are any new answers" +msgstr "Информировать один раз в день, еÑли еÑÑ‚ÑŒ новые ответы" + +#: forum/skins/default/templates/question.html:372 +msgid "Notify me weekly when there are any new answers" +msgstr "Информировать еженедельно, еÑли еÑÑ‚ÑŒ новые ответы" + +#: forum/skins/default/templates/question.html:377 +#, python-format +msgid "" +"You can always adjust frequency of email updates from your %(profile_url)s" +msgstr "" +"Ð’Ñ‹ вÑегда можете наÑтроить чаÑтоту Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñлектронной почте Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ %" +"(profile_url)s" + +#: forum/skins/default/templates/question.html:382 +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "ПоÑле входа в ÑиÑтему вы Ñможете подпиÑатьÑÑ Ð½Ð° вÑе обновлениÑ" + +#: forum/skins/default/templates/question.html:393 +msgid "Your answer" +msgstr "Ваш ответ" + +#: forum/skins/default/templates/question.html:395 +msgid "Be the first one to answer this question!" +msgstr "Будьте первым, кто ответ на Ñтот вопроÑ!" + +#: forum/skins/default/templates/question.html:401 +msgid "you can answer anonymously and then login" +msgstr "Ð’Ñ‹ можете ответить анонимно, а затем войти" + +#: forum/skins/default/templates/question.html:405 +msgid "answer your own question only to give an answer" +msgstr "ответ на ÑобÑтвенный Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ради ответа" + +#: forum/skins/default/templates/question.html:407 +msgid "please only give an answer, no discussions" +msgstr "пожалуйÑта, отвечайте на вопроÑÑ‹, а не вÑтупайте в обÑуждениÑ" + +#: forum/skins/default/templates/question.html:443 +msgid "Login/Signup to Post Your Answer" +msgstr "Войти / ЗарегиÑтрироватьÑÑ Ñ‡Ñ‚Ð¾Ð±Ñ‹ ответить" + +#: forum/skins/default/templates/question.html:446 +msgid "Answer Your Own Question" +msgstr "Ответ на ÑобÑтвенный вопроÑ" + +#: forum/skins/default/templates/question.html:448 +msgid "Answer the question" +msgstr "Ответ на вопроÑ" + +#: forum/skins/default/templates/question.html:462 +msgid "Question tags" +msgstr "Теги вопроÑа" + +#: forum/skins/default/templates/question.html:467 +#: forum/skins/default/templates/questions.html:257 +#: forum/skins/default/templates/tag_selector.html:11 +#: forum/skins/default/templates/tag_selector.html:28 +#, python-format +msgid "see questions tagged '%(tag_name)s'" +msgstr "Ñм. вопроÑÑ‹ Ñ Ñ‚ÐµÐ³Ð°Ð¼Ð¸ '%(tag_name)s'" + +#: forum/skins/default/templates/question.html:473 +msgid "question asked" +msgstr "заданный вопроÑ" + +#: forum/skins/default/templates/question.html:476 +msgid "question was seen" +msgstr "Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» проÑмотрен" + +#: forum/skins/default/templates/question.html:476 +msgid "times" +msgstr "раз" + +#: forum/skins/default/templates/question.html:479 +msgid "last updated" +msgstr "поÑледнее обновление" + +#: forum/skins/default/templates/question.html:485 +msgid "Related questions" +msgstr "похожие вопроÑÑ‹" + +#: forum/skins/default/templates/question_counter_widget.html:6 +msgid "Please decide if you like this question or not by voting" +msgstr "" +"ПожалуйÑта, решите, еÑли вам нравитÑÑ Ñтот Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¸Ð»Ð¸ не путем голоÑованиÑ" + +#: forum/skins/default/templates/question_counter_widget.html:12 +msgid "" +"\n" +" vote\n" +" " +msgid_plural "" +"\n" +" votes\n" +" " +msgstr[0] "" +"\n" +"голоÑ\n" +" " +msgstr[1] "" +"\n" +"голоÑа" +msgstr[2] "" +"\n" +"голоÑов" + +#: forum/skins/default/templates/question_counter_widget.html:21 +msgid "this answer has been accepted to be correct" +msgstr "ответ был принÑÑ‚ как правильный" + +#: forum/skins/default/templates/question_counter_widget.html:27 +msgid "" +"\n" +" answer \n" +" " +msgid_plural "" +"\n" +" answers \n" +" " +msgstr[0] "" +"\n" +"ответ\n" +" " +msgstr[1] "" +"\n" +"ответа" +msgstr[2] "" +"\n" +"ответов" + +#: forum/skins/default/templates/question_counter_widget.html:39 +msgid "" +"\n" +" view\n" +" " +msgid_plural "" +"\n" +" views\n" +" " +msgstr[0] "" +"\n" +"проÑмотр\n" +" " +msgstr[1] "" +"\n" +"проÑмотра" +msgstr[2] "" +"\n" +"проÑмотров" + +#: forum/skins/default/templates/question_edit.html:5 +#: forum/skins/default/templates/question_edit.html:66 +msgid "Edit question" +msgstr "Изменить вопроÑ" + +#: forum/skins/default/templates/question_edit_tips.html:4 +msgid "question tips" +msgstr "подÑказки к вопроÑам" + +#: forum/skins/default/templates/question_edit_tips.html:7 +msgid "please ask a relevant question" +msgstr "задавайте, пожалуйÑта, умеÑтный вопроÑ" + +#: forum/skins/default/templates/question_edit_tips.html:10 +msgid "please try provide enough details" +msgstr "попробуйте обеÑпечить доÑтаточно подробные ÑведениÑ" + +#: forum/skins/default/templates/question_retag.html:4 +#: forum/skins/default/templates/question_retag.html:53 +msgid "Change tags" +msgstr "Измененить Ñ‚Ñги" + +#: forum/skins/default/templates/question_retag.html:40 +msgid "up to 5 tags, less than 20 characters each" +msgstr "до 5 тегов, менее 20 Ñимволов каждый" + +#: forum/skins/default/templates/question_retag.html:83 +msgid "Why use and modify tags?" +msgstr "Зачем иÑпользовать и изменÑÑ‚ÑŒ теги?" + +#: forum/skins/default/templates/question_retag.html:86 +msgid "tags help us keep Questions organized" +msgstr "метки помогают нам Ñтруктурировать вопроÑÑ‹" + +#: forum/skins/default/templates/question_retag.html:94 +msgid "tag editors receive special awards from the community" +msgstr "теги редакторы получают Ñпециальные призы от ÑообщеÑтва" + +#: forum/skins/default/templates/question_summary_list_roll.html:13 +msgid "answers" +msgstr "ответы" + +#: forum/skins/default/templates/questions.html:8 +msgid "Questions" +msgstr "ВопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:32 +msgid "Found by tags" +msgstr "Ðайдено по тегам" + +#: forum/skins/default/templates/questions.html:36 +msgid "Search results" +msgstr "Результаты поиÑка" + +#: forum/skins/default/templates/questions.html:38 +msgid "Found by title" +msgstr "Ðайдено по названию" + +#: forum/skins/default/templates/questions.html:42 +msgid "Unanswered questions" +msgstr "Ðеотвеченные вопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:44 +msgid "All questions" +msgstr "Ð’Ñе вопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:51 +msgid "In:" +msgstr "Ð’:" + +#: forum/skins/default/templates/questions.html:53 +msgid "see unanswered questions" +msgstr "проÑмотрите неотвеченные ворпоÑÑ‹" + +#: forum/skins/default/templates/questions.html:55 +msgid "see your favorite questions" +msgstr "проÑмотр отмеченных вопроÑов" + +#: forum/skins/default/templates/questions.html:59 +msgid "Sort by:" +msgstr "Сортировать по:" + +#: forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/questions.html:75 +msgid "click to see the newest questions" +msgstr "нажмите, чтобы увидеть поÑледние вопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:70 +msgid "click to see the oldest questions" +msgstr "нажмите, чтобы увидеть Ñтарые вопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:83 +#: forum/skins/default/templates/questions.html:94 +msgid "click to see the most recently updated questions" +msgstr "нажмите, чтобы поÑмотреть недавно обновленные вопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:89 +msgid "click to see the least recently updated questions" +msgstr "нажмите, чтобы поÑмотреть поÑледние обновленные вопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:102 +#: forum/skins/default/templates/questions.html:113 +msgid "click to see hottest questions" +msgstr "нажмите, чтобы поÑмотреть популÑрные вопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:102 +msgid "less answers" +msgstr "меньше ответов" + +#: forum/skins/default/templates/questions.html:108 +msgid "click to see coldest questions" +msgstr "нажмите, чтобы поÑмотреть непопулÑрные вопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:108 +#: forum/skins/default/templates/questions.html:113 +msgid "more answers" +msgstr "больше ответов" + +#: forum/skins/default/templates/questions.html:121 +#: forum/skins/default/templates/questions.html:132 +msgid "click to see most voted questions" +msgstr "нажмите, чтобы проÑмотреть вопроÑÑ‹ Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ чиÑлом голоÑов" + +#: forum/skins/default/templates/questions.html:121 +msgid "unpopular" +msgstr "непопулÑрный" + +#: forum/skins/default/templates/questions.html:127 +msgid "click to see least voted questions" +msgstr "нажмите, чтобы проÑмотреть поÑледние проголоÑванные вопроÑÑ‹" + +#: forum/skins/default/templates/questions.html:127 +#: forum/skins/default/templates/questions.html:132 +msgid "popular" +msgstr "популÑрный" + +#: forum/skins/default/templates/questions.html:141 +#, fuzzy, python-format +msgid " %(q_num)s question found" +msgid_plural "%(q_num)s questions found" +msgstr[0] "%(q_num)s вопроÑ" +msgstr[1] "%(q_num)s вопроÑа" +msgstr[2] "%(q_num)s вопроÑов" + +#: forum/skins/default/templates/questions.html:143 +#, fuzzy, python-format +msgid "%(q_num)s question" +msgid_plural "%(q_num)s questions" +msgstr[0] "%(q_num)s вопроÑ" +msgstr[1] "%(q_num)s вопроÑа" +msgstr[2] "%(q_num)s вопроÑов" + +#: forum/skins/default/templates/questions.html:147 +#, python-format +msgid "with %(author_name)s's contributions" +msgstr "Ñ Ð¿Ð¾Ð¼Ð¾ÑˆÑŒÑŽ от %(author_name)s" + +#: forum/skins/default/templates/questions.html:151 +msgid "tagged" +msgstr "помеченный" + +#: forum/skins/default/templates/questions.html:157 +msgid "Search tips:" +msgstr "Советы по поиÑку:" + +#: forum/skins/default/templates/questions.html:161 +msgid "reset author" +msgstr "ÑÐ±Ñ€Ð¾Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð°" + +#: forum/skins/default/templates/questions.html:165 +msgid "reset tags" +msgstr "ÑброÑить Ñ‚Ñги" + +#: forum/skins/default/templates/questions.html:169 +#: forum/skins/default/templates/questions.html:173 +msgid "start over" +msgstr "начать вÑе Ñначала" + +#: forum/skins/default/templates/questions.html:175 +msgid " - to expand, or dig in by adding more tags and revising the query." +msgstr "- раÑширить или Ñузить, добавлÑÑ Ñвои метки и Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñ." + +#: forum/skins/default/templates/questions.html:178 +msgid "Search tip:" +msgstr "ПодÑказки Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка:" + +#: forum/skins/default/templates/questions.html:178 +msgid "add tags and a query to focus your search" +msgstr "добавить теги и выполнить поиÑк" + +#: forum/skins/default/templates/questions.html:190 +msgid "There are no unanswered questions here" +msgstr "Ðеотвеченных вопроÑов здеÑÑŒ нет" + +#: forum/skins/default/templates/questions.html:193 +msgid "No favorite questions here. " +msgstr "Отмеченных вопроÑов нет." + +#: forum/skins/default/templates/questions.html:194 +msgid "Please start (bookmark) some questions when you visit them" +msgstr "Ðачните (закладки) некоторые вопроÑÑ‹, когда вы поÑещаете их" + +#: forum/skins/default/templates/questions.html:199 +msgid "You can expand your search by " +msgstr "Ð’Ñ‹ можете раÑширить поиÑк" + +#: forum/skins/default/templates/questions.html:203 +msgid "resetting author" +msgstr "ÑÐ±Ñ€Ð¾Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð°" + +#: forum/skins/default/templates/questions.html:207 +msgid "resetting tags" +msgstr "ÑÐ±Ñ€Ð¾Ñ Ñ‚Ñгов" + +#: forum/skins/default/templates/questions.html:211 +#: forum/skins/default/templates/questions.html:215 +msgid "starting over" +msgstr "начать Ñначала" + +#: forum/skins/default/templates/questions.html:220 +msgid "Please always feel free to ask your question!" +msgstr "ПожалуйÑта, вÑегда можете задать Ñвой вопроÑ!" + +#: forum/skins/default/templates/questions.html:224 +msgid "Did not find what you were looking for?" +msgstr "Ð’Ñ‹ не нашли то, что вы ищете?" + +#: forum/skins/default/templates/questions.html:225 +msgid "Please, post your question!" +msgstr "ПожалуйÑта, опубликуйте Ñвой вопроÑ!" + +#: forum/skins/default/templates/questions.html:241 +msgid "Contributors" +msgstr "Ðвторы" + +#: forum/skins/default/templates/questions.html:254 +msgid "Related tags" +msgstr "СвÑзанные теги" + +#: forum/skins/default/templates/reopen.html:6 +#: forum/skins/default/templates/reopen.html:16 +msgid "Reopen question" +msgstr "Переоткрыть вопроÑ" + +#: forum/skins/default/templates/reopen.html:19 +msgid "Open the previously closed question" +msgstr "Открыть ранее закрытый вопроÑ" + +#: forum/skins/default/templates/reopen.html:22 +msgid "The question was closed for the following reason " +msgstr "Ð’Ð¾Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» закрыт по Ñледующим причинам" + +#: forum/skins/default/templates/reopen.html:22 +msgid "reason - leave blank in english" +msgstr "причина - оÑтавить пуÑтым на английÑком Ñзыке" + +#: forum/skins/default/templates/reopen.html:22 +msgid "on " +msgstr "на" + +#: forum/skins/default/templates/reopen.html:22 +msgid "date closed" +msgstr "дату окончаниÑ" + +#: forum/skins/default/templates/reopen.html:29 +msgid "Reopen this question" +msgstr "Переоткрыть Ñтот вопроÑ" + +#: forum/skins/default/templates/revisions_answer.html:7 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:8 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "Revision history" +msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹" + +#: forum/skins/default/templates/revisions_answer.html:50 +#: forum/skins/default/templates/revisions_question.html:50 +msgid "click to hide/show revision" +msgstr "нажмите, чтобы Ñкрыть / показать ревизию" + +#: forum/skins/default/templates/tag_selector.html:5 +msgid "Interesting tags" +msgstr "ИнтереÑные теги" + +#: forum/skins/default/templates/tag_selector.html:15 +#, python-format +msgid "remove '%(tag_name)s' from the list of interesting tags" +msgstr "удалить '%(tag_name)s' из ÑпиÑка интереÑных теги" + +#: forum/skins/default/templates/tag_selector.html:21 +#: forum/skins/default/templates/tag_selector.html:38 +msgid "Add" +msgstr "Добавить" + +#: forum/skins/default/templates/tag_selector.html:22 +msgid "Ignored tags" +msgstr "Игнорируемые теги" + +#: forum/skins/default/templates/tag_selector.html:32 +#, python-format +msgid "remove '%(tag_name)s' from the list of ignored tags" +msgstr "удалить '%(tag_name)s' из ÑпиÑка игнорируемых тегов" + +#: forum/skins/default/templates/tag_selector.html:41 +msgid "keep ignored questions hidden" +msgstr "Ñохранить игнорируемые вопроÑÑ‹ Ñкрытыми" + +#: forum/skins/default/templates/tags.html:6 +#: forum/skins/default/templates/tags.html:30 +msgid "Tag list" +msgstr "СпиÑок тегов" + +#: forum/skins/default/templates/tags.html:32 +msgid "sorted alphabetically" +msgstr "ÑортируютÑÑ Ð² алфавитном порÑдке" + +#: forum/skins/default/templates/tags.html:32 +msgid "by name" +msgstr "по имени" + +#: forum/skins/default/templates/tags.html:33 +msgid "sorted by frequency of tag use" +msgstr "отÑортировано по чаÑтоте иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ³Ð°" + +#: forum/skins/default/templates/tags.html:33 +msgid "by popularity" +msgstr "по популÑрноÑти" + +#: forum/skins/default/templates/tags.html:39 +#, python-format +msgid "" +"All tags matching '%(stag)s'" +msgstr "" +"Ð’Ñе Ñ‚Ñга, ÑоответÑтвующие '%(stag)s' " + +#: forum/skins/default/templates/tags.html:42 +msgid "Nothing found" +msgstr "Ðичего не найдено" + +#: forum/skins/default/templates/user_edit.html:6 +msgid "Edit user profile" +msgstr "Изменить профиль пользователÑ" + +#: forum/skins/default/templates/user_edit.html:19 +msgid "edit profile" +msgstr "изменить профиль" + +#: forum/skins/default/templates/user_edit.html:33 +#: forum/skins/default/templates/user_info.html:53 +msgid "Registered user" +msgstr "ЗарегиÑтрированный пользователь" + +#: forum/skins/default/templates/user_edit.html:40 +msgid "Screen Name" +msgstr "Ðазвание Ñкрана" + +#: forum/skins/default/templates/user_edit.html:89 +#: forum/skins/default/templates/user_email_subscriptions.html:20 +msgid "Update" +msgstr "Обновить" + +#: forum/skins/default/templates/user_email_subscriptions.html:8 +msgid "Email subscription settings" +msgstr "ÐаÑтройка подпиÑки по Ñлектронной почте" + +#: forum/skins/default/templates/user_email_subscriptions.html:9 +msgid "email subscription settings info" +msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ наÑтройках подпиÑки по Ñлектронной почте" + +#: forum/skins/default/templates/user_email_subscriptions.html:21 +msgid "Stop sending email" +msgstr "ОÑтановить отправку Ñлектронной почты" + +#: forum/skins/default/templates/user_info.html:18 +msgid "change picture" +msgstr "изменить изображение" + +#: forum/skins/default/templates/user_info.html:25 +#: forum/skins/default/templates/users.html:26 forum/views/users.py:934 +msgid "reputation" +msgstr "карма" + +#: forum/skins/default/templates/user_info.html:35 +msgid "Moderate this user" +msgstr "Модерировать Ñтого пользователÑ" + +#: forum/skins/default/templates/user_info.html:47 +msgid "update profile" +msgstr "обновить профиль" + +#: forum/skins/default/templates/user_info.html:57 +msgid "real name" +msgstr "наÑтоÑщее имÑ" + +#: forum/skins/default/templates/user_info.html:62 +msgid "member for" +msgstr "ÑоÑтоит в " + +#: forum/skins/default/templates/user_info.html:67 +msgid "last seen" +msgstr "поÑледнее поÑещение" + +#: forum/skins/default/templates/user_info.html:73 +msgid "user website" +msgstr "Ñайт пользователÑ" + +#: forum/skins/default/templates/user_info.html:79 +msgid "location" +msgstr "меÑтоположение" + +#: forum/skins/default/templates/user_info.html:86 +msgid "age" +msgstr "возраÑÑ‚" + +#: forum/skins/default/templates/user_info.html:87 +msgid "age unit" +msgstr "блок возраÑта" + +#: forum/skins/default/templates/user_info.html:93 +msgid "todays unused votes" +msgstr "ÑегоднÑшних неиÑпользованных голоÑов" + +#: forum/skins/default/templates/user_info.html:94 +msgid "votes left" +msgstr "оÑталоÑÑŒ голоÑов" + +#: forum/skins/default/templates/user_reputation.html:29 +msgid "Your karma change log." +msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ кармы" + +#: forum/skins/default/templates/user_reputation.html:31 +#, python-format +msgid "%(user_name)s's karma change log" +msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ кармы Ð´Ð»Ñ %(user_name)s " + +#: forum/skins/default/templates/user_stats.html:11 +#, fuzzy, python-format +msgid "%(counter)s Question" +msgid_plural "%(counter)s Questions" +msgstr[0] "1 ВопроÑ" +msgstr[1] "%(counter)s ВопроÑов" +msgstr[2] "%(counter)s ВопроÑа" + +#: forum/skins/default/templates/user_stats.html:16 +#, fuzzy, python-format +msgid "%(counter)s Answer" +msgid_plural "%(counter)s Answers" +msgstr[0] "1 Ответ" +msgstr[1] "%(counter)s Ответов" +msgstr[2] "%(counter)s Ответа" + +#: forum/skins/default/templates/user_stats.html:24 +#, python-format +msgid "the answer has been voted for %(answer_score)s times" +msgstr "за ответ проголоÑовали %(answer_score)s раз" + +#: forum/skins/default/templates/user_stats.html:24 +msgid "this answer has been selected as correct" +msgstr "Ñтот ответ был выбран в качеÑтве правильного" + +#: forum/skins/default/templates/user_stats.html:34 +#, fuzzy, python-format +msgid "(%(comment_count)s comment)" +msgid_plural "the answer has been commented %(comment_count)s times" +msgstr[0] "(один комментарий)" +msgstr[1] "ответ был прокомментирован %(comment_count)s раз" +msgstr[2] "ответ был прокомментирован %(comment_count)s раза" + +#: forum/skins/default/templates/user_stats.html:44 +#, fuzzy, python-format +msgid "%(cnt)s Vote" +msgid_plural "%(cnt)s Votes " +msgstr[0] "1 ГолоÑ" +msgstr[1] "%(cnt)s ГолоÑов" +msgstr[2] "%(cnt)s ГолоÑа" + +#: forum/skins/default/templates/user_stats.html:50 +msgid "thumb up" +msgstr "Ñ \"за\"" + +#: forum/skins/default/templates/user_stats.html:51 +msgid "user has voted up this many times" +msgstr "пользователь проголоÑовал \"за\" много раз" + +#: forum/skins/default/templates/user_stats.html:55 +msgid "thumb down" +msgstr "Ñ \"против\"" + +#: forum/skins/default/templates/user_stats.html:56 +msgid "user voted down this many times" +msgstr "пользователь проголоÑовал \"против\" много раз" + +#: forum/skins/default/templates/user_stats.html:64 +#, fuzzy, python-format +msgid "%(counter)s Tag" +msgid_plural "%(counter)s Tags" +msgstr[0] "1 ТÑг" +msgstr[1] "%(counter)s ТÑгов" +msgstr[2] "%(counter)s ТÑга" + +#: forum/skins/default/templates/user_stats.html:72 +#, python-format +msgid "" +"see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " +msgstr "" +"Ñм. другие вопроÑÑ‹, в которых еÑÑ‚ÑŒ вклад от %(view_user)s, отмеченные Ñ‚Ñгом " +"'%(tag_name)s'" + +#: forum/skins/default/templates/user_stats.html:86 +#, fuzzy, python-format +msgid "%(counter)s Badge" +msgid_plural "%(counter)s Badges" +msgstr[0] "1 Значок" +msgstr[1] "%(counter)s Значка" +msgstr[2] "%(counter)s Значков" + +#: forum/skins/default/templates/user_tabs.html:7 +msgid "User profile" +msgstr "Профиль пользователÑ" + +#: forum/skins/default/templates/user_tabs.html:7 forum/views/users.py:908 +msgid "overview" +msgstr "обзор" + +#: forum/skins/default/templates/user_tabs.html:9 forum/views/users.py:916 +msgid "recent activity" +msgstr "поÑледние данные по активноÑти" + +#: forum/skins/default/templates/user_tabs.html:12 forum/views/users.py:926 +msgid "comments and answers to others questions" +msgstr "комментарии и ответы на другие вопроÑÑ‹" + +#: forum/skins/default/templates/user_tabs.html:13 forum/views/users.py:925 +msgid "responses" +msgstr "ответы" + +#: forum/skins/default/templates/user_tabs.html:16 +msgid "graph of user reputation" +msgstr "график кармы" + +#: forum/skins/default/templates/user_tabs.html:17 +msgid "reputation history" +msgstr "иÑÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ°Ñ€Ð¼Ñ‹" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:952 +msgid "user vote record" +msgstr "Ð³Ð¾Ð»Ð¾Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð·Ð°Ð¿Ð¸Ñан" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:951 +msgid "casted votes" +msgstr "поданных голоÑов" + +#: forum/skins/default/templates/user_tabs.html:23 +msgid "questions that user selected as his/her favorite" +msgstr "" +"ВопроÑов отмеченных закладками (интереÑные вопроÑÑ‹ можно отмечать нажав на " +"звездочку)." + +#: forum/skins/default/templates/user_tabs.html:24 +msgid "favorites" +msgstr "закладки" + +#: forum/skins/default/templates/user_tabs.html:27 forum/views/users.py:961 +msgid "email subscription settings" +msgstr "наÑтройки подпиÑки по Ñлектронной почте" + +#: forum/skins/default/templates/user_tabs.html:28 forum/views/users.py:960 +msgid "email subscriptions" +msgstr "подпиÑки по email" + +#: forum/skins/default/templates/users.html:6 +#: forum/skins/default/templates/users.html:24 +msgid "Users" +msgstr "Пользователи" + +#: forum/skins/default/templates/users.html:27 +msgid "recent" +msgstr "поÑледний" + +#: forum/skins/default/templates/users.html:29 +msgid "by username" +msgstr "по имени пользователÑ" + +#: forum/skins/default/templates/users.html:35 +#, python-format +msgid "users matching query %(suser)s:" +msgstr "пользователей, ÑоответÑтвующих запроÑу, %(suser)s:" + +#: forum/skins/default/templates/users.html:39 +msgid "Nothing found." +msgstr "Ðичего не найдено." + +#: forum/skins/default/templates/users_questions.html:11 +msgid "this questions was selected as favorite" +msgstr "Ñти вопроÑÑ‹ были выбраны в качеÑтве любимых" + +#: forum/skins/default/templates/users_questions.html:12 +msgid "thumb-up on" +msgstr "Ñ \"за\"" + +#: forum/skins/default/templates/users_questions.html:19 +msgid "thumb-up off" +msgstr "Ñ \"против\"" + +#: forum/skins/default/templates/authopenid/changeemail.html:3 +#: forum/skins/default/templates/authopenid/changeemail.html:9 +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Change email" +msgstr "Изменить Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" + +#: forum/skins/default/templates/authopenid/changeemail.html:11 +msgid "Save your email address" +msgstr "Сохранить Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" + +#: forum/skins/default/templates/authopenid/changeemail.html:16 +#, python-format +msgid "change %(email)s info" +msgstr "измененить %(email)s" + +#: forum/skins/default/templates/authopenid/changeemail.html:18 +#, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "вот почему требуетÑÑ Ñлектронной почты, Ñм. %(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your new Email" +msgstr "Ваш новый Email" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your Email" +msgstr "Ваш E-mail" + +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Save Email" +msgstr "Сохранить Email" + +#: forum/skins/default/templates/authopenid/changeemail.html:49 +msgid "Validate email" +msgstr "Проверить Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" + +#: forum/skins/default/templates/authopenid/changeemail.html:52 +#, python-format +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "Проверить информацию о %(email)s или перейти на %(change_email_url)s" + +#: forum/skins/default/templates/authopenid/changeemail.html:57 +msgid "Email not changed" +msgstr "Email не изменилÑÑ" + +#: forum/skins/default/templates/authopenid/changeemail.html:60 +#, python-format +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" +"Ñтарый %(email)s Ñохранен, при желании можно изменить тут %(change_email_url)" +"s" + +#: forum/skins/default/templates/authopenid/changeemail.html:65 +msgid "Email changed" +msgstr "Email изменен" + +#: forum/skins/default/templates/authopenid/changeemail.html:68 +#, python-format +msgid "your current %(email)s can be used for this" +msgstr "текущий %(email)s может быть иÑпользован Ð´Ð»Ñ Ñтого" + +#: forum/skins/default/templates/authopenid/changeemail.html:73 +msgid "Email verified" +msgstr "Email проверен" + +#: forum/skins/default/templates/authopenid/changeemail.html:76 +msgid "thanks for verifying email" +msgstr "ÑпаÑибо за проверку email" + +#: forum/skins/default/templates/authopenid/changeemail.html:81 +msgid "email key not sent" +msgstr "email ключ не передаетÑÑ" + +#: forum/skins/default/templates/authopenid/changeemail.html:84 +#, python-format +msgid "email key not sent %(email)s change email here %(change_link)s" +msgstr "" +"email ключ не поÑлан на %(email)s, изменить email здеÑÑŒ %(change_link)s" + +#: forum/skins/default/templates/authopenid/changeopenid.html:8 +msgid "Account: change OpenID URL" +msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ: Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ OpenID URL" + +#: forum/skins/default/templates/authopenid/changeopenid.html:12 +msgid "" +"This is where you can change your OpenID URL. Make sure you remember it!" +msgstr "" +"ЗдеÑÑŒ вы можете изменить Ñвой OpenID URL. УбедитеÑÑŒ, что вы помните Ñто!" + +#: forum/skins/default/templates/authopenid/changeopenid.html:14 +#: forum/skins/default/templates/authopenid/delete.html:14 +#: forum/skins/default/templates/authopenid/delete.html:24 +msgid "Please correct errors below:" +msgstr "ПожалуйÑта, иÑправьте ошибки, указанные ниже:" + +#: forum/skins/default/templates/authopenid/changeopenid.html:29 +msgid "OpenID URL:" +msgstr "OpenID URL:" + +#: forum/skins/default/templates/authopenid/changepw.html:7 +msgid "Account: change password" +msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ: Ñменить пароль" + +#: forum/skins/default/templates/authopenid/changepw.html:8 +msgid "This is where you can change your password. Make sure you remember it!" +msgstr "ЗдеÑÑŒ вы можете изменить Ñвой пароль. УбедитеÑÑŒ, что вы помните его!" + +#: forum/skins/default/templates/authopenid/complete.html:19 +msgid "Connect your OpenID with this site" +msgstr "Подключите ваш OpenID Ñ Ñтого Ñайта" + +#: forum/skins/default/templates/authopenid/complete.html:22 +msgid "Connect your OpenID with your account on this site" +msgstr "Подключите ваш OpenID Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑью на Ñтом Ñайте" + +#: forum/skins/default/templates/authopenid/complete.html:27 +#, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"зарегиÑтрировать нового провайдера %(provider)s к учетной запиÑи, Ñмотрите %" +"(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/complete.html:31 +#, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" +"%(username)s уже ÑущеÑтвует, выберите другое Ð¸Ð¼Ñ Ð´Ð»Ñ %(provider)s. Email так " +"же требуетÑÑ Ñ‚Ð¾Ð¶Ðµ, Ñмотрите %(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/complete.html:35 +#, python-format +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ внешнего %(provider)s к учетной запиÑи, Ñмотрите %" +"(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/complete.html:38 +#, python-format +msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" +msgstr "региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Facebook подключениÑ, Ñмотрите %(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/complete.html:42 +msgid "This account already exists, please use another." +msgstr "Эта ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уже ÑущеÑтвует, пожалуйÑта, иÑпользуйте другую." + +#: forum/skins/default/templates/authopenid/complete.html:57 +msgid "Sorry, looks like we have some errors:" +msgstr "К Ñожалению, у Ð½Ð°Ñ ÐµÑÑ‚ÑŒ некоторые ошибки:" + +#: forum/skins/default/templates/authopenid/complete.html:82 +msgid "Screen name label" +msgstr "Ярлык Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸" + +#: forum/skins/default/templates/authopenid/complete.html:89 +msgid "Email address label" +msgstr "Ярлык Ð´Ð»Ñ Email" + +#: forum/skins/default/templates/authopenid/complete.html:95 +#: forum/skins/default/templates/authopenid/signup.html:18 +msgid "receive updates motivational blurb" +msgstr "получать Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ñ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð¹ рекламы" + +#: forum/skins/default/templates/authopenid/complete.html:99 +#: forum/skins/default/templates/authopenid/signup.html:22 +msgid "please select one of the options above" +msgstr "ПожалуйÑта, выберите один из вариантов" + +#: forum/skins/default/templates/authopenid/complete.html:102 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" +"Фильтр тегов будет в правой панели, поÑле того, как вы войдете в ÑиÑтему" + +#: forum/skins/default/templates/authopenid/complete.html:103 +msgid "create account" +msgstr "зарегиÑтрироватьÑÑ" + +#: forum/skins/default/templates/authopenid/complete.html:112 +msgid "Existing account" +msgstr "СущеÑтвующие учетные запиÑи" + +#: forum/skins/default/templates/authopenid/complete.html:113 +msgid "user name" +msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + +#: forum/skins/default/templates/authopenid/complete.html:114 +msgid "password" +msgstr "пароль" + +#: forum/skins/default/templates/authopenid/complete.html:121 +msgid "Register" +msgstr "ЗарегиÑтрироватьÑÑ" + +#: forum/skins/default/templates/authopenid/complete.html:122 +#: forum/skins/default/templates/authopenid/signin.html:168 +msgid "Forgot your password?" +msgstr "Забыли пароль?" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:2 +msgid "Thank you for registering at our Q&A forum!" +msgstr "Благодарим Ð²Ð°Ñ Ð·Ð° региÑтрацию на нашем Q/A форуме!" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:4 +msgid "Your account details are:" +msgstr "ПодробноÑти вашей учетной запиÑи:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:6 +msgid "Username:" +msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:7 +#: forum/skins/default/templates/authopenid/delete.html:19 +msgid "Password:" +msgstr "Пароль:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:9 +msgid "Please sign in here:" +msgstr "ПожалуйÑта, войдите здеÑÑŒ:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:12 +#: forum/skins/default/templates/authopenid/email_validation.txt:14 +#: forum/skins/default/templates/authopenid/sendpw_email.txt:8 +msgid "" +"Sincerely,\n" +"Forum Administrator" +msgstr "С уважением, админиÑтратор форума" + +#: forum/skins/default/templates/authopenid/delete.html:8 +msgid "Account: delete account" +msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ: удалить учетную запиÑÑŒ" + +#: forum/skins/default/templates/authopenid/delete.html:12 +msgid "" +"Note: After deleting your account, anyone will be able to register this " +"username." +msgstr "" +"Примечание: ПоÑле ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи, любой пользователь Ñможет " +"зарегиÑтрировать Ñто Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ." + +#: forum/skins/default/templates/authopenid/delete.html:16 +msgid "Check confirm box, if you want delete your account." +msgstr "УÑтановите флаг, подтвержадющий, что вы хотите удалить Ñвой аккаунт." + +#: forum/skins/default/templates/authopenid/delete.html:31 +msgid "I am sure I want to delete my account." +msgstr "Я уверен, что хочу удалить Ñвой аккаунт." + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "Password/OpenID URL" +msgstr "Пароль / OpenID URL" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "(required for your security)" +msgstr "(необходимо Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ безопаÑноÑти)" + +#: forum/skins/default/templates/authopenid/delete.html:34 +msgid "Delete account permanently" +msgstr "Удалить аккаунт навÑегда" + +#: forum/skins/default/templates/authopenid/email_validation.txt:2 +msgid "Greetings from the Q&A forum" +msgstr "С Уважением, Q/A форум" + +#: forum/skins/default/templates/authopenid/email_validation.txt:4 +msgid "To make use of the Forum, please follow the link below:" +msgstr "" +"Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы воÑпользоватьÑÑ Ñ„Ð¾Ñ€ÑƒÐ¼Ð¾Ð¼, пожалуйÑта, перейдите по ÑÑылке ниже:" + +#: forum/skins/default/templates/authopenid/email_validation.txt:8 +msgid "Following the link above will help us verify your email address." +msgstr "ÐŸÐµÑ€ÐµÐ¹Ð´Ñ Ð¿Ð¾ ÑÑылке выше, вы поможете нам проверить ваш email." + +#: forum/skins/default/templates/authopenid/email_validation.txt:10 +msgid "" +"If you beleive that this message was sent in mistake - \n" +"no further action is needed. Just ingore this email, we apologize\n" +"for any inconvenience" +msgstr "" +"ЕÑли вы Ñчитаете, что Ñообщение было отправлено по ошибке - никаких " +"дальнейших дейÑтвий не требуетÑÑ. ПроÑто проигнорируйте Ñто пиÑьмо, мы " +"приноÑим Ñвои Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° причиненные неудобÑтва." + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:4 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:7 +msgid "Traditional login information" +msgstr "Ð¢Ñ€Ð°Ð´Ð¸Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:12 +#, python-format +msgid "" +"how to login with password through external login website or use %" +"(feedback_url)s" +msgstr "" +"как войти Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼ через внешнюю учетную запиÑÑŒ или иÑпользовать %" +"(feedback_url)s" + +#: forum/skins/default/templates/authopenid/sendpw.html:4 +#: forum/skins/default/templates/authopenid/sendpw.html:7 +msgid "Send new password" +msgstr "Получить новый пароль" + +#: forum/skins/default/templates/authopenid/sendpw.html:10 +msgid "password recovery information" +msgstr "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ" + +#: forum/skins/default/templates/authopenid/sendpw.html:21 +msgid "Reset password" +msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ" + +#: forum/skins/default/templates/authopenid/sendpw.html:22 +msgid "return to login" +msgstr "вернутьÑÑ Ðº Ñтранице входа" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:2 +#, python-format +msgid "" +"Someone has requested to reset your password on %(site_url)s.\n" +"If it were not you, it is safe to ignore this email." +msgstr "" +"Кто-то запроÑил ÑÐ±Ñ€Ð¾Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ð° Ñайте %(site_url)s. \n" +"ЕÑли Ñто не вы, то можно проÑто проигнорировать Ñто Ñообщение." + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:5 +#, python-format +msgid "" +"email explanation how to use new %(password)s for %(username)s\n" +"with the %(key_link)s" +msgstr "" +"email-инÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð¿Ð¾ иÑпользованию новых %(username)s / %(password)s\n" +"Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ %(key_link)s" + +#: forum/skins/default/templates/authopenid/signin.html:5 +#: forum/skins/default/templates/authopenid/signin.html:21 +msgid "User login" +msgstr "Пользователь вошел" + +#: forum/skins/default/templates/authopenid/signin.html:28 +#, python-format +msgid "" +"\n" +" Your answer to %(title)s %(summary)s will be posted once you " +"log in\n" +" " +msgstr "" +"\n" +"Ваш ответ на %(title)s / %(summary)s будет опубликован, как только вы войдете" + +#: forum/skins/default/templates/authopenid/signin.html:35 +#, python-format +msgid "" +"Your question \n" +" %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" +"Ваш Ð²Ð¾Ð¿Ñ€Ð¾Ñ %(title)s / %(summary)s Ñ‹ будет опубликован поÑле того, как вы " +"войдёте" + +#: forum/skins/default/templates/authopenid/signin.html:42 +msgid "Click to sign in through any of these services." +msgstr "Ðажмите, чтобы войти в ÑиÑтему через любой из ÑервиÑов." + +#: forum/skins/default/templates/authopenid/signin.html:144 +msgid "Enter your Provider user name" +msgstr "" +"Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð°" + +#: forum/skins/default/templates/authopenid/signin.html:151 +msgid "" +"Enter your OpenID " +"web address" +msgstr "" +"Введите Ñвой OpenID " +"веб-адреÑ" + +#: forum/skins/default/templates/authopenid/signin.html:153 +#: forum/skins/default/templates/authopenid/signin.html:166 +msgid "Login" +msgstr "Войти" + +#: forum/skins/default/templates/authopenid/signin.html:157 +msgid "Enter your login name and password" +msgstr "Введите Ð¸Ð¼Ñ Ð¸ пароль" + +#: forum/skins/default/templates/authopenid/signin.html:161 +msgid "Login name" +msgstr "Ð˜Ð¼Ñ Ð¿Ñ€Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + +#: forum/skins/default/templates/authopenid/signin.html:163 +msgid "Password" +msgstr "Пароль" + +#: forum/skins/default/templates/authopenid/signin.html:167 +msgid "Create account" +msgstr "Создать учетную запиÑÑŒ" + +#: forum/skins/default/templates/authopenid/signin.html:178 +msgid "Why use OpenID?" +msgstr "Зачем иÑпользовать OpenID?" + +#: forum/skins/default/templates/authopenid/signin.html:181 +msgid "with openid it is easier" +msgstr "Ñ OpenID легче" + +#: forum/skins/default/templates/authopenid/signin.html:184 +msgid "reuse openid" +msgstr "повторное иÑпользование OpenID" + +#: forum/skins/default/templates/authopenid/signin.html:187 +msgid "openid is widely adopted" +msgstr "OpenID широко применÑетÑÑ" + +#: forum/skins/default/templates/authopenid/signin.html:190 +msgid "openid is supported open standard" +msgstr "OpenID поддерживаемый открытый Ñтандарт" + +#: forum/skins/default/templates/authopenid/signin.html:195 +msgid "Find out more" +msgstr "Узнать больше" + +#: forum/skins/default/templates/authopenid/signin.html:196 +msgid "Get OpenID" +msgstr "Получить OpenID" + +#: forum/skins/default/templates/authopenid/signup.html:4 +msgid "Signup" +msgstr "ЗарегиÑтрироватьÑÑ" + +#: forum/skins/default/templates/authopenid/signup.html:8 +msgid "Create login name and password" +msgstr "Создать Ð¸Ð¼Ñ Ð¸ пароль" + +#: forum/skins/default/templates/authopenid/signup.html:10 +msgid "Traditional signup info" +msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ традиционной региÑтрации" + +#: forum/skins/default/templates/authopenid/signup.html:25 +msgid "" +"Please read and type in the two words below to help us prevent automated " +"account creation." +msgstr "" +"ПожалуйÑта, прочтите и укажите два Ñлова ниже, чтобы помочь нам " +"предотвратить автоматизированные ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи." + +#: forum/skins/default/templates/authopenid/signup.html:27 +msgid "Create Account" +msgstr "Создать учетную запиÑÑŒ" + +#: forum/skins/default/templates/authopenid/signup.html:28 +msgid "or" +msgstr "или" + +#: forum/skins/default/templates/authopenid/signup.html:29 +msgid "return to OpenID login" +msgstr "вернутьÑÑ Ðº Ñтарнице OpenID входа" + +#: forum/skins/default/templates/fbconnect/xd_receiver.html:5 +#, fuzzy, python-format +msgid "Connect to %(settings.APP_SHORT_NAME)s with Facebook!" +msgstr "Подключение к %(APP_SHORT_NAME)s Ñ Facebook!" + +#: forum/templatetags/extra_filters.py:100 +msgid "no items in counter" +msgstr "нет Ñлементов" + +#: forum/templatetags/extra_tags.py:54 +#, python-format +msgid "%(username)s gravatar image" +msgstr "%(username)s Gravatar" + +#: forum/templatetags/extra_tags.py:179 forum/templatetags/extra_tags.py:206 +msgid "reputation points" +msgstr "очки кармы" + +#: forum/templatetags/extra_tags.py:266 +msgid "2 days ago" +msgstr "2 Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´" + +#: forum/templatetags/extra_tags.py:268 +msgid "yesterday" +msgstr "вчера" + +#: forum/templatetags/extra_tags.py:270 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "%(hr)d Ñ‡Ð°Ñ Ð½Ð°Ð·Ð°Ð´" +msgstr[1] "%(hr)d чаÑов назад" +msgstr[2] "%(hr)d чаÑа назад" + +#: forum/templatetags/extra_tags.py:272 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "%(min)d минуту назад" +msgstr[1] "%(min)d минут назад" +msgstr[2] "%(min)d минуты назад" + +#: forum/utils/forms.py:31 +msgid "this field is required" +msgstr "Ñто поле обÑзательное" + +#: forum/utils/forms.py:46 +msgid "choose a username" +msgstr "выбрать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + +#: forum/utils/forms.py:51 +msgid "user name is required" +msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ð±Ñзательно" + +#: forum/utils/forms.py:52 +msgid "sorry, this name is taken, please choose another" +msgstr "к Ñожалению, Ñто Ð¸Ð¼Ñ Ð¸ÑпользуетÑÑ, выберите другое" + +#: forum/utils/forms.py:53 +msgid "sorry, this name is not allowed, please choose another" +msgstr "к Ñожалению, Ñто Ð¸Ð¼Ñ Ð½Ðµ разрешено, выберите другое" + +#: forum/utils/forms.py:54 +msgid "sorry, there is no user with this name" +msgstr "е Ñожалению, Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем не ÑущеÑтвует" + +#: forum/utils/forms.py:55 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" +"е Ñожалению, у Ð½Ð°Ñ ÐµÑÑ‚ÑŒ ÑÐµÑ€ÑŒÐµÐ·Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° - Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ÑпользуетÑÑ " +"неÑколькими пользователÑми" + +#: forum/utils/forms.py:56 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "" +"Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ ÑоÑтоÑÑ‚ÑŒ только из букв, пробелов и подчеркиваний" + +#: forum/utils/forms.py:110 +msgid "your email address" +msgstr "ваш email" + +#: forum/utils/forms.py:111 +msgid "email address is required" +msgstr "email обÑзательное" + +#: forum/utils/forms.py:112 +msgid "please enter a valid email address" +msgstr "пожалуйÑта, введите работающий Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" + +#: forum/utils/forms.py:113 +msgid "this email is already used by someone else, please choose another" +msgstr "Ñтот email уже иÑпользуетÑÑ ÐºÐµÐ¼-то еще, пожалуйÑта, выберите другое" + +#: forum/utils/forms.py:141 +msgid "choose password" +msgstr "выбрать пароль" + +#: forum/utils/forms.py:142 +msgid "password is required" +msgstr "пароль обÑзателен" + +#: forum/utils/forms.py:145 +msgid "retype password" +msgstr "введите пароль еще раз" + +#: forum/utils/forms.py:146 +msgid "please, retype your password" +msgstr "пожалуйÑта, повторите Ñвой пароль" + +#: forum/utils/forms.py:147 +msgid "sorry, entered passwords did not match, please try again" +msgstr "к Ñожалению, пароли не Ñовпадают, попробуйте еще раз" + +#: forum/views/commands.py:217 +#, python-format +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "подпиÑка Ñохранена, %(email)s требует проверки, Ñм. %(details_url)s" + +#: forum/views/commands.py:225 +msgid "email update frequency has been set to daily" +msgstr "чаÑтота обновлений по email была уÑтановлена в ежедневную" + +#: forum/views/meta.py:35 +msgid "Q&A forum feedback" +msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑвÑзь" + +#: forum/views/meta.py:36 +msgid "Thanks for the feedback!" +msgstr "СпаÑибо за отзыв!" + +#: forum/views/meta.py:44 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "Мы Ñ Ð½ÐµÑ‚ÐµÑ€Ð¿ÐµÐ½Ð¸ÐµÐ¼ ждем ваших отзывов!" + +#: forum/views/users.py:868 forum/views/users.py:872 +msgid "changes saved" +msgstr "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñохранены" + +#: forum/views/users.py:878 +msgid "email updates canceled" +msgstr "Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ email отменены" + +#: forum/views/users.py:909 +msgid "user profile" +msgstr "профиль пользователÑ" + +#: forum/views/users.py:910 +msgid "user profile overview" +msgstr "обзор Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + +#: forum/views/users.py:917 +msgid "recent user activity" +msgstr "поÑледние данные по активноÑти пользователÑ" + +#: forum/views/users.py:918 +msgid "profile - recent activity" +msgstr "профиль - поÑледние данные по активноÑти" + +#: forum/views/users.py:927 +msgid "profile - responses" +msgstr "профиль - ответы" + +#: forum/views/users.py:935 +msgid "user reputation in the community" +msgstr "карма Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² ÑообщеÑтве" + +#: forum/views/users.py:936 +msgid "profile - user reputation" +msgstr "профиль - карма пользователÑ" + +#: forum/views/users.py:942 +msgid "favorite questions" +msgstr "избранные вопроÑÑ‹" + +#: forum/views/users.py:943 +msgid "users favorite questions" +msgstr "избранные вопроÑÑ‹ пользователей" + +#: forum/views/users.py:944 +msgid "profile - favorite questions" +msgstr "профиль - избранные вопроÑÑ‹" + +#: forum/views/users.py:953 +msgid "profile - votes" +msgstr "профиль - голоÑа" + +#: forum/views/users.py:962 +msgid "profile - email subscriptions" +msgstr "профиль - email подпиÑки" + +#: forum/views/writers.py:69 +msgid "uploading images is limited to users with >60 reputation points" +msgstr "загрузка изображений доÑтупна только пользователÑм Ñ Ñ€ÐµÐ¿ÑƒÑ‚Ð°Ñ†Ð¸ÐµÐ¹ > 60" + +#: forum/views/writers.py:71 +msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" +msgstr "" +"допуÑтимые типы файлов: 'JPG ',' JPEG ',' GIF ',' BMP ',' PNG ',' TIFF'" + +#: forum/views/writers.py:73 +#, python-format +msgid "maximum upload file size is %sK" +msgstr "макÑимальный размер загружаемого файла - %s K" + +#: forum/views/writers.py:75 +#, python-format +msgid "" +"Error uploading file. Please contact the site administrator. Thank you. %s" +msgstr "" +"Ошибка при загрузке файла. ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтрацией Ñайта. " +"СпаÑибо. %s" + +#: forum_modules/authentication/auth.py:27 +msgid "Email Validation" +msgstr "Проверка Email" + +#: forum_modules/authentication/auth.py:38 +msgid "Thank you, your email is now validated." +msgstr "СпаÑибо, Ваш email в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑетÑÑ." + +#: forum_modules/authentication/auth.py:62 +msgid "Your password was changed" +msgstr "Ваш пароль был изменен" + +#: forum_modules/authentication/auth.py:64 +msgid "New password set" +msgstr "УÑтановлен новый пароль" + +#: forum_modules/authentication/auth.py:130 +#, python-format +msgid "Welcome back %s, you are now logged in" +msgstr "С возвращением, %s, вы вошли в ÑиÑтему" + +#: forum_modules/books/urls.py:7 forum_modules/books/urls.py:8 +#: forum_modules/books/urls.py:9 +msgid "books/" +msgstr "books/" + +#: keyedcache/views.py:14 +msgid "Yes" +msgstr "" + +#: keyedcache/views.py:15 +msgid "No" +msgstr "" + +#: keyedcache/views.py:19 +#, fuzzy +msgid "Key to delete" +msgstr "удалÑÑ‚ÑŒ" + +#: keyedcache/views.py:20 +msgid "Include Children?" +msgstr "" + +#: keyedcache/views.py:21 +msgid "Delete all keys?" +msgstr "" + +#: keyedcache/templates/keyedcache/delete.html:6 +#: keyedcache/templates/keyedcache/stats.html:6 +#: keyedcache/templates/keyedcache/view.html:6 +#: livesettings/templates/livesettings/group_settings.html:14 +#: livesettings/templates/livesettings/site_settings.html:26 +#, fuzzy +msgid "Home" +msgstr "главнаÑ" + +#: keyedcache/templates/keyedcache/delete.html:7 +#: keyedcache/templates/keyedcache/view.html:7 +#, fuzzy +msgid "Cache" +msgstr "Отменить" + +#: keyedcache/templates/keyedcache/delete.html:8 +msgid "Cache Delete" +msgstr "" + +#: keyedcache/templates/keyedcache/stats.html:7 +#, fuzzy +msgid "Cache Stats" +msgstr "Измененить Ñ‚Ñги" + +#: keyedcache/templates/keyedcache/view.html:8 +msgid "Cache View" +msgstr "" + +#: livesettings/models.py:101 livesettings/models.py:140 +#, fuzzy +msgid "Site" +msgstr "заголовок" + +#: livesettings/values.py:103 +#, fuzzy +msgid "Base Settings" +msgstr "наÑтройки-аккаунта" + +#: livesettings/values.py:210 +msgid "Default value: \"\"" +msgstr "" + +#: livesettings/values.py:217 +msgid "Default value: " +msgstr "" + +#: livesettings/values.py:220 +#, python-format +msgid "Default value: %s" +msgstr "" + +#: livesettings/templates/livesettings/_admin_site_views.html:4 +#, fuzzy +msgid "Sites" +msgstr "заголовок" + +#: livesettings/templates/livesettings/group_settings.html:11 +#: livesettings/templates/livesettings/site_settings.html:23 +#, fuzzy +msgid "Documentation" +msgstr "МеÑтоположение" + +#: livesettings/templates/livesettings/group_settings.html:11 +#: livesettings/templates/livesettings/site_settings.html:23 +#, fuzzy +msgid "Log out" +msgstr "Выйти" + +#: livesettings/templates/livesettings/group_settings.html:15 +#, fuzzy +msgid "Edit Group Settings" +msgstr "Изменить вопроÑ" + +#: livesettings/templates/livesettings/group_settings.html:22 +#: livesettings/templates/livesettings/site_settings.html:50 +#, fuzzy +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "ПожалуйÑта, иÑправьте ошибки, указанные ниже:" +msgstr[1] "ПожалуйÑта, иÑправьте ошибки, указанные ниже:" +msgstr[2] "ПожалуйÑта, иÑправьте ошибки, указанные ниже:" + +#: livesettings/templates/livesettings/group_settings.html:28 +#, python-format +msgid "Settings included in %(name)s." +msgstr "" + +#: livesettings/templates/livesettings/group_settings.html:62 +#: livesettings/templates/livesettings/site_settings.html:97 +msgid "You don't have permission to edit values." +msgstr "" + +#: livesettings/templates/livesettings/group_settings.html:68 +#, fuzzy +msgid "Setting groups" +msgstr "ÑÐ±Ñ€Ð¾Ñ Ñ‚Ñгов" + +#: livesettings/templates/livesettings/site_settings.html:27 +msgid "Edit Site Settings" +msgstr "" + +#: livesettings/templates/livesettings/site_settings.html:43 +msgid "Livesettings are disabled for this site." +msgstr "" + +#: livesettings/templates/livesettings/site_settings.html:44 +msgid "All configuration options must be edited in the site settings.py file" +msgstr "" + +#: livesettings/templates/livesettings/site_settings.html:66 +#, python-format +msgid "Group settings: %(name)s" +msgstr "" + +#: livesettings/templates/livesettings/site_settings.html:93 +msgid "Uncollapse all" +msgstr "" + +#~ msgid "please login" +#~ msgstr "пожалуйÑта, выполнить вход" + +#~ msgid "books" +#~ msgstr "книги" + +#~ msgid "unanswered questions" +#~ msgstr "неотвеченные вопроÑÑ‹" + +#~ msgid "general message about privacy" +#~ msgstr "общее мнение о конфиденциальноÑти" + +#~ msgid "Site Visitors" +#~ msgstr "ПоÑетителÑм Ñайта" + +#~ msgid "what technical information is collected about visitors" +#~ msgstr "ÐºÐ°ÐºÐ°Ñ Ñ‚ÐµÑ…Ð½Ð¸Ñ‡ÐµÑÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÑобираетÑÑ Ð¾ поÑетителÑÑ…" + +#~ msgid "Personal Information" +#~ msgstr "ПерÑÐ¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" + +#~ msgid "details on personal information policies" +#~ msgstr "ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ личной информационной политики" + +#~ msgid "Other Services" +#~ msgstr "Прочие уÑлуги" + +#~ msgid "details on sharing data with third parties" +#~ msgstr "Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± обмене данными Ñ Ñ‚Ñ€ÐµÑ‚ÑŒÐ¸Ð¼Ð¸ Ñторонами" + +#~ msgid "Policy Changes" +#~ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ¸" + +#~ msgid "how privacy policies can be changed" +#~ msgstr "как политики конфиденциальноÑти могут быть изменены" + +#~ msgid " One question found" +#~ msgid_plural "%(q_num)s questions found" +#~ msgstr[0] "Ðайден один Ð²Ð¾Ð¿Ñ€Ð¾Ñ " +#~ msgstr[1] "Ðайдено %(q_num)s вопроÑа" +#~ msgstr[2] "Ðайдено %(q_num)s вопроÑов" + +#~ msgid "one revision" +#~ msgid_plural "%(rev_count)s revisions" +#~ msgstr[0] "одна верÑиÑ" +#~ msgstr[1] "%(rev_count)s верÑии правки" +#~ msgstr[2] "%(rev_count)s верÑий правки" + +#~ msgid "nimda/" +#~ msgstr "админиÑтрациÑ/" + +#~ msgid "The users have been awarded with badges:" +#~ msgstr "Ðаграды, приÑужденные пользователÑм:" + +#~ msgid "Your account email" +#~ msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты ÑвÑзанный Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð¾Ð¼" + +#~ msgid "You cannot leave this field blank" +#~ msgstr "Это необходимо заполнить" + +#~ msgid "Sorry, but this email is not on our database." +#~ msgstr "Извините, но Ñтого адреÑа нет в нашей базе данных." + +#~ msgid "no OSQA community email please, thanks" +#~ msgstr "ÑпаÑибо, но Ñлектронной почты не надо" + +#~ msgid "These login credentials are already associated with your account." +#~ msgstr "Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÑƒÐ¶Ðµ аÑÑоциирована Ñ Ð’Ð°ÑˆÐµÐ¹ учетной запиÑью." + +#~ msgid "The new credentials are now associated with your account" +#~ msgstr "ÐÐ¾Ð²Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° в Вашу учетную запиÑÑŒ" diff --git a/askbot/locale/sr/LC_MESSAGES/django.mo b/askbot/locale/sr/LC_MESSAGES/django.mo new file mode 100644 index 00000000..bdc63f43 Binary files /dev/null and b/askbot/locale/sr/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/sr/LC_MESSAGES/django.po b/askbot/locale/sr/LC_MESSAGES/django.po new file mode 100644 index 00000000..d4980ec9 --- /dev/null +++ b/askbot/locale/sr/LC_MESSAGES/django.po @@ -0,0 +1,4213 @@ +# Serbian translation for Askbot. +# Copyright (C) 2009 Gang Chen, 2010 Askbot +# This file is distributed under the same license as the Askbot package. +# Aleksandar, 2010 +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-09 19:42-0400\n" +"PO-Revision-Date: 2010-05-07 02:52\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\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" + +#: django_authopenid/forms.py:71 django_authopenid/views.py:132 +msgid "i-names are not supported" +msgstr "i-names ниÑу подржанa" + +#: django_authopenid/forms.py:134 +msgid "Account with this name already exists on the forum" +msgstr "Ðалог Ñа овим именом већ поÑтоји на форуму" + +#: django_authopenid/forms.py:135 +msgid "can't have two logins to the same account yet, sorry." +msgstr "не можете имати два начина пријаве за иÑти налог." + +#: django_authopenid/forms.py:157 +msgid "Please enter valid username and password (both are case-sensitive)." +msgstr "" +"Молимо Ð’Ð°Ñ Ð´Ð° унеÑете валидно кориÑничко име и шифру (оба поља Ñу оÑетљива " +"на мала и велика Ñлова)." + +#: django_authopenid/forms.py:160 django_authopenid/forms.py:210 +msgid "This account is inactive." +msgstr "Овај налог је неактиван." + +#: django_authopenid/forms.py:162 +msgid "Login failed." +msgstr "Пријављивање није уÑпело." + +#: django_authopenid/forms.py:164 +msgid "Please enter username and password" +msgstr "Молимо Ð’Ð°Ñ Ð´Ð° унеÑете кориÑничко име и шифру" + +#: django_authopenid/forms.py:166 +msgid "Please enter your password" +msgstr "Молимо Ð’Ð°Ñ Ð´Ð° унеÑете шифру" + +#: django_authopenid/forms.py:168 +msgid "Please enter user name" +msgstr "Молимо Ð’Ð°Ñ Ð´Ð° унеÑете кориÑничко име" + +#: django_authopenid/forms.py:206 +msgid "" +"Please enter a valid username and password. Note that " +"both fields are case-sensitive." +msgstr "" +"Молимо Ð’Ð°Ñ Ð´Ð° унеÑете важеће кориÑничко име и шифру. Имајте на уму да Ñу оба " +"поља оÑетљива на мала и велика Ñлова." + +#: django_authopenid/forms.py:229 +msgid "Current password" +msgstr "Тренутна шифра" + +#: django_authopenid/forms.py:240 +msgid "" +"Old password is incorrect. Please enter the correct " +"password." +msgstr "Стара шифра није иÑправна. Молимо Ð’Ð°Ñ Ð´Ð° унеÑете иÑправну шифру." + +#: django_authopenid/forms.py:305 +msgid "Your user name (required)" +msgstr "Ваше кориÑничко име (обавезно)" + +#: django_authopenid/forms.py:320 +msgid "Incorrect username." +msgstr "Погрешно кориÑничко име." + +#: django_authopenid/urls.py:23 django_authopenid/urls.py:24 +#: django_authopenid/urls.py:25 django_authopenid/urls.py:27 +#: fbconnect/urls.py:12 fbconnect/urls.py:13 fbconnect/urls.py:14 +msgid "signin/" +msgstr "пријава/" + +#: django_authopenid/urls.py:24 fbconnect/urls.py:13 fbconnect/urls.py:17 +msgid "newquestion/" +msgstr "новопитање/" + +#: django_authopenid/urls.py:25 fbconnect/urls.py:14 fbconnect/urls.py:18 +msgid "newanswer/" +msgstr "новиодговор/" + +#: django_authopenid/urls.py:26 +msgid "signout/" +msgstr "одјава/" + +#: django_authopenid/urls.py:27 +msgid "complete/" +msgstr "complete/" + +#: django_authopenid/urls.py:29 fbconnect/urls.py:16 fbconnect/urls.py:17 +#: fbconnect/urls.py:18 +msgid "register/" +msgstr "register/" + +#: django_authopenid/urls.py:30 +msgid "signup/" +msgstr "signup/" + +#: django_authopenid/urls.py:32 +#, fuzzy +msgid "sendpw/" +msgstr "sendpassword/" + +#: django_authopenid/urls.py:33 django_authopenid/urls.py:37 +msgid "password/" +msgstr "шифра/" + +#: django_authopenid/urls.py:33 +msgid "confirm/" +msgstr "потврди/" + +#: django_authopenid/urls.py:38 django_authopenid/urls.py:39 +#: django_authopenid/urls.py:40 django_authopenid/urls.py:41 +msgid "email/" +msgstr "е-пошта/" + +#: django_authopenid/urls.py:38 +msgid "validate/" +msgstr "validate/" + +#: django_authopenid/urls.py:39 +msgid "change/" +msgstr "change/" + +#: django_authopenid/urls.py:40 +msgid "sendkey/" +msgstr "sendkey/" + +#: django_authopenid/urls.py:41 +#, fuzzy +msgid "verify/" +msgstr "провери/" + +#: django_authopenid/urls.py:42 +msgid "openid/" +msgstr "openid/" + +#: django_authopenid/urls.py:43 forum/urls.py:52 forum/urls.py:56 +msgid "delete/" +msgstr "избриши/" + +#: django_authopenid/urls.py:51 +msgid "external-login/forgot-password/" +msgstr "екÑтерна-пријава/заборављена-шифра/" + +#: django_authopenid/urls.py:54 +msgid "external-login/signup/" +msgstr "external-login/signup/" + +#: django_authopenid/views.py:139 +#, python-format +msgid "OpenID %(openid_url)s is invalid" +msgstr "OpenID %(openid_url)s није иÑправан" + +#: django_authopenid/views.py:614 +msgid "Welcome email subject line" +msgstr "Добродошли на П&О форум" + +#: django_authopenid/views.py:720 +msgid "Password changed." +msgstr "Шифра је промењена." + +#: django_authopenid/views.py:732 django_authopenid/views.py:738 +#, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" +"Your email needs to be validated. Please see details here." + +#: django_authopenid/views.py:759 +msgid "Email verification subject line" +msgstr "П&О форум / Верификација е-поште" + +#: django_authopenid/views.py:850 +msgid "your email was not changed" +msgstr "Ваша е-пошта није промењена" + +#: django_authopenid/views.py:898 django_authopenid/views.py:1056 +#, python-format +msgid "No OpenID %s found associated in our database" +msgstr "Унети OpenID %s, није пронађен у нашој бази." + +#: django_authopenid/views.py:902 django_authopenid/views.py:1063 +#, python-format +msgid "The OpenID %s isn't associated to current user logged in" +msgstr "%s OpenID није повезан Ñа тренутно пријављеним кориÑником." + +#: django_authopenid/views.py:910 +msgid "Email Changed." +msgstr "Е-пошта је промењена." + +#: django_authopenid/views.py:988 +msgid "This OpenID is already associated with another account." +msgstr "Овај OpenID је већ повезан Ñа другим налогом." + +#: django_authopenid/views.py:993 +#, python-format +msgid "OpenID %s is now associated with your account." +msgstr "OpenID %s је Ñада повезан Ñа Вашим налогом." + +#: django_authopenid/views.py:1066 +msgid "Account deleted." +msgstr "Ðалог је избриÑан." + +#: django_authopenid/views.py:1118 +msgid "Request for new password" +msgstr "Захтев за нову шифру" + +#: django_authopenid/views.py:1132 +msgid "A new password and the activation link were sent to your email address." +msgstr "Ðова шифра и активациони линк поÑлати Ñу на вашу адреÑу." + +#: django_authopenid/views.py:1164 +#, python-format +msgid "" +"Could not change password. Confirmation key '%s' is not " +"registered." +msgstr "Шифра није промењена. Потврдни кључ ' %s' није региÑтрован." + +#: django_authopenid/views.py:1174 +msgid "" +"Can not change password. User don't exist anymore in our " +"database." +msgstr "Шифра није промењена. КориÑник више не поÑтоје у нашој бази." + +#: django_authopenid/views.py:1184 +#, python-format +msgid "Password changed for %s. You may now sign in." +msgstr "Шифра за %s је промењена. Сада можете да Ñе пријавите." + +#: forum/auth.py:505 +msgid "Your question and all of it's answers have been deleted" +msgstr "Ваше питање и Ñви одговори на њега Ñу избриÑани" + +#: forum/auth.py:507 +msgid "Your question has been deleted" +msgstr "Ваше питање је избриÑано" + +#: forum/auth.py:510 +msgid "The question and all of it's answers have been deleted" +msgstr "Питање и Ñви одговори на њега Ñу избриÑани" + +#: forum/auth.py:512 +msgid "The question has been deleted" +msgstr "Питање је избриÑано" + +#: forum/const.py:8 +msgid "duplicate question" +msgstr "дупликат питање" + +#: forum/const.py:9 +msgid "question is off-topic or not relevant" +msgstr "питање Ñе одаљило од теме или није релевантно" + +#: forum/const.py:10 +msgid "too subjective and argumentative" +msgstr "превише Ñубјективно и полемичко" + +#: forum/const.py:11 +msgid "not a real question" +msgstr "у Ñуштини није питање" + +#: forum/const.py:12 +msgid "the question is answered, right answer was accepted" +msgstr "питање је одговорено, прави одговор је прихваћен" + +#: forum/const.py:13 +msgid "question is not relevant or outdated" +msgstr "питање није релевантно или је заÑтарело" + +#: forum/const.py:14 +msgid "question contains offensive or malicious remarks" +msgstr "питање Ñадржи увредљиве или злонамерне примедбе" + +#: forum/const.py:15 +msgid "spam or advertising" +msgstr "Ñпам или реклама" + +#: forum/const.py:16 +msgid "too localized" +msgstr "превише локализовано" + +#: forum/const.py:37 forum/skins/default/templates/questions.html:70 +#: forum/skins/default/templates/questions.html:75 +msgid "newest" +msgstr "најновија" + +#: forum/const.py:38 forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/users.html:28 +msgid "oldest" +msgstr "Ñтари" + +#: forum/const.py:39 forum/skins/default/templates/questions.html:89 +#: forum/skins/default/templates/questions.html:94 +msgid "active" +msgstr "активна" + +#: forum/const.py:40 forum/skins/default/templates/questions.html:83 +msgid "inactive" +msgstr "не активнa" + +#: forum/const.py:41 +msgid "hottest" +msgstr "hottest" + +#: forum/const.py:42 +msgid "coldest" +msgstr "coldest" + +#: forum/const.py:43 +msgid "most voted" +msgstr "Ñа највише глаÑова" + +#: forum/const.py:44 +msgid "least voted" +msgstr "Ñа најмање глаÑова" + +#: forum/const.py:45 +msgid "relevance" +msgstr "релевантноÑти" + +#: forum/const.py:52 forum/skins/default/templates/questions.html:52 +msgid "all" +msgstr "Ñвa" + +#: forum/const.py:53 forum/skins/default/templates/questions.html:53 +msgid "unanswered" +msgstr "неодговорена" + +#: forum/const.py:54 forum/skins/default/templates/questions.html:55 +msgid "favorite" +msgstr "омиљена" + +#: forum/const.py:97 +msgid "question" +msgstr "питање" + +#: forum/const.py:98 forum/skins/default/templates/book.html:110 +msgid "answer" +msgstr "одговор" + +#: forum/const.py:99 +msgid "commented question" +msgstr "коментариÑано питање" + +#: forum/const.py:100 +msgid "commented answer" +msgstr "коментариÑан одговор" + +#: forum/const.py:101 +msgid "edited question" +msgstr "измењено питање" + +#: forum/const.py:102 +msgid "edited answer" +msgstr "измењен одговор" + +#: forum/const.py:103 +msgid "received award" +msgstr "примљен беџ" + +#: forum/const.py:104 +msgid "marked best answer" +msgstr "означен најбољи одговор" + +#: forum/const.py:105 +#, fuzzy +msgid "upvoted" +msgstr "upvoted" + +#: forum/const.py:106 +#, fuzzy +msgid "downvoted" +msgstr "downvoted" + +#: forum/const.py:107 +msgid "canceled vote" +msgstr "глаÑање је отказано" + +#: forum/const.py:108 +msgid "deleted question" +msgstr "обриÑано питање" + +#: forum/const.py:109 +msgid "deleted answer" +msgstr "обриÑан одговор" + +#: forum/const.py:110 +msgid "marked offensive" +msgstr "означено увредљивим" + +#: forum/const.py:111 +msgid "updated tags" +msgstr "ажуриране ознаке" + +#: forum/const.py:112 +msgid "selected favorite" +msgstr "" + +#: forum/const.py:113 +msgid "completed user profile" +msgstr "" + +#: forum/const.py:114 +msgid "email update sent to user" +msgstr "ажурирање је поÑлато на кориÑникову е-пошту" + +#: forum/const.py:118 +msgid "question_answered" +msgstr "одговорено питање" + +#: forum/const.py:119 +msgid "question_commented" +msgstr "коментариÑано питање" + +#: forum/const.py:120 +#, fuzzy +msgid "answer_commented" +msgstr "одговор коментариÑао" + +#: forum/const.py:121 +msgid "answer_accepted" +msgstr "прихваћен одговор" + +#: forum/const.py:125 +msgid "[closed]" +msgstr "[затворено]" + +#: forum/const.py:126 +msgid "[deleted]" +msgstr "[обриÑано]" + +#: forum/const.py:127 forum/views/readers.py:396 forum/views/readers.py:417 +msgid "initial version" +msgstr "почетна верзија" + +#: forum/const.py:128 +#, fuzzy +msgid "retagged" +msgstr "ретаговано" + +#: forum/const.py:132 +msgid "exclude ignored tags" +msgstr "занемари игнориÑане ознаке" + +#: forum/const.py:132 +msgid "allow only selected tags" +msgstr "дозволи Ñамо изабране тагове" + +#: forum/feed.py:18 +msgid " - " +msgstr "" + +#: forum/feed.py:18 +msgid "latest questions" +msgstr "најновија питања" + +#: forum/forms.py:23 forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "title" +msgstr "наÑлов" + +#: forum/forms.py:24 +msgid "please enter a descriptive title for your question" +msgstr "молимо ВаÑ, унеÑтите јаÑан наÑлов за Ваше питање" + +#: forum/forms.py:29 +msgid "title must be > 10 characters" +msgstr "наÑлов мора имати > 10 карактера" + +#: forum/forms.py:38 +msgid "content" +msgstr "Ñадржај" + +#: forum/forms.py:44 +msgid "question content must be > 10 characters" +msgstr "Ñадржај питања мора имати > 10 карактера" + +#: forum/forms.py:53 forum/skins/default/templates/header.html:28 +msgid "tags" +msgstr "ознаке" + +#: forum/forms.py:55 +msgid "" +"Tags are short keywords, with no spaces within. Up to five tags can be used." +msgstr "Ознаке Ñу кратке речи, без размака. Можете унети до 5 ознака." + +#: forum/forms.py:62 forum/skins/default/templates/question_retag.html:39 +msgid "tags are required" +msgstr "ознаке Ñу обавезне" + +#: forum/forms.py:70 +#, python-format +msgid "please use %(tag_count)d tag or less" +msgid_plural "please use %(tag_count)d tags or less" +msgstr[0] "кориÑтите %(tag_count)d ознаку или мање" +msgstr[1] "кориÑтите %(tag_count)d ознака или мање" +msgstr[2] "" + +#: forum/forms.py:79 +#, python-format +msgid "each tag must be shorter than %(max_chars)d character" +msgid_plural "each tag must be shorter than %(max_chars)d characters" +msgstr[0] "Ñвака ознака мора имати мање од %(max_chars)d карактера" +msgstr[1] "Ñвака ознака мора имати мање од %(max_chars)d карактера" +msgstr[2] "" + +#: forum/forms.py:87 +msgid "use-these-chars-in-tags" +msgstr "кориÑтите-ове-каратере-у-ознакама" + +#: forum/forms.py:97 +#: forum/skins/default/templates/post_contributor_info.html:7 +#: forum/skins/default/templates/question_summary_list_roll.html:26 +#: forum/skins/default/templates/question_summary_list_roll.html:38 +msgid "community wiki" +msgstr "вики" + +#: forum/forms.py:98 +msgid "" +"if you choose community wiki option, the question and answer do not generate " +"points and name of author will not be shown" +msgstr "" +"уколико одаберете вики опцију, питање и одговор не доноÑе поене; име аутора " +"Ñе не приказује" + +#: forum/forms.py:114 +msgid "update summary:" +msgstr "ажурирање резимеа:" + +#: forum/forms.py:115 +msgid "" +"enter a brief summary of your revision (e.g. fixed spelling, grammar, " +"improved style, this field is optional)" +msgstr "" +"унеÑите кратко објашњење Ваше измене (нпр. правопиÑ, граматика, побољшање " +"Ñтила, ово поље није обавезно)" + +#: forum/forms.py:118 +msgid "Automatically accept user's contributions for the email updates" +msgstr "" + +#: forum/forms.py:209 +msgid "Your name:" +msgstr "Ваше име:" + +#: forum/forms.py:210 +msgid "Email (not shared with anyone):" +msgstr "Е-пошта:" + +#: forum/forms.py:211 +msgid "Your message:" +msgstr "Ваша порука:" + +#: forum/forms.py:294 +msgid "this email does not have to be linked to gravatar" +msgstr "ова е-пошта не мора бити повезана Ñа gravatar-ом" + +#: forum/forms.py:296 +msgid "Screen name" +msgstr "КориÑничко име" + +#: forum/forms.py:297 +msgid "Real name" +msgstr "Право име" + +#: forum/forms.py:298 +msgid "Website" +msgstr "ВебÑајт" + +#: forum/forms.py:299 +msgid "Location" +msgstr "Локација" + +#: forum/forms.py:300 +msgid "Date of birth" +msgstr "Датум рођења" + +#: forum/forms.py:300 +msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" +msgstr "" +"неће бити приказано, кориÑти Ñе за израчунавање ваших година, формат: ГГГГ-" +"ММ-ДД" + +#: forum/forms.py:301 forum/skins/default/templates/account_settings.html:21 +#: forum/skins/default/templates/authopenid/settings.html:21 +msgid "Profile" +msgstr "Профил" + +#: forum/forms.py:332 forum/forms.py:333 +msgid "this email has already been registered, please use another one" +msgstr "ова е-пошта је већ региÑтрована, молимо Ð’Ð°Ñ ÑƒÐ½ÐµÑите другу" + +#: forum/forms.py:339 +msgid "Choose email tag filter" +msgstr "" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "weekly" +msgstr "недељно" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "no email" +msgstr "" + +#: forum/forms.py:356 +msgid "daily" +msgstr "дневно" + +#: forum/forms.py:371 +msgid "Asked by me" +msgstr "" + +#: forum/forms.py:374 +msgid "Answered by me" +msgstr "" + +#: forum/forms.py:377 +msgid "Individually selected" +msgstr "Појединачно одабрани" + +#: forum/forms.py:380 +msgid "Entire forum (tag filtered)" +msgstr "Цео форум (ознака филтрирана)" + +#: forum/forms.py:434 +msgid "okay, let's try!" +msgstr "У реду, хајде да покушамо!" + +#: forum/forms.py:435 +msgid "no community email please, thanks" +msgstr "молимо Ð’Ð°Ñ Ð±ÐµÐ· askbot е-поште, хвала" + +#: forum/forms.py:438 +msgid "please choose one of the options above" +msgstr "молимо Ð’Ð°Ñ Ð¸Ð·Ð°Ð±ÐµÑ€ÐµÑ‚Ðµ једну од опција изнад" + +#: forum/urls.py:28 +msgid "upfiles/" +msgstr "upfiles/" + +#: forum/urls.py:33 +msgid "about/" +msgstr "онама/" + +#: forum/urls.py:34 +msgid "faq/" +msgstr "чпп/" + +#: forum/urls.py:35 +msgid "privacy/" +msgstr "приватноÑÑ‚/" + +#: forum/urls.py:36 +msgid "logout/" +msgstr "одјава/" + +#: forum/urls.py:37 forum/urls.py:38 forum/urls.py:39 forum/urls.py:56 +msgid "answers/" +msgstr "одговори/" + +#: forum/urls.py:37 forum/urls.py:49 forum/urls.py:52 forum/urls.py:56 +msgid "comments/" +msgstr "коментари/" + +#: forum/urls.py:38 forum/urls.py:43 forum/urls.py:78 +#: forum/skins/default/templates/user_info.html:47 +msgid "edit/" +msgstr "уреди/" + +#: forum/urls.py:39 forum/urls.py:48 +msgid "revisions/" +msgstr "ревизије/" + +#: forum/urls.py:40 forum/urls.py:41 forum/urls.py:42 forum/urls.py:43 +#: forum/urls.py:44 forum/urls.py:45 forum/urls.py:46 forum/urls.py:47 +#: forum/urls.py:48 forum/urls.py:49 forum/urls.py:52 +msgid "questions/" +msgstr "питања/" + +#: forum/urls.py:41 forum_modules/books/urls.py:8 +msgid "ask/" +msgstr "питај/" + +#: forum/urls.py:42 +msgid "unanswered/" +msgstr "неодговорени/" + +#: forum/urls.py:44 +msgid "close/" +msgstr "затвори/" + +#: forum/urls.py:45 +msgid "reopen/" +msgstr "отворипоново/" + +#: forum/urls.py:46 +msgid "answer/" +msgstr "одговор/" + +#: forum/urls.py:47 +msgid "vote/" +msgstr "глаÑај/" + +#: forum/urls.py:50 +msgid "command/" +msgstr "command/" + +#: forum/urls.py:60 forum/views/readers.py:265 +msgid "question/" +msgstr "питање/" + +#: forum/urls.py:61 forum/urls.py:62 +msgid "tags/" +msgstr "ознаке/" + +#: forum/urls.py:64 forum/urls.py:68 +msgid "mark-tag/" +msgstr "означи-ознаку/" + +#: forum/urls.py:64 +msgid "interesting/" +msgstr "занимљиво/" + +#: forum/urls.py:68 +msgid "ignored/" +msgstr "игнориÑано/" + +#: forum/urls.py:72 +msgid "unmark-tag/" +msgstr "unmark-tag/" + +#: forum/urls.py:76 forum/urls.py:78 forum/urls.py:79 +msgid "users/" +msgstr "кориÑници/" + +#: forum/urls.py:77 +msgid "moderate-user/" +msgstr "moderate-user/" + +#: forum/urls.py:80 forum/urls.py:81 +msgid "badges/" +msgstr "беџеви/" + +#: forum/urls.py:82 +msgid "messages/" +msgstr "поруке/" + +#: forum/urls.py:82 +msgid "markread/" +msgstr "означипрочитано/" + +#: forum/urls.py:84 +#, fuzzy +msgid "nimda/" +msgstr "openid/" + +#: forum/urls.py:86 +msgid "upload/" +msgstr "upload/" + +#: forum/urls.py:87 +msgid "search/" +msgstr "претрага/" + +#: forum/urls.py:88 +msgid "feedback/" +msgstr "ÑугеÑтија/" + +#: forum/urls.py:89 forum/urls.py:90 +#, fuzzy +msgid "account/" +msgstr "онама/" + +#: forum/importers/stackexchange/management/commands/load_stackexchange.py:124 +msgid "Congratulations, you are now an Administrator" +msgstr "ЧеÑтитамо, Ñада Ñте админиÑтратор" + +#: forum/management/commands/send_email_alerts.py:236 +msgid "email update message subject" +msgstr "новоÑти од П&О форума" + +#: forum/management/commands/send_email_alerts.py:238 +#, fuzzy, python-format +msgid "%(name)s, this is an update message header for %(num)d question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "

%(name)s,

Следеће питање је ажурирано на П&О форуму:

" +msgstr[1] "" +"

%(name)s,

Следећих %(num)d питања је ажурирано на П&О форуму:

" +msgstr[2] "" + +#: forum/management/commands/send_email_alerts.py:255 +msgid "new question" +msgstr "ново питање" + +#: forum/management/commands/send_email_alerts.py:272 +msgid "" +"Please visit the forum and see what's new! Could you spread the word about " +"it - can somebody you know help answering those questions or benefit from " +"posting one?" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:284 +msgid "" +"Your most frequent subscription setting is 'daily' on selected questions. If " +"you are receiving more than one email per dayplease tell about this issue to " +"the forum administrator." +msgstr "" + +#: forum/management/commands/send_email_alerts.py:290 +msgid "" +"Your most frequent subscription setting is 'weekly' if you are receiving " +"this email more than once a week please report this issue to the forum " +"administrator." +msgstr "" + +#: forum/management/commands/send_email_alerts.py:296 +msgid "" +"There is a chance that you may be receiving links seen before - due to a " +"technicality that will eventually go away. " +msgstr "" + +#: forum/management/commands/send_email_alerts.py:311 +#, python-format +msgid "" +"go to %(link)s to change frequency of email updates or %(email)s " +"administrator" +msgstr "" +"

Please remember that you can always adjust " +"frequency of the email updates or turn them off entirely.
If you believe " +"that this message was sent in an error, please email about it the forum " +"administrator at %(email)s.

Sincerely,

Your friendly Q&A forum " +"server.

" + +#: forum/middleware/anon_user.py:34 +#, python-format +msgid "First time here? Check out the FAQ!" +msgstr "Први пут Ñте овде? Погледајте ЧПП!" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Disciplined" +msgstr "ДиÑциплинован" + +#: forum/migrations/0005_install_badges.py:10 +msgid "disciplined" +msgstr "диÑциплинован" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Deleted own post with score of 3 or higher" +msgstr "ОбриÑао ÑопÑтвени поÑÑ‚ Ñа резултатом од 3 или више" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Peer Pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "peer-pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Deleted own post with score of -3 or lower" +msgstr "ОбриÑао ÑопÑтвени поÑÑ‚ Ñа резултатом од -3 или мање" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Nice answer" +msgstr "КориÑтан одговор" + +#: forum/migrations/0005_install_badges.py:12 +msgid "nice-answer" +msgstr "кориÑтан-одговор" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Answer voted up 10 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Nice Question" +msgstr "Добро питање" + +#: forum/migrations/0005_install_badges.py:13 +msgid "nice-question" +msgstr "добро-питање" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Question voted up 10 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Pundit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "pundit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +#, fuzzy +msgid "Left 10 comments with score of 10 or more" +msgstr "ÐапиÑао/ла 10 коментара Ñа резултатом од 10 или више" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Popular Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "popular-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Asked a question with 1,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "Citizen patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "citizen-patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "First flagged post" +msgstr "Први означени поÑÑ‚" + +#: forum/migrations/0005_install_badges.py:17 +msgid "Cleanup" +msgstr "Чишћење" + +#: forum/migrations/0005_install_badges.py:17 +msgid "cleanup" +msgstr "чишћење" + +#: forum/migrations/0005_install_badges.py:17 +msgid "First rollback" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "Critic" +msgstr "Критичар" + +#: forum/migrations/0005_install_badges.py:18 +msgid "critic" +msgstr "критичар" + +#: forum/migrations/0005_install_badges.py:18 +msgid "First down vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "Editor" +msgstr "Уредник" + +#: forum/migrations/0005_install_badges.py:19 +msgid "editor" +msgstr "уредник" + +#: forum/migrations/0005_install_badges.py:19 +msgid "First edit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "Organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "First retag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "Scholar" +msgstr "Ученик" + +#: forum/migrations/0005_install_badges.py:21 +msgid "scholar" +msgstr "ученик" + +#: forum/migrations/0005_install_badges.py:21 +msgid "First accepted answer on your own question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Student" +msgstr "Студент" + +#: forum/migrations/0005_install_badges.py:22 +msgid "student" +msgstr "Ñтудент" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Asked first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "Supporter" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "supporter" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "First up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Teacher" +msgstr "ÐаÑтавник" + +#: forum/migrations/0005_install_badges.py:24 +msgid "teacher" +msgstr "наÑтавник" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Answered first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Autobiographer" +msgstr "Ðутобиограф" + +#: forum/migrations/0005_install_badges.py:25 +msgid "autobiographer" +msgstr "аутобиограф" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Completed all user profile fields" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Self-Learner" +msgstr "Самоук" + +#: forum/migrations/0005_install_badges.py:26 +msgid "self-learner" +msgstr "Ñамоук" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Answered your own question with at least 3 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Great Answer" +msgstr "Савршен Одговор" + +#: forum/migrations/0005_install_badges.py:27 +msgid "great-answer" +msgstr "Ñавршен-одговор" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Answer voted up 100 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Great Question" +msgstr "Добро Питање" + +#: forum/migrations/0005_install_badges.py:28 +msgid "great-question" +msgstr "добро-питање" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Question voted up 100 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Stellar Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "stellar-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Question favorited by 100 users" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Famous question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "famous-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Asked a question with 10,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Actively participated in the private alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Good Answer" +msgstr "Добар Одговор" + +#: forum/migrations/0005_install_badges.py:32 +msgid "good-answer" +msgstr "добар-одговор" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Answer voted up 25 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Good Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "good-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Question voted up 25 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Favorite Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "favorite-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Question favorited by 25 users" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Civic duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "civic-duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Voted 300 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Strunk & White" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "strunk-and-white" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Edited 100 entries" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Active in many different tags" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Expert" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +#, fuzzy +msgid "expert" +msgstr "текÑÑ‚" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Very active in one tag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Active member for a year" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Notable Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "notable-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Asked a question with 2,500 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "Enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "First answer was accepted with at least 10 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Actively participated in the private beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Accepted answer and voted up 40 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Answered a question more than 60 days later with at least 5 votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Created a tag used by 50 questions" +msgstr "" + +#: forum/models/question.py:499 +#, python-format +msgid "%(author)s modified the question" +msgstr "" + +#: forum/models/question.py:503 +#, python-format +msgid "%(people)s posted %(new_answer_count)s new answers" +msgstr "" + +#: forum/models/question.py:508 +#, python-format +msgid "%(people)s commented the question" +msgstr "" + +#: forum/models/question.py:513 +#, python-format +msgid "%(people)s commented answers" +msgstr "" + +#: forum/models/question.py:515 +#, python-format +msgid "%(people)s commented an answer" +msgstr "" + +#: forum/models/repute.py:13 forum/skins/default/templates/badges.html:54 +msgid "gold" +msgstr "злато" + +#: forum/models/repute.py:14 forum/skins/default/templates/badges.html:62 +msgid "silver" +msgstr "Ñребро" + +#: forum/models/repute.py:15 forum/skins/default/templates/badges.html:69 +msgid "bronze" +msgstr "бронза" + +#: forum/models/tag.py:81 +msgid "interesting" +msgstr "" + +#: forum/models/tag.py:81 +msgid "ignored" +msgstr "" + +#: forum/models/user.py:36 +msgid "Entire forum" +msgstr "" + +#: forum/models/user.py:37 +msgid "Questions that I asked" +msgstr "Питања која Ñте поÑтавили" + +#: forum/models/user.py:38 +msgid "Questions that I answered" +msgstr "Питања на која Ñте одговорили" + +#: forum/models/user.py:39 +msgid "Individually selected questions" +msgstr "" + +#: forum/models/user.py:42 +msgid "Weekly" +msgstr "" + +#: forum/models/user.py:43 +msgid "Daily" +msgstr "" + +#: forum/models/user.py:44 +msgid "No email" +msgstr "" + +#: forum/skins/default/templates/404.html:24 +msgid "Sorry, could not find the page you requested." +msgstr "ÐажалоÑÑ‚, Ñтраница коју Ñте тражили није пронађена." + +#: forum/skins/default/templates/404.html:26 +msgid "This might have happened for the following reasons:" +msgstr "" + +#: forum/skins/default/templates/404.html:28 +msgid "this question or answer has been deleted;" +msgstr "ово питање или одговор је избриÑано;" + +#: forum/skins/default/templates/404.html:29 +msgid "url has error - please check it;" +msgstr "" + +#: forum/skins/default/templates/404.html:30 +msgid "" +"the page you tried to visit is protected or you don't have sufficient " +"points, see" +msgstr "" + +#: forum/skins/default/templates/404.html:31 +msgid "if you believe this error 404 should not have occured, please" +msgstr "" + +#: forum/skins/default/templates/404.html:32 +msgid "report this problem" +msgstr "" + +#: forum/skins/default/templates/404.html:41 +#: forum/skins/default/templates/500.html:27 +msgid "back to previous page" +msgstr "назад на предходну Ñтрану" + +#: forum/skins/default/templates/404.html:42 +#: forum/skins/default/templates/questions.html:52 +msgid "see all questions" +msgstr "" + +#: forum/skins/default/templates/404.html:43 +msgid "see all tags" +msgstr "" + +#: forum/skins/default/templates/500.html:22 +msgid "sorry, system error" +msgstr "" + +#: forum/skins/default/templates/500.html:24 +msgid "system error log is recorded, error will be fixed as soon as possible" +msgstr "" + +#: forum/skins/default/templates/500.html:25 +msgid "please report the error to the site administrators if you wish" +msgstr "" + +#: forum/skins/default/templates/500.html:28 +msgid "see latest questions" +msgstr "" + +#: forum/skins/default/templates/500.html:29 +msgid "see tags" +msgstr "" + +#: forum/skins/default/templates/about.html:6 +#: forum/skins/default/templates/about.html:11 +msgid "About" +msgstr "O нама" + +#: forum/skins/default/templates/account_settings.html:4 +#: forum/skins/default/templates/authopenid/settings.html:4 +msgid "Account functions" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:29 +#: forum/skins/default/templates/authopenid/changepw.html:5 +#: forum/skins/default/templates/authopenid/changepw.html:14 +#: forum/skins/default/templates/authopenid/settings.html:29 +msgid "Change password" +msgstr "Промени шифру" + +#: forum/skins/default/templates/account_settings.html:30 +#: forum/skins/default/templates/authopenid/settings.html:30 +msgid "Give your account a new password." +msgstr "" + +#: forum/skins/default/templates/account_settings.html:32 +#: forum/skins/default/templates/authopenid/settings.html:31 +msgid "Change email " +msgstr "Промени е-пошту" + +#: forum/skins/default/templates/account_settings.html:33 +#: forum/skins/default/templates/authopenid/settings.html:32 +msgid "Add or update the email address associated with your account." +msgstr "" + +#: forum/skins/default/templates/account_settings.html:35 +#: forum/skins/default/templates/authopenid/changeopenid.html:4 +#: forum/skins/default/templates/authopenid/changeopenid.html:30 +#: forum/skins/default/templates/authopenid/settings.html:34 +msgid "Change OpenID" +msgstr "Промени OpenID" + +#: forum/skins/default/templates/account_settings.html:36 +#: forum/skins/default/templates/authopenid/settings.html:35 +msgid "Change openid associated to your account" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:39 +#: forum/skins/default/templates/authopenid/delete.html:4 +#: forum/skins/default/templates/authopenid/settings.html:38 +msgid "Delete account" +msgstr "Избриши налог" + +#: forum/skins/default/templates/account_settings.html:40 +#: forum/skins/default/templates/authopenid/settings.html:39 +msgid "Erase your username and all your data from website" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:5 +#: forum/skins/default/templates/answer_edit.html:48 +msgid "Edit answer" +msgstr "Измените одговор" + +#: forum/skins/default/templates/answer_edit.html:25 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:26 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:46 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:25 +#: forum/skins/default/templates/question_edit.html:28 +msgid "hide preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:28 +msgid "show preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:48 +#: forum/skins/default/templates/question_edit.html:66 +#: forum/skins/default/templates/question_retag.html:53 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "back" +msgstr "назад" + +#: forum/skins/default/templates/answer_edit.html:53 +#: forum/skins/default/templates/question_edit.html:71 +#: forum/skins/default/templates/revisions_answer.html:52 +#: forum/skins/default/templates/revisions_question.html:52 +msgid "revision" +msgstr "ревизија" + +#: forum/skins/default/templates/answer_edit.html:56 +#: forum/skins/default/templates/question_edit.html:75 +msgid "select revision" +msgstr "изаберите ревизију" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:418 +#: forum/skins/default/templates/question_edit.html:92 +msgid "Toggle the real time Markdown editor preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:419 +#: forum/skins/default/templates/question_edit.html:92 +msgid "toggle preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:72 +#: forum/skins/default/templates/question_edit.html:118 +#: forum/skins/default/templates/question_retag.html:74 +msgid "Save edit" +msgstr "Сачувајте промену" + +#: forum/skins/default/templates/answer_edit.html:73 +#: forum/skins/default/templates/close.html:29 +#: forum/skins/default/templates/feedback.html:50 +#: forum/skins/default/templates/question_edit.html:119 +#: forum/skins/default/templates/question_retag.html:75 +#: forum/skins/default/templates/reopen.html:30 +#: forum/skins/default/templates/user_edit.html:90 +#: forum/skins/default/templates/authopenid/changeemail.html:40 +msgid "Cancel" +msgstr "Откажите" + +#: forum/skins/default/templates/answer_edit_tips.html:4 +msgid "answer tips" +msgstr "Савети" + +#: forum/skins/default/templates/answer_edit_tips.html:7 +msgid "please make your answer relevant to this community" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:10 +msgid "try to give an answer, rather than engage into a discussion" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:13 +msgid "please try to provide details" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:16 +#: forum/skins/default/templates/question_edit_tips.html:13 +msgid "be clear and concise" +msgstr "будите јаÑни и кратки" + +#: forum/skins/default/templates/answer_edit_tips.html:20 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "see frequently asked questions" +msgstr "погледајте чеÑто поÑтављана питања" + +#: forum/skins/default/templates/answer_edit_tips.html:26 +#: forum/skins/default/templates/question_edit_tips.html:23 +msgid "Markdown tips" +msgstr "Markdown оÑнове" + +#: forum/skins/default/templates/answer_edit_tips.html:29 +#: forum/skins/default/templates/question_edit_tips.html:26 +msgid "*italic* or __italic__" +msgstr "*укошено* или _укошено_" + +#: forum/skins/default/templates/answer_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:29 +msgid "**bold** or __bold__" +msgstr "**подебљано** или __подебљано__" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/question_edit_tips.html:32 +msgid "link" +msgstr "линк" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "text" +msgstr "текÑÑ‚" + +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "image" +msgstr "Ñлика" + +#: forum/skins/default/templates/answer_edit_tips.html:43 +#: forum/skins/default/templates/question_edit_tips.html:41 +msgid "numbered list:" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:48 +#: forum/skins/default/templates/question_edit_tips.html:46 +msgid "basic HTML tags are also supported" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:52 +#: forum/skins/default/templates/question_edit_tips.html:50 +msgid "learn more about Markdown" +msgstr "" + +#: forum/skins/default/templates/ask.html:5 +#: forum/skins/default/templates/ask.html:62 +msgid "Ask a question" +msgstr "ПоÑтавите питање" + +#: forum/skins/default/templates/ask.html:69 +#: forum/skins/default/templates/ask_form.html:11 +msgid "login to post question info" +msgstr "" +"You are welcome to start submitting your question " +"anonymously. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: forum/skins/default/templates/ask.html:75 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Looks like your email address, %(email)s has not " +"yet been validated. To post messages you must verify your email, " +"please see more details here." +"
You can submit your question now and validate email after that. Your " +"question will saved as pending meanwhile. " + +#: forum/skins/default/templates/ask.html:113 +#: forum/skins/default/templates/ask_form.html:54 +msgid "(required)" +msgstr "(обавезно)" + +#: forum/skins/default/templates/ask.html:120 +#: forum/skins/default/templates/ask_form.html:61 +#, fuzzy +msgid "Login/signup to post your question" +msgstr "Login/Signup to Post" + +#: forum/skins/default/templates/ask.html:122 +#: forum/skins/default/templates/ask_form.html:63 +msgid "Ask your question" +msgstr "ПоÑтавите Ваше Питање" + +#: forum/skins/default/templates/ask_form.html:15 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Looks like your email address, %(email)s has not " +"yet been validated. To post messages you must verify your email, " +"please see more details here." +"
You can submit your question now and validate email after that. Your " +"question will saved as pending meanwhile. " + +#: forum/skins/default/templates/badge.html:6 +#: forum/skins/default/templates/badge.html:17 +msgid "Badge" +msgstr "" + +#: forum/skins/default/templates/badge.html:26 +msgid "user received this badge:" +msgid_plural "users received this badge:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: forum/skins/default/templates/badges.html:6 +msgid "Badges summary" +msgstr "" + +#: forum/skins/default/templates/badges.html:17 +msgid "Badges" +msgstr "" + +#: forum/skins/default/templates/badges.html:21 +msgid "Community gives you awards for your questions, answers and votes." +msgstr "" +"If your questions and answers are highly voted, your contribution to this " +"Q&A community will be recognized with the variety of badges." + +#: forum/skins/default/templates/badges.html:22 +#, python-format +msgid "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +" " +msgstr "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Have ideas about fun " +"badges? Please, give us your feedback" + +#: forum/skins/default/templates/badges.html:51 +msgid "Community badges" +msgstr "Беџеви - нивои" + +#: forum/skins/default/templates/badges.html:57 +msgid "gold badge description" +msgstr "" +"Gold badge is the highest award in this community. To obtain it have to show " +"profound knowledge and ability in addition to your active participation." + +#: forum/skins/default/templates/badges.html:65 +msgid "silver badge description" +msgstr "" +"Obtaining silver badge requires significant patience. If you have received " +"one, that means you have greatly contributed to this community." + +#: forum/skins/default/templates/badges.html:68 +msgid "bronze badge: often given as a special honor" +msgstr "" + +#: forum/skins/default/templates/badges.html:72 +msgid "bronze badge description" +msgstr "" +"If you are an active participant in this community, you will be recognized " +"with this badge." + +#: forum/skins/default/templates/book.html:7 +msgid "reading channel" +msgstr "" + +#: forum/skins/default/templates/book.html:26 +msgid "[author]" +msgstr "" + +#: forum/skins/default/templates/book.html:30 +msgid "[publisher]" +msgstr "" + +#: forum/skins/default/templates/book.html:34 +msgid "[publication date]" +msgstr "" + +#: forum/skins/default/templates/book.html:38 +msgid "[price]" +msgstr "" + +#: forum/skins/default/templates/book.html:39 +msgid "currency unit" +msgstr "" + +#: forum/skins/default/templates/book.html:42 +msgid "[pages]" +msgstr "" + +#: forum/skins/default/templates/book.html:43 +msgid "pages abbreviation" +msgstr "" + +#: forum/skins/default/templates/book.html:46 +msgid "[tags]" +msgstr "" + +#: forum/skins/default/templates/book.html:56 +msgid "author blog" +msgstr "" + +#: forum/skins/default/templates/book.html:62 +msgid "book directory" +msgstr "" + +#: forum/skins/default/templates/book.html:66 +msgid "buy online" +msgstr "" + +#: forum/skins/default/templates/book.html:79 +msgid "reader questions" +msgstr "" + +#: forum/skins/default/templates/book.html:82 +msgid "ask the author" +msgstr "" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:18 +msgid "this question was selected as favorite" +msgstr "" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:18 +msgid "number of times" +msgstr "" + +#: forum/skins/default/templates/book.html:105 +#: forum/skins/default/templates/question_summary_list_roll.html:14 +msgid "votes" +msgstr "" + +#: forum/skins/default/templates/book.html:108 +msgid "the answer has been accepted to be correct" +msgstr "" + +#: forum/skins/default/templates/book.html:115 +#: forum/skins/default/templates/question_summary_list_roll.html:15 +msgid "views" +msgstr "" + +#: forum/skins/default/templates/book.html:125 +#: forum/skins/default/templates/question.html:136 +#: forum/skins/default/templates/question_list.html:19 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/tags.html:50 +#: forum/skins/default/templates/users_questions.html:34 +#, python-format +msgid "see questions tagged '%(tag)s'" +msgstr "" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to book RSS feed" +msgstr "" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to the questions feed" +msgstr "" + +#: forum/skins/default/templates/close.html:6 +#: forum/skins/default/templates/close.html:16 +msgid "Close question" +msgstr "Затвори питање" + +#: forum/skins/default/templates/close.html:19 +msgid "Close the question" +msgstr "Затвори питање" + +#: forum/skins/default/templates/close.html:25 +msgid "Reasons" +msgstr "Разлози" + +#: forum/skins/default/templates/close.html:28 +msgid "OK to close" +msgstr "" + +#: forum/skins/default/templates/email_base.html:11 +msgid "home" +msgstr "" + +#: forum/skins/default/templates/faq.html:11 +msgid "Frequently Asked Questions " +msgstr "ЧеÑто поÑтављана питања" + +#: forum/skins/default/templates/faq.html:16 +msgid "What kinds of questions can I ask here?" +msgstr "" + +#: forum/skins/default/templates/faq.html:17 +msgid "" +"Most importanly - questions should be relevant to this " +"community." +msgstr "" + +#: forum/skins/default/templates/faq.html:18 +msgid "" +"Before asking the question - please make sure to use search to see whether " +"your question has alredy been answered." +msgstr "" +"Before you ask - please make sure to search for a similar question. You can " +"search questions by their title or tags." + +#: forum/skins/default/templates/faq.html:21 +msgid "What questions should I avoid asking?" +msgstr "What kinds of questions should be avoided?" + +#: forum/skins/default/templates/faq.html:22 +msgid "" +"Please avoid asking questions that are not relevant to this community, too " +"subjective and argumentative." +msgstr "" + +#: forum/skins/default/templates/faq.html:27 +msgid "What should I avoid in my answers?" +msgstr "" + +#: forum/skins/default/templates/faq.html:28 +msgid "" +"is a Q&A site, not a discussion group. Therefore - please avoid having " +"discussions in your answers, comment facility allows some space for brief " +"discussions." +msgstr "" +"is a question and answer site - it is not a " +"discussion group. Please avoid holding debates in your answers as " +"they tend to dilute the essense of questions and answers. For the brief " +"discussions please use commenting facility." + +#: forum/skins/default/templates/faq.html:32 +msgid "Who moderates this community?" +msgstr "" + +#: forum/skins/default/templates/faq.html:33 +msgid "The short answer is: you." +msgstr "" + +#: forum/skins/default/templates/faq.html:34 +msgid "This website is moderated by the users." +msgstr "" + +#: forum/skins/default/templates/faq.html:35 +msgid "" +"The reputation system allows users earn the authorization to perform a " +"variety of moderation tasks." +msgstr "" +"Karma system allows users to earn rights to perform a variety of moderation " +"tasks" + +#: forum/skins/default/templates/faq.html:40 +msgid "How does reputation system work?" +msgstr "Како ÑиÑтем карме функционише?" + +#: forum/skins/default/templates/faq.html:41 +msgid "Rep system summary" +msgstr "" +"When a question or answer is upvoted, the user who posted them will gain " +"some points, which are called \"karma points\". These points serve as a " +"rough measure of the community trust to him/her. Various moderation tasks " +"are gradually assigned to the users based on those points." + +#: forum/skins/default/templates/faq.html:42 +msgid "" +"For example, if you ask an interesting question or give a helpful answer, " +"your input will be upvoted. On the other hand if the answer is misleading - " +"it will be downvoted. Each vote in favor will generate 10 " +"points, each vote against will subtract 2 points. There is " +"a limit of 200 points that can be accumulated per question " +"or answer. The table below explains reputation point requirements for each " +"type of moderation task." +msgstr "" + +#: forum/skins/default/templates/faq.html:53 +#: forum/skins/default/templates/user_votes.html:15 +msgid "upvote" +msgstr "" + +#: forum/skins/default/templates/faq.html:57 +msgid "use tags" +msgstr "" + +#: forum/skins/default/templates/faq.html:62 +msgid "add comments" +msgstr "" + +#: forum/skins/default/templates/faq.html:66 +#: forum/skins/default/templates/user_votes.html:17 +msgid "downvote" +msgstr "" + +#: forum/skins/default/templates/faq.html:69 +msgid "open and close own questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:73 +msgid "retag questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:78 +msgid "edit community wiki questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:83 +msgid "edit any answer" +msgstr "" + +#: forum/skins/default/templates/faq.html:87 +msgid "open any closed question" +msgstr "" + +#: forum/skins/default/templates/faq.html:91 +msgid "delete any comment" +msgstr "" + +#: forum/skins/default/templates/faq.html:95 +msgid "delete any questions and answers and perform other moderation tasks" +msgstr "" + +#: forum/skins/default/templates/faq.html:103 +msgid "how to validate email title" +msgstr "Како да потврдите е-пошту и зашто?" + +#: forum/skins/default/templates/faq.html:105 +#, python-format +msgid "" +"how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" +msgstr "" +"

How? If you have just set or changed your " +"email address - check your email and click the included link.
The link contains a key generated specifically for you. You can " +"also and check your email again.

Why? Email validation is required to make sure that " +"only you can post messages on your behalf and to " +"minimize spam posts.
With email you can " +"subscribe for updates on the most interesting questions. " +"Also, when you sign up for the first time - create a unique gravatar personal image.

" + +#: forum/skins/default/templates/faq.html:110 +msgid "what is gravatar" +msgstr "Како да промените Ñвоју Ñлику (gravatar) и шта је gravatar?" + +#: forum/skins/default/templates/faq.html:111 +msgid "gravatar faq info" +msgstr "" +"

The picture that appears on the users profiles is called " +"gravatar (which means globally recognized avatar).

Here is how it works: a " +"cryptographic key (unbreakable code) is calculated from " +"your email address. You upload your picture (or your favorite alter ego " +"image) the website gravatar.com from where we later retreive your image using the key.

This way all the websites you trust can show your image next to your " +"posts and your email address remains private.

Please " +"personalize your account with an image - just register at " +"gravatar.com (just please " +"be sure to use the same email address that you used to register with us). " +"Default image that looks like a kitchen tile is generated automatically.

" + +#: forum/skins/default/templates/faq.html:114 +msgid "To register, do I need to create new password?" +msgstr "" + +#: forum/skins/default/templates/faq.html:115 +msgid "" +"No, you don't have to. You can login through any service that supports " +"OpenID, e.g. Google, Yahoo, AOL, etc." +msgstr "" + +#: forum/skins/default/templates/faq.html:116 +msgid "Login now!" +msgstr "" + +#: forum/skins/default/templates/faq.html:121 +msgid "Why other people can edit my questions/answers?" +msgstr "" + +#: forum/skins/default/templates/faq.html:122 +msgid "Goal of this site is..." +msgstr "" + +#: forum/skins/default/templates/faq.html:122 +msgid "" +"So questions and answers can be edited like wiki pages by experienced users " +"of this site and this improves the overall quality of the knowledge base " +"content." +msgstr "" + +#: forum/skins/default/templates/faq.html:123 +msgid "If this approach is not for you, we respect your choice." +msgstr "" + +#: forum/skins/default/templates/faq.html:127 +msgid "Still have questions?" +msgstr "" + +#: forum/skins/default/templates/faq.html:128 +#, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "" +"Please ask your question, help make our " +"community better!" + +#: forum/skins/default/templates/faq.html:130 +#: forum/skins/default/templates/header.html:27 +msgid "questions" +msgstr "питања" + +#: forum/skins/default/templates/faq.html:130 +msgid "." +msgstr "" + +#: forum/skins/default/templates/feedback.html:6 +msgid "Feedback" +msgstr "" + +#: forum/skins/default/templates/feedback.html:11 +msgid "Give us your feedback!" +msgstr "" + +#: forum/skins/default/templates/feedback.html:17 +#, python-format +msgid "" +"\n" +" Dear %(user_name)s, we look " +"forward to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: forum/skins/default/templates/feedback.html:24 +msgid "" +"\n" +" Dear visitor, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: forum/skins/default/templates/feedback.html:41 +msgid "(this field is required)" +msgstr "" + +#: forum/skins/default/templates/feedback.html:49 +msgid "Send Feedback" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:3 +#, python-format +msgid "" +"\n" +"Hello, this is a %(site_title)s forum feedback message\n" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:9 +msgid "Sender is" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:11 +#: forum/skins/default/templates/feedback_email.txt:14 +msgid "email" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:13 +msgid "anonymous" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:19 +msgid "Message body:" +msgstr "" + +#: forum/skins/default/templates/footer.html:8 +#: forum/skins/default/templates/header.html:14 +msgid "about" +msgstr "о нама" + +#: forum/skins/default/templates/footer.html:9 +#: forum/skins/default/templates/header.html:15 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "faq" +msgstr "чпп" + +#: forum/skins/default/templates/footer.html:10 +msgid "privacy policy" +msgstr "политика приватноÑти" + +#: forum/skins/default/templates/footer.html:19 +msgid "give feedback" +msgstr "ÑугеÑтије и žалбе" + +#: forum/skins/default/templates/header.html:10 +msgid "logout" +msgstr "одјава" + +#: forum/skins/default/templates/header.html:12 +msgid "login" +msgstr "пријава" + +#: forum/skins/default/templates/header.html:22 +msgid "back to home page" +msgstr "назад на почетну Ñтрану" + +#: forum/skins/default/templates/header.html:29 +msgid "users" +msgstr "кориÑници" + +#: forum/skins/default/templates/header.html:31 +msgid "books" +msgstr "књиге" + +#: forum/skins/default/templates/header.html:33 +#: forum/templatetags/extra_tags.py:177 forum/templatetags/extra_tags.py:206 +msgid "badges" +msgstr "беџеви" + +#: forum/skins/default/templates/header.html:34 +#: forum/skins/default/templates/header.html:38 +msgid "ask a question" +msgstr "поÑтавите питање" + +#: forum/skins/default/templates/header.html:36 +msgid "unanswered questions" +msgstr "неодговорена" + +#: forum/skins/default/templates/input_bar.html:33 +msgid "search" +msgstr "" + +#: forum/skins/default/templates/logout.html:6 +#: forum/skins/default/templates/logout.html:16 +msgid "Logout" +msgstr "" + +#: forum/skins/default/templates/logout.html:19 +msgid "" +"As a registered user you can login with your OpenID, log out of the site or " +"permanently remove your account." +msgstr "" +"Clicking Logout will log you out from the forumbut will not " +"sign you off from your OpenID provider.

If you wish to sign off " +"completely - please make sure to log out from your OpenID provider as well." + +#: forum/skins/default/templates/logout.html:20 +msgid "Logout now" +msgstr "Одјава" + +#: forum/skins/default/templates/notarobot.html:3 +msgid "Please prove that you are a Human Being" +msgstr "" + +#: forum/skins/default/templates/notarobot.html:10 +msgid "I am a Human Being" +msgstr "" + +#: forum/skins/default/templates/pagesize.html:6 +msgid "posts per page" +msgstr "поÑтова по Ñтрани" + +#: forum/skins/default/templates/paginator.html:6 +#: forum/skins/default/templates/paginator.html:7 +msgid "previous" +msgstr "претходна" + +#: forum/skins/default/templates/paginator.html:19 +msgid "current page" +msgstr "" + +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 +#, python-format +msgid "page number %(num)s" +msgstr "Ñтрана %(num)s" + +#: forum/skins/default/templates/paginator.html:33 +msgid "next page" +msgstr "Ñледећа Ñтранa" + +#: forum/skins/default/templates/post_contributor_info.html:9 +#, fuzzy, python-format +msgid "%(rev_count)s revision" +msgid_plural "%(rev_count)s revisions" +msgstr[0] "изаберите ревизију" +msgstr[1] "изаберите ревизију" +msgstr[2] "изаберите ревизију" + +#: forum/skins/default/templates/post_contributor_info.html:15 +msgid "asked" +msgstr "питано" + +#: forum/skins/default/templates/post_contributor_info.html:18 +msgid "answered" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:20 +msgid "posted" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:41 +msgid "updated" +msgstr "" + +#: forum/skins/default/templates/privacy.html:6 +#: forum/skins/default/templates/privacy.html:11 +msgid "Privacy policy" +msgstr "" + +#: forum/skins/default/templates/privacy.html:15 +msgid "general message about privacy" +msgstr "" +"Respecting users privacy is an important core principle of this Q&A " +"forum. Information on this page details how this forum protects your " +"privacy, and what type of information is collected." + +#: forum/skins/default/templates/privacy.html:18 +msgid "Site Visitors" +msgstr "" + +#: forum/skins/default/templates/privacy.html:20 +msgid "what technical information is collected about visitors" +msgstr "" +"Information on question views, revisions of questions and answers - both " +"times and content are recorded for each user in order to correctly count " +"number of views, maintain data integrity and report relevant updates." + +#: forum/skins/default/templates/privacy.html:23 +msgid "Personal Information" +msgstr "" + +#: forum/skins/default/templates/privacy.html:25 +msgid "details on personal information policies" +msgstr "" +"Members of this community may choose to display personally identifiable " +"information in their profiles. Forum will never display such information " +"without a request from the user." + +#: forum/skins/default/templates/privacy.html:28 +msgid "Other Services" +msgstr "" + +#: forum/skins/default/templates/privacy.html:30 +msgid "details on sharing data with third parties" +msgstr "" +"None of the data that is not openly shown on the forum by the choice of the " +"user is shared with any third party." + +#: forum/skins/default/templates/privacy.html:35 +msgid "cookie policy details" +msgstr "" +"Forum software relies on the internet cookie technology to keep track of " +"user sessions. Cookies must be enabled in your browser so that forum can " +"work for you." + +#: forum/skins/default/templates/privacy.html:37 +msgid "Policy Changes" +msgstr "" + +#: forum/skins/default/templates/privacy.html:38 +msgid "how privacy policies can be changed" +msgstr "" +"These policies may be adjusted to improve protection of user's privacy. " +"Whenever such changes occur, users will be notified via the internal " +"messaging system. " + +#: forum/skins/default/templates/question.html:78 +#: forum/skins/default/templates/question.html:79 +#: forum/skins/default/templates/question.html:95 +#: forum/skins/default/templates/question.html:97 +msgid "i like this post (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:81 +#: forum/skins/default/templates/question.html:99 +#: forum/skins/default/templates/question.html:251 +msgid "current number of votes" +msgstr "" + +#: forum/skins/default/templates/question.html:90 +#: forum/skins/default/templates/question.html:91 +#: forum/skins/default/templates/question.html:104 +#: forum/skins/default/templates/question.html:105 +msgid "i dont like this post (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:109 +#: forum/skins/default/templates/question.html:110 +msgid "mark this question as favorite (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:116 +#: forum/skins/default/templates/question.html:117 +msgid "remove favorite mark from this question (click again to restore mark)" +msgstr "" + +#: forum/skins/default/templates/question.html:141 +#: forum/skins/default/templates/question.html:288 +#: forum/skins/default/templates/revisions_answer.html:58 +#: forum/skins/default/templates/revisions_question.html:58 +msgid "edit" +msgstr "" + +#: forum/skins/default/templates/question.html:146 +msgid "reopen" +msgstr "" + +#: forum/skins/default/templates/question.html:150 +msgid "close" +msgstr "затвори" + +#: forum/skins/default/templates/question.html:156 +#: forum/skins/default/templates/question.html:293 +msgid "" +"report as offensive (i.e containing spam, advertising, malicious text, etc.)" +msgstr "" + +#: forum/skins/default/templates/question.html:157 +#: forum/skins/default/templates/question.html:294 +msgid "flag offensive" +msgstr "означи увредљивим" + +#: forum/skins/default/templates/question.html:165 +#: forum/skins/default/templates/question.html:305 +msgid "delete" +msgstr "избриши" + +#: forum/skins/default/templates/question.html:183 +#: forum/skins/default/templates/question.html:325 +msgid "delete this comment" +msgstr "избриши овај коментар" + +#: forum/skins/default/templates/question.html:194 +#: forum/skins/default/templates/question.html:336 +msgid "add comment" +msgstr "унеÑите коментар" + +#: forum/skins/default/templates/question.html:198 +#: forum/skins/default/templates/question.html:340 +#, python-format +msgid "see %(counter)s more" +msgid_plural "see %(counter)s more" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: forum/skins/default/templates/question.html:200 +#: forum/skins/default/templates/question.html:342 +#, python-format +msgid "see %(counter)s more comment" +msgid_plural "" +"see %(counter)s more comments\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: forum/skins/default/templates/question.html:213 +#, python-format +msgid "" +"The question has been closed for the following reason \"%(close_reason)s\" by" +msgstr "" + +#: forum/skins/default/templates/question.html:215 +#, python-format +msgid "close date %(closed_at)s" +msgstr "датум затварања %(closed_at)s" + +#: forum/skins/default/templates/question.html:223 +#, fuzzy, python-format +msgid "" +"\n" +" %(counter)s Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +"\n" +"(one comment)" +msgstr[1] "" +"\n" +"(%(comment_count)s comments)" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers will be shown first" +msgstr "" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers" +msgstr "Ñтара" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers will be shown first" +msgstr "" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers" +msgstr "нова" + +#: forum/skins/default/templates/question.html:235 +msgid "most voted answers will be shown first" +msgstr "" + +#: forum/skins/default/templates/question.html:235 +msgid "popular answers" +msgstr "популарна" + +#: forum/skins/default/templates/question.html:249 +#: forum/skins/default/templates/question.html:250 +msgid "i like this answer (click again to cancel)" +msgstr "Ñвиђа ми Ñе овај одговор (кликните поново да биÑте отказали)" + +#: forum/skins/default/templates/question.html:256 +#: forum/skins/default/templates/question.html:257 +msgid "i dont like this answer (click again to cancel)" +msgstr "не Ñвиђа ми Ñе овај одговор (кликните поново да биÑте отказали)" + +#: forum/skins/default/templates/question.html:262 +#: forum/skins/default/templates/question.html:263 +msgid "mark this answer as favorite (click again to undo)" +msgstr "означи овај одговор као омиљени (кликните поново да биÑте отказали)" + +#: forum/skins/default/templates/question.html:268 +#: forum/skins/default/templates/question.html:269 +msgid "the author of the question has selected this answer as correct" +msgstr "аутор питања је изабрао овај одговор као прави" + +#: forum/skins/default/templates/question.html:282 +msgid "answer permanent link" +msgstr "трајни линк одговора" + +#: forum/skins/default/templates/question.html:283 +msgid "permanent link" +msgstr "трајни линк" + +#: forum/skins/default/templates/question.html:305 +msgid "undelete" +msgstr "undelete" + +#: forum/skins/default/templates/question.html:364 +#: forum/skins/default/templates/question.html:367 +msgid "Notify me once a day when there are any new answers" +msgstr "" +"Notify me once a day by email when there are any new " +"answers or updates" + +#: forum/skins/default/templates/question.html:370 +msgid "Notify me weekly when there are any new answers" +msgstr "" +"Notify me weekly when there are any new answers or updates" + +#: forum/skins/default/templates/question.html:375 +#, python-format +msgid "" +"You can always adjust frequency of email updates from your %(profile_url)s" +msgstr "" +"(note: you can always change how often you receive updates)" + +#: forum/skins/default/templates/question.html:380 +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "" +"Here (once you log in) you will be able to sign " +"up for the periodic email updates about this question." + +#: forum/skins/default/templates/question.html:391 +msgid "Your answer" +msgstr "Ваш одговор" + +#: forum/skins/default/templates/question.html:393 +msgid "Be the first one to answer this question!" +msgstr "Будите први који ћете дати одговор на ово питање!" + +#: forum/skins/default/templates/question.html:399 +msgid "you can answer anonymously and then login" +msgstr "" +"Please start posting your answer anonymously " +"- your answer will be saved within the current session and published after " +"you log in or create a new account. Please try to give a substantial " +"answer, for discussions, please use comments and " +"please do remember to vote (after you log in)!" + +#: forum/skins/default/templates/question.html:403 +msgid "answer your own question only to give an answer" +msgstr "" +"You are welcome to answer your own question, " +"but please make sure to give an answer. Remember that you " +"can always revise your original question. Please " +"use comments for discussions and please don't " +"forget to vote :) for the answers that you liked (or perhaps did " +"not like)! " + +#: forum/skins/default/templates/question.html:405 +msgid "please only give an answer, no discussions" +msgstr "" +"Please try to give a substantial answer. If " +"you wanted to comment on the question or answer, just use the " +"commenting tool. Please remember that you can always revise " +"your answers - no need to answer the same question twice. Also, " +"please don't forget to vote - it really helps to select the " +"best questions and answers!" + +#: forum/skins/default/templates/question.html:441 +msgid "Login/Signup to Post Your Answer" +msgstr "" + +#: forum/skins/default/templates/question.html:444 +msgid "Answer Your Own Question" +msgstr "Одговорите на ваше питање" + +#: forum/skins/default/templates/question.html:446 +msgid "Answer the question" +msgstr "Одговорите на питање" + +#: forum/skins/default/templates/question.html:460 +msgid "Question tags" +msgstr "Ознаке" + +#: forum/skins/default/templates/question.html:465 +#: forum/skins/default/templates/questions.html:257 +#: forum/skins/default/templates/tag_selector.html:11 +#: forum/skins/default/templates/tag_selector.html:28 +#, python-format +msgid "see questions tagged '%(tag_name)s'" +msgstr "" + +#: forum/skins/default/templates/question.html:471 +msgid "question asked" +msgstr "Питано" + +#: forum/skins/default/templates/question.html:474 +msgid "question was seen" +msgstr "Прегледано" + +#: forum/skins/default/templates/question.html:474 +msgid "times" +msgstr "пута" + +#: forum/skins/default/templates/question.html:477 +msgid "last updated" +msgstr "Задњи пут ажурирано" + +#: forum/skins/default/templates/question.html:483 +msgid "Related questions" +msgstr "Слична питања" + +#: forum/skins/default/templates/question_counter_widget.html:6 +msgid "Please decide if you like this question or not by voting" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:12 +#, fuzzy +msgid "" +"\n" +" vote\n" +" " +msgid_plural "" +"\n" +" votes\n" +" " +msgstr[0] "" +"\n" +"глаÑ\n" +" " +msgstr[1] "" +"\n" +"глаÑова" +msgstr[2] "" + +#: forum/skins/default/templates/question_counter_widget.html:21 +msgid "this answer has been accepted to be correct" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:27 +#, fuzzy +msgid "" +"\n" +" answer \n" +" " +msgid_plural "" +"\n" +" answers \n" +" " +msgstr[0] "" +"\n" +"одговор\n" +" " +msgstr[1] "" +"\n" +"одговора" +msgstr[2] "" + +#: forum/skins/default/templates/question_counter_widget.html:39 +#, fuzzy +msgid "" +"\n" +" view\n" +" " +msgid_plural "" +"\n" +" views\n" +" " +msgstr[0] "" +"\n" +"pregled" +msgstr[1] "" +"\n" +"pregleda" +msgstr[2] "" + +#: forum/skins/default/templates/question_edit.html:5 +#: forum/skins/default/templates/question_edit.html:66 +msgid "Edit question" +msgstr "Измени питање" + +#: forum/skins/default/templates/question_edit_tips.html:4 +msgid "question tips" +msgstr "Савети" + +#: forum/skins/default/templates/question_edit_tips.html:7 +msgid "please ask a relevant question" +msgstr "ask a question interesting to this community" + +#: forum/skins/default/templates/question_edit_tips.html:10 +msgid "please try provide enough details" +msgstr "provide enough details" + +#: forum/skins/default/templates/question_retag.html:4 +#: forum/skins/default/templates/question_retag.html:53 +msgid "Change tags" +msgstr "Промените ознаке" + +#: forum/skins/default/templates/question_retag.html:40 +msgid "up to 5 tags, less than 20 characters each" +msgstr "до 5 ознака, мање од 20 карактера у Ñвакој" + +#: forum/skins/default/templates/question_retag.html:83 +msgid "Why use and modify tags?" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:86 +msgid "tags help us keep Questions organized" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:94 +msgid "tag editors receive special awards from the community" +msgstr "" + +#: forum/skins/default/templates/question_summary_list_roll.html:13 +msgid "answers" +msgstr "одговори" + +#: forum/skins/default/templates/questions.html:8 +msgid "Questions" +msgstr "Питања" + +#: forum/skins/default/templates/questions.html:32 +msgid "Found by tags" +msgstr "Tagged questions" + +#: forum/skins/default/templates/questions.html:36 +msgid "Search results" +msgstr "Резултати претраге" + +#: forum/skins/default/templates/questions.html:38 +msgid "Found by title" +msgstr "" + +#: forum/skins/default/templates/questions.html:42 +msgid "Unanswered questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:44 +msgid "All questions" +msgstr "Сва питања" + +#: forum/skins/default/templates/questions.html:51 +msgid "In:" +msgstr "Прикажи:" + +#: forum/skins/default/templates/questions.html:53 +msgid "see unanswered questions" +msgstr "погледајте питања без одговора" + +#: forum/skins/default/templates/questions.html:55 +msgid "see your favorite questions" +msgstr "погледајте Ваша омиљена питања" + +#: forum/skins/default/templates/questions.html:59 +msgid "Sort by:" +msgstr "Сортирај:" + +#: forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/questions.html:75 +msgid "click to see the newest questions" +msgstr "кликните да биÑте видели најновији питања" + +#: forum/skins/default/templates/questions.html:70 +msgid "click to see the oldest questions" +msgstr "кликните да биÑте видели најÑтарија питања" + +#: forum/skins/default/templates/questions.html:83 +#: forum/skins/default/templates/questions.html:94 +msgid "click to see the most recently updated questions" +msgstr "кликните да биÑте видели недавно ажурирана питања" + +#: forum/skins/default/templates/questions.html:89 +msgid "click to see the least recently updated questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:102 +#: forum/skins/default/templates/questions.html:113 +msgid "click to see hottest questions" +msgstr "questions with most answers" + +#: forum/skins/default/templates/questions.html:102 +msgid "less answers" +msgstr "" + +#: forum/skins/default/templates/questions.html:108 +msgid "click to see coldest questions" +msgstr "questions with fewest answers" + +#: forum/skins/default/templates/questions.html:108 +#: forum/skins/default/templates/questions.html:113 +msgid "more answers" +msgstr "Ñа више одговора" + +#: forum/skins/default/templates/questions.html:121 +#: forum/skins/default/templates/questions.html:132 +msgid "click to see most voted questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:121 +msgid "unpopular" +msgstr "" + +#: forum/skins/default/templates/questions.html:127 +msgid "click to see least voted questions" +msgstr "least voted questions" + +#: forum/skins/default/templates/questions.html:127 +#: forum/skins/default/templates/questions.html:132 +msgid "popular" +msgstr "популарна" + +#: forum/skins/default/templates/questions.html:141 +#, fuzzy, python-format +msgid " %(q_num)s question found" +msgid_plural "%(q_num)s questions found" +msgstr[0] "Једно питање" +msgstr[1] "%(q_num)s питања" +msgstr[2] "" + +#: forum/skins/default/templates/questions.html:143 +#, fuzzy, python-format +msgid "%(q_num)s question" +msgid_plural "%(q_num)s questions" +msgstr[0] "Једно питање" +msgstr[1] "%(q_num)s питања" +msgstr[2] "" + +#: forum/skins/default/templates/questions.html:147 +#, python-format +msgid "with %(author_name)s's contributions" +msgstr "" + +#: forum/skins/default/templates/questions.html:151 +msgid "tagged" +msgstr "означено" + +#: forum/skins/default/templates/questions.html:157 +msgid "Search tips:" +msgstr "Савети за претраживање:" + +#: forum/skins/default/templates/questions.html:161 +msgid "reset author" +msgstr "реÑетујте аутора" + +#: forum/skins/default/templates/questions.html:165 +msgid "reset tags" +msgstr "реÑетујте ознаке" + +#: forum/skins/default/templates/questions.html:169 +#: forum/skins/default/templates/questions.html:173 +msgid "start over" +msgstr "крените изпочетка" + +#: forum/skins/default/templates/questions.html:175 +msgid " - to expand, or dig in by adding more tags and revising the query." +msgstr "" + +#: forum/skins/default/templates/questions.html:178 +msgid "Search tip:" +msgstr "Савет за претраживање:" + +#: forum/skins/default/templates/questions.html:178 +msgid "add tags and a query to focus your search" +msgstr "додајте ознаке и упит да Ñузите претрагу" + +#: forum/skins/default/templates/questions.html:190 +msgid "There are no unanswered questions here" +msgstr "" + +#: forum/skins/default/templates/questions.html:193 +msgid "No favorite questions here. " +msgstr "Овде нема омиљених питања." + +#: forum/skins/default/templates/questions.html:194 +msgid "Please start (bookmark) some questions when you visit them" +msgstr "" + +#: forum/skins/default/templates/questions.html:199 +msgid "You can expand your search by " +msgstr "" + +#: forum/skins/default/templates/questions.html:203 +msgid "resetting author" +msgstr "" + +#: forum/skins/default/templates/questions.html:207 +msgid "resetting tags" +msgstr "" + +#: forum/skins/default/templates/questions.html:211 +#: forum/skins/default/templates/questions.html:215 +msgid "starting over" +msgstr "" + +#: forum/skins/default/templates/questions.html:220 +msgid "Please always feel free to ask your question!" +msgstr "" + +#: forum/skins/default/templates/questions.html:224 +msgid "Did not find what you were looking for?" +msgstr "" + +#: forum/skins/default/templates/questions.html:225 +msgid "Please, post your question!" +msgstr "" + +#: forum/skins/default/templates/questions.html:241 +#, fuzzy +msgid "Contributors" +msgstr "Сарадници" + +#: forum/skins/default/templates/questions.html:254 +msgid "Related tags" +msgstr "Ознаке" + +#: forum/skins/default/templates/reopen.html:6 +#: forum/skins/default/templates/reopen.html:16 +msgid "Reopen question" +msgstr "" + +#: forum/skins/default/templates/reopen.html:19 +msgid "Open the previously closed question" +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "The question was closed for the following reason " +msgstr "Питање је затворено из Ñледећих разлога" + +#: forum/skins/default/templates/reopen.html:22 +msgid "reason - leave blank in english" +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "on " +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "date closed" +msgstr "датум затварања" + +#: forum/skins/default/templates/reopen.html:29 +msgid "Reopen this question" +msgstr "Поново отворите ово питање" + +#: forum/skins/default/templates/revisions_answer.html:7 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:8 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "Revision history" +msgstr "Преглед ревизија" + +#: forum/skins/default/templates/revisions_answer.html:50 +#: forum/skins/default/templates/revisions_question.html:50 +msgid "click to hide/show revision" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:5 +msgid "Interesting tags" +msgstr "Занимљиве ознаке" + +#: forum/skins/default/templates/tag_selector.html:15 +#, python-format +msgid "remove '%(tag_name)s' from the list of interesting tags" +msgstr "уклоните '%(tag_name)s' Ñа лиÑте занимљивих ознака" + +#: forum/skins/default/templates/tag_selector.html:21 +#: forum/skins/default/templates/tag_selector.html:38 +msgid "Add" +msgstr "Додајте" + +#: forum/skins/default/templates/tag_selector.html:22 +msgid "Ignored tags" +msgstr "ИгнориÑане ознаке" + +#: forum/skins/default/templates/tag_selector.html:32 +#, python-format +msgid "remove '%(tag_name)s' from the list of ignored tags" +msgstr "уклоните '%(tag_name)s' Ñа лиÑте игнориÑаних ознака" + +#: forum/skins/default/templates/tag_selector.html:41 +msgid "keep ignored questions hidden" +msgstr "Ñакрите игнориÑана питања" + +#: forum/skins/default/templates/tags.html:6 +#: forum/skins/default/templates/tags.html:30 +msgid "Tag list" +msgstr "СпиÑак ознака" + +#: forum/skins/default/templates/tags.html:32 +msgid "sorted alphabetically" +msgstr "Ñортирано по алфабету" + +#: forum/skins/default/templates/tags.html:32 +msgid "by name" +msgstr "по имену" + +#: forum/skins/default/templates/tags.html:33 +msgid "sorted by frequency of tag use" +msgstr "" + +#: forum/skins/default/templates/tags.html:33 +msgid "by popularity" +msgstr "по популарноÑти" + +#: forum/skins/default/templates/tags.html:39 +#, python-format +msgid "" +"All tags matching '%(stag)s'" +msgstr "" + +#: forum/skins/default/templates/tags.html:42 +msgid "Nothing found" +msgstr "Ðишта није пронађено" + +#: forum/skins/default/templates/user_edit.html:6 +msgid "Edit user profile" +msgstr "Измените кориÑников профил" + +#: forum/skins/default/templates/user_edit.html:19 +msgid "edit profile" +msgstr "измените профил" + +#: forum/skins/default/templates/user_edit.html:33 +#: forum/skins/default/templates/user_info.html:53 +msgid "Registered user" +msgstr "РегиÑтровани кориÑник" + +#: forum/skins/default/templates/user_edit.html:40 +msgid "Screen Name" +msgstr "КориÑничко, (видљиво) име" + +#: forum/skins/default/templates/user_edit.html:89 +#: forum/skins/default/templates/user_email_subscriptions.html:20 +msgid "Update" +msgstr "Ðжурирајте" + +#: forum/skins/default/templates/user_email_subscriptions.html:8 +msgid "Email subscription settings" +msgstr "" + +#: forum/skins/default/templates/user_email_subscriptions.html:9 +msgid "email subscription settings info" +msgstr "" +"Adjust frequency of email updates. Receive " +"updates on interesting questions by email,
help the community by answering questions of your colleagues. If you do not wish to " +"receive emails - select 'no email' on all items below.
Updates are only " +"sent when there is any new activity on selected items." + +#: forum/skins/default/templates/user_email_subscriptions.html:21 +msgid "Stop sending email" +msgstr "Stop Email" + +#: forum/skins/default/templates/user_info.html:18 +msgid "change picture" +msgstr "промените Ñлику" + +#: forum/skins/default/templates/user_info.html:25 +#: forum/skins/default/templates/users.html:26 forum/views/users.py:933 +msgid "reputation" +msgstr "карма" + +#: forum/skins/default/templates/user_info.html:35 +msgid "Moderate this user" +msgstr "Модеришите овог кориÑника" + +#: forum/skins/default/templates/user_info.html:47 +msgid "update profile" +msgstr "ажурирајте профил" + +#: forum/skins/default/templates/user_info.html:57 +msgid "real name" +msgstr "право име" + +#: forum/skins/default/templates/user_info.html:62 +msgid "member for" +msgstr "члан од" + +#: forum/skins/default/templates/user_info.html:67 +msgid "last seen" +msgstr "поÑледњи пут виђен" + +#: forum/skins/default/templates/user_info.html:73 +msgid "user website" +msgstr "кориÑников веб Ñајт" + +#: forum/skins/default/templates/user_info.html:79 +msgid "location" +msgstr "локација" + +#: forum/skins/default/templates/user_info.html:86 +msgid "age" +msgstr "ÑтароÑÑ‚" + +#: forum/skins/default/templates/user_info.html:87 +msgid "age unit" +msgstr "година" + +#: forum/skins/default/templates/user_info.html:93 +msgid "todays unused votes" +msgstr "данашњи неиÑкоришћени глаÑови" + +#: forum/skins/default/templates/user_info.html:94 +msgid "votes left" +msgstr "преоÑтало глаÑова" + +#: forum/skins/default/templates/user_reputation.html:29 +msgid "Your karma change log." +msgstr "Евиденција промене Ваше карме." + +#: forum/skins/default/templates/user_reputation.html:31 +#, python-format +msgid "%(user_name)s's karma change log" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:11 +#, python-format +msgid "%(counter)s Question" +msgid_plural "%(counter)s Questions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: forum/skins/default/templates/user_stats.html:16 +#, python-format +msgid "%(counter)s Answer" +msgid_plural "%(counter)s Answers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: forum/skins/default/templates/user_stats.html:24 +#, python-format +msgid "the answer has been voted for %(answer_score)s times" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:24 +msgid "this answer has been selected as correct" +msgstr "овај одговор је изабран као иÑправан" + +#: forum/skins/default/templates/user_stats.html:34 +#, python-format +msgid "(%(comment_count)s comment)" +msgid_plural "the answer has been commented %(comment_count)s times" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: forum/skins/default/templates/user_stats.html:44 +#, python-format +msgid "%(cnt)s Vote" +msgid_plural "%(cnt)s Votes " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: forum/skins/default/templates/user_stats.html:50 +msgid "thumb up" +msgstr "палац горе" + +#: forum/skins/default/templates/user_stats.html:51 +msgid "user has voted up this many times" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:55 +msgid "thumb down" +msgstr "палац доле" + +#: forum/skins/default/templates/user_stats.html:56 +msgid "user voted down this many times" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:64 +#, python-format +msgid "%(counter)s Tag" +msgid_plural "%(counter)s Tags" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: forum/skins/default/templates/user_stats.html:72 +#, python-format +msgid "" +"see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " +msgstr "" + +#: forum/skins/default/templates/user_stats.html:86 +#, python-format +msgid "%(counter)s Badge" +msgid_plural "%(counter)s Badges" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: forum/skins/default/templates/user_tabs.html:7 +msgid "User profile" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:7 forum/views/users.py:907 +msgid "overview" +msgstr "преглед" + +#: forum/skins/default/templates/user_tabs.html:9 forum/views/users.py:915 +msgid "recent activity" +msgstr "недавне активноÑти" + +#: forum/skins/default/templates/user_tabs.html:12 forum/views/users.py:925 +msgid "comments and answers to others questions" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:13 forum/views/users.py:924 +msgid "responses" +msgstr "одговори" + +#: forum/skins/default/templates/user_tabs.html:16 +msgid "graph of user reputation" +msgstr "Graph of user karma" + +#: forum/skins/default/templates/user_tabs.html:17 +msgid "reputation history" +msgstr "karma history" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:951 +msgid "user vote record" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:950 +msgid "casted votes" +msgstr "votes" + +#: forum/skins/default/templates/user_tabs.html:23 +msgid "questions that user selected as his/her favorite" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:24 +msgid "favorites" +msgstr "омиљена" + +#: forum/skins/default/templates/user_tabs.html:27 forum/views/users.py:960 +msgid "email subscription settings" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:28 forum/views/users.py:959 +msgid "email subscriptions" +msgstr "" + +#: forum/skins/default/templates/users.html:6 +#: forum/skins/default/templates/users.html:24 +msgid "Users" +msgstr "КориÑници" + +#: forum/skins/default/templates/users.html:27 +msgid "recent" +msgstr "нови" + +#: forum/skins/default/templates/users.html:29 +msgid "by username" +msgstr "по кориÑничком имену" + +#: forum/skins/default/templates/users.html:35 +#, python-format +msgid "users matching query %(suser)s:" +msgstr "" + +#: forum/skins/default/templates/users.html:39 +msgid "Nothing found." +msgstr "Ðишта није пронађено." + +#: forum/skins/default/templates/users_questions.html:11 +msgid "this questions was selected as favorite" +msgstr "" + +#: forum/skins/default/templates/users_questions.html:12 +#, fuzzy +msgid "thumb-up on" +msgstr "палац-горе да" + +#: forum/skins/default/templates/users_questions.html:19 +#, fuzzy +msgid "thumb-up off" +msgstr "палац-горе не" + +#: forum/skins/default/templates/authopenid/changeemail.html:3 +#: forum/skins/default/templates/authopenid/changeemail.html:9 +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Change email" +msgstr "Change Email" + +#: forum/skins/default/templates/authopenid/changeemail.html:11 +msgid "Save your email address" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:16 +#, python-format +msgid "change %(email)s info" +msgstr "" +"Enter your new email into the box below if " +"you'd like to use another email for update subscriptions." +"
Currently you are using %(email)s" + +#: forum/skins/default/templates/authopenid/changeemail.html:18 +#, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "" +"Please enter your email address in the box below. Valid email address is required on this Q&A forum. If you like, " +"you can receive updates on interesting questions or entire " +"forum via email. Also, your email is used to create a unique gravatar image for your account. " +"Email addresses are never shown or otherwise shared with anybody else." + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your new Email" +msgstr "" +"Your new Email: (will not be shown to " +"anyone, must be valid)" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your Email" +msgstr "" +"Your Email (must be valid, never shown to others)" + +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Save Email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:49 +msgid "Validate email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:52 +#, python-format +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "" +"An email with a validation link has been sent to %" +"(email)s. Please follow the emailed link with your " +"web browser. Email validation is necessary to help insure the proper use of " +"email on Q&A. If you would like to use " +"another email, please change it again." + +#: forum/skins/default/templates/authopenid/changeemail.html:57 +msgid "Email not changed" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:60 +#, python-format +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" +"Your email address %(email)s has not been changed." +" If you decide to change it later - you can always do it by editing " +"it in your user profile or by using the previous form again." + +#: forum/skins/default/templates/authopenid/changeemail.html:65 +msgid "Email changed" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:68 +#, python-format +msgid "your current %(email)s can be used for this" +msgstr "" +"Your email address is now set to %(email)s. " +"Updates on the questions that you like most will be sent to this address. " +"Email notifications are sent once a day or less frequently - only when there " +"are any news." + +#: forum/skins/default/templates/authopenid/changeemail.html:73 +msgid "Email verified" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:76 +msgid "thanks for verifying email" +msgstr "" +"Thank you for verifying your email! Now " +"you can ask and answer questions. Also if " +"you find a very interesting question you can subscribe for the " +"updates - then will be notified about changes once a day or less frequently." + +#: forum/skins/default/templates/authopenid/changeemail.html:81 +msgid "email key not sent" +msgstr "Validation email not sent" + +#: forum/skins/default/templates/authopenid/changeemail.html:84 +#, python-format +msgid "email key not sent %(email)s change email here %(change_link)s" +msgstr "" +"Your current email address %(email)s has been " +"validated before so the new key was not sent. You can change email used for update subscriptions if necessary." + +#: forum/skins/default/templates/authopenid/changeopenid.html:8 +msgid "Account: change OpenID URL" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:12 +msgid "" +"This is where you can change your OpenID URL. Make sure you remember it!" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:14 +#: forum/skins/default/templates/authopenid/delete.html:14 +#: forum/skins/default/templates/authopenid/delete.html:24 +msgid "Please correct errors below:" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:29 +msgid "OpenID URL:" +msgstr "OpenID URL:" + +#: forum/skins/default/templates/authopenid/changepw.html:7 +msgid "Account: change password" +msgstr "Change your password" + +#: forum/skins/default/templates/authopenid/changepw.html:8 +msgid "This is where you can change your password. Make sure you remember it!" +msgstr "" +"To change your password please fill out and " +"submit this form" + +#: forum/skins/default/templates/authopenid/complete.html:19 +msgid "Connect your OpenID with this site" +msgstr "New user signup" + +#: forum/skins/default/templates/authopenid/complete.html:22 +msgid "Connect your OpenID with your account on this site" +msgstr "New user signup" + +#: forum/skins/default/templates/authopenid/complete.html:27 +#, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your %" +"(provider)s login. Please create your screen name " +"and save your email address. Saved email address will let " +"you subscribe for the updates on the most interesting " +"questions and will be used to create and retrieve your unique avatar image - " +"gravatar.

" + +#: forum/skins/default/templates/authopenid/complete.html:31 +#, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" +"

Oops... looks like screen name %(username)s is " +"already used in another account.

Please choose another screen " +"name to use with your %(provider)s login. Also, a valid email address is " +"required on the Q&A forum. Your email is " +"used to create a unique gravatar image for your account. If you like, you can receive " +"updates on the interesting questions or entire forum by email. " +"Email addresses are never shown or otherwise shared with anybody else.

" + +#: forum/skins/default/templates/authopenid/complete.html:35 +#, python-format +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your %" +"(provider)s login.

You can either keep your screen " +"name the same as your %(provider)s login name or choose some other " +"nickname.

Also, please save a valid email address. " +"With the email you can subscribe for the updates on the " +"most interesting questions. Email address is also used to create and " +"retrieve your unique avatar image - gravatar.

" + +#: forum/skins/default/templates/authopenid/complete.html:38 +#, python-format +msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your " +"Facebook login. Please create your screen name and " +"save your email address. Saved email address will let you " +"subscribe for the updates on the most interesting questions " +"and will be used to create and retrieve your unique avatar image - gravatar.

" + +#: forum/skins/default/templates/authopenid/complete.html:42 +msgid "This account already exists, please use another." +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:57 +msgid "Sorry, looks like we have some errors:" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:82 +msgid "Screen name label" +msgstr "Screen Name (will be shown to others)" + +#: forum/skins/default/templates/authopenid/complete.html:89 +msgid "Email address label" +msgstr "" +"Email Address (will not be shared with " +"anyone, must be valid)" + +#: forum/skins/default/templates/authopenid/complete.html:95 +#: forum/skins/default/templates/authopenid/signup.html:18 +msgid "receive updates motivational blurb" +msgstr "" +"Receive forum updates by email - this will help our " +"community grow and become more useful.
By default Q&A forum sends up to one email digest per " +"week - only when there is anything new.
If you like, please " +"adjust this now or any time later from your user account." + +#: forum/skins/default/templates/authopenid/complete.html:99 +#: forum/skins/default/templates/authopenid/signup.html:22 +msgid "please select one of the options above" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:102 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:103 +msgid "create account" +msgstr "Signup" + +#: forum/skins/default/templates/authopenid/complete.html:112 +msgid "Existing account" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:113 +msgid "user name" +msgstr "кориÑничко име" + +#: forum/skins/default/templates/authopenid/complete.html:114 +msgid "password" +msgstr "шифра" + +#: forum/skins/default/templates/authopenid/complete.html:121 +msgid "Register" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:122 +#: forum/skins/default/templates/authopenid/signin.html:168 +msgid "Forgot your password?" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:2 +msgid "Thank you for registering at our Q&A forum!" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:4 +msgid "Your account details are:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:6 +msgid "Username:" +msgstr "КориÑничко име:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:7 +#: forum/skins/default/templates/authopenid/delete.html:19 +msgid "Password:" +msgstr "Шифра:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:9 +msgid "Please sign in here:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:12 +#: forum/skins/default/templates/authopenid/email_validation.txt:14 +#: forum/skins/default/templates/authopenid/sendpw_email.txt:8 +msgid "" +"Sincerely,\n" +"Forum Administrator" +msgstr "" +"Sincerely,\n" +"Q&A Forum Administrator" + +#: forum/skins/default/templates/authopenid/delete.html:8 +msgid "Account: delete account" +msgstr "Ðалог: избришите налог" + +#: forum/skins/default/templates/authopenid/delete.html:12 +msgid "" +"Note: After deleting your account, anyone will be able to register this " +"username." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:16 +msgid "Check confirm box, if you want delete your account." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:31 +msgid "I am sure I want to delete my account." +msgstr "Сигуран Ñам да желим да избришем мој налог." + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "Password/OpenID URL" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "(required for your security)" +msgstr "(потребно за вашу ÑигурноÑÑ‚)" + +#: forum/skins/default/templates/authopenid/delete.html:34 +msgid "Delete account permanently" +msgstr "Избришите трајно Ваш налог" + +#: forum/skins/default/templates/authopenid/email_validation.txt:2 +msgid "Greetings from the Q&A forum" +msgstr "Поздрав од П&О форума" + +#: forum/skins/default/templates/authopenid/email_validation.txt:4 +msgid "To make use of the Forum, please follow the link below:" +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:8 +msgid "Following the link above will help us verify your email address." +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:10 +msgid "" +"If you beleive that this message was sent in mistake - \n" +"no further action is needed. Just ingore this email, we apologize\n" +"for any inconvenience" +msgstr "" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:4 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:7 +msgid "Traditional login information" +msgstr "" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:12 +#, python-format +msgid "" +"how to login with password through external login website or use %" +"(feedback_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw.html:4 +#: forum/skins/default/templates/authopenid/sendpw.html:7 +msgid "Send new password" +msgstr "Recover password" + +#: forum/skins/default/templates/authopenid/sendpw.html:10 +msgid "password recovery information" +msgstr "" +"Forgot you password? No problems - just get a new " +"one!
Please follow the following steps:
• submit your " +"user name below and check your email
follow the " +"activation link for the new password - sent to you by email and " +"login with the suggested password
• at this you might want to " +"change your password to something you can remember better" + +#: forum/skins/default/templates/authopenid/sendpw.html:21 +msgid "Reset password" +msgstr "Send me a new password" + +#: forum/skins/default/templates/authopenid/sendpw.html:22 +msgid "return to login" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:2 +#, python-format +msgid "" +"Someone has requested to reset your password on %(site_url)s.\n" +"If it were not you, it is safe to ignore this email." +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:5 +#, python-format +msgid "" +"email explanation how to use new %(password)s for %(username)s\n" +"with the %(key_link)s" +msgstr "" +"To change your password, please follow these steps:\n" +"* visit this link: %(key_link)s\n" +"* login with user name %(username)s and password %(password)s\n" +"* go to your user profile and set the password to something you can remember" + +#: forum/skins/default/templates/authopenid/signin.html:5 +#: forum/skins/default/templates/authopenid/signin.html:21 +msgid "User login" +msgstr "User login" + +#: forum/skins/default/templates/authopenid/signin.html:28 +#, python-format +msgid "" +"\n" +" Your answer to %(title)s %(summary)s will be posted once you " +"log in\n" +" " +msgstr "" +"\n" +"Your answer to \"%(title)s %(summary)s...\" is saved and will be " +"posted once you log in." + +#: forum/skins/default/templates/authopenid/signin.html:35 +#, python-format +msgid "" +"Your question \n" +" %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" +"Your question \"%(title)s %(summary)s...\" is saved and will be " +"posted once you log in." + +#: forum/skins/default/templates/authopenid/signin.html:42 +msgid "Click to sign in through any of these services." +msgstr "" +"

Please select your favorite login method below." +"

External login services use OpenID technology, where your password " +"always stays confidential between you and your login provider and you don't " +"have to remember another one.

" + +# msgid "Click to sign in through any of these services." +# msgstr "" +# "

Please select your favorite login method +# below." +# "

External login services use OpenID technology, where your password " +# "always stays confidential between you and your login provider and you don't +# " +# "have to remember another one. " +# "Askbot option requires your login name and " +# "password entered here.

" +#: forum/skins/default/templates/authopenid/signin.html:144 +msgid "Enter your Provider user name" +msgstr "" +"Enter your Provider user name
(or " +"select another login method above)" + +#: forum/skins/default/templates/authopenid/signin.html:151 +msgid "" +"Enter your OpenID " +"web address" +msgstr "" +"Enter your OpenID web address
(or choose " +"another login method above)" + +#: forum/skins/default/templates/authopenid/signin.html:153 +#: forum/skins/default/templates/authopenid/signin.html:166 +msgid "Login" +msgstr "Пријава" + +#: forum/skins/default/templates/authopenid/signin.html:157 +msgid "Enter your login name and password" +msgstr "" +"Enter your Askbot login and password
(or select your OpenID provider above)" + +#: forum/skins/default/templates/authopenid/signin.html:161 +msgid "Login name" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:163 +msgid "Password" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:167 +#, fuzzy +msgid "Create account" +msgstr "Отворите налог" + +#: forum/skins/default/templates/authopenid/signin.html:178 +msgid "Why use OpenID?" +msgstr "Зашто кориÑтити OpenID?" + +#: forum/skins/default/templates/authopenid/signin.html:181 +msgid "with openid it is easier" +msgstr "With the OpenID you don't need to create new username and password." + +#: forum/skins/default/templates/authopenid/signin.html:184 +msgid "reuse openid" +msgstr "You can safely re-use the same login for all OpenID-enabled websites." + +#: forum/skins/default/templates/authopenid/signin.html:187 +msgid "openid is widely adopted" +msgstr "" +"There are > 160,000,000 OpenID account in use. Over 10,000 sites are OpenID-" +"enabled." + +#: forum/skins/default/templates/authopenid/signin.html:190 +msgid "openid is supported open standard" +msgstr "OpenID is based on an open standard, supported by many organizations." + +#: forum/skins/default/templates/authopenid/signin.html:195 +msgid "Find out more" +msgstr "Сазнајте више" + +#: forum/skins/default/templates/authopenid/signin.html:196 +msgid "Get OpenID" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:4 +msgid "Signup" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:8 +msgid "Create login name and password" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:10 +msgid "Traditional signup info" +msgstr "" +"If you prefer, create your forum login name and " +"password here. However, please keep in mind that we also support " +"OpenID login method. With OpenID you can " +"simply reuse your external login (e.g. Gmail or AOL) without ever sharing " +"your login details with anyone and having to remember yet another password." + +#: forum/skins/default/templates/authopenid/signup.html:25 +msgid "" +"Please read and type in the two words below to help us prevent automated " +"account creation." +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:27 +msgid "Create Account" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:28 +msgid "or" +msgstr "или" + +#: forum/skins/default/templates/authopenid/signup.html:29 +msgid "return to OpenID login" +msgstr "" + +#: forum/skins/default/templates/fbconnect/xd_receiver.html:5 +#, python-format +msgid "Connect to %(APP_SHORT_NAME)s with Facebook!" +msgstr "" + +#: forum/templatetags/extra_filters.py:100 +msgid "no items in counter" +msgstr "без" + +#: forum/templatetags/extra_tags.py:53 +#, python-format +msgid "%(username)s gravatar image" +msgstr "%(username)s gravatar Ñлика" + +#: forum/templatetags/extra_tags.py:178 forum/templatetags/extra_tags.py:205 +msgid "reputation points" +msgstr "карма" + +#: forum/templatetags/extra_tags.py:265 +msgid "2 days ago" +msgstr "пре 2 дана" + +#: forum/templatetags/extra_tags.py:267 +msgid "yesterday" +msgstr "јуче" + +#: forum/templatetags/extra_tags.py:269 +#, fuzzy, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "пре %(hr)d Ñат" +msgstr[1] "пре %(hr)d Ñати" +msgstr[2] "" + +#: forum/templatetags/extra_tags.py:271 +#, fuzzy, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "пре %(min)d минут" +msgstr[1] "пре %(min)d минута" +msgstr[2] "" + +#: forum/utils/forms.py:30 +msgid "this field is required" +msgstr "ово поље је обавезно" + +#: forum/utils/forms.py:45 +msgid "choose a username" +msgstr "Одаберете кориÑничко име" + +#: forum/utils/forms.py:50 +msgid "user name is required" +msgstr "кориÑничко име је обавезно" + +#: forum/utils/forms.py:51 +msgid "sorry, this name is taken, please choose another" +msgstr "нажалоÑÑ‚, ово име је заузето, молимо Ð’Ð°Ñ Ð¸Ð·Ð°Ð±ÐµÑ€Ð¸Ñ‚Ðµ друго" + +#: forum/utils/forms.py:52 +msgid "sorry, this name is not allowed, please choose another" +msgstr "нажалоÑÑ‚, ово име није дозвољено, молимо Ð’Ð°Ñ Ð¸Ð·Ð°Ð±ÐµÑ€Ð¸Ñ‚Ðµ друго" + +#: forum/utils/forms.py:53 +msgid "sorry, there is no user with this name" +msgstr "нажалоÑÑ‚, не поÑтоји кориÑник Ñа овим именом" + +#: forum/utils/forms.py:54 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" +"нажалоÑÑ‚, имамо озбиљну грешку - кориÑничко име је заузето од Ñтране више " +"кориÑника" + +#: forum/utils/forms.py:55 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "" +"кориÑничко име Ñе може ÑаÑтојати иÑкључиво од Ñлова, празног проÑтора и доње " +"линије." + +#: forum/utils/forms.py:109 +msgid "your email address" +msgstr "Your email (never shared)" + +#: forum/utils/forms.py:110 +msgid "email address is required" +msgstr "е-пошта је обавезна" + +#: forum/utils/forms.py:111 +msgid "please enter a valid email address" +msgstr "унеÑите валидну е-пошту" + +#: forum/utils/forms.py:112 +msgid "this email is already used by someone else, please choose another" +msgstr "ову е-пошту већ кориÑти неки кориÑник, изаберите другу" + +#: forum/utils/forms.py:140 +msgid "choose password" +msgstr "Шифра" + +#: forum/utils/forms.py:141 +msgid "password is required" +msgstr "шифра је неопходна" + +#: forum/utils/forms.py:144 +msgid "retype password" +msgstr "Шифра (поново откуцајте)" + +#: forum/utils/forms.py:145 +msgid "please, retype your password" +msgstr "молимo ВаÑ, поново откуцајте шифру" + +#: forum/utils/forms.py:146 +msgid "sorry, entered passwords did not match, please try again" +msgstr "унета шифра не одговара, покушајте поново" + +#: forum/views/commands.py:209 +#, python-format +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "" +"Ваша претплата је Ñачувана, али е-пошту %(email)s је потребно проверити, " +"погледајте овде за више информација" + +#: forum/views/commands.py:217 +msgid "email update frequency has been set to daily" +msgstr "" + +#: forum/views/meta.py:35 +msgid "Q&A forum feedback" +msgstr "П&О форум ÑугеÑтије" + +#: forum/views/meta.py:36 +msgid "Thanks for the feedback!" +msgstr "Хвала на ÑугеÑтији!" + +#: forum/views/meta.py:44 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "" + +#: forum/views/users.py:867 forum/views/users.py:871 +msgid "changes saved" +msgstr "промене Ñу Ñачуване" + +#: forum/views/users.py:877 +msgid "email updates canceled" +msgstr "" + +#: forum/views/users.py:908 +msgid "user profile" +msgstr "кориÑнички профил" + +#: forum/views/users.py:909 +msgid "user profile overview" +msgstr "преглед кориÑниковог профила" + +#: forum/views/users.py:916 +msgid "recent user activity" +msgstr "недавне активноÑти кориÑника" + +#: forum/views/users.py:917 +msgid "profile - recent activity" +msgstr "профил - недавне активноÑти" + +#: forum/views/users.py:926 +msgid "profile - responses" +msgstr "профил - одговори" + +#: forum/views/users.py:934 +msgid "user reputation in the community" +msgstr "кориÑникова карма" + +#: forum/views/users.py:935 +msgid "profile - user reputation" +msgstr "профил - кориÑникова карма" + +#: forum/views/users.py:941 +msgid "favorite questions" +msgstr "омиљена питања" + +#: forum/views/users.py:942 +msgid "users favorite questions" +msgstr "омиљена питања кориÑника" + +#: forum/views/users.py:943 +msgid "profile - favorite questions" +msgstr "профил - омиљена питања" + +#: forum/views/users.py:952 +msgid "profile - votes" +msgstr "профил - глаÑови" + +#: forum/views/users.py:961 +msgid "profile - email subscriptions" +msgstr "профил - претплата е-поштом" + +#: forum/views/writers.py:70 +msgid "uploading images is limited to users with >60 reputation points" +msgstr "нажалоÑÑ‚, Ñлање датотека на Ñервер захтева да имате карму >60" + +#: forum/views/writers.py:72 +msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" +msgstr "" +"дозвољени типови датотека Ñу 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" + +#: forum/views/writers.py:74 +#, python-format +msgid "maximum upload file size is %sK" +msgstr "макÑимална величина датотеке за Ñлање на Ñервер је %sK" + +#: forum/views/writers.py:76 +#, python-format +msgid "" +"Error uploading file. Please contact the site administrator. Thank you. %s" +msgstr "" +"Грешка при Ñлању датотеке. Молимо Ð’Ð°Ñ Ð´Ð° контактирате админиÑтратора Ñајта. " +"Хвала Вам. %s" + +#: forum_modules/authentication/auth.py:27 +msgid "Email Validation" +msgstr "Валидација е-поште" + +#: forum_modules/authentication/auth.py:38 +msgid "Thank you, your email is now validated." +msgstr "Хвала вам, Ваша е-пошта је Ñада потврђена." + +#: forum_modules/authentication/auth.py:62 +msgid "Your password was changed" +msgstr "Ваша шифра је измењена" + +#: forum_modules/authentication/auth.py:64 +msgid "New password set" +msgstr "Ðова шифра је креирана" + +#: forum_modules/authentication/auth.py:130 +#, python-format +msgid "Welcome back %s, you are now logged in" +msgstr "Добродошли назад %s, Ñада Ñте пријављени" + +#: forum_modules/books/urls.py:7 forum_modules/books/urls.py:8 +#: forum_modules/books/urls.py:9 +msgid "books/" +msgstr "књиге/" + +#, fuzzy +#~ msgid "please login" +#~ msgstr "User login" + +#, fuzzy +#~ msgid " One question found" +#~ msgid_plural "%(q_num)s questions found" +#~ msgstr[0] "Једно пронађено питање" +#~ msgstr[1] "%(q_num)s пронађених питања" +#~ msgstr[2] "" + +#~ msgid "welcome to website" +#~ msgstr "Welcome to Q&A forum" + +#~ msgid "Recent awards" +#~ msgstr "Recent badges" + +#~ msgid "all awards" +#~ msgstr "Ñви беџеви" + +#~ msgid "complete list of questions" +#~ msgstr "list of all questions" + +#~ msgid "popular tags" +#~ msgstr "ознаке" + +#~ msgid "list of unanswered questions" +#~ msgstr "питања без одговора" + +#~ msgid "" +#~ " have total %(q_num)s questions containing %(searchtitle)s in full text " +#~ msgid_plural "" +#~ " have total %(q_num)s questions containing %(searchtitle)s in full text " +#~ msgstr[0] "" +#~ "
%(q_num)s

question containing " +#~ "%(searchtitle)s

" +#~ msgstr[1] "" +#~ "
%(q_num)s

questions containing " +#~ "%(searchtitle)s

" + +#~ msgid " have total %(q_num)s questions containing %(searchtitle)s " +#~ msgid_plural " have total %(q_num)s questions containing %(searchtitle)s " +#~ msgstr[0] "" +#~ "
%(q_num)s

question with title " +#~ "containing %(searchtitle)s

" +#~ msgstr[1] "" +#~ "
%(q_num)s

questions with title " +#~ "containing %(searchtitle)s

" + +#~ msgid " have total %(q_num)s unanswered questions " +#~ msgid_plural " have total %(q_num)s unanswered questions " +#~ msgstr[0] "" +#~ "
%(q_num)s
questions without " +#~ "accepted answers" +#~ msgstr[1] "" +#~ "
%(q_num)s
questions without " +#~ "accepted answers" + +#~ msgid "Most recently answered ones are shown first." +#~ msgstr "Most recently answered questions are shown first." + +#~ msgid "Questions sorted by number of responses." +#~ msgstr "Questions sorted by the number of answers." + +#~ msgid "Most answered questions are shown first." +#~ msgstr " " + +#~ msgid "avatar, see %(gravatar_faq_url)s" +#~ msgstr "gravatar" + +#~ msgid "" +#~ "Sincerely,
\n" +#~ " Forum Administrator" +#~ msgstr "" +#~ "Sincerely,\n" +#~ "Q&A Forum Administrator" + +#~ msgid "" +#~ "\n" +#~ " have total %(q_num)s unanswered questions\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " have total %(q_num)s unanswered questions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "
%(q_num)s

question without an " +#~ "accepted answer

\n" +#~ msgstr[1] "" +#~ "
%(q_num)s

questions without an " +#~ "accepted answer

" + +#~ msgid "" +#~ "\n" +#~ " have total %(q_num)s questions\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " have total %(q_num)s questions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "
%(q_num)s

question

" +#~ msgstr[1] "" +#~ "\n" +#~ "
%(q_num)s

questions

" diff --git a/askbot/locale/tr/LC_MESSAGES/django.mo b/askbot/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 00000000..66384a39 Binary files /dev/null and b/askbot/locale/tr/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/tr/LC_MESSAGES/django.po b/askbot/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 00000000..6a4e438c --- /dev/null +++ b/askbot/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,4391 @@ +# Translation prepared for Askbot project +# Copyright (C) 2010 Mike Chen and Askbot developers +# This file is distributed under the same license as the Askbot package. +# Otkay Yildiz , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-09 19:43-0400\n" +"PO-Revision-Date: 2010-04-30 02:23\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" + +#: django_authopenid/forms.py:71 django_authopenid/views.py:132 +msgid "i-names are not supported" +msgstr "i-name girişleri desteklenmiyor" + +#: django_authopenid/forms.py:134 +msgid "Account with this name already exists on the forum" +msgstr "Hesap bu adla zaten forum var" + +#: django_authopenid/forms.py:135 +msgid "can't have two logins to the same account yet, sorry." +msgstr "Üzgünüm.. Bir hesaba aynı anda iki giriş mümkün değil." + +#: django_authopenid/forms.py:157 +msgid "Please enter valid username and password (both are case-sensitive)." +msgstr "Lütfen) geçerli kullanıcı adı ve şifre (hem harf duyarlıdır girin." + +#: django_authopenid/forms.py:160 django_authopenid/forms.py:210 +msgid "This account is inactive." +msgstr "Bu hesap etkin değil." + +#: django_authopenid/forms.py:162 +msgid "Login failed." +msgstr "Giriş başarısız oldu." + +#: django_authopenid/forms.py:164 +msgid "Please enter username and password" +msgstr "Lütfen kullanıcı adınızı ve şifrenizi girin" + +#: django_authopenid/forms.py:166 +msgid "Please enter your password" +msgstr "Lütfen şifrenizi girin" + +#: django_authopenid/forms.py:168 +msgid "Please enter user name" +msgstr "Lütfen kullanıcı adı girin" + +#: django_authopenid/forms.py:206 +msgid "" +"Please enter a valid username and password. Note that " +"both fields are case-sensitive." +msgstr "" +"Lütfen geçerli bir kullanıcı adı ve şifrenizi giriniz. Her iki alan küçük " +"harfe duyarlı olduğunu unutmayın." + +#: django_authopenid/forms.py:229 +msgid "Current password" +msgstr "Şu anki şifre" + +#: django_authopenid/forms.py:240 +msgid "" +"Old password is incorrect. Please enter the correct " +"password." +msgstr "Eski şifre doğru değil. Lütfen eski şifrenizi tekrar girin." + +#: django_authopenid/forms.py:305 +msgid "Your user name (required)" +msgstr "Kullanıcı adınız (gerekli)" + +#: django_authopenid/forms.py:320 +msgid "Incorrect username." +msgstr "Hatalı kullanıcı adı." + +#: django_authopenid/urls.py:23 django_authopenid/urls.py:24 +#: django_authopenid/urls.py:25 django_authopenid/urls.py:27 +#: fbconnect/urls.py:12 fbconnect/urls.py:13 fbconnect/urls.py:14 +msgid "signin/" +msgstr "giriş/" + +#: django_authopenid/urls.py:24 fbconnect/urls.py:13 fbconnect/urls.py:17 +msgid "newquestion/" +msgstr "yeni-soru/" + +#: django_authopenid/urls.py:25 fbconnect/urls.py:14 fbconnect/urls.py:18 +msgid "newanswer/" +msgstr "yeni-cevap/" + +#: django_authopenid/urls.py:26 +msgid "signout/" +msgstr "cikis/" + +#: django_authopenid/urls.py:27 +msgid "complete/" +msgstr "tamamlandi/" + +#: django_authopenid/urls.py:29 fbconnect/urls.py:16 fbconnect/urls.py:17 +#: fbconnect/urls.py:18 +msgid "register/" +msgstr "kayit/" + +#: django_authopenid/urls.py:30 +msgid "signup/" +msgstr "kayit/" + +#: django_authopenid/urls.py:32 +msgid "sendpw/" +msgstr "sifre-yolla/" + +#: django_authopenid/urls.py:33 django_authopenid/urls.py:37 +msgid "password/" +msgstr "sifre/" + +#: django_authopenid/urls.py:33 +msgid "confirm/" +msgstr "onayla/" + +#: django_authopenid/urls.py:38 django_authopenid/urls.py:39 +#: django_authopenid/urls.py:40 django_authopenid/urls.py:41 +msgid "email/" +msgstr "E-mail/" + +#: django_authopenid/urls.py:38 +msgid "validate/" +msgstr "dogrula/" + +#: django_authopenid/urls.py:39 +msgid "change/" +msgstr "degistir/" + +#: django_authopenid/urls.py:40 +msgid "sendkey/" +msgstr "sifre-yolla/" + +#: django_authopenid/urls.py:41 +msgid "verify/" +msgstr "dogrula/" + +#: django_authopenid/urls.py:42 +msgid "openid/" +msgstr "OpenID/" + +#: django_authopenid/urls.py:43 forum/urls.py:52 forum/urls.py:56 +msgid "delete/" +msgstr "sil/" + +#: django_authopenid/urls.py:51 +msgid "external-login/forgot-password/" +msgstr "harici-giris/sifremi-unuttum/" + +#: django_authopenid/urls.py:54 +msgid "external-login/signup/" +msgstr "harici-giris/üye-ol/" + +#: django_authopenid/views.py:139 +#, python-format +msgid "OpenID %(openid_url)s is invalid" +msgstr "OpenID %(openid_url)s geçersiz" + +#: django_authopenid/views.py:614 +msgid "Welcome email subject line" +msgstr "Hoşgeldiniz mesajının konusu" + +#: django_authopenid/views.py:720 +msgid "Password changed." +msgstr "Şifre değiştirildi." + +#: django_authopenid/views.py:732 django_authopenid/views.py:738 +#, fuzzy, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" +"Your email needs to be validated. Please see details here." + +#: django_authopenid/views.py:759 +#, fuzzy +msgid "Email verification subject line" +msgstr "Verification Email from Q&A forum" + +#: django_authopenid/views.py:850 +msgid "your email was not changed" +msgstr "E-mail adresiniz değiştirilmedi" + +#: django_authopenid/views.py:898 django_authopenid/views.py:1056 +#, python-format +msgid "No OpenID %s found associated in our database" +msgstr "OpenID %s hesabı veritabanımızda yok" + +#: django_authopenid/views.py:902 django_authopenid/views.py:1063 +#, python-format +msgid "The OpenID %s isn't associated to current user logged in" +msgstr "OpenID %s hesabı giriş yapan kullanıcı ile bağlantılı değil" + +#: django_authopenid/views.py:910 +msgid "Email Changed." +msgstr "E-mail adresi değiştirildi." + +#: django_authopenid/views.py:988 +msgid "This OpenID is already associated with another account." +msgstr "Bu OpenID zaten başka bir hesap ile ilişkilidir." + +#: django_authopenid/views.py:993 +#, python-format +msgid "OpenID %s is now associated with your account." +msgstr "OpenID %s hesabını sizin ile ilişkilendirilecek." + +#: django_authopenid/views.py:1066 +msgid "Account deleted." +msgstr "Hesap silindi." + +#: django_authopenid/views.py:1118 +msgid "Request for new password" +msgstr "Yeni şifre iste" + +#: django_authopenid/views.py:1132 +msgid "A new password and the activation link were sent to your email address." +msgstr "Yeni bir şifre ve aktivasyon linki e-mail adresinize gönderildi." + +#: django_authopenid/views.py:1164 +#, python-format +msgid "" +"Could not change password. Confirmation key '%s' is not " +"registered." +msgstr "Şifreniz değiştirilemedi. Onay kodu '%s' kayıtlı değil." + +#: django_authopenid/views.py:1174 +msgid "" +"Can not change password. User don't exist anymore in our " +"database." +msgstr "" +"Şifre değiştirilemez. Kullanıcı adı artık bizim veritabanımızda mevcut " +"değildir." + +#: django_authopenid/views.py:1184 +#, python-format +msgid "Password changed for %s. You may now sign in." +msgstr "%s için şifre değiştirildi. Şimdi giriş yapabilirsiniz." + +#: forum/auth.py:505 +msgid "Your question and all of it's answers have been deleted" +msgstr "Sorunuz ve ona ait tüm cevapları silindi." + +#: forum/auth.py:507 +msgid "Your question has been deleted" +msgstr "Sorunuz silindi" + +#: forum/auth.py:510 +msgid "The question and all of it's answers have been deleted" +msgstr "Soru ve ona ait tüm cevaplar silindi" + +#: forum/auth.py:512 +msgid "The question has been deleted" +msgstr "Soru silindi" + +#: forum/const.py:8 +msgid "duplicate question" +msgstr "yinelenen soru" + +#: forum/const.py:9 +msgid "question is off-topic or not relevant" +msgstr "soru konu dışı veya alakalısız" + +#: forum/const.py:10 +msgid "too subjective and argumentative" +msgstr "çok öznel ve tartışmacı" + +#: forum/const.py:11 +msgid "not a real question" +msgstr "gerçek bir soru değil" + +#: forum/const.py:12 +msgid "the question is answered, right answer was accepted" +msgstr "soru cevabı doğru kabul edildi" + +#: forum/const.py:13 +msgid "question is not relevant or outdated" +msgstr "soru, ilgisiz veya eskimiş" + +#: forum/const.py:14 +msgid "question contains offensive or malicious remarks" +msgstr "soru saldırgan ya da kötü niyetli sözler içeriyor" + +#: forum/const.py:15 +msgid "spam or advertising" +msgstr "spam ya da reklam" + +#: forum/const.py:16 +msgid "too localized" +msgstr "çok dar kapsamlı" + +#: forum/const.py:37 forum/skins/default/templates/questions.html:70 +#: forum/skins/default/templates/questions.html:75 +msgid "newest" +msgstr "en yeni" + +#: forum/const.py:38 forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/users.html:28 +msgid "oldest" +msgstr "en eski" + +#: forum/const.py:39 forum/skins/default/templates/questions.html:89 +#: forum/skins/default/templates/questions.html:94 +msgid "active" +msgstr "aktif" + +#: forum/const.py:40 forum/skins/default/templates/questions.html:83 +msgid "inactive" +msgstr "hareketsiz" + +#: forum/const.py:41 +msgid "hottest" +msgstr "sıcak" + +#: forum/const.py:42 +msgid "coldest" +msgstr "soğuk" + +#: forum/const.py:43 +msgid "most voted" +msgstr "en çok oy alan" + +#: forum/const.py:44 +msgid "least voted" +msgstr "En az oy" + +#: forum/const.py:45 +msgid "relevance" +msgstr "ilgi" + +#: forum/const.py:52 forum/skins/default/templates/questions.html:52 +msgid "all" +msgstr "tümü" + +#: forum/const.py:53 forum/skins/default/templates/questions.html:53 +msgid "unanswered" +msgstr "cevapsız" + +#: forum/const.py:54 forum/skins/default/templates/questions.html:55 +msgid "favorite" +msgstr "favori" + +#: forum/const.py:97 +msgid "question" +msgstr "soru" + +#: forum/const.py:98 forum/skins/default/templates/book.html:110 +msgid "answer" +msgstr "cevap" + +#: forum/const.py:99 +msgid "commented question" +msgstr "soruya yorum yazıldı" + +#: forum/const.py:100 +msgid "commented answer" +msgstr "cevaba yorum yazıldı" + +#: forum/const.py:101 +msgid "edited question" +msgstr "soru düzeltilmiş" + +#: forum/const.py:102 +msgid "edited answer" +msgstr "cevap düzeltilmiş" + +#: forum/const.py:103 +msgid "received award" +msgstr "alınan ödül" + +#: forum/const.py:104 +msgid "marked best answer" +msgstr "en iyi cevap olarak işaretlenmiş" + +#: forum/const.py:105 +msgid "upvoted" +msgstr "beğendim" + +#: forum/const.py:106 +msgid "downvoted" +msgstr "beğenmedim" + +#: forum/const.py:107 +msgid "canceled vote" +msgstr "oy iptal" + +#: forum/const.py:108 +msgid "deleted question" +msgstr "silinmiş bir soru" + +#: forum/const.py:109 +msgid "deleted answer" +msgstr "silinmiş cevap" + +#: forum/const.py:110 +msgid "marked offensive" +msgstr "saldırgan olarak işaretlenmiş" + +#: forum/const.py:111 +msgid "updated tags" +msgstr "güncellenmiş etiketler" + +#: forum/const.py:112 +msgid "selected favorite" +msgstr "favori olarak seçilmiş" + +#: forum/const.py:113 +msgid "completed user profile" +msgstr "tamamlanmış kullanıcı profili" + +#: forum/const.py:114 +msgid "email update sent to user" +msgstr "kullanıcıya e-mail güncelleme gönder" + +#: forum/const.py:118 +msgid "question_answered" +msgstr "cevaplanmış_soru" + +#: forum/const.py:119 +msgid "question_commented" +msgstr "yorumlanmış soru" + +#: forum/const.py:120 +msgid "answer_commented" +msgstr "yorumlanmış soru" + +#: forum/const.py:121 +msgid "answer_accepted" +msgstr "kabul edilmiş soru" + +#: forum/const.py:125 +msgid "[closed]" +msgstr "[kapatıldı]" + +#: forum/const.py:126 +msgid "[deleted]" +msgstr "[silindi]" + +#: forum/const.py:127 forum/views/readers.py:396 forum/views/readers.py:417 +msgid "initial version" +msgstr "ilk versiyon" + +#: forum/const.py:128 +msgid "retagged" +msgstr "yeniden etiketlendi" + +#: forum/const.py:132 +msgid "exclude ignored tags" +msgstr "dışlanmış etiketleri dikkate al" + +#: forum/const.py:132 +msgid "allow only selected tags" +msgstr "sadece seçilmiş etiketlere izin ver" + +#: forum/feed.py:18 +msgid " - " +msgstr "-" + +#: forum/feed.py:18 +msgid "latest questions" +msgstr "en son sorulanlar" + +#: forum/forms.py:23 forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "title" +msgstr "başlık" + +#: forum/forms.py:24 +msgid "please enter a descriptive title for your question" +msgstr "Sorunuz için açıklayıcı bir başlık girin" + +#: forum/forms.py:29 +msgid "title must be > 10 characters" +msgstr "en az 10 karakter olmalı" + +#: forum/forms.py:38 +msgid "content" +msgstr "içerik" + +#: forum/forms.py:44 +msgid "question content must be > 10 characters" +msgstr "soru içeriği en az 10 karakter olmalı" + +#: forum/forms.py:53 forum/skins/default/templates/header.html:28 +msgid "tags" +msgstr "etiketler" + +#: forum/forms.py:55 +msgid "" +"Tags are short keywords, with no spaces within. Up to five tags can be used." +msgstr "" +"Etiketler kısa anahtar kelimelerdir ve bir soru için en fazla 5 etiket " +"yazabilirsiniz." + +#: forum/forms.py:62 forum/skins/default/templates/question_retag.html:39 +msgid "tags are required" +msgstr "etiket yazmalısınız" + +#: forum/forms.py:70 +#, python-format +msgid "please use %(tag_count)d tag or less" +msgid_plural "please use %(tag_count)d tags or less" +msgstr[0] "En fazla %(tag_count)d etiket kullanabilirsiniz" +msgstr[1] "En fazla %(tag_count)d etiket kullanabilirsiniz" + +#: forum/forms.py:79 +#, python-format +msgid "each tag must be shorter than %(max_chars)d character" +msgid_plural "each tag must be shorter than %(max_chars)d characters" +msgstr[0] "Her etiket en fazla %(max_chars)d karakter içerebilir" +msgstr[1] "Her etiket en fazla %(max_chars)d karakter içerebilir" + +#: forum/forms.py:87 +msgid "use-these-chars-in-tags" +msgstr "bu-yazıları-etiket-olarak-kullan" + +#: forum/forms.py:97 +#: forum/skins/default/templates/post_contributor_info.html:7 +#: forum/skins/default/templates/question_summary_list_roll.html:26 +#: forum/skins/default/templates/question_summary_list_roll.html:38 +msgid "community wiki" +msgstr "topluluk wiki" + +#: forum/forms.py:98 +msgid "" +"if you choose community wiki option, the question and answer do not generate " +"points and name of author will not be shown" +msgstr "" +"Eğer wiki seçeneğini seçerseniz, soru ve cevaplardan puan verilip " +"alınamayacak ve yazarın ismi gizli kalacaktır." + +#: forum/forms.py:114 +msgid "update summary:" +msgstr "güncelleme özeti:" + +#: forum/forms.py:115 +msgid "" +"enter a brief summary of your revision (e.g. fixed spelling, grammar, " +"improved style, this field is optional)" +msgstr "" +"revizyon özeti bildir (sabit yazım, dilbilgisi, gelişmiş stil gibi, bu alan " +"isteğe bağlı gibi falan)" + +#: forum/forms.py:118 +msgid "Automatically accept user's contributions for the email updates" +msgstr "E-mail güncelleştirmeleri için kullanıcı katkılarını otomatik kabul et" + +#: forum/forms.py:209 +msgid "Your name:" +msgstr "Adınız:" + +#: forum/forms.py:210 +msgid "Email (not shared with anyone):" +msgstr "E-mail (kimse göremeyecektir):" + +#: forum/forms.py:211 +msgid "Your message:" +msgstr "Mesajınız:" + +#: forum/forms.py:294 +msgid "this email does not have to be linked to gravatar" +msgstr "Bu e-mail gravatar bağlantılı olmak zorunda değildir" + +#: forum/forms.py:296 +msgid "Screen name" +msgstr "Görünen isim" + +#: forum/forms.py:297 +msgid "Real name" +msgstr "Gerçek isim" + +#: forum/forms.py:298 +msgid "Website" +msgstr "Website" + +#: forum/forms.py:299 +msgid "Location" +msgstr "Yer" + +#: forum/forms.py:300 +msgid "Date of birth" +msgstr "Doğum tarihi" + +#: forum/forms.py:300 +msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" +msgstr "" +"Gizli alan (Formatı: YYYY-AA-GG şeklinde olup, yaş hesaplamak için " +"kullanılır)" + +#: forum/forms.py:301 forum/skins/default/templates/account_settings.html:21 +#: forum/skins/default/templates/authopenid/settings.html:21 +msgid "Profile" +msgstr "Profil" + +#: forum/forms.py:332 forum/forms.py:333 +msgid "this email has already been registered, please use another one" +msgstr "Bu e-mail sitemizde zaten kayıtlı, lütfen başka bir tane deneyin" + +#: forum/forms.py:339 +msgid "Choose email tag filter" +msgstr "E-mail etiketi için filtre seç" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "weekly" +msgstr "haftalık" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "no email" +msgstr "e-mail yok" + +#: forum/forms.py:356 +msgid "daily" +msgstr "günlük" + +#: forum/forms.py:371 +msgid "Asked by me" +msgstr "Bana sorulan" + +#: forum/forms.py:374 +msgid "Answered by me" +msgstr "Bana cevaplanan" + +#: forum/forms.py:377 +msgid "Individually selected" +msgstr "Tek tek seçilmiş" + +#: forum/forms.py:380 +msgid "Entire forum (tag filtered)" +msgstr "Tüm forum (etiket filtre)" + +#: forum/forms.py:434 +msgid "okay, let's try!" +msgstr "tamam, şimdi başlayalım!" + +#: forum/forms.py:435 +msgid "no community email please, thanks" +msgstr "toplu e-mail istemiyorum" + +#: forum/forms.py:438 +msgid "please choose one of the options above" +msgstr "lütfen yukarıdaki seçeneklerden birini seçin " + +#: forum/urls.py:28 +msgid "upfiles/" +msgstr "upfiles/" + +#: forum/urls.py:33 +msgid "about/" +msgstr "hakkimizda/" + +#: forum/urls.py:34 +msgid "faq/" +msgstr "sss/" + +#: forum/urls.py:35 +msgid "privacy/" +msgstr "gizlilik/" + +#: forum/urls.py:36 +msgid "logout/" +msgstr "guvenli-cikis/" + +#: forum/urls.py:37 forum/urls.py:38 forum/urls.py:39 forum/urls.py:56 +msgid "answers/" +msgstr "cevaplar/" + +#: forum/urls.py:37 forum/urls.py:49 forum/urls.py:52 forum/urls.py:56 +msgid "comments/" +msgstr "yorumlar/" + +#: forum/urls.py:38 forum/urls.py:43 forum/urls.py:78 +#: forum/skins/default/templates/user_info.html:47 +msgid "edit/" +msgstr "düzenle/" + +#: forum/urls.py:39 forum/urls.py:48 +msgid "revisions/" +msgstr "revizyonlar/" + +#: forum/urls.py:40 forum/urls.py:41 forum/urls.py:42 forum/urls.py:43 +#: forum/urls.py:44 forum/urls.py:45 forum/urls.py:46 forum/urls.py:47 +#: forum/urls.py:48 forum/urls.py:49 forum/urls.py:52 +msgid "questions/" +msgstr "sorular/" + +#: forum/urls.py:41 forum_modules/books/urls.py:8 +msgid "ask/" +msgstr "sor/" + +#: forum/urls.py:42 +msgid "unanswered/" +msgstr "cevapsiz/" + +#: forum/urls.py:44 +msgid "close/" +msgstr "kapat/" + +#: forum/urls.py:45 +msgid "reopen/" +msgstr "yeniden aç/" + +#: forum/urls.py:46 +msgid "answer/" +msgstr "cevap/" + +#: forum/urls.py:47 +msgid "vote/" +msgstr "oy/" + +#: forum/urls.py:50 +msgid "command/" +msgstr "komut/" + +#: forum/urls.py:60 forum/views/readers.py:265 +msgid "question/" +msgstr "soru/" + +#: forum/urls.py:61 forum/urls.py:62 +msgid "tags/" +msgstr "etiketler/" + +#: forum/urls.py:64 forum/urls.py:68 +msgid "mark-tag/" +msgstr "etiket /" + +#: forum/urls.py:64 +msgid "interesting/" +msgstr "ilginç/" + +#: forum/urls.py:68 +msgid "ignored/" +msgstr "yoksayıldı/" + +#: forum/urls.py:72 +msgid "unmark-tag/" +msgstr "etiket işaretini kaldır/" + +#: forum/urls.py:76 forum/urls.py:78 forum/urls.py:79 +msgid "users/" +msgstr "uyeler/" + +#: forum/urls.py:77 +msgid "moderate-user/" +msgstr "yöneticiler/" + +#: forum/urls.py:80 forum/urls.py:81 +msgid "badges/" +msgstr "oduller/" + +#: forum/urls.py:82 +msgid "messages/" +msgstr "mesajlar/" + +#: forum/urls.py:82 +msgid "markread/" +msgstr "konu/" + +#: forum/urls.py:84 +msgid "nimda/" +msgstr "Nimda /" + +#: forum/urls.py:86 +msgid "upload/" +msgstr "yükle/" + +#: forum/urls.py:87 +msgid "search/" +msgstr "arama-yap/" + +#: forum/urls.py:88 +msgid "feedback/" +msgstr "geribildirim/" + +#: forum/urls.py:89 forum/urls.py:90 +msgid "account/" +msgstr "hesab/" + +#: forum/importers/stackexchange/management/commands/load_stackexchange.py:124 +msgid "Congratulations, you are now an Administrator" +msgstr "Tebrikler, artık sitemizde yönetici oldunuz..." + +#: forum/management/commands/send_email_alerts.py:236 +msgid "email update message subject" +msgstr "e-mail güncelleme mesajı" + +#: forum/management/commands/send_email_alerts.py:238 +#, fuzzy, python-format +msgid "%(name)s, this is an update message header for %(num)d question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "" +"

Dear %(name)s,

The following question has been updated on the Q&A " +"forum:

" +msgstr[1] "" +"

Dear %(name)s,

The following %(num)d questions have been updated on " +"the Q&A forum:

" + +#: forum/management/commands/send_email_alerts.py:255 +msgid "new question" +msgstr "yeni soru" + +#: forum/management/commands/send_email_alerts.py:272 +msgid "" +"Please visit the forum and see what's new! Could you spread the word about " +"it - can somebody you know help answering those questions or benefit from " +"posting one?" +msgstr "" +"Lütfen forumu ziyaret edin ve yenilikleri görün! Belki birisine bir şekilde " +"yardım ya da en azından sorusuna cevap yazabilirsiniz." + +#: forum/management/commands/send_email_alerts.py:284 +msgid "" +"Your most frequent subscription setting is 'daily' on selected questions. If " +"you are receiving more than one email per dayplease tell about this issue to " +"the forum administrator." +msgstr "" +"Seçili sorulara aboneliğiniz 'günlük' olarak görünüyor. Eğer birden fazla e-" +"posta alıyorsanız, lütfen bunu bize bildirin." + +#: forum/management/commands/send_email_alerts.py:290 +msgid "" +"Your most frequent subscription setting is 'weekly' if you are receiving " +"this email more than once a week please report this issue to the forum " +"administrator." +msgstr "" +"Seçili sorulara aboneliğiniz 'haftalık' olarak görünüyor. Eğer birden fazla " +"e-posta alıyorsanız, lütfen bunu bize bildirin." + +#: forum/management/commands/send_email_alerts.py:296 +msgid "" +"There is a chance that you may be receiving links seen before - due to a " +"technicality that will eventually go away. " +msgstr "Ölen linkleri önceden görme şansın olabilir. " + +#: forum/management/commands/send_email_alerts.py:311 +#, fuzzy, python-format +msgid "" +"go to %(link)s to change frequency of email updates or %(email)s " +"administrator" +msgstr "" +"

Please remember that you can always adjust " +"frequency of the email updates or turn them off entirely.
If you believe " +"that this message was sent in an error, please email about it the forum " +"administrator at %(email)s.

Sincerely,

Your friendly Q&A forum " +"server.

" + +#: forum/middleware/anon_user.py:34 +#, python-format +msgid "First time here? Check out the FAQ!" +msgstr "" +"İlk defa mı buradasınız? Sıkça sorulan sorular SSS " +"kısmını ziyaret edebilirsiniz." + +#: forum/migrations/0005_install_badges.py:10 +msgid "Disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Deleted own post with score of 3 or higher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Peer Pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "peer-pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Deleted own post with score of -3 or lower" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Nice answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +msgid "nice-answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Answer voted up 10 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Nice Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "nice-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Question voted up 10 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Pundit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "pundit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Left 10 comments with score of 10 or more" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Popular Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "popular-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Asked a question with 1,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "Citizen patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "citizen-patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "First flagged post" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "Cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "First rollback" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "Critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "First down vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "Editor" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "editor" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "First edit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "Organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "First retag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "Scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "First accepted answer on your own question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Asked first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "Supporter" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "supporter" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "First up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Teacher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "teacher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Answered first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Completed all user profile fields" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Self-Learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "self-learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Answered your own question with at least 3 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Great Answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "great-answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Answer voted up 100 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Great Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "great-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Question voted up 100 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Stellar Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "stellar-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Question favorited by 100 users" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Famous question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "famous-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Asked a question with 10,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Actively participated in the private alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Good Answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "good-answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Answer voted up 25 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Good Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "good-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Question voted up 25 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Favorite Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "favorite-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Question favorited by 25 users" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Civic duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "civic-duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Voted 300 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Strunk & White" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "strunk-and-white" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Edited 100 entries" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Active in many different tags" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Expert" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "expert" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Very active in one tag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Active member for a year" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Notable Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "notable-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Asked a question with 2,500 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "Enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "First answer was accepted with at least 10 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Actively participated in the private beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Accepted answer and voted up 40 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Answered a question more than 60 days later with at least 5 votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Created a tag used by 50 questions" +msgstr "" + +#: forum/models/question.py:499 +#, python-format +msgid "%(author)s modified the question" +msgstr "%(author)s soruyu düzenledi" + +#: forum/models/question.py:503 +#, python-format +msgid "%(people)s posted %(new_answer_count)s new answers" +msgstr "%(people)s adlı üyemiz %(new_answer_count)s yeni cevap yolladı" + +#: forum/models/question.py:508 +#, python-format +msgid "%(people)s commented the question" +msgstr "%(people)s bir soruyu yorumladı" + +#: forum/models/question.py:513 +#, python-format +msgid "%(people)s commented answers" +msgstr "" +"suggest forum/models/question.py:508\n" +" \n" +"%(people)s cevaba yorum yazdı" + +#: forum/models/question.py:515 +#, python-format +msgid "%(people)s commented an answer" +msgstr "%(people)s bir cevabı yorumladı" + +#: forum/models/repute.py:13 forum/skins/default/templates/badges.html:54 +msgid "gold" +msgstr "altın" + +#: forum/models/repute.py:14 forum/skins/default/templates/badges.html:62 +msgid "silver" +msgstr "gümüş" + +#: forum/models/repute.py:15 forum/skins/default/templates/badges.html:69 +msgid "bronze" +msgstr "bronz" + +#: forum/models/tag.py:81 +msgid "interesting" +msgstr "ilginç" + +#: forum/models/tag.py:81 +msgid "ignored" +msgstr "yoksay" + +#: forum/models/user.py:36 +msgid "Entire forum" +msgstr "Tüm forum" + +#: forum/models/user.py:37 +msgid "Questions that I asked" +msgstr "Sorduğum sorular" + +#: forum/models/user.py:38 +msgid "Questions that I answered" +msgstr "Cevapladığım sorular" + +#: forum/models/user.py:39 +msgid "Individually selected questions" +msgstr "Seçtiğim sorular" + +#: forum/models/user.py:42 +msgid "Weekly" +msgstr "Haftalık" + +#: forum/models/user.py:43 +msgid "Daily" +msgstr "Günlük" + +#: forum/models/user.py:44 +msgid "No email" +msgstr "E-posta yok" + +#: forum/skins/default/templates/404.html:24 +msgid "Sorry, could not find the page you requested." +msgstr "Üzgünüz, istediğiniz sayfayı bulamadık." + +#: forum/skins/default/templates/404.html:26 +msgid "This might have happened for the following reasons:" +msgstr "Bu durum, aşağıdaki sebeplerden dolayı olabilir:" + +#: forum/skins/default/templates/404.html:28 +msgid "this question or answer has been deleted;" +msgstr "bu soru ya da cevap silindi;" + +#: forum/skins/default/templates/404.html:29 +msgid "url has error - please check it;" +msgstr "adres hatası var - tekrar kontrol edin;" + +#: forum/skins/default/templates/404.html:30 +msgid "" +"the page you tried to visit is protected or you don't have sufficient " +"points, see" +msgstr "" +"ziyaret etmeye çalıştığınız sayfa korumalıdır ya da görmek için yeterince " +"puanınız yoktur" + +#: forum/skins/default/templates/404.html:31 +msgid "if you believe this error 404 should not have occured, please" +msgstr "Hata kodu 404: lütfen" + +#: forum/skins/default/templates/404.html:32 +msgid "report this problem" +msgstr "Bu sorunu yöneticiye bildir" + +#: forum/skins/default/templates/404.html:41 +#: forum/skins/default/templates/500.html:27 +msgid "back to previous page" +msgstr "önceki sayfaya geri dön" + +#: forum/skins/default/templates/404.html:42 +#: forum/skins/default/templates/questions.html:52 +msgid "see all questions" +msgstr "tüm soruları gör" + +#: forum/skins/default/templates/404.html:43 +msgid "see all tags" +msgstr "tüm etiketleri gör" + +#: forum/skins/default/templates/500.html:22 +msgid "sorry, system error" +msgstr "Üzgünüm, bir sistem hatası oluştu!" + +#: forum/skins/default/templates/500.html:24 +msgid "system error log is recorded, error will be fixed as soon as possible" +msgstr "" +"Bu hata, sistem hata günlüğüne kayıt edildi. En kısa sürede çözümlenmesi " +"için uğraşacağız." + +#: forum/skins/default/templates/500.html:25 +msgid "please report the error to the site administrators if you wish" +msgstr "isterseniz hata raporunu site yöneticilerine bildirin" + +#: forum/skins/default/templates/500.html:28 +msgid "see latest questions" +msgstr "son soruları gör" + +#: forum/skins/default/templates/500.html:29 +msgid "see tags" +msgstr "etiketleri gör" + +#: forum/skins/default/templates/about.html:6 +#: forum/skins/default/templates/about.html:11 +msgid "About" +msgstr "Hakkımızda" + +#: forum/skins/default/templates/account_settings.html:4 +#: forum/skins/default/templates/authopenid/settings.html:4 +msgid "Account functions" +msgstr "Hesab özellikleri" + +#: forum/skins/default/templates/account_settings.html:29 +#: forum/skins/default/templates/authopenid/changepw.html:5 +#: forum/skins/default/templates/authopenid/changepw.html:14 +#: forum/skins/default/templates/authopenid/settings.html:29 +msgid "Change password" +msgstr "Şifre değiştir" + +#: forum/skins/default/templates/account_settings.html:30 +#: forum/skins/default/templates/authopenid/settings.html:30 +msgid "Give your account a new password." +msgstr "Hesabınıza yeni bir şifre verin." + +#: forum/skins/default/templates/account_settings.html:32 +#: forum/skins/default/templates/authopenid/settings.html:31 +msgid "Change email " +msgstr "E-mail değiştir" + +#: forum/skins/default/templates/account_settings.html:33 +#: forum/skins/default/templates/authopenid/settings.html:32 +msgid "Add or update the email address associated with your account." +msgstr "" +"hesabınızla bağlantılanmış e-mail adresinizi, güncelleyin, yoksa ekleyin" + +#: forum/skins/default/templates/account_settings.html:35 +#: forum/skins/default/templates/authopenid/changeopenid.html:4 +#: forum/skins/default/templates/authopenid/changeopenid.html:30 +#: forum/skins/default/templates/authopenid/settings.html:34 +msgid "Change OpenID" +msgstr "OpenID değiştir" + +#: forum/skins/default/templates/account_settings.html:36 +#: forum/skins/default/templates/authopenid/settings.html:35 +msgid "Change openid associated to your account" +msgstr "Hesabınıza ilişkili OpenID'yi değiştirin" + +#: forum/skins/default/templates/account_settings.html:39 +#: forum/skins/default/templates/authopenid/delete.html:4 +#: forum/skins/default/templates/authopenid/settings.html:38 +msgid "Delete account" +msgstr "Hesabı sil" + +#: forum/skins/default/templates/account_settings.html:40 +#: forum/skins/default/templates/authopenid/settings.html:39 +msgid "Erase your username and all your data from website" +msgstr "Kullanıcı adımı ve tüm bilgilerimi bu siteden sil" + +#: forum/skins/default/templates/answer_edit.html:5 +#: forum/skins/default/templates/answer_edit.html:48 +msgid "Edit answer" +msgstr "Cevapı düzenle" + +#: forum/skins/default/templates/answer_edit.html:25 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:26 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:46 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:25 +#: forum/skins/default/templates/question_edit.html:28 +msgid "hide preview" +msgstr "önizlemeyi gizle" + +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:28 +msgid "show preview" +msgstr "önizlemeyi göster" + +#: forum/skins/default/templates/answer_edit.html:48 +#: forum/skins/default/templates/question_edit.html:66 +#: forum/skins/default/templates/question_retag.html:53 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "back" +msgstr "geri" + +#: forum/skins/default/templates/answer_edit.html:53 +#: forum/skins/default/templates/question_edit.html:71 +#: forum/skins/default/templates/revisions_answer.html:52 +#: forum/skins/default/templates/revisions_question.html:52 +msgid "revision" +msgstr "revizyon" + +#: forum/skins/default/templates/answer_edit.html:56 +#: forum/skins/default/templates/question_edit.html:75 +msgid "select revision" +msgstr "revizyon seç" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:418 +#: forum/skins/default/templates/question_edit.html:92 +msgid "Toggle the real time Markdown editor preview" +msgstr "Toggle gerçek zamanlı Markdown editörü önizleme" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:419 +#: forum/skins/default/templates/question_edit.html:92 +msgid "toggle preview" +msgstr "toggle önizleme" + +#: forum/skins/default/templates/answer_edit.html:72 +#: forum/skins/default/templates/question_edit.html:118 +#: forum/skins/default/templates/question_retag.html:74 +msgid "Save edit" +msgstr "Değişikliği kaydet" + +#: forum/skins/default/templates/answer_edit.html:73 +#: forum/skins/default/templates/close.html:29 +#: forum/skins/default/templates/feedback.html:50 +#: forum/skins/default/templates/question_edit.html:119 +#: forum/skins/default/templates/question_retag.html:75 +#: forum/skins/default/templates/reopen.html:30 +#: forum/skins/default/templates/user_edit.html:90 +#: forum/skins/default/templates/authopenid/changeemail.html:40 +msgid "Cancel" +msgstr "Iptal" + +#: forum/skins/default/templates/answer_edit_tips.html:4 +msgid "answer tips" +msgstr "cevap ipuçları" + +#: forum/skins/default/templates/answer_edit_tips.html:7 +msgid "please make your answer relevant to this community" +msgstr "Cevabınızın sitemizdeki konu ile alakalı olmasına dikkat edin" + +#: forum/skins/default/templates/answer_edit_tips.html:10 +msgid "try to give an answer, rather than engage into a discussion" +msgstr "tartışmaya girmek yerine, soruya bir cevap vermeye çalışın" + +#: forum/skins/default/templates/answer_edit_tips.html:13 +msgid "please try to provide details" +msgstr "ayrıntılarıyayınlamayı deneyin" + +#: forum/skins/default/templates/answer_edit_tips.html:16 +#: forum/skins/default/templates/question_edit_tips.html:13 +msgid "be clear and concise" +msgstr "sorunuzun açık ve kısa olmasına çalışın" + +#: forum/skins/default/templates/answer_edit_tips.html:20 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "see frequently asked questions" +msgstr "sık sorulan soruları gör" + +#: forum/skins/default/templates/answer_edit_tips.html:26 +#: forum/skins/default/templates/question_edit_tips.html:23 +msgid "Markdown tips" +msgstr "İpuçları" + +#: forum/skins/default/templates/answer_edit_tips.html:29 +#: forum/skins/default/templates/question_edit_tips.html:26 +msgid "*italic* or __italic__" +msgstr "* Italik * veya __italic__" + +#: forum/skins/default/templates/answer_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:29 +msgid "**bold** or __bold__" +msgstr "** Kalın ** veya __bold__" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/question_edit_tips.html:32 +msgid "link" +msgstr "bağlantı" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "text" +msgstr "metin" + +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "image" +msgstr "resim" + +#: forum/skins/default/templates/answer_edit_tips.html:43 +#: forum/skins/default/templates/question_edit_tips.html:41 +msgid "numbered list:" +msgstr "numaralandırılmış liste:" + +#: forum/skins/default/templates/answer_edit_tips.html:48 +#: forum/skins/default/templates/question_edit_tips.html:46 +msgid "basic HTML tags are also supported" +msgstr "temel HTML etiketleri de desteklenmektedir" + +#: forum/skins/default/templates/answer_edit_tips.html:52 +#: forum/skins/default/templates/question_edit_tips.html:50 +msgid "learn more about Markdown" +msgstr "Markdown hakkında daha fazla bilgi" + +#: forum/skins/default/templates/ask.html:5 +#: forum/skins/default/templates/ask.html:62 +msgid "Ask a question" +msgstr "Soru sor" + +#: forum/skins/default/templates/ask.html:69 +#: forum/skins/default/templates/ask_form.html:11 +#, fuzzy +msgid "login to post question info" +msgstr "" +"You are welcome to start submitting your question " +"anonymously. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: forum/skins/default/templates/ask.html:75 +#, fuzzy, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Looks like your email address, %(email)s has not " +"yet been validated. To post messages you must verify your email, " +"please see more details here." +"
You can submit your question now and validate email after that. Your " +"question will saved as pending meanwhile. " + +#: forum/skins/default/templates/ask.html:113 +#: forum/skins/default/templates/ask_form.html:54 +msgid "(required)" +msgstr "(gerekli)" + +#: forum/skins/default/templates/ask.html:120 +#: forum/skins/default/templates/ask_form.html:61 +msgid "Login/signup to post your question" +msgstr "Soru göndermek için üye girişi yapmalısınız" + +#: forum/skins/default/templates/ask.html:122 +#: forum/skins/default/templates/ask_form.html:63 +msgid "Ask your question" +msgstr "Soru yazın" + +#: forum/skins/default/templates/ask_form.html:15 +#, fuzzy, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Looks like your email address, %(email)s has not " +"yet been validated. To post messages you must verify your email, " +"please see more details here." +"
You can submit your question now and validate email after that. Your " +"question will saved as pending meanwhile. " + +#: forum/skins/default/templates/badge.html:6 +#: forum/skins/default/templates/badge.html:17 +msgid "Badge" +msgstr "Madalya" + +#: forum/skins/default/templates/badge.html:26 +msgid "user received this badge:" +msgid_plural "users received this badge:" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/badges.html:6 +msgid "Badges summary" +msgstr "Madalya özeti" + +#: forum/skins/default/templates/badges.html:17 +msgid "Badges" +msgstr "Ödüller" + +#: forum/skins/default/templates/badges.html:21 +#, fuzzy +msgid "Community gives you awards for your questions, answers and votes." +msgstr "" +"If your questions and answers are highly voted, your contribution to this " +"Q&A community will be recognized with the variety of badges." + +#: forum/skins/default/templates/badges.html:22 +#, fuzzy, python-format +msgid "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +" " +msgstr "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Have ideas about fun " +"badges? Please, give us your feedback" + +#: forum/skins/default/templates/badges.html:51 +msgid "Community badges" +msgstr "Site ödülleri" + +#: forum/skins/default/templates/badges.html:57 +#, fuzzy +msgid "gold badge description" +msgstr "" +"Gold badge is the highest award in this community. To obtain it have to show " +"profound knowledge and ability in addition to your active participation." + +#: forum/skins/default/templates/badges.html:65 +#, fuzzy +msgid "silver badge description" +msgstr "" +"Obtaining silver badge requires significant patience. If you have received " +"one, that means you have greatly contributed to this community." + +#: forum/skins/default/templates/badges.html:68 +msgid "bronze badge: often given as a special honor" +msgstr "bronz madalya: genellikle özel bir onur olarak verilir" + +#: forum/skins/default/templates/badges.html:72 +#, fuzzy +msgid "bronze badge description" +msgstr "" +"If you are an active participant in this community, you will be recognized " +"with this badge." + +#: forum/skins/default/templates/book.html:7 +msgid "reading channel" +msgstr "kanal okuma" + +#: forum/skins/default/templates/book.html:26 +msgid "[author]" +msgstr "[yazar]" + +#: forum/skins/default/templates/book.html:30 +msgid "[publisher]" +msgstr "[yayıncı]" + +#: forum/skins/default/templates/book.html:34 +msgid "[publication date]" +msgstr "[yayınlanma tarihi]" + +#: forum/skins/default/templates/book.html:38 +msgid "[price]" +msgstr "[fiyat]" + +#: forum/skins/default/templates/book.html:39 +msgid "currency unit" +msgstr "para birimi" + +#: forum/skins/default/templates/book.html:42 +msgid "[pages]" +msgstr "[sayfa]" + +#: forum/skins/default/templates/book.html:43 +msgid "pages abbreviation" +msgstr "sayfaları kısaltma" + +#: forum/skins/default/templates/book.html:46 +msgid "[tags]" +msgstr "[etiketler]" + +#: forum/skins/default/templates/book.html:56 +msgid "author blog" +msgstr "yazar günlüğü" + +#: forum/skins/default/templates/book.html:62 +msgid "book directory" +msgstr "kitap listesi" + +#: forum/skins/default/templates/book.html:66 +msgid "buy online" +msgstr "online satın al" + +#: forum/skins/default/templates/book.html:79 +msgid "reader questions" +msgstr "okuyucu soruları" + +#: forum/skins/default/templates/book.html:82 +msgid "ask the author" +msgstr "yazar sor" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:18 +msgid "this question was selected as favorite" +msgstr "bu soru favori olarak seçildi" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:18 +msgid "number of times" +msgstr "kez" + +#: forum/skins/default/templates/book.html:105 +#: forum/skins/default/templates/question_summary_list_roll.html:14 +msgid "votes" +msgstr "oy" + +#: forum/skins/default/templates/book.html:108 +msgid "the answer has been accepted to be correct" +msgstr "cevap doğru olarak kabul edilmiştir" + +#: forum/skins/default/templates/book.html:115 +#: forum/skins/default/templates/question_summary_list_roll.html:15 +msgid "views" +msgstr "izlenme" + +#: forum/skins/default/templates/book.html:125 +#: forum/skins/default/templates/question.html:136 +#: forum/skins/default/templates/question_list.html:19 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/tags.html:50 +#: forum/skins/default/templates/users_questions.html:34 +#, python-format +msgid "see questions tagged '%(tag)s'" +msgstr "'%(tag)s' etiketli sorulara bak" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to book RSS feed" +msgstr "RSS haber besleme akışına abone ol" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to the questions feed" +msgstr "soruya ve cevaplarına abone ol" + +#: forum/skins/default/templates/close.html:6 +#: forum/skins/default/templates/close.html:16 +msgid "Close question" +msgstr "Soruyu kapat" + +#: forum/skins/default/templates/close.html:19 +msgid "Close the question" +msgstr "Cevabı kapat" + +#: forum/skins/default/templates/close.html:25 +msgid "Reasons" +msgstr "Nedenleri" + +#: forum/skins/default/templates/close.html:28 +msgid "OK to close" +msgstr "Kapatmak için OK butonuna bas" + +#: forum/skins/default/templates/email_base.html:11 +msgid "home" +msgstr "anasayfa" + +#: forum/skins/default/templates/faq.html:11 +msgid "Frequently Asked Questions " +msgstr "Sıkça Sorulan Sorular" + +#: forum/skins/default/templates/faq.html:16 +msgid "What kinds of questions can I ask here?" +msgstr "Ne tür sorular sorabilirim?" + +#: forum/skins/default/templates/faq.html:17 +msgid "" +"Most importanly - questions should be relevant to this " +"community." +msgstr "" +"En önemli sorular sitemizde önemli şeklinde " +"gösterilmektedir." + +#: forum/skins/default/templates/faq.html:18 +msgid "" +"Before asking the question - please make sure to use search to see whether " +"your question has alredy been answered." +msgstr "" +"Soru sormadan önce, öncelikle sitemizde bir arama yapın. Belki bu soru ve " +"cevabı sitemizde bulunmaktadır." + +#: forum/skins/default/templates/faq.html:21 +msgid "What questions should I avoid asking?" +msgstr "Ne tür sorulardan kaçınmalıyım?" + +#: forum/skins/default/templates/faq.html:22 +msgid "" +"Please avoid asking questions that are not relevant to this community, too " +"subjective and argumentative." +msgstr "" +"Lütfen, çok subjektif ve tartışmacı olan, sitemizle ilgili olmayan sorular " +"sormaktan kaçının." + +#: forum/skins/default/templates/faq.html:27 +msgid "What should I avoid in my answers?" +msgstr "Cevaplarımda nelere dikkat etmeliyim?" + +#: forum/skins/default/templates/faq.html:28 +msgid "" +"is a Q&A site, not a discussion group. Therefore - please avoid having " +"discussions in your answers, comment facility allows some space for brief " +"discussions." +msgstr "" +"bir soru & cevap sitesi olup, asla ve asla bir tartışma ortamı değildir. Bu " +"nedenle cevaplarınızı, tartışmalardan kaçınacak şekilde, yorum ve karşılıklı " +"fikir alışverişine dayalı şekilde yazınız." + +#: forum/skins/default/templates/faq.html:32 +msgid "Who moderates this community?" +msgstr "Bu siteyi kimler yönetiyor?" + +#: forum/skins/default/templates/faq.html:33 +msgid "The short answer is: you." +msgstr "Cevabı çok açık: Sen! Yani sizlersiniz! " + +#: forum/skins/default/templates/faq.html:34 +msgid "This website is moderated by the users." +msgstr "Bu web sitesi, kullanıcıları tarafından yönetilmektedir." + +#: forum/skins/default/templates/faq.html:35 +msgid "" +"The reputation system allows users earn the authorization to perform a " +"variety of moderation tasks." +msgstr "" +"İtibar sistemi, kullanıcılarımızın sitedeki yetkilendirme ve yazdıklarının " +"doğruluğu konusunda fikir verir." + +#: forum/skins/default/templates/faq.html:40 +msgid "How does reputation system work?" +msgstr "İtibar sistemi nasıl çalışmaktadır?" + +#: forum/skins/default/templates/faq.html:41 +#, fuzzy +msgid "Rep system summary" +msgstr "" +"When a question or answer is upvoted, the user who posted them will gain " +"some points, which are called \"karma points\". These points serve as a " +"rough measure of the community trust to him/her. Various moderation tasks " +"are gradually assigned to the users based on those points." + +#: forum/skins/default/templates/faq.html:42 +msgid "" +"For example, if you ask an interesting question or give a helpful answer, " +"your input will be upvoted. On the other hand if the answer is misleading - " +"it will be downvoted. Each vote in favor will generate 10 " +"points, each vote against will subtract 2 points. There is " +"a limit of 200 points that can be accumulated per question " +"or answer. The table below explains reputation point requirements for each " +"type of moderation task." +msgstr "" +"Örneğin, ilginç bir soru sordunuz ya da yararlı bir cevap verdiniz. Doğal " +"olarak bu durum, diğer kullanıcılarımız tarafından beğenilecektir. Diğer " +"taraftan da, eğer cevabınız doğru değilse ya da yanıltıcı ise " +"beğenilmeyecektir. Sistem, beğenilen her soru veya cevap yazınız için size " +"10 puan verirken, beğenilmeyen soru veya cevabınız için " +"2 puan düşmektedir. Her soru veya cevaptan alabileceğiniz " +"en fazla puan 200 ile sınırlandırılmıştır. Aşağıdaki tablo, " +"itibar sisteminden toplanan puanlar ile neler yapılabileceğini " +"göstermektedir." + +#: forum/skins/default/templates/faq.html:53 +#: forum/skins/default/templates/user_votes.html:15 +msgid "upvote" +msgstr "beğendim" + +#: forum/skins/default/templates/faq.html:57 +msgid "use tags" +msgstr "etiketleri kullan" + +#: forum/skins/default/templates/faq.html:62 +msgid "add comments" +msgstr "yorum ekle" + +#: forum/skins/default/templates/faq.html:66 +#: forum/skins/default/templates/user_votes.html:17 +msgid "downvote" +msgstr "beğenmedim" + +#: forum/skins/default/templates/faq.html:69 +msgid "open and close own questions" +msgstr "kendi sorularım açık ve kapalı " + +#: forum/skins/default/templates/faq.html:73 +msgid "retag questions" +msgstr "soruları yeniden etiketle" + +#: forum/skins/default/templates/faq.html:78 +msgid "edit community wiki questions" +msgstr "sitenin wiki sorularını değiştir" + +#: forum/skins/default/templates/faq.html:83 +msgid "edit any answer" +msgstr "herhangi bir cevabı değiştir" + +#: forum/skins/default/templates/faq.html:87 +msgid "open any closed question" +msgstr "kapatılmış bir soruyu aç" + +#: forum/skins/default/templates/faq.html:91 +msgid "delete any comment" +msgstr "bir yorumu sil" + +#: forum/skins/default/templates/faq.html:95 +msgid "delete any questions and answers and perform other moderation tasks" +msgstr "Herhangi bir soruyu veya cevabı silmek site yöneticilerinin görevidir." + +#: forum/skins/default/templates/faq.html:103 +msgid "how to validate email title" +msgstr "E-mail doğrulama" + +#: forum/skins/default/templates/faq.html:105 +#, fuzzy, python-format +msgid "" +"how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" +msgstr "" +"

How? If you have just set or changed your " +"email address - check your email and click the included link.
The link contains a key generated specifically for you. You can " +"also and check your email again.

Why? Email validation is required to make sure that " +"only you can post messages on your behalf and to " +"minimize spam posts.
With email you can " +"subscribe for updates on the most interesting questions. " +"Also, when you sign up for the first time - create a unique gravatar personal image.

" + +#: forum/skins/default/templates/faq.html:110 +#, fuzzy +msgid "what is gravatar" +msgstr "How to change my picture (gravatar) and what is gravatar?" + +#: forum/skins/default/templates/faq.html:111 +#, fuzzy +msgid "gravatar faq info" +msgstr "" +"

The picture that appears on the users profiles is called " +"gravatar (which means globally recognized avatar).

Here is how it works: a " +"cryptographic key (unbreakable code) is calculated from " +"your email address. You upload your picture (or your favorite alter ego " +"image) the website gravatar.com from where we later retreive your image using the key.

This way all the websites you trust can show your image next to your " +"posts and your email address remains private.

Please " +"personalize your account with an image - just register at " +"gravatar.com (just please " +"be sure to use the same email address that you used to register with us). " +"Default image that looks like a kitchen tile is generated automatically.

" + +#: forum/skins/default/templates/faq.html:114 +msgid "To register, do I need to create new password?" +msgstr "" + +#: forum/skins/default/templates/faq.html:115 +msgid "" +"No, you don't have to. You can login through any service that supports " +"OpenID, e.g. Google, Yahoo, AOL, etc." +msgstr "" +"Hayır, bu şart değil. Eğer OpenID destekleyen herhangi bir hizmete üye isen, " +"mesela Facebook, Twitter, Google Mail, Yahoo, AOL, vb aracılığıyla da giriş " +"yapabilirsiniz." + +#: forum/skins/default/templates/faq.html:116 +msgid "Login now!" +msgstr "Şimdi giriş yap!" + +#: forum/skins/default/templates/faq.html:121 +msgid "Why other people can edit my questions/answers?" +msgstr "" +"Neden başkaları benim sorumu ya da cevabımı düzenleyebiliyor ve " +"değiştirebiliyorlar?" + +#: forum/skins/default/templates/faq.html:122 +msgid "Goal of this site is..." +msgstr "İşte bu, sitenin en önemli amaçlarından biridir..." + +#: forum/skins/default/templates/faq.html:122 +msgid "" +"So questions and answers can be edited like wiki pages by experienced users " +"of this site and this improves the overall quality of the knowledge base " +"content." +msgstr "" +"Böylelikle sorular ve cevaplar aynen wiki sayfaları gibi sitenin deneyimli " +"kullanıcıları tarafından değiştirilip düzenlenebilir. Bu ise bilgi site " +"içeriğimizin kalitesini artırır." + +#: forum/skins/default/templates/faq.html:123 +msgid "If this approach is not for you, we respect your choice." +msgstr "" +"Bu değişiklikler size uygun değilse, sizin seçiminize saygılı değilse, " +"lütfen bize bildirin." + +#: forum/skins/default/templates/faq.html:127 +msgid "Still have questions?" +msgstr "Hala aklınıza takılan bir soru mu var?" + +#: forum/skins/default/templates/faq.html:128 +#, fuzzy, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "" +"Please ask your question, help make our " +"community better!Lütfen sorularınızı %(ask_question_url)s kısmına yazın. " +"Böylelikle bize daha fazla yardımcı olmuş olursunuz." + +#: forum/skins/default/templates/faq.html:130 +#: forum/skins/default/templates/header.html:27 +msgid "questions" +msgstr "sorular" + +#: forum/skins/default/templates/faq.html:130 +msgid "." +msgstr "." + +#: forum/skins/default/templates/feedback.html:6 +msgid "Feedback" +msgstr "Geri bildirim" + +#: forum/skins/default/templates/feedback.html:11 +msgid "Give us your feedback!" +msgstr "Görüşlerinizi bize bildirin!" + +#: forum/skins/default/templates/feedback.html:17 +#, python-format +msgid "" +"\n" +" Dear %(user_name)s, we look " +"forward to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" +"\n" +"Sevgili %(user_name)s, sitemizle alakalı " +"görüş, öneri ve eleştirilerinizi bekliyoruz. Her konuda bize yazmaktan " +"çekinmeyin." + +#: forum/skins/default/templates/feedback.html:24 +msgid "" +"\n" +" Dear visitor, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" +"\n" +"Sevgili ziyaretçimiz, sitemizle alakalı " +"görüş, öneri ve eleştirilerinizi bekliyoruz. Her konuda bize yazmaktan " +"çekinmeyin." + +#: forum/skins/default/templates/feedback.html:41 +msgid "(this field is required)" +msgstr "(bu alanın doldurulması gereklidir)" + +#: forum/skins/default/templates/feedback.html:49 +msgid "Send Feedback" +msgstr "Geribildirim gönder" + +#: forum/skins/default/templates/feedback_email.txt:3 +#, python-format +msgid "" +"\n" +"Hello, this is a %(site_title)s forum feedback message\n" +msgstr "" +"\n" +"Merhaba, bu bir %(site_title)s geribildirim mesajıdır.\n" + +#: forum/skins/default/templates/feedback_email.txt:9 +msgid "Sender is" +msgstr "Gönderen" + +#: forum/skins/default/templates/feedback_email.txt:11 +#: forum/skins/default/templates/feedback_email.txt:14 +msgid "email" +msgstr "E-mail" + +#: forum/skins/default/templates/feedback_email.txt:13 +msgid "anonymous" +msgstr "anonim" + +#: forum/skins/default/templates/feedback_email.txt:19 +msgid "Message body:" +msgstr "Mesajınız:" + +#: forum/skins/default/templates/footer.html:8 +#: forum/skins/default/templates/header.html:14 +msgid "about" +msgstr "hakkımızda" + +#: forum/skins/default/templates/footer.html:9 +#: forum/skins/default/templates/header.html:15 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "faq" +msgstr "sss" + +#: forum/skins/default/templates/footer.html:10 +msgid "privacy policy" +msgstr "gizlilik politikası" + +#: forum/skins/default/templates/footer.html:19 +msgid "give feedback" +msgstr "görüşlerinizi bildirin" + +#: forum/skins/default/templates/header.html:10 +msgid "logout" +msgstr "çıkış" + +#: forum/skins/default/templates/header.html:12 +msgid "login" +msgstr "giriş" + +#: forum/skins/default/templates/header.html:22 +msgid "back to home page" +msgstr "anasayfaya geri dön" + +#: forum/skins/default/templates/header.html:29 +msgid "users" +msgstr "kullanıcılar" + +#: forum/skins/default/templates/header.html:31 +msgid "books" +msgstr "kitaplar" + +#: forum/skins/default/templates/header.html:33 +#: forum/templatetags/extra_tags.py:177 forum/templatetags/extra_tags.py:206 +msgid "badges" +msgstr "ödüller" + +#: forum/skins/default/templates/header.html:34 +#: forum/skins/default/templates/header.html:38 +msgid "ask a question" +msgstr "soru sor" + +#: forum/skins/default/templates/header.html:36 +msgid "unanswered questions" +msgstr "cevapsız sorular" + +#: forum/skins/default/templates/input_bar.html:33 +msgid "search" +msgstr "ara" + +#: forum/skins/default/templates/logout.html:6 +#: forum/skins/default/templates/logout.html:16 +msgid "Logout" +msgstr "Çıkış" + +#: forum/skins/default/templates/logout.html:19 +#, fuzzy +msgid "" +"As a registered user you can login with your OpenID, log out of the site or " +"permanently remove your account." +msgstr "" +"Clicking Logout will log you out from the forumbut will not " +"sign you off from your OpenID provider.

If you wish to sign off " +"completely - please make sure to log out from your OpenID provider as well." +"OpenID hesaplarından birisi ile (mesela Facebook, Twitter, Googlemail, " +"Yahoo, MSN) giriş yapabilirsiniz. Şifreniz sitemizde kimse tarafından " +"görünmeyecek, sitemizde kaydedilmeyecektir. Bize güvenebilirsiniz..." + +#: forum/skins/default/templates/logout.html:20 +msgid "Logout now" +msgstr "Şimdi çıkış yap" + +#: forum/skins/default/templates/notarobot.html:3 +msgid "Please prove that you are a Human Being" +msgstr "Gerçek kullanıcı olduğunuzu kanıtlayın!" + +#: forum/skins/default/templates/notarobot.html:10 +msgid "I am a Human Being" +msgstr "Ben bir gerçek kullanıcıyım" + +#: forum/skins/default/templates/pagesize.html:6 +msgid "posts per page" +msgstr "sayfa başına mesaj" + +#: forum/skins/default/templates/paginator.html:6 +#: forum/skins/default/templates/paginator.html:7 +msgid "previous" +msgstr "önceki" + +#: forum/skins/default/templates/paginator.html:19 +msgid "current page" +msgstr "şuanki sayfa" + +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 +#, python-format +msgid "page number %(num)s" +msgstr "sayfa numarası %(num)s" + +#: forum/skins/default/templates/paginator.html:33 +msgid "next page" +msgstr "sonraki sayfa" + +#: forum/skins/default/templates/post_contributor_info.html:9 +#, fuzzy, python-format +msgid "%(rev_count)s revision" +msgid_plural "%(rev_count)s revisions" +msgstr[0] "revizyon seç" +msgstr[1] "revizyon seç" + +#: forum/skins/default/templates/post_contributor_info.html:15 +msgid "asked" +msgstr "soruldu" + +#: forum/skins/default/templates/post_contributor_info.html:18 +msgid "answered" +msgstr "cevaplandı" + +#: forum/skins/default/templates/post_contributor_info.html:20 +msgid "posted" +msgstr "yollandı" + +#: forum/skins/default/templates/post_contributor_info.html:41 +msgid "updated" +msgstr "güncellendi" + +#: forum/skins/default/templates/privacy.html:6 +#: forum/skins/default/templates/privacy.html:11 +msgid "Privacy policy" +msgstr "Gizlilik politikası" + +#: forum/skins/default/templates/privacy.html:15 +#, fuzzy +msgid "general message about privacy" +msgstr "" +"Respecting users privacy is an important core principle of this Q&A " +"forum. Information on this page details how this forum protects your " +"privacy, and what type of information is collected." + +#: forum/skins/default/templates/privacy.html:18 +msgid "Site Visitors" +msgstr "Site ziyaretçileri" + +#: forum/skins/default/templates/privacy.html:20 +#, fuzzy +msgid "what technical information is collected about visitors" +msgstr "" +"Information on question views, revisions of questions and answers - both " +"times and content are recorded for each user in order to correctly count " +"number of views, maintain data integrity and report relevant updates." + +#: forum/skins/default/templates/privacy.html:23 +msgid "Personal Information" +msgstr "Kişisel bilgiler" + +#: forum/skins/default/templates/privacy.html:25 +#, fuzzy +msgid "details on personal information policies" +msgstr "" +"Members of this community may choose to display personally identifiable " +"information in their profiles. Forum will never display such information " +"without a request from the user." + +#: forum/skins/default/templates/privacy.html:28 +msgid "Other Services" +msgstr "Diğer Hizmetler" + +#: forum/skins/default/templates/privacy.html:30 +#, fuzzy +msgid "details on sharing data with third parties" +msgstr "" +"None of the data that is not openly shown on the forum by the choice of the " +"user is shared with any third party.üçüncü şahıslarla paylaşılacak veriler " +"ile ilgili ayrıntılar" + +#: forum/skins/default/templates/privacy.html:35 +#, fuzzy +msgid "cookie policy details" +msgstr "" +"Forum software relies on the internet cookie technology to keep track of " +"user sessions. Cookies must be enabled in your browser so that forum can " +"work for you.çerezler hakkında" + +#: forum/skins/default/templates/privacy.html:37 +msgid "Policy Changes" +msgstr "Site kurallarındaki değişiklikler" + +#: forum/skins/default/templates/privacy.html:38 +#, fuzzy +msgid "how privacy policies can be changed" +msgstr "" +"These policies may be adjusted to improve protection of user's privacy. " +"Whenever such changes occur, users will be notified via the internal " +"messaging system. gizlilik politikaları nasıl değiştirilebilir?" + +#: forum/skins/default/templates/question.html:78 +#: forum/skins/default/templates/question.html:79 +#: forum/skins/default/templates/question.html:95 +#: forum/skins/default/templates/question.html:97 +msgid "i like this post (click again to cancel)" +msgstr "bunu beğendim (iptal için tekrar tıklayın)" + +#: forum/skins/default/templates/question.html:81 +#: forum/skins/default/templates/question.html:99 +#: forum/skins/default/templates/question.html:251 +msgid "current number of votes" +msgstr "oy geçerli sayısı" + +#: forum/skins/default/templates/question.html:90 +#: forum/skins/default/templates/question.html:91 +#: forum/skins/default/templates/question.html:104 +#: forum/skins/default/templates/question.html:105 +msgid "i dont like this post (click again to cancel)" +msgstr "bu yazıyı beğenmedim (iptal etmek için tekrar tıklayın)" + +#: forum/skins/default/templates/question.html:109 +#: forum/skins/default/templates/question.html:110 +msgid "mark this question as favorite (click again to cancel)" +msgstr "favorilerime ekle (iptal etmek için tıkla)" + +#: forum/skins/default/templates/question.html:116 +#: forum/skins/default/templates/question.html:117 +msgid "remove favorite mark from this question (click again to restore mark)" +msgstr "" +"bu sorudan favori işaretini kaldır (işareti tekrar koymak için tıklayın)" + +#: forum/skins/default/templates/question.html:141 +#: forum/skins/default/templates/question.html:288 +#: forum/skins/default/templates/revisions_answer.html:58 +#: forum/skins/default/templates/revisions_question.html:58 +msgid "edit" +msgstr "değiştir" + +#: forum/skins/default/templates/question.html:146 +msgid "reopen" +msgstr "yeniden aç" + +#: forum/skins/default/templates/question.html:150 +msgid "close" +msgstr "kapat" + +#: forum/skins/default/templates/question.html:156 +#: forum/skins/default/templates/question.html:293 +msgid "" +"report as offensive (i.e containing spam, advertising, malicious text, etc.)" +msgstr "şikayet et (spam, reklam, kötü amaçlı yazı vb. içeriyor)" + +#: forum/skins/default/templates/question.html:157 +#: forum/skins/default/templates/question.html:294 +msgid "flag offensive" +msgstr "şikayet et" + +#: forum/skins/default/templates/question.html:165 +#: forum/skins/default/templates/question.html:305 +msgid "delete" +msgstr "sil" + +#: forum/skins/default/templates/question.html:183 +#: forum/skins/default/templates/question.html:325 +msgid "delete this comment" +msgstr "bu yorumu sil" + +#: forum/skins/default/templates/question.html:194 +#: forum/skins/default/templates/question.html:336 +msgid "add comment" +msgstr "yorum ekle" + +#: forum/skins/default/templates/question.html:198 +#: forum/skins/default/templates/question.html:340 +#, python-format +msgid "see %(counter)s more" +msgid_plural "see %(counter)s more" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question.html:200 +#: forum/skins/default/templates/question.html:342 +#, python-format +msgid "see %(counter)s more comment" +msgid_plural "" +"see %(counter)s more comments\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question.html:213 +#, python-format +msgid "" +"The question has been closed for the following reason \"%(close_reason)s\" by" +msgstr "Soru şu nedenle kapatılmış olabilir: %(close_reason)s" + +#: forum/skins/default/templates/question.html:215 +#, python-format +msgid "close date %(closed_at)s" +msgstr "kapatılma tarihi %(closed_at)s" + +#: forum/skins/default/templates/question.html:223 +#, fuzzy, python-format +msgid "" +"\n" +" %(counter)s Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +"\n" +"Bir tek cevap var:" +msgstr[1] "" +"\n" +"%(counter)s cevap:" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers will be shown first" +msgstr "ilk önce eski cevaplar görünecek" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers" +msgstr "eski cevaplar" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers will be shown first" +msgstr "yeni cevaplar ilk önce görünecek" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers" +msgstr "yeni cevaplar" + +#: forum/skins/default/templates/question.html:235 +msgid "most voted answers will be shown first" +msgstr "çok oy alan cevaplar önce görünsün" + +#: forum/skins/default/templates/question.html:235 +msgid "popular answers" +msgstr "popüler cevaplar" + +#: forum/skins/default/templates/question.html:249 +#: forum/skins/default/templates/question.html:250 +msgid "i like this answer (click again to cancel)" +msgstr "bu cevabı beğendim (iptal etmek için tekrar tıklayın)" + +#: forum/skins/default/templates/question.html:256 +#: forum/skins/default/templates/question.html:257 +msgid "i dont like this answer (click again to cancel)" +msgstr "bu cevabı beğenmedim (iptal etmek için tekrar tıklayın)" + +#: forum/skins/default/templates/question.html:262 +#: forum/skins/default/templates/question.html:263 +msgid "mark this answer as favorite (click again to undo)" +msgstr "bu cevabı favori olarak işaretle (geri almak için tıklayın)" + +#: forum/skins/default/templates/question.html:268 +#: forum/skins/default/templates/question.html:269 +msgid "the author of the question has selected this answer as correct" +msgstr "bu soruyu yazan kişi, bu cevabı doğru olarak seçti" + +#: forum/skins/default/templates/question.html:282 +msgid "answer permanent link" +msgstr "kalıcı bağlantıyı cevapla" + +#: forum/skins/default/templates/question.html:283 +msgid "permanent link" +msgstr "kalıcı bağlantı" + +#: forum/skins/default/templates/question.html:305 +msgid "undelete" +msgstr "silineni geri al" + +#: forum/skins/default/templates/question.html:364 +#: forum/skins/default/templates/question.html:367 +#, fuzzy +msgid "Notify me once a day when there are any new answers" +msgstr "" +"Notify me once a day by email when there are any new " +"answers or updatesSoruya cevap verilirse bana bildir" + +#: forum/skins/default/templates/question.html:370 +#, fuzzy +msgid "Notify me weekly when there are any new answers" +msgstr "" +"Notify me weekly when there are any new answers or " +"updatesYeni cevapları bana haftalık olarak bildir" + +#: forum/skins/default/templates/question.html:375 +#, fuzzy, python-format +msgid "" +"You can always adjust frequency of email updates from your %(profile_url)s" +msgstr "" +"(note: you can always change how often you receive updates)%" +"(profile_url)s adresinden E-mail güncellemelerini alma sıklığını " +"ayarlayabilirsiniz." + +#: forum/skins/default/templates/question.html:380 +#, fuzzy +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "" +"Here (once you log in) you will be able to sign " +"up for the periodic email updates about this question.güncellemelerden " +"haberdar olmak için kaydolun." + +#: forum/skins/default/templates/question.html:391 +msgid "Your answer" +msgstr "Cevabınız" + +#: forum/skins/default/templates/question.html:393 +msgid "Be the first one to answer this question!" +msgstr "Bu soruya ilk cevabı sen yaz!" + +#: forum/skins/default/templates/question.html:399 +#, fuzzy +msgid "you can answer anonymously and then login" +msgstr "" +"Please start posting your answer anonymously " +"- your answer will be saved within the current session and published after " +"you log in or create a new account. Please try to give a substantial " +"answer, for discussions, please use comments and " +"please do remember to vote (after you log in)!şimdi hemen " +"cevap yazabilir, yollamak için daha sonra üye girişi yapabilirsiniz." + +#: forum/skins/default/templates/question.html:403 +#, fuzzy +msgid "answer your own question only to give an answer" +msgstr "" +"You are welcome to answer your own question, " +"but please make sure to give an answer. Remember that you " +"can always revise your original question. Please " +"use comments for discussions and please don't " +"forget to vote :) for the answers that you liked (or perhaps did " +"not like)! Kendi soruna cevap vermek üzeresin. Ya da sorunu daha da " +"açıklamak mı istiyorsun?" + +#: forum/skins/default/templates/question.html:405 +#, fuzzy +msgid "please only give an answer, no discussions" +msgstr "" +"Please try to give a substantial answer. If " +"you wanted to comment on the question or answer, just use the " +"commenting tool. Please remember that you can always revise " +"your answers - no need to answer the same question twice. Also, " +"please don't forget to vote - it really helps to select the " +"best questions and answers!sadece cevap yazınız, tartışmaya girmeyiniz." + +#: forum/skins/default/templates/question.html:441 +msgid "Login/Signup to Post Your Answer" +msgstr "Cevap yollamak için üye girişi yapmalısınız" + +#: forum/skins/default/templates/question.html:444 +msgid "Answer Your Own Question" +msgstr "Kendi soruna cevap yaz!" + +#: forum/skins/default/templates/question.html:446 +msgid "Answer the question" +msgstr "Soru cevapla" + +#: forum/skins/default/templates/question.html:460 +msgid "Question tags" +msgstr "Etiketleri" + +#: forum/skins/default/templates/question.html:465 +#: forum/skins/default/templates/questions.html:257 +#: forum/skins/default/templates/tag_selector.html:11 +#: forum/skins/default/templates/tag_selector.html:28 +#, python-format +msgid "see questions tagged '%(tag_name)s'" +msgstr "'%(tag_name)s' etiketli soruları gör" + +#: forum/skins/default/templates/question.html:471 +msgid "question asked" +msgstr "sorulma zamanı" + +#: forum/skins/default/templates/question.html:474 +msgid "question was seen" +msgstr "izlenme sayısı" + +#: forum/skins/default/templates/question.html:474 +msgid "times" +msgstr "kez" + +#: forum/skins/default/templates/question.html:477 +msgid "last updated" +msgstr "son güncelleme" + +#: forum/skins/default/templates/question.html:483 +msgid "Related questions" +msgstr "İlgili sorular" + +#: forum/skins/default/templates/question_counter_widget.html:6 +msgid "Please decide if you like this question or not by voting" +msgstr "Bu soruyu beğenip beğenmediğinize karar verin. Oy da verebilirsiniz." + +#: forum/skins/default/templates/question_counter_widget.html:12 +msgid "" +"\n" +" vote\n" +" " +msgid_plural "" +"\n" +" votes\n" +" " +msgstr[0] "" +"\n" +"oy" +msgstr[1] "" +"\n" +"oy" + +#: forum/skins/default/templates/question_counter_widget.html:21 +msgid "this answer has been accepted to be correct" +msgstr "bu cevap doğru olarak kabul edilmiştir" + +#: forum/skins/default/templates/question_counter_widget.html:27 +msgid "" +"\n" +" answer \n" +" " +msgid_plural "" +"\n" +" answers \n" +" " +msgstr[0] "" +"\n" +"cevap" +msgstr[1] "" +"\n" +"cevap" + +#: forum/skins/default/templates/question_counter_widget.html:39 +msgid "" +"\n" +" view\n" +" " +msgid_plural "" +"\n" +" views\n" +" " +msgstr[0] "" +"\n" +"izlenme" +msgstr[1] "" +"\n" +"izlenme" + +#: forum/skins/default/templates/question_edit.html:5 +#: forum/skins/default/templates/question_edit.html:66 +msgid "Edit question" +msgstr "Soruyu düzenle" + +#: forum/skins/default/templates/question_edit_tips.html:4 +msgid "question tips" +msgstr "soru ipuçları" + +#: forum/skins/default/templates/question_edit_tips.html:7 +msgid "please ask a relevant question" +msgstr "lütfen ilgili bir soru sorunuz" + +#: forum/skins/default/templates/question_edit_tips.html:10 +msgid "please try provide enough details" +msgstr "yeterince ayrıntılı olmasına çalışın" + +#: forum/skins/default/templates/question_retag.html:4 +#: forum/skins/default/templates/question_retag.html:53 +msgid "Change tags" +msgstr "Etiket değiştir" + +#: forum/skins/default/templates/question_retag.html:40 +msgid "up to 5 tags, less than 20 characters each" +msgstr "en fazla 5 etiket, her etiket en fazla 20 karakter" + +#: forum/skins/default/templates/question_retag.html:83 +msgid "Why use and modify tags?" +msgstr "Neden etiket kullanıyor ve bunu değiştiriyoruz?" + +#: forum/skins/default/templates/question_retag.html:86 +msgid "tags help us keep Questions organized" +msgstr "etiketler, bizim soruları organize etmemize yardımcı olur" + +#: forum/skins/default/templates/question_retag.html:94 +msgid "tag editors receive special awards from the community" +msgstr "etiket editörleri, sitemizden özel ödül almaktadır" + +#: forum/skins/default/templates/question_summary_list_roll.html:13 +msgid "answers" +msgstr "cevaplar" + +#: forum/skins/default/templates/questions.html:8 +msgid "Questions" +msgstr "Sorular" + +#: forum/skins/default/templates/questions.html:32 +msgid "Found by tags" +msgstr "Bulunan etiketler" + +#: forum/skins/default/templates/questions.html:36 +msgid "Search results" +msgstr "Arama sonuçları" + +#: forum/skins/default/templates/questions.html:38 +msgid "Found by title" +msgstr "Bulunan başlığa göre" + +#: forum/skins/default/templates/questions.html:42 +msgid "Unanswered questions" +msgstr "Cevapsız sorular" + +#: forum/skins/default/templates/questions.html:44 +msgid "All questions" +msgstr "Tüm sorular" + +#: forum/skins/default/templates/questions.html:51 +msgid "In:" +msgstr "Sorular:" + +#: forum/skins/default/templates/questions.html:53 +msgid "see unanswered questions" +msgstr "cevapsız sorular gör" + +#: forum/skins/default/templates/questions.html:55 +msgid "see your favorite questions" +msgstr "beğendiğiniz soruları gör" + +#: forum/skins/default/templates/questions.html:59 +msgid "Sort by:" +msgstr "Sıralama:" + +#: forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/questions.html:75 +msgid "click to see the newest questions" +msgstr "yeni soruları görmek için tıklayın" + +#: forum/skins/default/templates/questions.html:70 +msgid "click to see the oldest questions" +msgstr "eski soruları görmek için tıklayın" + +#: forum/skins/default/templates/questions.html:83 +#: forum/skins/default/templates/questions.html:94 +msgid "click to see the most recently updated questions" +msgstr "en güncel soruları görmek için tıklayın" + +#: forum/skins/default/templates/questions.html:89 +msgid "click to see the least recently updated questions" +msgstr "güncel olmayan soruları görmek için tıklayın" + +#: forum/skins/default/templates/questions.html:102 +#: forum/skins/default/templates/questions.html:113 +#, fuzzy +msgid "click to see hottest questions" +msgstr "questions with most answersen beğenilen cevaplar için tıklayın" + +#: forum/skins/default/templates/questions.html:102 +msgid "less answers" +msgstr "az cevaplananlar" + +#: forum/skins/default/templates/questions.html:108 +#, fuzzy +msgid "click to see coldest questions" +msgstr "questions with fewest answersen beğenilmeyen soruları gör" + +#: forum/skins/default/templates/questions.html:108 +#: forum/skins/default/templates/questions.html:113 +msgid "more answers" +msgstr "çok cevaplananlar" + +#: forum/skins/default/templates/questions.html:121 +#: forum/skins/default/templates/questions.html:132 +msgid "click to see most voted questions" +msgstr "en çok oylanan soruları gör" + +#: forum/skins/default/templates/questions.html:121 +msgid "unpopular" +msgstr "beğenilmeyen" + +#: forum/skins/default/templates/questions.html:127 +msgid "click to see least voted questions" +msgstr "en az oylanan soruları gör" + +#: forum/skins/default/templates/questions.html:127 +#: forum/skins/default/templates/questions.html:132 +msgid "popular" +msgstr "popüler" + +#: forum/skins/default/templates/questions.html:141 +#, fuzzy, python-format +msgid " %(q_num)s question found" +msgid_plural "%(q_num)s questions found" +msgstr[0] "%(q_num)s soru" +msgstr[1] "%(q_num)s soru" + +#: forum/skins/default/templates/questions.html:143 +#, fuzzy, python-format +msgid "%(q_num)s question" +msgid_plural "%(q_num)s questions" +msgstr[0] "%(q_num)s soru" +msgstr[1] "%(q_num)s soru" + +#: forum/skins/default/templates/questions.html:147 +#, python-format +msgid "with %(author_name)s's contributions" +msgstr "%(author_name)s 'ın katkılarıyla" + +#: forum/skins/default/templates/questions.html:151 +msgid "tagged" +msgstr "etiketlendi" + +#: forum/skins/default/templates/questions.html:157 +msgid "Search tips:" +msgstr "Arama ipuçları:" + +#: forum/skins/default/templates/questions.html:161 +msgid "reset author" +msgstr "yazarı sil" + +#: forum/skins/default/templates/questions.html:165 +msgid "reset tags" +msgstr "etiketleri temizle" + +#: forum/skins/default/templates/questions.html:169 +#: forum/skins/default/templates/questions.html:173 +msgid "start over" +msgstr "baştan başla" + +#: forum/skins/default/templates/questions.html:175 +msgid " - to expand, or dig in by adding more tags and revising the query." +msgstr "" +"- daha fazla etiket eklemek veya incelemek için inceleme alanını genişlet" + +#: forum/skins/default/templates/questions.html:178 +msgid "Search tip:" +msgstr "Arama ipucu:" + +#: forum/skins/default/templates/questions.html:178 +msgid "add tags and a query to focus your search" +msgstr "etiketleri kullanmak, arama sonucuna tam olarak odaklanmanızı sağlar" + +#: forum/skins/default/templates/questions.html:190 +msgid "There are no unanswered questions here" +msgstr "Harika! Cevapsız bir soru bile kalmamış..." + +#: forum/skins/default/templates/questions.html:193 +msgid "No favorite questions here. " +msgstr "Malesef, henüz beğenilmiş bir soru mevcut değil." + +#: forum/skins/default/templates/questions.html:194 +msgid "Please start (bookmark) some questions when you visit them" +msgstr "Beğendiğiniz soruları, favorilerinize ekleyebilirsiniz." + +#: forum/skins/default/templates/questions.html:199 +msgid "You can expand your search by " +msgstr "Ayrıntılı arama yapabilirsiniz" + +#: forum/skins/default/templates/questions.html:203 +msgid "resetting author" +msgstr "yazar sıfırlanıyor" + +#: forum/skins/default/templates/questions.html:207 +msgid "resetting tags" +msgstr "etiketler sıfırlanıyor" + +#: forum/skins/default/templates/questions.html:211 +#: forum/skins/default/templates/questions.html:215 +msgid "starting over" +msgstr "baştan başlıyor" + +#: forum/skins/default/templates/questions.html:220 +msgid "Please always feel free to ask your question!" +msgstr "" +"Asla soru sormaktan çekinmeyin! Sorun ki, sayenizde başkaları da öğrensin!" + +#: forum/skins/default/templates/questions.html:224 +msgid "Did not find what you were looking for?" +msgstr "Aradığını bulamadın mı?" + +#: forum/skins/default/templates/questions.html:225 +msgid "Please, post your question!" +msgstr "Hemen kendi sorunu yolla!" + +#: forum/skins/default/templates/questions.html:241 +msgid "Contributors" +msgstr "Yazarlar" + +#: forum/skins/default/templates/questions.html:254 +msgid "Related tags" +msgstr "İlgili etiketler" + +#: forum/skins/default/templates/reopen.html:6 +#: forum/skins/default/templates/reopen.html:16 +msgid "Reopen question" +msgstr "Soruyu yeniden aç" + +#: forum/skins/default/templates/reopen.html:19 +msgid "Open the previously closed question" +msgstr "Daha önce kapalıtılan soru aç" + +#: forum/skins/default/templates/reopen.html:22 +msgid "The question was closed for the following reason " +msgstr "Soru şu sebepten dolayı kaldırıldı:" + +#: forum/skins/default/templates/reopen.html:22 +msgid "reason - leave blank in english" +msgstr "Sorunun kaldırılma sebebi" + +#: forum/skins/default/templates/reopen.html:22 +msgid "on " +msgstr "yayında" + +#: forum/skins/default/templates/reopen.html:22 +msgid "date closed" +msgstr "kapatılma tarihi" + +#: forum/skins/default/templates/reopen.html:29 +msgid "Reopen this question" +msgstr "Bu soruyu tekrar aç" + +#: forum/skins/default/templates/revisions_answer.html:7 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:8 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "Revision history" +msgstr "düzenleme geçmişi" + +#: forum/skins/default/templates/revisions_answer.html:50 +#: forum/skins/default/templates/revisions_question.html:50 +msgid "click to hide/show revision" +msgstr "düzenlemeleri gizle/göster" + +#: forum/skins/default/templates/tag_selector.html:5 +msgid "Interesting tags" +msgstr "İlginç etiketler" + +#: forum/skins/default/templates/tag_selector.html:15 +#, python-format +msgid "remove '%(tag_name)s' from the list of interesting tags" +msgstr "ilginizi çeken etiketler kısmından '%(tag_name)s' etiketini sil" + +#: forum/skins/default/templates/tag_selector.html:21 +#: forum/skins/default/templates/tag_selector.html:38 +msgid "Add" +msgstr "Ekle" + +#: forum/skins/default/templates/tag_selector.html:22 +msgid "Ignored tags" +msgstr "Yoksayılan etiketler" + +#: forum/skins/default/templates/tag_selector.html:32 +#, python-format +msgid "remove '%(tag_name)s' from the list of ignored tags" +msgstr "yoksaydığınız etiketler kısmından '%(tag_name)s' etiketini sil" + +#: forum/skins/default/templates/tag_selector.html:41 +msgid "keep ignored questions hidden" +msgstr "yoksayılan soruları gizle" + +#: forum/skins/default/templates/tags.html:6 +#: forum/skins/default/templates/tags.html:30 +msgid "Tag list" +msgstr "Etiket listesi" + +#: forum/skins/default/templates/tags.html:32 +msgid "sorted alphabetically" +msgstr "alfabetik sıraya göre" + +#: forum/skins/default/templates/tags.html:32 +msgid "by name" +msgstr "isime göre" + +#: forum/skins/default/templates/tags.html:33 +msgid "sorted by frequency of tag use" +msgstr "etiket kullanım sıklığına göre" + +#: forum/skins/default/templates/tags.html:33 +msgid "by popularity" +msgstr "popülerliğe göre" + +#: forum/skins/default/templates/tags.html:39 +#, python-format +msgid "" +"All tags matching '%(stag)s'" +msgstr "" +"Tüm etiketleri eşleştirme '%(stag)s'" + +#: forum/skins/default/templates/tags.html:42 +msgid "Nothing found" +msgstr "Hiçbir şey bulunamadı" + +#: forum/skins/default/templates/user_edit.html:6 +msgid "Edit user profile" +msgstr "Kullanıcı profilini düzenle" + +#: forum/skins/default/templates/user_edit.html:19 +msgid "edit profile" +msgstr "profil değiştir" + +#: forum/skins/default/templates/user_edit.html:33 +#: forum/skins/default/templates/user_info.html:53 +msgid "Registered user" +msgstr "Kayıtlı kullanıcı" + +#: forum/skins/default/templates/user_edit.html:40 +msgid "Screen Name" +msgstr "Görünen isim" + +#: forum/skins/default/templates/user_edit.html:89 +#: forum/skins/default/templates/user_email_subscriptions.html:20 +msgid "Update" +msgstr "Güncelleme" + +#: forum/skins/default/templates/user_email_subscriptions.html:8 +msgid "Email subscription settings" +msgstr "E-mail abonelik ayarları" + +#: forum/skins/default/templates/user_email_subscriptions.html:9 +#, fuzzy +msgid "email subscription settings info" +msgstr "" +"Adjust frequency of email updates. Receive " +"updates on interesting questions by email,
help the community by answering questions of your colleagues. If you do not wish to " +"receive emails - select 'no email' on all items below.
Updates are only " +"sent when there is any new activity on selected items.E-mail abonelik " +"ayarları bilgisi" + +#: forum/skins/default/templates/user_email_subscriptions.html:21 +msgid "Stop sending email" +msgstr "E-mail yollamayı duraklat" + +#: forum/skins/default/templates/user_info.html:18 +msgid "change picture" +msgstr "resim değiştir" + +#: forum/skins/default/templates/user_info.html:25 +#: forum/skins/default/templates/users.html:26 forum/views/users.py:933 +msgid "reputation" +msgstr "itibar puanı" + +#: forum/skins/default/templates/user_info.html:35 +msgid "Moderate this user" +msgstr "Bu kullanıcıyı yönet" + +#: forum/skins/default/templates/user_info.html:47 +msgid "update profile" +msgstr "profilimi güncelle" + +#: forum/skins/default/templates/user_info.html:57 +msgid "real name" +msgstr "gerçek ismi" + +#: forum/skins/default/templates/user_info.html:62 +msgid "member for" +msgstr "üyelik başlangıcı" + +#: forum/skins/default/templates/user_info.html:67 +msgid "last seen" +msgstr "son görülme" + +#: forum/skins/default/templates/user_info.html:73 +msgid "user website" +msgstr "websitesi" + +#: forum/skins/default/templates/user_info.html:79 +msgid "location" +msgstr "yer" + +#: forum/skins/default/templates/user_info.html:86 +msgid "age" +msgstr "yaş" + +#: forum/skins/default/templates/user_info.html:87 +msgid "age unit" +msgstr "yaşında" + +#: forum/skins/default/templates/user_info.html:93 +msgid "todays unused votes" +msgstr "bugün kullanılmayan oy" + +#: forum/skins/default/templates/user_info.html:94 +msgid "votes left" +msgstr "oy kullandı" + +#: forum/skins/default/templates/user_reputation.html:29 +msgid "Your karma change log." +msgstr "Karma değişiklik kayıtları" + +#: forum/skins/default/templates/user_reputation.html:31 +#, python-format +msgid "%(user_name)s's karma change log" +msgstr "%(user_name)s 'nin karma değişim günlüğü" + +#: forum/skins/default/templates/user_stats.html:11 +#, fuzzy, python-format +msgid "%(counter)s Question" +msgid_plural "%(counter)s Questions" +msgstr[0] "1 Madalya" +msgstr[1] "%(counter)s Madalya" + +#: forum/skins/default/templates/user_stats.html:16 +#, fuzzy, python-format +msgid "%(counter)s Answer" +msgid_plural "%(counter)s Answers" +msgstr[0] "1 Madalya" +msgstr[1] "%(counter)s Madalya" + +#: forum/skins/default/templates/user_stats.html:24 +#, python-format +msgid "the answer has been voted for %(answer_score)s times" +msgstr "cevap için %(answer_score)s kez oy kullanıldı" + +#: forum/skins/default/templates/user_stats.html:24 +msgid "this answer has been selected as correct" +msgstr "bu cevap doğru olarak seçildi" + +#: forum/skins/default/templates/user_stats.html:34 +#, fuzzy, python-format +msgid "(%(comment_count)s comment)" +msgid_plural "the answer has been commented %(comment_count)s times" +msgstr[0] "yorum ekle" +msgstr[1] "yorum ekle" + +#: forum/skins/default/templates/user_stats.html:44 +#, fuzzy, python-format +msgid "%(cnt)s Vote" +msgid_plural "%(cnt)s Votes " +msgstr[0] "1 Madalya" +msgstr[1] "%(counter)s Madalya" + +#: forum/skins/default/templates/user_stats.html:50 +msgid "thumb up" +msgstr "beğen" + +#: forum/skins/default/templates/user_stats.html:51 +msgid "user has voted up this many times" +msgstr "kullanıcılar tarafından defalarca beğendi" + +#: forum/skins/default/templates/user_stats.html:55 +msgid "thumb down" +msgstr "beğenme" + +#: forum/skins/default/templates/user_stats.html:56 +msgid "user voted down this many times" +msgstr "kullanıcılar tarafından defalarca beğenilmedi" + +#: forum/skins/default/templates/user_stats.html:64 +#, fuzzy, python-format +msgid "%(counter)s Tag" +msgid_plural "%(counter)s Tags" +msgstr[0] "1 Madalya" +msgstr[1] "%(counter)s Madalya" + +#: forum/skins/default/templates/user_stats.html:72 +#, python-format +msgid "" +"see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " +msgstr "%(view_user)s 'nin diğer '%(tag_name)s' etiketli diğer sorularını gör" + +#: forum/skins/default/templates/user_stats.html:86 +#, fuzzy, python-format +msgid "%(counter)s Badge" +msgid_plural "%(counter)s Badges" +msgstr[0] "1 Madalya" +msgstr[1] "%(counter)s Madalya" + +#: forum/skins/default/templates/user_tabs.html:7 +msgid "User profile" +msgstr "Kullanıcı profili" + +#: forum/skins/default/templates/user_tabs.html:7 forum/views/users.py:907 +msgid "overview" +msgstr "genel bakış" + +#: forum/skins/default/templates/user_tabs.html:9 forum/views/users.py:915 +msgid "recent activity" +msgstr "son etkinlik" + +#: forum/skins/default/templates/user_tabs.html:12 forum/views/users.py:925 +msgid "comments and answers to others questions" +msgstr "diğer sorulara cevaplar ve yorumlar" + +#: forum/skins/default/templates/user_tabs.html:13 forum/views/users.py:924 +msgid "responses" +msgstr "cevaplar" + +#: forum/skins/default/templates/user_tabs.html:16 +msgid "graph of user reputation" +msgstr "kullanıcı itibar grafiği" + +#: forum/skins/default/templates/user_tabs.html:17 +msgid "reputation history" +msgstr "itibar geçmişi" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:951 +msgid "user vote record" +msgstr "kullanıcı oy rekoru" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:950 +msgid "casted votes" +msgstr "kritik oy" + +#: forum/skins/default/templates/user_tabs.html:23 +msgid "questions that user selected as his/her favorite" +msgstr "kullanıcının favori olarak seçtiği sorular" + +#: forum/skins/default/templates/user_tabs.html:24 +msgid "favorites" +msgstr "favoriler" + +#: forum/skins/default/templates/user_tabs.html:27 forum/views/users.py:960 +msgid "email subscription settings" +msgstr "E-mail abonelik ayarları" + +#: forum/skins/default/templates/user_tabs.html:28 forum/views/users.py:959 +msgid "email subscriptions" +msgstr "e-mail abonelikleri" + +#: forum/skins/default/templates/users.html:6 +#: forum/skins/default/templates/users.html:24 +msgid "Users" +msgstr "Kullanıcılar" + +#: forum/skins/default/templates/users.html:27 +msgid "recent" +msgstr "son" + +#: forum/skins/default/templates/users.html:29 +msgid "by username" +msgstr "kullanıcı tarafından" + +#: forum/skins/default/templates/users.html:35 +#, python-format +msgid "users matching query %(suser)s:" +msgstr "kullanıcı sorgusuna eşleşen %(suser)s :" + +#: forum/skins/default/templates/users.html:39 +msgid "Nothing found." +msgstr "Hiçbir şey bulunamadı." + +#: forum/skins/default/templates/users_questions.html:11 +msgid "this questions was selected as favorite" +msgstr "Bu sorular favori olarak seçildi" + +#: forum/skins/default/templates/users_questions.html:12 +msgid "thumb-up on" +msgstr "Küçük beğeni resmi açık" + +#: forum/skins/default/templates/users_questions.html:19 +msgid "thumb-up off" +msgstr "Küçük beğeni resmi kapalı" + +#: forum/skins/default/templates/authopenid/changeemail.html:3 +#: forum/skins/default/templates/authopenid/changeemail.html:9 +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Change email" +msgstr "E-mai değiştir" + +#: forum/skins/default/templates/authopenid/changeemail.html:11 +msgid "Save your email address" +msgstr "E-mail adresinizi kaydedin" + +#: forum/skins/default/templates/authopenid/changeemail.html:16 +#, fuzzy, python-format +msgid "change %(email)s info" +msgstr "" +"Enter your new email into the box below if " +"you'd like to use another email for update subscriptions." +"
Currently you are using %(email)s%(email)s değişiklik " +"bilgisi" + +#: forum/skins/default/templates/authopenid/changeemail.html:18 +#, fuzzy, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "" +"Please enter your email address in the box below. Valid email address is required on this Q&A forum. If you like, " +"you can receive updates on interesting questions or entire " +"forum via email. Also, your email is used to create a unique gravatar image for your account. " +"Email addresses are never shown or otherwise shared with anybody else.buraya " +"bakarak neden E-mail adresinin gerekli olduğunu görebilirsiniz: %" +"(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +#, fuzzy +msgid "Your new Email" +msgstr "" +"Your new Email: (will not be shown to " +"anyone, must be valid)Yeni E-mail adresiniz" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your Email" +msgstr "E-mail adresiniz" + +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Save Email" +msgstr "E-mail adresini kaydet" + +#: forum/skins/default/templates/authopenid/changeemail.html:49 +msgid "Validate email" +msgstr "E-mail adresini doğrula" + +#: forum/skins/default/templates/authopenid/changeemail.html:52 +#, fuzzy, python-format +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "" +"An email with a validation link has been sent to %" +"(email)s. Please follow the emailed link with your " +"web browser. Email validation is necessary to help insure the proper use of " +"email on Q&A. If you would like to use " +"another email, please change it again. %(email)s adresini doğrulayın ya " +"da %(change_email_url)s adresine gidin." + +#: forum/skins/default/templates/authopenid/changeemail.html:57 +msgid "Email not changed" +msgstr "E-mail değişmedi" + +#: forum/skins/default/templates/authopenid/changeemail.html:60 +#, fuzzy, python-format +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" +"Your email address %(email)s has not been changed." +" If you decide to change it later - you can always do it by editing " +"it in your user profile or by using the previous form again.eski %(email)s saklansın " +"diyorsanız, %(change_email_url)s adresi size yardımcı olacaktır." + +#: forum/skins/default/templates/authopenid/changeemail.html:65 +msgid "Email changed" +msgstr "E-mail değiştirildi" + +#: forum/skins/default/templates/authopenid/changeemail.html:68 +#, fuzzy, python-format +msgid "your current %(email)s can be used for this" +msgstr "" +"Your email address is now set to %(email)s. " +"Updates on the questions that you like most will be sent to this address. " +"Email notifications are sent once a day or less frequently - only when there " +"are any news.şu anki geçerli %(email)s bunun için kullanılabilir" + +#: forum/skins/default/templates/authopenid/changeemail.html:73 +msgid "Email verified" +msgstr "E-mail doğrulandı" + +#: forum/skins/default/templates/authopenid/changeemail.html:76 +#, fuzzy +msgid "thanks for verifying email" +msgstr "" +"Thank you for verifying your email! Now " +"you can ask and answer questions. Also if " +"you find a very interesting question you can subscribe for the " +"updates - then will be notified about changes once a day or less frequently.E-mail doğrulaması için teşekkürler..." + +#: forum/skins/default/templates/authopenid/changeemail.html:81 +#, fuzzy +msgid "email key not sent" +msgstr "" +"Your current email address %(email)s has been " +"validated before so the new key was not sent. You can change email used for update subscriptions if necessary." +"E-mail anahtarı yollanmadı" + +#: forum/skins/default/templates/authopenid/changeemail.html:84 +#, python-format +msgid "email key not sent %(email)s change email here %(change_link)s" +msgstr "" +"E-mail şifresi %(email)s yollanamadı. E-mail değiştirmek için: %(change_link)" +"s adresine bakın." + +#: forum/skins/default/templates/authopenid/changeopenid.html:8 +msgid "Account: change OpenID URL" +msgstr "Hesabınız hakkında: OpenID adresini değiştirin" + +#: forum/skins/default/templates/authopenid/changeopenid.html:12 +msgid "" +"This is where you can change your OpenID URL. Make sure you remember it!" +msgstr "" +"Burada OpenID adresinizi değiştirebilirsiniz. Bu değişikliği " +"hatırlayabileceğinizden emin olun!" + +#: forum/skins/default/templates/authopenid/changeopenid.html:14 +#: forum/skins/default/templates/authopenid/delete.html:14 +#: forum/skins/default/templates/authopenid/delete.html:24 +msgid "Please correct errors below:" +msgstr "Lütfen aşağıdaki hataları düzeltin:" + +#: forum/skins/default/templates/authopenid/changeopenid.html:29 +msgid "OpenID URL:" +msgstr "OpenID adresi:" + +#: forum/skins/default/templates/authopenid/changepw.html:7 +msgid "Account: change password" +msgstr "Hesabınız: Şifremi değiştir" + +#: forum/skins/default/templates/authopenid/changepw.html:8 +#, fuzzy +msgid "This is where you can change your password. Make sure you remember it!" +msgstr "" +"To change your password please fill out and " +"submit this formBurada şifrenizi değiştirebilirsiniz. Yeni şifrenizin, " +"hatırlıyacağınız bir şifre olduğundan emin olun!" + +#: forum/skins/default/templates/authopenid/complete.html:19 +msgid "Connect your OpenID with this site" +msgstr "OpenID hesabınızla giriş yapın" + +#: forum/skins/default/templates/authopenid/complete.html:22 +msgid "Connect your OpenID with your account on this site" +msgstr "Bu siteye OpenID hesabınızla giriş yapın" + +#: forum/skins/default/templates/authopenid/complete.html:27 +#, fuzzy, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your %" +"(provider)s login. Please create your screen name " +"and save your email address. Saved email address will let " +"you subscribe for the updates on the most interesting " +"questions and will be used to create and retrieve your unique avatar image - " +"gravatar.

Yeni %" +"(provider)s hesabı kayıt bilgisi için lütfen bakınız: %(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/complete.html:31 +#, fuzzy, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" +"

Oops... looks like screen name %(username)s is " +"already used in another account.

Please choose another screen " +"name to use with your %(provider)s login. Also, a valid email address is " +"required on the Q&A forum. Your email is " +"used to create a unique gravatar image for your account. If you like, you can receive " +"updates on the interesting questions or entire forum by email. " +"Email addresses are never shown or otherwise shared with anybody else.

%" +"(username)s kullanıcı adı, %(provider)s için başka birisi tarafından " +"alınmıştır. Başka bir isim deneyin. Lütfen okuyun: %(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/complete.html:35 +#, fuzzy, python-format +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your %" +"(provider)s login.

You can either keep your screen " +"name the same as your %(provider)s login name or choose some other " +"nickname.

Also, please save a valid email address. " +"With the email you can subscribe for the updates on the " +"most interesting questions. Email address is also used to create and " +"retrieve your unique avatar image - gravatar.

başka bir %(provider)s hesabı kaydetmek " +"için bakınız: %(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/complete.html:38 +#, fuzzy, python-format +msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your " +"Facebook login. Please create your screen name and " +"save your email address. Saved email address will let you " +"subscribe for the updates on the most interesting questions " +"and will be used to create and retrieve your unique avatar image - gravatar.

Yeni Facebook hesabı " +"ile bağlanma kaydı bilgisi: %(gravatar_faq_url)s" + +#: forum/skins/default/templates/authopenid/complete.html:42 +msgid "This account already exists, please use another." +msgstr "" +"Bu kullanıcı adı sitemizde zaten kayıtlı. Lütfen başka bir tane deneyin." + +#: forum/skins/default/templates/authopenid/complete.html:57 +msgid "Sorry, looks like we have some errors:" +msgstr "Üzgünüm...Bazı hatalar var gibi görünüyor:" + +#: forum/skins/default/templates/authopenid/complete.html:82 +msgid "Screen name label" +msgstr "Görünen isim etiketi" + +#: forum/skins/default/templates/authopenid/complete.html:89 +#, fuzzy +msgid "Email address label" +msgstr "" +"Email Address (will not be shared with " +"anyone, must be valid)" + +#: forum/skins/default/templates/authopenid/complete.html:95 +#: forum/skins/default/templates/authopenid/signup.html:18 +#, fuzzy +msgid "receive updates motivational blurb" +msgstr "" +"Receive forum updates by email - this will help our " +"community grow and become more useful.
By default Q&A forum sends up to one email digest per " +"week - only when there is anything new.
If you like, please " +"adjust this now or any time later from your user account." + +#: forum/skins/default/templates/authopenid/complete.html:99 +#: forum/skins/default/templates/authopenid/signup.html:22 +msgid "please select one of the options above" +msgstr "Lütfen yukarıdaki seçeneklerden birini seçin" + +#: forum/skins/default/templates/authopenid/complete.html:102 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" +"Etiket filtreleme aracı sağ panelde, oturum açınca bir kez görünecektir." + +#: forum/skins/default/templates/authopenid/complete.html:103 +msgid "create account" +msgstr "hesap oluştur" + +#: forum/skins/default/templates/authopenid/complete.html:112 +msgid "Existing account" +msgstr "Hesabım var" + +#: forum/skins/default/templates/authopenid/complete.html:113 +msgid "user name" +msgstr "kullanıcı adı" + +#: forum/skins/default/templates/authopenid/complete.html:114 +msgid "password" +msgstr "şifre" + +#: forum/skins/default/templates/authopenid/complete.html:121 +msgid "Register" +msgstr "Kayıt" + +#: forum/skins/default/templates/authopenid/complete.html:122 +#: forum/skins/default/templates/authopenid/signin.html:168 +msgid "Forgot your password?" +msgstr "Şifrenizi mi unuttunuz?" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:2 +msgid "Thank you for registering at our Q&A forum!" +msgstr "Sorucevap.de sitesine kayıt olduğunuz için teşekkür ederiz!" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:4 +msgid "Your account details are:" +msgstr "Hesap ayrıntılarınız şöyledir:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:6 +msgid "Username:" +msgstr "Kullanıcı adı:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:7 +#: forum/skins/default/templates/authopenid/delete.html:19 +msgid "Password:" +msgstr "Şifre:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:9 +msgid "Please sign in here:" +msgstr "Lütfen buradan giriş yapın:" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:12 +#: forum/skins/default/templates/authopenid/email_validation.txt:14 +#: forum/skins/default/templates/authopenid/sendpw_email.txt:8 +msgid "" +"Sincerely,\n" +"Forum Administrator" +msgstr "Saygılarımızla,
Site yönetimi" + +#: forum/skins/default/templates/authopenid/delete.html:8 +msgid "Account: delete account" +msgstr "Hesabınız: hesabımı sil" + +#: forum/skins/default/templates/authopenid/delete.html:12 +msgid "" +"Note: After deleting your account, anyone will be able to register this " +"username." +msgstr "" +"Not: Hesabınızı sildikten sonra, artık hiç kimse bu kullanıcı adı ile kayıt " +"olamayacaktır." + +#: forum/skins/default/templates/authopenid/delete.html:16 +msgid "Check confirm box, if you want delete your account." +msgstr "Hesabınızı silmek istediğinizi, onay kutucuğunu işaretleyip onaylayın." + +#: forum/skins/default/templates/authopenid/delete.html:31 +msgid "I am sure I want to delete my account." +msgstr "Hesabımı silmek istediğimden eminim." + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "Password/OpenID URL" +msgstr "Şifre ya da OpenID adresi" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "(required for your security)" +msgstr "(güvenliğiniz için gereklidir)" + +#: forum/skins/default/templates/authopenid/delete.html:34 +msgid "Delete account permanently" +msgstr "hesabı kalıcı olarak sil" + +#: forum/skins/default/templates/authopenid/email_validation.txt:2 +msgid "Greetings from the Q&A forum" +msgstr "Sorucevap.de sitesinden selamlar..." + +#: forum/skins/default/templates/authopenid/email_validation.txt:4 +msgid "To make use of the Forum, please follow the link below:" +msgstr "Forum faydalanmak için, aşağıdaki bağlantıyı takip edin:" + +#: forum/skins/default/templates/authopenid/email_validation.txt:8 +msgid "Following the link above will help us verify your email address." +msgstr "Yukarıdaki bağlantı, E-mail adresinizi doğrulamada yardımcı olacaktır." + +#: forum/skins/default/templates/authopenid/email_validation.txt:10 +msgid "" +"If you beleive that this message was sent in mistake - \n" +"no further action is needed. Just ingore this email, we apologize\n" +"for any inconvenience" +msgstr "" +"Eğer bu mesajın size yanlışlıkla gönderildiğini düşünüyorsanız, hiçbir şey " +"yapmanıza gerek yok.
Bu mesajı dikkate almayın.
Bu durum için özür " +"dileriz." + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:4 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:7 +msgid "Traditional login information" +msgstr "Her zamanki giriş bilgileri" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:12 +#, python-format +msgid "" +"how to login with password through external login website or use %" +"(feedback_url)s" +msgstr "" +"Sitemize harici bir şifre ile nasıl girilebileceğini mi öğrenmek " +"istiyorsunuz? Tıklayın: %(feedback_url)s" + +#: forum/skins/default/templates/authopenid/sendpw.html:4 +#: forum/skins/default/templates/authopenid/sendpw.html:7 +msgid "Send new password" +msgstr "Yeni şifre gönder" + +#: forum/skins/default/templates/authopenid/sendpw.html:10 +#, fuzzy +msgid "password recovery information" +msgstr "" +"Forgot you password? No problems - just get a new " +"one!
Please follow the following steps:
• submit your " +"user name below and check your email
follow the " +"activation link for the new password - sent to you by email and " +"login with the suggested password
• at this you might want to " +"change your password to something you can remember better" + +#: forum/skins/default/templates/authopenid/sendpw.html:21 +msgid "Reset password" +msgstr "Åžifreyi sıfırla" + +#: forum/skins/default/templates/authopenid/sendpw.html:22 +msgid "return to login" +msgstr "giriÅŸe dön" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:2 +#, python-format +msgid "" +"Someone has requested to reset your password on %(site_url)s.\n" +"If it were not you, it is safe to ignore this email." +msgstr "" +"%(site_url)s sitesindeki kullanıcı, sizin E-mail adresiniz ile ÅŸifresini " +"sıfırlamaya çalışıyor. EÄŸer bunu kendiniz istemediyseniz, hiçbir ÅŸeye " +"tıklamayın ve bu mesajı dikkate almayın." + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:5 +#, fuzzy, python-format +msgid "" +"email explanation how to use new %(password)s for %(username)s\n" +"with the %(key_link)s" +msgstr "" +"To change your password, please follow these steps:\n" +"* visit this link: %(key_link)s\n" +"* login with user name %(username)s and password %(password)s\n" +"* go to your user profile and set the password to something you can remember%" +"(username)s için yeni ÅŸifre %(password)s ve kullanım açıklaması için link: %" +"(key_link)s" + +#: forum/skins/default/templates/authopenid/signin.html:5 +#: forum/skins/default/templates/authopenid/signin.html:21 +msgid "User login" +msgstr "Kullanıcı giriÅŸi" + +#: forum/skins/default/templates/authopenid/signin.html:28 +#, fuzzy, python-format +msgid "" +"\n" +" Your answer to %(title)s %(summary)s will be posted once you " +"log in\n" +" " +msgstr "" +"\n" +"Your answer to \"%(title)s %(summary)s...\" is saved and will be " +"posted once you log in.\"%(title)s\" baÅŸlıklı soruya yazdığınız \"%" +"(summary)s\" cevabını yollamak için giriÅŸ yapmalısınız." + +#: forum/skins/default/templates/authopenid/signin.html:35 +#, fuzzy, python-format +msgid "" +"Your question \n" +" %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" +"Your question \"%(title)s %(summary)s...\" is saved and will be " +"posted once you log in.\"%(title)s\" baÅŸlıklı \"%(summary)s\" " +"sorunuzu yollamak için giriÅŸ yapmalısınız." + +#: forum/skins/default/templates/authopenid/signin.html:42 +#, fuzzy +msgid "Click to sign in through any of these services." +msgstr "" +"

Please select your favorite login method below." +"

External login services use OpenID technology, where your password " +"always stays confidential between you and your login provider and you don't " +"have to remember another one.

Bu hizmetlerden yararlanmak için üye " +"girişi yapın." + +#: forum/skins/default/templates/authopenid/signin.html:144 +#, fuzzy +msgid "Enter your Provider user name" +msgstr "" +"Enter your Provider user name
(or " +"select another login method above)Provider kullanıcı adınız" + +#: forum/skins/default/templates/authopenid/signin.html:151 +#, fuzzy +msgid "" +"Enter your OpenID " +"web address" +msgstr "" +"Enter your OpenID web address
(or choose " +"another login method above)" + +#: forum/skins/default/templates/authopenid/signin.html:153 +#: forum/skins/default/templates/authopenid/signin.html:166 +msgid "Login" +msgstr "GiriÅŸ" + +#: forum/skins/default/templates/authopenid/signin.html:157 +msgid "Enter your login name and password" +msgstr "Kullanıcı adınızı ve ÅŸifrenizi girin" + +#: forum/skins/default/templates/authopenid/signin.html:161 +msgid "Login name" +msgstr "Kullanıcı adı" + +#: forum/skins/default/templates/authopenid/signin.html:163 +msgid "Password" +msgstr "Åžifre" + +#: forum/skins/default/templates/authopenid/signin.html:167 +msgid "Create account" +msgstr "Hesap oluÅŸtur" + +#: forum/skins/default/templates/authopenid/signin.html:178 +msgid "Why use OpenID?" +msgstr "Neden OpenID kullanıyoruz?" + +#: forum/skins/default/templates/authopenid/signin.html:181 +#, fuzzy +msgid "with openid it is easier" +msgstr "With the OpenID you don't need to create new username and password." + +#: forum/skins/default/templates/authopenid/signin.html:184 +#, fuzzy +msgid "reuse openid" +msgstr "You can safely re-use the same login for all OpenID-enabled websites." + +#: forum/skins/default/templates/authopenid/signin.html:187 +#, fuzzy +msgid "openid is widely adopted" +msgstr "" +"There are > 160,000,000 OpenID account in use. Over 10,000 sites are OpenID-" +"enabled." + +#: forum/skins/default/templates/authopenid/signin.html:190 +#, fuzzy +msgid "openid is supported open standard" +msgstr "" +"OpenID is based on an open standard, supported by many organizations.OpenID " +"açık kaynak standartları ile desteklenmektedir" + +#: forum/skins/default/templates/authopenid/signin.html:195 +msgid "Find out more" +msgstr "Daha fazla bilgi" + +#: forum/skins/default/templates/authopenid/signin.html:196 +msgid "Get OpenID" +msgstr "OpenID hesabı açın" + +#: forum/skins/default/templates/authopenid/signup.html:4 +msgid "Signup" +msgstr "Kaydol" + +#: forum/skins/default/templates/authopenid/signup.html:8 +msgid "Create login name and password" +msgstr "Kullanıcı adı ve ÅŸifre oluÅŸtur" + +#: forum/skins/default/templates/authopenid/signup.html:10 +#, fuzzy +msgid "Traditional signup info" +msgstr "" +"If you prefer, create your forum login name and " +"password here. However, please keep in mind that we also support " +"OpenID login method. With OpenID you can " +"simply reuse your external login (e.g. Gmail or AOL) without ever sharing " +"your login details with anyone and having to remember yet another password." + +#: forum/skins/default/templates/authopenid/signup.html:25 +msgid "" +"Please read and type in the two words below to help us prevent automated " +"account creation." +msgstr "" +"Lütfen aÅŸağıdaki iki kelimeyi yazın. Çünkü bazı otomatik hesap " +"oluÅŸturucular, sitemize böyle kayıt olup, gerçek olmayan içerikler " +"eklemektedir." + +#: forum/skins/default/templates/authopenid/signup.html:27 +msgid "Create Account" +msgstr "Hesap oluÅŸtur" + +#: forum/skins/default/templates/authopenid/signup.html:28 +msgid "or" +msgstr "veya" + +#: forum/skins/default/templates/authopenid/signup.html:29 +msgid "return to OpenID login" +msgstr "OpenID giriÅŸine dön" + +#: forum/skins/default/templates/fbconnect/xd_receiver.html:5 +#, python-format +msgid "Connect to %(APP_SHORT_NAME)s with Facebook!" +msgstr "%(APP_SHORT_NAME)s 'a Facebook hesabınızla baÄŸlanın!" + +#: forum/templatetags/extra_filters.py:100 +msgid "no items in counter" +msgstr "0" + +#: forum/templatetags/extra_tags.py:53 +#, python-format +msgid "%(username)s gravatar image" +msgstr "%(username)s Gravatar görüntüsü" + +#: forum/templatetags/extra_tags.py:178 forum/templatetags/extra_tags.py:205 +msgid "reputation points" +msgstr "itibar puanları" + +#: forum/templatetags/extra_tags.py:265 +msgid "2 days ago" +msgstr "2 gün önce" + +#: forum/templatetags/extra_tags.py:267 +msgid "yesterday" +msgstr "dün" + +#: forum/templatetags/extra_tags.py:269 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "%(hr)d saat önce" +msgstr[1] "%(hr)d saat önce" + +#: forum/templatetags/extra_tags.py:271 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "%(min)d dakika önce" +msgstr[1] "%(min)d dakika önce" + +#: forum/utils/forms.py:30 +msgid "this field is required" +msgstr "bu alanın doldurulması gereklidir" + +#: forum/utils/forms.py:45 +msgid "choose a username" +msgstr "bir kullanıcı adı seçin" + +#: forum/utils/forms.py:50 +msgid "user name is required" +msgstr "kullanıcı adı doldurulması gerekli alandır" + +#: forum/utils/forms.py:51 +msgid "sorry, this name is taken, please choose another" +msgstr "üzgünüm, bu isim baÅŸkası tarafından kullanılıyor." + +#: forum/utils/forms.py:52 +msgid "sorry, this name is not allowed, please choose another" +msgstr "" +"Ãœzgünüm, bu ismin kullanılmasına izin verilmiyor. BaÅŸka bir tane deneyin." + +#: forum/utils/forms.py:53 +msgid "sorry, there is no user with this name" +msgstr "Ãœzgünüm, bu isimle kayıtlı bir kullanıcı yoktur" + +#: forum/utils/forms.py:54 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" +"Ãœzgünüm, ciddi bir sorun var! Bu kullanıcı adı farklı kullanıcılar " +"tarafından alınmıştır." + +#: forum/utils/forms.py:55 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "kullanıcı adı sadece harf, rakam veya altçizgiden oluÅŸur" + +#: forum/utils/forms.py:109 +#, fuzzy +msgid "your email address" +msgstr "Your email (never shared)E-mail adresiniz" + +#: forum/utils/forms.py:110 +msgid "email address is required" +msgstr "E-mail adresinizi yazmalısınız" + +#: forum/utils/forms.py:111 +msgid "please enter a valid email address" +msgstr "geçerli bir e-mail adresi girin" + +#: forum/utils/forms.py:112 +msgid "this email is already used by someone else, please choose another" +msgstr "" +"Bu E-mail sitemizde kullanılıyor. Åžifre hatırlatmayı deneyebilir ya da " +"yeniden kayıt olabilirsiniz." + +#: forum/utils/forms.py:140 +msgid "choose password" +msgstr "ÅŸifre seçin" + +#: forum/utils/forms.py:141 +msgid "password is required" +msgstr "ÅŸifre yazmalısınız." + +#: forum/utils/forms.py:144 +#, fuzzy +msgid "retype password" +msgstr "Password (please retype)ÅŸifreyi yeniden yazın" + +#: forum/utils/forms.py:145 +msgid "please, retype your password" +msgstr "lütfen ÅŸifrenizi yeniden yazın" + +#: forum/utils/forms.py:146 +msgid "sorry, entered passwords did not match, please try again" +msgstr "Ãœzgünüm, ÅŸifreler uyuÅŸmuyor lütfen tekrar deneyin." + +#: forum/views/commands.py:209 +#, python-format +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "" +"Your subscription is saved, but email address %(email)s needs to be " +"validated, please see more details hereaboneliÄŸiniz kaydedildi %(email)s adresindeki doÄŸrulama linkini " +"tıklamalısınız. Ayrıntılar için: %(details_url)s" + +#: forum/views/commands.py:217 +msgid "email update frequency has been set to daily" +msgstr "E-mail güncelleme sıklığı günlük olarak belirtilmiÅŸtir." + +#: forum/views/meta.py:35 +msgid "Q&A forum feedback" +msgstr "Sorucevap.de geribildirim" + +#: forum/views/meta.py:36 +msgid "Thanks for the feedback!" +msgstr "Görüşleriniz için teÅŸekkür ederiz!" + +#: forum/views/meta.py:44 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "" +"Görüşlerinizi bekliyoruz! Lütfen bize, yakın bir zamanda mutlaka sitemiz " +"hakkındaki görüşlerinizi bildirin :)" + +#: forum/views/users.py:867 forum/views/users.py:871 +msgid "changes saved" +msgstr "deÄŸiÅŸiklikler kaydedildi" + +#: forum/views/users.py:877 +msgid "email updates canceled" +msgstr "E-mail güncellemeleri iptal edildi" + +#: forum/views/users.py:908 +msgid "user profile" +msgstr "kullanıcı profili" + +#: forum/views/users.py:909 +msgid "user profile overview" +msgstr "kullanıcı profiline genel bakış" + +#: forum/views/users.py:916 +msgid "recent user activity" +msgstr "son kullanıcı etkinliÄŸi" + +#: forum/views/users.py:917 +msgid "profile - recent activity" +msgstr "profil - son etkinlikler" + +#: forum/views/users.py:926 +msgid "profile - responses" +msgstr "profil - cevapları" + +#: forum/views/users.py:934 +#, fuzzy +msgid "user reputation in the community" +msgstr "user karmasitemizde kullanıcının itibarı" + +#: forum/views/users.py:935 +#, fuzzy +msgid "profile - user reputation" +msgstr "Profile - User's Karmaprofil - kullanıcı itibarı" + +#: forum/views/users.py:941 +msgid "favorite questions" +msgstr "favori sorular" + +#: forum/views/users.py:942 +msgid "users favorite questions" +msgstr "kullanıcının favori soruları" + +#: forum/views/users.py:943 +msgid "profile - favorite questions" +msgstr "profil - favori sorular" + +#: forum/views/users.py:952 +msgid "profile - votes" +msgstr "profil - oy" + +#: forum/views/users.py:961 +msgid "profile - email subscriptions" +msgstr "profil - e-mail abonelikleri" + +#: forum/views/writers.py:70 +msgid "uploading images is limited to users with >60 reputation points" +msgstr "resim göndermek için en az 60 puan toplamalısınız" + +#: forum/views/writers.py:72 +msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" +msgstr "izin verilen dosya türleri ''jpeg, jpg, gif, bmp, tif, png''" + +#: forum/views/writers.py:74 +#, python-format +msgid "maximum upload file size is %sK" +msgstr "maksimum dosya yükleme boyutu %s Kb" + +#: forum/views/writers.py:76 +#, python-format +msgid "" +"Error uploading file. Please contact the site administrator. Thank you. %s" +msgstr "" +"Yükleme dosyası hatası! Lütfen site yöneticisi ile iletiÅŸime geçin. TeÅŸekkür " +"ederiz. %s" + +#: forum_modules/authentication/auth.py:27 +msgid "Email Validation" +msgstr "E-mail doÄŸrulama" + +#: forum_modules/authentication/auth.py:38 +msgid "Thank you, your email is now validated." +msgstr "E-mail adresinizi doÄŸruladığınız için teÅŸekkür ederiz." + +#: forum_modules/authentication/auth.py:62 +msgid "Your password was changed" +msgstr "Åžifreniz deÄŸiÅŸtirildi" + +#: forum_modules/authentication/auth.py:64 +msgid "New password set" +msgstr "Yeni ÅŸifre ayarla" + +#: forum_modules/authentication/auth.py:130 +#, python-format +msgid "Welcome back %s, you are now logged in" +msgstr "HoÅŸgeldin %s, seni yeniden burada görmek güzel..." + +#: forum_modules/books/urls.py:7 forum_modules/books/urls.py:8 +#: forum_modules/books/urls.py:9 +msgid "books/" +msgstr "kitaplar/" + +#, fuzzy +#~ msgid "please login" +#~ msgstr "Kullanıcı giriÅŸi" + +#~ msgid " One question found" +#~ msgid_plural "%(q_num)s questions found" +#~ msgstr[0] "1 cevap bulundu." +#~ msgstr[1] "%(q_num)s cevap bulundu." + +#, fuzzy +#~ msgid "one revision" +#~ msgid_plural "%(rev_count)s revisions" +#~ msgstr[0] "one revision" +#~ msgstr[1] "%(rev_count)s kez düzenlendi" + +#~ msgid "account_settings" +#~ msgstr "hesap ayarları" + +#~ msgid "The users have been awarded with badges:" +#~ msgstr "Kullanıcıya verilen madalya:" + +#~ msgid "" +#~ "\n" +#~ " 1 Question\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " %(counter)s Questions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "1 Soru" +#~ msgstr[1] "" +#~ "\n" +#~ "%(counter)s Soru" + +#~ msgid "" +#~ "\n" +#~ " 1 Answer\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " %(counter)s Answers\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "1 Cevap" +#~ msgstr[1] "" +#~ "\n" +#~ "%(counter)s Cevap" + +#~ msgid "" +#~ "\n" +#~ " 1 Vote\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " %(cnt)s Votes\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "1 oy" +#~ msgstr[1] "" +#~ "\n" +#~ "%(cnt)s oy" + +#~ msgid "" +#~ "\n" +#~ " 1 Badge\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " %(counter)s Badges\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "1 Madalya" +#~ msgstr[1] "" +#~ "\n" +#~ "%(counter)s Madalya" + +#~ msgid "" +#~ "\n" +#~ " see one " +#~ "more \n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " see %(counter)s more\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "diÄŸer bir tanesine bak" +#~ msgstr[1] "" +#~ "\n" +#~ "%(counter)s daha var" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " see one more " +#~ "comment\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " see %(counter)s more comments\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "bir yorum daha gör\n" +#~ msgstr[1] "diÄŸer %(counter)s yorumu gör" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " see one more \n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " see %" +#~ "(counter)s more\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "bir tane daha gör\n" +#~ msgstr[1] "%(counter)s tane daha gör" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " see one more comment\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " see %" +#~ "(counter)s more comments\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "bir yorum daha gör\n" +#~ msgstr[1] "%(counter)s yorum daha gör" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " (one comment)\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " the answer has been commented %(comment_count)s " +#~ "times\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "(bir kez yorum yazıldı)\n" +#~ msgstr[1] "Cevap %(comment_count)s kez yorumlandı" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " 1 Tag\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " %(counter)s Tags\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "1 Etiket\n" +#~ msgstr[1] "%(counter)s Etiket" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ " one revision\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " %(rev_count)s revisions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "bir kez düzenlendi\n" +#~ msgstr[1] "%(rev_count)s kez düzenlendi" diff --git a/askbot/locale/vi/LC_MESSAGES/django.mo b/askbot/locale/vi/LC_MESSAGES/django.mo new file mode 100644 index 00000000..67785c70 Binary files /dev/null and b/askbot/locale/vi/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/vi/LC_MESSAGES/django.po b/askbot/locale/vi/LC_MESSAGES/django.po new file mode 100644 index 00000000..0c8cb9af --- /dev/null +++ b/askbot/locale/vi/LC_MESSAGES/django.po @@ -0,0 +1,4134 @@ +# Vietnamese translation for Askbot package +# Copyright (C) 2010 Askbot, 2009 Gang Chen +# This file is distributed under the same license as the Askbot package. +# Cong It , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-09 19:43-0400\n" +"PO-Revision-Date: 2010-05-09 07:03\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.5.3\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: django_authopenid/forms.py:71 django_authopenid/views.py:132 +#, fuzzy +msgid "i-names are not supported" +msgstr "i-names không được há»— trợ" + +#: django_authopenid/forms.py:134 +msgid "Account with this name already exists on the forum" +msgstr "Tài khoản vá»›i tên này đã tồn tại trên diá»…n đàn" + +#: django_authopenid/forms.py:135 +msgid "can't have two logins to the same account yet, sorry." +msgstr "" +"không thể có hai lần đăng nhập vào cùng má»™t tài khoản nào được nêu ra, xin " +"lá»—i." + +#: django_authopenid/forms.py:157 +msgid "Please enter valid username and password (both are case-sensitive)." +msgstr "Vui lòng nhập tên đăng nhập và mật khẩu hợp lệ (phân biệt HOA-thÆ°á»ng)." + +#: django_authopenid/forms.py:160 django_authopenid/forms.py:210 +msgid "This account is inactive." +msgstr "Tài khoản này không hoạt Ä‘á»™ng" + +#: django_authopenid/forms.py:162 +msgid "Login failed." +msgstr "Äăng nhập không thành công." + +#: django_authopenid/forms.py:164 +msgid "Please enter username and password" +msgstr "Vui lòng nhập tên và mật khẩu" + +#: django_authopenid/forms.py:166 +msgid "Please enter your password" +msgstr "" + +#: django_authopenid/forms.py:168 +msgid "Please enter user name" +msgstr "" + +#: django_authopenid/forms.py:206 +msgid "" +"Please enter a valid username and password. Note that " +"both fields are case-sensitive." +msgstr "" + +#: django_authopenid/forms.py:229 +msgid "Current password" +msgstr "" + +#: django_authopenid/forms.py:240 +msgid "" +"Old password is incorrect. Please enter the correct " +"password." +msgstr "" + +#: django_authopenid/forms.py:305 +msgid "Your user name (required)" +msgstr "" + +#: django_authopenid/forms.py:320 +msgid "Incorrect username." +msgstr "sorry, there is no such user name" + +#: django_authopenid/urls.py:23 django_authopenid/urls.py:24 +#: django_authopenid/urls.py:25 django_authopenid/urls.py:27 +#: fbconnect/urls.py:12 fbconnect/urls.py:13 fbconnect/urls.py:14 +msgid "signin/" +msgstr "" + +#: django_authopenid/urls.py:24 fbconnect/urls.py:13 fbconnect/urls.py:17 +msgid "newquestion/" +msgstr "" + +#: django_authopenid/urls.py:25 fbconnect/urls.py:14 fbconnect/urls.py:18 +msgid "newanswer/" +msgstr "" + +#: django_authopenid/urls.py:26 +msgid "signout/" +msgstr "" + +#: django_authopenid/urls.py:27 +msgid "complete/" +msgstr "" + +#: django_authopenid/urls.py:29 fbconnect/urls.py:16 fbconnect/urls.py:17 +#: fbconnect/urls.py:18 +msgid "register/" +msgstr "" + +#: django_authopenid/urls.py:30 +msgid "signup/" +msgstr "" + +#: django_authopenid/urls.py:32 +msgid "sendpw/" +msgstr "" + +#: django_authopenid/urls.py:33 django_authopenid/urls.py:37 +msgid "password/" +msgstr "" + +#: django_authopenid/urls.py:33 +msgid "confirm/" +msgstr "" + +#: django_authopenid/urls.py:38 django_authopenid/urls.py:39 +#: django_authopenid/urls.py:40 django_authopenid/urls.py:41 +msgid "email/" +msgstr "" + +#: django_authopenid/urls.py:38 +msgid "validate/" +msgstr "" + +#: django_authopenid/urls.py:39 +msgid "change/" +msgstr "" + +#: django_authopenid/urls.py:40 +msgid "sendkey/" +msgstr "" + +#: django_authopenid/urls.py:41 +msgid "verify/" +msgstr "" + +#: django_authopenid/urls.py:42 +msgid "openid/" +msgstr "" + +#: django_authopenid/urls.py:43 forum/urls.py:52 forum/urls.py:56 +msgid "delete/" +msgstr "" + +#: django_authopenid/urls.py:51 +msgid "external-login/forgot-password/" +msgstr "" + +#: django_authopenid/urls.py:54 +msgid "external-login/signup/" +msgstr "" + +#: django_authopenid/views.py:139 +#, python-format +msgid "OpenID %(openid_url)s is invalid" +msgstr "" + +#: django_authopenid/views.py:614 +msgid "Welcome email subject line" +msgstr "Welcome to the Q&A forum" + +#: django_authopenid/views.py:720 +msgid "Password changed." +msgstr "" + +#: django_authopenid/views.py:732 django_authopenid/views.py:738 +#, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" +"Your email needs to be validated. Please see details here." + +#: django_authopenid/views.py:759 +msgid "Email verification subject line" +msgstr "Verification Email from Q&A forum" + +#: django_authopenid/views.py:850 +msgid "your email was not changed" +msgstr "" + +#: django_authopenid/views.py:898 django_authopenid/views.py:1056 +#, python-format +msgid "No OpenID %s found associated in our database" +msgstr "" + +#: django_authopenid/views.py:902 django_authopenid/views.py:1063 +#, python-format +msgid "The OpenID %s isn't associated to current user logged in" +msgstr "" + +#: django_authopenid/views.py:910 +msgid "Email Changed." +msgstr "" + +#: django_authopenid/views.py:988 +msgid "This OpenID is already associated with another account." +msgstr "" + +#: django_authopenid/views.py:993 +#, python-format +msgid "OpenID %s is now associated with your account." +msgstr "" + +#: django_authopenid/views.py:1066 +msgid "Account deleted." +msgstr "" + +#: django_authopenid/views.py:1118 +msgid "Request for new password" +msgstr "" + +#: django_authopenid/views.py:1132 +msgid "A new password and the activation link were sent to your email address." +msgstr "" + +#: django_authopenid/views.py:1164 +#, python-format +msgid "" +"Could not change password. Confirmation key '%s' is not " +"registered." +msgstr "" + +#: django_authopenid/views.py:1174 +msgid "" +"Can not change password. User don't exist anymore in our " +"database." +msgstr "" + +#: django_authopenid/views.py:1184 +#, python-format +msgid "Password changed for %s. You may now sign in." +msgstr "" + +#: forum/auth.py:505 +msgid "Your question and all of it's answers have been deleted" +msgstr "" + +#: forum/auth.py:507 +msgid "Your question has been deleted" +msgstr "" + +#: forum/auth.py:510 +msgid "The question and all of it's answers have been deleted" +msgstr "" + +#: forum/auth.py:512 +msgid "The question has been deleted" +msgstr "" + +#: forum/const.py:8 +msgid "duplicate question" +msgstr "" + +#: forum/const.py:9 +msgid "question is off-topic or not relevant" +msgstr "" + +#: forum/const.py:10 +msgid "too subjective and argumentative" +msgstr "" + +#: forum/const.py:11 +msgid "not a real question" +msgstr "" + +#: forum/const.py:12 +msgid "the question is answered, right answer was accepted" +msgstr "" + +#: forum/const.py:13 +msgid "question is not relevant or outdated" +msgstr "" + +#: forum/const.py:14 +msgid "question contains offensive or malicious remarks" +msgstr "" + +#: forum/const.py:15 +msgid "spam or advertising" +msgstr "" + +#: forum/const.py:16 +msgid "too localized" +msgstr "" + +#: forum/const.py:37 forum/skins/default/templates/questions.html:70 +#: forum/skins/default/templates/questions.html:75 +msgid "newest" +msgstr "" + +#: forum/const.py:38 forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/users.html:28 +msgid "oldest" +msgstr "" + +#: forum/const.py:39 forum/skins/default/templates/questions.html:89 +#: forum/skins/default/templates/questions.html:94 +msgid "active" +msgstr "" + +#: forum/const.py:40 forum/skins/default/templates/questions.html:83 +msgid "inactive" +msgstr "" + +#: forum/const.py:41 +msgid "hottest" +msgstr "" + +#: forum/const.py:42 +msgid "coldest" +msgstr "" + +#: forum/const.py:43 +msgid "most voted" +msgstr "" + +#: forum/const.py:44 +msgid "least voted" +msgstr "" + +#: forum/const.py:45 +msgid "relevance" +msgstr "" + +#: forum/const.py:52 forum/skins/default/templates/questions.html:52 +msgid "all" +msgstr "" + +#: forum/const.py:53 forum/skins/default/templates/questions.html:53 +msgid "unanswered" +msgstr "" + +#: forum/const.py:54 forum/skins/default/templates/questions.html:55 +msgid "favorite" +msgstr "" + +#: forum/const.py:97 +msgid "question" +msgstr "" + +#: forum/const.py:98 forum/skins/default/templates/book.html:110 +msgid "answer" +msgstr "" + +#: forum/const.py:99 +msgid "commented question" +msgstr "" + +#: forum/const.py:100 +msgid "commented answer" +msgstr "" + +#: forum/const.py:101 +msgid "edited question" +msgstr "" + +#: forum/const.py:102 +msgid "edited answer" +msgstr "" + +#: forum/const.py:103 +msgid "received award" +msgstr "received badge" + +#: forum/const.py:104 +msgid "marked best answer" +msgstr "" + +#: forum/const.py:105 +msgid "upvoted" +msgstr "" + +#: forum/const.py:106 +msgid "downvoted" +msgstr "" + +#: forum/const.py:107 +msgid "canceled vote" +msgstr "" + +#: forum/const.py:108 +msgid "deleted question" +msgstr "" + +#: forum/const.py:109 +msgid "deleted answer" +msgstr "" + +#: forum/const.py:110 +msgid "marked offensive" +msgstr "" + +#: forum/const.py:111 +msgid "updated tags" +msgstr "" + +#: forum/const.py:112 +msgid "selected favorite" +msgstr "" + +#: forum/const.py:113 +msgid "completed user profile" +msgstr "" + +#: forum/const.py:114 +msgid "email update sent to user" +msgstr "" + +#: forum/const.py:118 +msgid "question_answered" +msgstr "answered question" + +#: forum/const.py:119 +msgid "question_commented" +msgstr "commented question" + +#: forum/const.py:120 +msgid "answer_commented" +msgstr "" + +#: forum/const.py:121 +msgid "answer_accepted" +msgstr "" + +#: forum/const.py:125 +msgid "[closed]" +msgstr "" + +#: forum/const.py:126 +msgid "[deleted]" +msgstr "" + +#: forum/const.py:127 forum/views/readers.py:396 forum/views/readers.py:417 +msgid "initial version" +msgstr "" + +#: forum/const.py:128 +msgid "retagged" +msgstr "" + +#: forum/const.py:132 +msgid "exclude ignored tags" +msgstr "" + +#: forum/const.py:132 +msgid "allow only selected tags" +msgstr "" + +#: forum/feed.py:18 +msgid " - " +msgstr "" + +#: forum/feed.py:18 +msgid "latest questions" +msgstr "" + +#: forum/forms.py:23 forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "title" +msgstr "" + +#: forum/forms.py:24 +msgid "please enter a descriptive title for your question" +msgstr "" + +#: forum/forms.py:29 +msgid "title must be > 10 characters" +msgstr "" + +#: forum/forms.py:38 +msgid "content" +msgstr "" + +#: forum/forms.py:44 +msgid "question content must be > 10 characters" +msgstr "" + +#: forum/forms.py:53 forum/skins/default/templates/header.html:28 +msgid "tags" +msgstr "" + +#: forum/forms.py:55 +msgid "" +"Tags are short keywords, with no spaces within. Up to five tags can be used." +msgstr "" + +#: forum/forms.py:62 forum/skins/default/templates/question_retag.html:39 +msgid "tags are required" +msgstr "" + +#: forum/forms.py:70 +#, python-format +msgid "please use %(tag_count)d tag or less" +msgid_plural "please use %(tag_count)d tags or less" +msgstr[0] "" +msgstr[1] "" + +#: forum/forms.py:79 +#, python-format +msgid "each tag must be shorter than %(max_chars)d character" +msgid_plural "each tag must be shorter than %(max_chars)d characters" +msgstr[0] "" +msgstr[1] "" + +#: forum/forms.py:87 +msgid "use-these-chars-in-tags" +msgstr "" + +#: forum/forms.py:97 +#: forum/skins/default/templates/post_contributor_info.html:7 +#: forum/skins/default/templates/question_summary_list_roll.html:26 +#: forum/skins/default/templates/question_summary_list_roll.html:38 +msgid "community wiki" +msgstr "" + +#: forum/forms.py:98 +msgid "" +"if you choose community wiki option, the question and answer do not generate " +"points and name of author will not be shown" +msgstr "" + +#: forum/forms.py:114 +msgid "update summary:" +msgstr "" + +#: forum/forms.py:115 +msgid "" +"enter a brief summary of your revision (e.g. fixed spelling, grammar, " +"improved style, this field is optional)" +msgstr "" + +#: forum/forms.py:118 +msgid "Automatically accept user's contributions for the email updates" +msgstr "" + +#: forum/forms.py:209 +msgid "Your name:" +msgstr "" + +#: forum/forms.py:210 +msgid "Email (not shared with anyone):" +msgstr "" + +#: forum/forms.py:211 +msgid "Your message:" +msgstr "" + +#: forum/forms.py:294 +msgid "this email does not have to be linked to gravatar" +msgstr "" + +#: forum/forms.py:296 +msgid "Screen name" +msgstr "" + +#: forum/forms.py:297 +msgid "Real name" +msgstr "" + +#: forum/forms.py:298 +msgid "Website" +msgstr "" + +#: forum/forms.py:299 +msgid "Location" +msgstr "" + +#: forum/forms.py:300 +msgid "Date of birth" +msgstr "" + +#: forum/forms.py:300 +msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" +msgstr "" + +#: forum/forms.py:301 forum/skins/default/templates/account_settings.html:21 +#: forum/skins/default/templates/authopenid/settings.html:21 +msgid "Profile" +msgstr "" + +#: forum/forms.py:332 forum/forms.py:333 +msgid "this email has already been registered, please use another one" +msgstr "" + +#: forum/forms.py:339 +msgid "Choose email tag filter" +msgstr "" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "weekly" +msgstr "" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "no email" +msgstr "" + +#: forum/forms.py:356 +msgid "daily" +msgstr "" + +#: forum/forms.py:371 +msgid "Asked by me" +msgstr "" + +#: forum/forms.py:374 +msgid "Answered by me" +msgstr "" + +#: forum/forms.py:377 +msgid "Individually selected" +msgstr "" + +#: forum/forms.py:380 +msgid "Entire forum (tag filtered)" +msgstr "" + +#: forum/forms.py:434 +msgid "okay, let's try!" +msgstr "" + +#: forum/forms.py:435 +msgid "no community email please, thanks" +msgstr "no askbot email please, thanks" + +#: forum/forms.py:438 +msgid "please choose one of the options above" +msgstr "" + +#: forum/urls.py:28 +msgid "upfiles/" +msgstr "" + +#: forum/urls.py:33 +msgid "about/" +msgstr "" + +#: forum/urls.py:34 +msgid "faq/" +msgstr "" + +#: forum/urls.py:35 +msgid "privacy/" +msgstr "" + +#: forum/urls.py:36 +msgid "logout/" +msgstr "" + +#: forum/urls.py:37 forum/urls.py:38 forum/urls.py:39 forum/urls.py:56 +msgid "answers/" +msgstr "" + +#: forum/urls.py:37 forum/urls.py:49 forum/urls.py:52 forum/urls.py:56 +msgid "comments/" +msgstr "" + +#: forum/urls.py:38 forum/urls.py:43 forum/urls.py:78 +#: forum/skins/default/templates/user_info.html:47 +msgid "edit/" +msgstr "" + +#: forum/urls.py:39 forum/urls.py:48 +msgid "revisions/" +msgstr "" + +#: forum/urls.py:40 forum/urls.py:41 forum/urls.py:42 forum/urls.py:43 +#: forum/urls.py:44 forum/urls.py:45 forum/urls.py:46 forum/urls.py:47 +#: forum/urls.py:48 forum/urls.py:49 forum/urls.py:52 +msgid "questions/" +msgstr "" + +#: forum/urls.py:41 forum_modules/books/urls.py:8 +msgid "ask/" +msgstr "" + +#: forum/urls.py:42 +msgid "unanswered/" +msgstr "" + +#: forum/urls.py:44 +msgid "close/" +msgstr "" + +#: forum/urls.py:45 +msgid "reopen/" +msgstr "" + +#: forum/urls.py:46 +msgid "answer/" +msgstr "" + +#: forum/urls.py:47 +msgid "vote/" +msgstr "" + +#: forum/urls.py:50 +msgid "command/" +msgstr "" + +#: forum/urls.py:60 forum/views/readers.py:265 +msgid "question/" +msgstr "" + +#: forum/urls.py:61 forum/urls.py:62 +msgid "tags/" +msgstr "" + +#: forum/urls.py:64 forum/urls.py:68 +msgid "mark-tag/" +msgstr "" + +#: forum/urls.py:64 +msgid "interesting/" +msgstr "" + +#: forum/urls.py:68 +msgid "ignored/" +msgstr "" + +#: forum/urls.py:72 +msgid "unmark-tag/" +msgstr "" + +#: forum/urls.py:76 forum/urls.py:78 forum/urls.py:79 +msgid "users/" +msgstr "" + +#: forum/urls.py:77 +msgid "moderate-user/" +msgstr "" + +#: forum/urls.py:80 forum/urls.py:81 +msgid "badges/" +msgstr "" + +#: forum/urls.py:82 +msgid "messages/" +msgstr "" + +#: forum/urls.py:82 +msgid "markread/" +msgstr "" + +#: forum/urls.py:84 +msgid "nimda/" +msgstr "" + +#: forum/urls.py:86 +msgid "upload/" +msgstr "" + +#: forum/urls.py:87 +msgid "search/" +msgstr "" + +#: forum/urls.py:88 +msgid "feedback/" +msgstr "" + +#: forum/urls.py:89 forum/urls.py:90 +#, fuzzy +msgid "account/" +msgstr "Signup" + +#: forum/importers/stackexchange/management/commands/load_stackexchange.py:124 +msgid "Congratulations, you are now an Administrator" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:236 +msgid "email update message subject" +msgstr "news from Q&A forum" + +#: forum/management/commands/send_email_alerts.py:238 +#, fuzzy, python-format +msgid "%(name)s, this is an update message header for %(num)d question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "" +"

Dear %(name)s,

The following question has been updated on the Q&A " +"forum:

" +msgstr[1] "" +"

Dear %(name)s,

The following %(num)d questions have been updated on " +"the Q&A forum:

" + +#: forum/management/commands/send_email_alerts.py:255 +msgid "new question" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:272 +msgid "" +"Please visit the forum and see what's new! Could you spread the word about " +"it - can somebody you know help answering those questions or benefit from " +"posting one?" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:284 +msgid "" +"Your most frequent subscription setting is 'daily' on selected questions. If " +"you are receiving more than one email per dayplease tell about this issue to " +"the forum administrator." +msgstr "" + +#: forum/management/commands/send_email_alerts.py:290 +msgid "" +"Your most frequent subscription setting is 'weekly' if you are receiving " +"this email more than once a week please report this issue to the forum " +"administrator." +msgstr "" + +#: forum/management/commands/send_email_alerts.py:296 +msgid "" +"There is a chance that you may be receiving links seen before - due to a " +"technicality that will eventually go away. " +msgstr "" + +#: forum/management/commands/send_email_alerts.py:311 +#, python-format +msgid "" +"go to %(link)s to change frequency of email updates or %(email)s " +"administrator" +msgstr "" +"

Please remember that you can always adjust " +"frequency of the email updates or turn them off entirely.
If you believe " +"that this message was sent in an error, please email about it the forum " +"administrator at %(email)s.

Sincerely,

Your friendly Q&A forum " +"server.

" + +#: forum/middleware/anon_user.py:34 +#, python-format +msgid "First time here? Check out the FAQ!" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Deleted own post with score of 3 or higher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Peer Pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "peer-pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Deleted own post with score of -3 or lower" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Nice answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +msgid "nice-answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +msgid "Answer voted up 10 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Nice Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "nice-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:13 +msgid "Question voted up 10 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Pundit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "pundit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Left 10 comments with score of 10 or more" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Popular Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "popular-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Asked a question with 1,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "Citizen patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "citizen-patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "First flagged post" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "Cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "First rollback" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "Critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "First down vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "Editor" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "editor" +msgstr "" + +#: forum/migrations/0005_install_badges.py:19 +msgid "First edit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "Organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "First retag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "Scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "First accepted answer on your own question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Asked first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "Supporter" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "supporter" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +msgid "First up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Teacher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "teacher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Answered first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Completed all user profile fields" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Self-Learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "self-learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Answered your own question with at least 3 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Great Answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "great-answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +msgid "Answer voted up 100 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Great Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "great-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:28 +msgid "Question voted up 100 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Stellar Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "stellar-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Question favorited by 100 users" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Famous question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "famous-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Asked a question with 10,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Actively participated in the private alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Good Answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "good-answer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +msgid "Answer voted up 25 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Good Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "good-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:33 +msgid "Question voted up 25 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Favorite Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "favorite-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Question favorited by 25 users" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Civic duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "civic-duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Voted 300 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Strunk & White" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "strunk-and-white" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Edited 100 entries" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Active in many different tags" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Expert" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "expert" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Very active in one tag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Active member for a year" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Notable Question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "notable-question" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Asked a question with 2,500 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "Enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "First answer was accepted with at least 10 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Actively participated in the private beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Accepted answer and voted up 40 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Answered a question more than 60 days later with at least 5 votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Created a tag used by 50 questions" +msgstr "" + +#: forum/models/question.py:499 +#, python-format +msgid "%(author)s modified the question" +msgstr "" + +#: forum/models/question.py:503 +#, python-format +msgid "%(people)s posted %(new_answer_count)s new answers" +msgstr "" + +#: forum/models/question.py:508 +#, python-format +msgid "%(people)s commented the question" +msgstr "" + +#: forum/models/question.py:513 +#, python-format +msgid "%(people)s commented answers" +msgstr "" + +#: forum/models/question.py:515 +#, python-format +msgid "%(people)s commented an answer" +msgstr "" + +#: forum/models/repute.py:13 forum/skins/default/templates/badges.html:54 +msgid "gold" +msgstr "" + +#: forum/models/repute.py:14 forum/skins/default/templates/badges.html:62 +msgid "silver" +msgstr "" + +#: forum/models/repute.py:15 forum/skins/default/templates/badges.html:69 +msgid "bronze" +msgstr "" + +#: forum/models/tag.py:81 +msgid "interesting" +msgstr "" + +#: forum/models/tag.py:81 +msgid "ignored" +msgstr "" + +#: forum/models/user.py:36 +msgid "Entire forum" +msgstr "" + +#: forum/models/user.py:37 +msgid "Questions that I asked" +msgstr "" + +#: forum/models/user.py:38 +msgid "Questions that I answered" +msgstr "" + +#: forum/models/user.py:39 +msgid "Individually selected questions" +msgstr "" + +#: forum/models/user.py:42 +msgid "Weekly" +msgstr "" + +#: forum/models/user.py:43 +msgid "Daily" +msgstr "" + +#: forum/models/user.py:44 +msgid "No email" +msgstr "" + +#: forum/skins/default/templates/404.html:24 +msgid "Sorry, could not find the page you requested." +msgstr "" + +#: forum/skins/default/templates/404.html:26 +msgid "This might have happened for the following reasons:" +msgstr "" + +#: forum/skins/default/templates/404.html:28 +msgid "this question or answer has been deleted;" +msgstr "" + +#: forum/skins/default/templates/404.html:29 +msgid "url has error - please check it;" +msgstr "" + +#: forum/skins/default/templates/404.html:30 +msgid "" +"the page you tried to visit is protected or you don't have sufficient " +"points, see" +msgstr "" + +#: forum/skins/default/templates/404.html:31 +msgid "if you believe this error 404 should not have occured, please" +msgstr "" + +#: forum/skins/default/templates/404.html:32 +msgid "report this problem" +msgstr "" + +#: forum/skins/default/templates/404.html:41 +#: forum/skins/default/templates/500.html:27 +msgid "back to previous page" +msgstr "" + +#: forum/skins/default/templates/404.html:42 +#: forum/skins/default/templates/questions.html:52 +msgid "see all questions" +msgstr "" + +#: forum/skins/default/templates/404.html:43 +msgid "see all tags" +msgstr "" + +#: forum/skins/default/templates/500.html:22 +msgid "sorry, system error" +msgstr "" + +#: forum/skins/default/templates/500.html:24 +msgid "system error log is recorded, error will be fixed as soon as possible" +msgstr "" + +#: forum/skins/default/templates/500.html:25 +msgid "please report the error to the site administrators if you wish" +msgstr "" + +#: forum/skins/default/templates/500.html:28 +msgid "see latest questions" +msgstr "" + +#: forum/skins/default/templates/500.html:29 +msgid "see tags" +msgstr "" + +#: forum/skins/default/templates/about.html:6 +#: forum/skins/default/templates/about.html:11 +msgid "About" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:4 +#: forum/skins/default/templates/authopenid/settings.html:4 +msgid "Account functions" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:29 +#: forum/skins/default/templates/authopenid/changepw.html:5 +#: forum/skins/default/templates/authopenid/changepw.html:14 +#: forum/skins/default/templates/authopenid/settings.html:29 +msgid "Change password" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:30 +#: forum/skins/default/templates/authopenid/settings.html:30 +msgid "Give your account a new password." +msgstr "" + +#: forum/skins/default/templates/account_settings.html:32 +#: forum/skins/default/templates/authopenid/settings.html:31 +msgid "Change email " +msgstr "" + +#: forum/skins/default/templates/account_settings.html:33 +#: forum/skins/default/templates/authopenid/settings.html:32 +msgid "Add or update the email address associated with your account." +msgstr "" + +#: forum/skins/default/templates/account_settings.html:35 +#: forum/skins/default/templates/authopenid/changeopenid.html:4 +#: forum/skins/default/templates/authopenid/changeopenid.html:30 +#: forum/skins/default/templates/authopenid/settings.html:34 +msgid "Change OpenID" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:36 +#: forum/skins/default/templates/authopenid/settings.html:35 +msgid "Change openid associated to your account" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:39 +#: forum/skins/default/templates/authopenid/delete.html:4 +#: forum/skins/default/templates/authopenid/settings.html:38 +msgid "Delete account" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:40 +#: forum/skins/default/templates/authopenid/settings.html:39 +msgid "Erase your username and all your data from website" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:5 +#: forum/skins/default/templates/answer_edit.html:48 +msgid "Edit answer" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:25 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:26 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:46 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:25 +#: forum/skins/default/templates/question_edit.html:28 +msgid "hide preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:28 +msgid "show preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:48 +#: forum/skins/default/templates/question_edit.html:66 +#: forum/skins/default/templates/question_retag.html:53 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "back" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:53 +#: forum/skins/default/templates/question_edit.html:71 +#: forum/skins/default/templates/revisions_answer.html:52 +#: forum/skins/default/templates/revisions_question.html:52 +msgid "revision" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:56 +#: forum/skins/default/templates/question_edit.html:75 +msgid "select revision" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:418 +#: forum/skins/default/templates/question_edit.html:92 +msgid "Toggle the real time Markdown editor preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:419 +#: forum/skins/default/templates/question_edit.html:92 +msgid "toggle preview" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:72 +#: forum/skins/default/templates/question_edit.html:118 +#: forum/skins/default/templates/question_retag.html:74 +msgid "Save edit" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:73 +#: forum/skins/default/templates/close.html:29 +#: forum/skins/default/templates/feedback.html:50 +#: forum/skins/default/templates/question_edit.html:119 +#: forum/skins/default/templates/question_retag.html:75 +#: forum/skins/default/templates/reopen.html:30 +#: forum/skins/default/templates/user_edit.html:90 +#: forum/skins/default/templates/authopenid/changeemail.html:40 +msgid "Cancel" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:4 +msgid "answer tips" +msgstr "Tips" + +#: forum/skins/default/templates/answer_edit_tips.html:7 +msgid "please make your answer relevant to this community" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:10 +msgid "try to give an answer, rather than engage into a discussion" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:13 +msgid "please try to provide details" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:16 +#: forum/skins/default/templates/question_edit_tips.html:13 +msgid "be clear and concise" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:20 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "see frequently asked questions" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:26 +#: forum/skins/default/templates/question_edit_tips.html:23 +msgid "Markdown tips" +msgstr "Markdown basics" + +#: forum/skins/default/templates/answer_edit_tips.html:29 +#: forum/skins/default/templates/question_edit_tips.html:26 +msgid "*italic* or __italic__" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:29 +msgid "**bold** or __bold__" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/question_edit_tips.html:32 +msgid "link" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "text" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "image" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:43 +#: forum/skins/default/templates/question_edit_tips.html:41 +msgid "numbered list:" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:48 +#: forum/skins/default/templates/question_edit_tips.html:46 +msgid "basic HTML tags are also supported" +msgstr "" + +#: forum/skins/default/templates/answer_edit_tips.html:52 +#: forum/skins/default/templates/question_edit_tips.html:50 +msgid "learn more about Markdown" +msgstr "" + +#: forum/skins/default/templates/ask.html:5 +#: forum/skins/default/templates/ask.html:62 +msgid "Ask a question" +msgstr "" + +#: forum/skins/default/templates/ask.html:69 +#: forum/skins/default/templates/ask_form.html:11 +msgid "login to post question info" +msgstr "" +"You are welcome to start submitting your question " +"anonymously. When you submit the post, you will be redirected to the " +"login/signup page. Your question will be saved in the current session and " +"will be published after you log in. Login/signup process is very simple. " +"Login takes about 30 seconds, initial signup takes a minute or less." + +#: forum/skins/default/templates/ask.html:75 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Looks like your email address, %(email)s has not " +"yet been validated. To post messages you must verify your email, " +"please see more details here." +"
You can submit your question now and validate email after that. Your " +"question will saved as pending meanwhile. " + +#: forum/skins/default/templates/ask.html:113 +#: forum/skins/default/templates/ask_form.html:54 +msgid "(required)" +msgstr "" + +#: forum/skins/default/templates/ask.html:120 +#: forum/skins/default/templates/ask_form.html:61 +msgid "Login/signup to post your question" +msgstr "Login/Signup to Post" + +#: forum/skins/default/templates/ask.html:122 +#: forum/skins/default/templates/ask_form.html:63 +msgid "Ask your question" +msgstr "Ask Your Question" + +#: forum/skins/default/templates/ask_form.html:15 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" +"Looks like your email address, %(email)s has not " +"yet been validated. To post messages you must verify your email, " +"please see more details here." +"
You can submit your question now and validate email after that. Your " +"question will saved as pending meanwhile. " + +#: forum/skins/default/templates/badge.html:6 +#: forum/skins/default/templates/badge.html:17 +msgid "Badge" +msgstr "" + +#: forum/skins/default/templates/badge.html:26 +msgid "user received this badge:" +msgid_plural "users received this badge:" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/badges.html:6 +msgid "Badges summary" +msgstr "" + +#: forum/skins/default/templates/badges.html:17 +msgid "Badges" +msgstr "" + +#: forum/skins/default/templates/badges.html:21 +msgid "Community gives you awards for your questions, answers and votes." +msgstr "" +"If your questions and answers are highly voted, your contribution to this " +"Q&A community will be recognized with the variety of badges." + +#: forum/skins/default/templates/badges.html:22 +#, python-format +msgid "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +" " +msgstr "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Have ideas about fun " +"badges? Please, give us your feedback" + +#: forum/skins/default/templates/badges.html:51 +msgid "Community badges" +msgstr "Badge levels" + +#: forum/skins/default/templates/badges.html:57 +msgid "gold badge description" +msgstr "" +"Gold badge is the highest award in this community. To obtain it have to show " +"profound knowledge and ability in addition to your active participation." + +#: forum/skins/default/templates/badges.html:65 +msgid "silver badge description" +msgstr "" +"Obtaining silver badge requires significant patience. If you have received " +"one, that means you have greatly contributed to this community." + +#: forum/skins/default/templates/badges.html:68 +msgid "bronze badge: often given as a special honor" +msgstr "" + +#: forum/skins/default/templates/badges.html:72 +msgid "bronze badge description" +msgstr "" +"If you are an active participant in this community, you will be recognized " +"with this badge." + +#: forum/skins/default/templates/book.html:7 +msgid "reading channel" +msgstr "" + +#: forum/skins/default/templates/book.html:26 +msgid "[author]" +msgstr "" + +#: forum/skins/default/templates/book.html:30 +msgid "[publisher]" +msgstr "" + +#: forum/skins/default/templates/book.html:34 +msgid "[publication date]" +msgstr "" + +#: forum/skins/default/templates/book.html:38 +msgid "[price]" +msgstr "" + +#: forum/skins/default/templates/book.html:39 +msgid "currency unit" +msgstr "" + +#: forum/skins/default/templates/book.html:42 +msgid "[pages]" +msgstr "" + +#: forum/skins/default/templates/book.html:43 +msgid "pages abbreviation" +msgstr "" + +#: forum/skins/default/templates/book.html:46 +msgid "[tags]" +msgstr "" + +#: forum/skins/default/templates/book.html:56 +msgid "author blog" +msgstr "" + +#: forum/skins/default/templates/book.html:62 +msgid "book directory" +msgstr "" + +#: forum/skins/default/templates/book.html:66 +msgid "buy online" +msgstr "" + +#: forum/skins/default/templates/book.html:79 +msgid "reader questions" +msgstr "" + +#: forum/skins/default/templates/book.html:82 +msgid "ask the author" +msgstr "" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:18 +msgid "this question was selected as favorite" +msgstr "" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:18 +msgid "number of times" +msgstr "" + +#: forum/skins/default/templates/book.html:105 +#: forum/skins/default/templates/question_summary_list_roll.html:14 +msgid "votes" +msgstr "" + +#: forum/skins/default/templates/book.html:108 +msgid "the answer has been accepted to be correct" +msgstr "" + +#: forum/skins/default/templates/book.html:115 +#: forum/skins/default/templates/question_summary_list_roll.html:15 +msgid "views" +msgstr "" + +#: forum/skins/default/templates/book.html:125 +#: forum/skins/default/templates/question.html:136 +#: forum/skins/default/templates/question_list.html:19 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/tags.html:50 +#: forum/skins/default/templates/users_questions.html:34 +#, python-format +msgid "see questions tagged '%(tag)s'" +msgstr "" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to book RSS feed" +msgstr "" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to the questions feed" +msgstr "" + +#: forum/skins/default/templates/close.html:6 +#: forum/skins/default/templates/close.html:16 +msgid "Close question" +msgstr "" + +#: forum/skins/default/templates/close.html:19 +msgid "Close the question" +msgstr "" + +#: forum/skins/default/templates/close.html:25 +msgid "Reasons" +msgstr "" + +#: forum/skins/default/templates/close.html:28 +msgid "OK to close" +msgstr "" + +#: forum/skins/default/templates/email_base.html:11 +msgid "home" +msgstr "" + +#: forum/skins/default/templates/faq.html:11 +msgid "Frequently Asked Questions " +msgstr "" + +#: forum/skins/default/templates/faq.html:16 +msgid "What kinds of questions can I ask here?" +msgstr "" + +#: forum/skins/default/templates/faq.html:17 +msgid "" +"Most importanly - questions should be relevant to this " +"community." +msgstr "" + +#: forum/skins/default/templates/faq.html:18 +msgid "" +"Before asking the question - please make sure to use search to see whether " +"your question has alredy been answered." +msgstr "" +"Before you ask - please make sure to search for a similar question. You can " +"search questions by their title or tags." + +#: forum/skins/default/templates/faq.html:21 +msgid "What questions should I avoid asking?" +msgstr "What kinds of questions should be avoided?" + +#: forum/skins/default/templates/faq.html:22 +msgid "" +"Please avoid asking questions that are not relevant to this community, too " +"subjective and argumentative." +msgstr "" + +#: forum/skins/default/templates/faq.html:27 +msgid "What should I avoid in my answers?" +msgstr "" + +#: forum/skins/default/templates/faq.html:28 +msgid "" +"is a Q&A site, not a discussion group. Therefore - please avoid having " +"discussions in your answers, comment facility allows some space for brief " +"discussions." +msgstr "" +"is a question and answer site - it is not a " +"discussion group. Please avoid holding debates in your answers as " +"they tend to dilute the essense of questions and answers. For the brief " +"discussions please use commenting facility." + +#: forum/skins/default/templates/faq.html:32 +msgid "Who moderates this community?" +msgstr "" + +#: forum/skins/default/templates/faq.html:33 +msgid "The short answer is: you." +msgstr "" + +#: forum/skins/default/templates/faq.html:34 +msgid "This website is moderated by the users." +msgstr "" + +#: forum/skins/default/templates/faq.html:35 +msgid "" +"The reputation system allows users earn the authorization to perform a " +"variety of moderation tasks." +msgstr "" +"Karma system allows users to earn rights to perform a variety of moderation " +"tasks" + +#: forum/skins/default/templates/faq.html:40 +msgid "How does reputation system work?" +msgstr "How does karma system work?" + +#: forum/skins/default/templates/faq.html:41 +msgid "Rep system summary" +msgstr "" +"When a question or answer is upvoted, the user who posted them will gain " +"some points, which are called \"karma points\". These points serve as a " +"rough measure of the community trust to him/her. Various moderation tasks " +"are gradually assigned to the users based on those points." + +#: forum/skins/default/templates/faq.html:42 +msgid "" +"For example, if you ask an interesting question or give a helpful answer, " +"your input will be upvoted. On the other hand if the answer is misleading - " +"it will be downvoted. Each vote in favor will generate 10 " +"points, each vote against will subtract 2 points. There is " +"a limit of 200 points that can be accumulated per question " +"or answer. The table below explains reputation point requirements for each " +"type of moderation task." +msgstr "" + +#: forum/skins/default/templates/faq.html:53 +#: forum/skins/default/templates/user_votes.html:15 +msgid "upvote" +msgstr "" + +#: forum/skins/default/templates/faq.html:57 +msgid "use tags" +msgstr "" + +#: forum/skins/default/templates/faq.html:62 +msgid "add comments" +msgstr "" + +#: forum/skins/default/templates/faq.html:66 +#: forum/skins/default/templates/user_votes.html:17 +msgid "downvote" +msgstr "" + +#: forum/skins/default/templates/faq.html:69 +msgid "open and close own questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:73 +msgid "retag questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:78 +msgid "edit community wiki questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:83 +msgid "edit any answer" +msgstr "" + +#: forum/skins/default/templates/faq.html:87 +msgid "open any closed question" +msgstr "" + +#: forum/skins/default/templates/faq.html:91 +msgid "delete any comment" +msgstr "" + +#: forum/skins/default/templates/faq.html:95 +msgid "delete any questions and answers and perform other moderation tasks" +msgstr "" + +#: forum/skins/default/templates/faq.html:103 +msgid "how to validate email title" +msgstr "How to validate email and why?" + +#: forum/skins/default/templates/faq.html:105 +#, python-format +msgid "" +"how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" +msgstr "" +"

How? If you have just set or changed your " +"email address - check your email and click the included link.
The link contains a key generated specifically for you. You can " +"also and check your email again.

Why? Email validation is required to make sure that " +"only you can post messages on your behalf and to " +"minimize spam posts.
With email you can " +"subscribe for updates on the most interesting questions. " +"Also, when you sign up for the first time - create a unique gravatar personal image.

" + +#: forum/skins/default/templates/faq.html:110 +msgid "what is gravatar" +msgstr "How to change my picture (gravatar) and what is gravatar?" + +#: forum/skins/default/templates/faq.html:111 +msgid "gravatar faq info" +msgstr "" +"

The picture that appears on the users profiles is called " +"gravatar (which means globally recognized avatar).

Here is how it works: a " +"cryptographic key (unbreakable code) is calculated from " +"your email address. You upload your picture (or your favorite alter ego " +"image) the website gravatar.com from where we later retreive your image using the key.

This way all the websites you trust can show your image next to your " +"posts and your email address remains private.

Please " +"personalize your account with an image - just register at " +"gravatar.com (just please " +"be sure to use the same email address that you used to register with us). " +"Default image that looks like a kitchen tile is generated automatically.

" + +#: forum/skins/default/templates/faq.html:114 +msgid "To register, do I need to create new password?" +msgstr "" + +#: forum/skins/default/templates/faq.html:115 +msgid "" +"No, you don't have to. You can login through any service that supports " +"OpenID, e.g. Google, Yahoo, AOL, etc." +msgstr "" + +#: forum/skins/default/templates/faq.html:116 +msgid "Login now!" +msgstr "" + +#: forum/skins/default/templates/faq.html:121 +msgid "Why other people can edit my questions/answers?" +msgstr "" + +#: forum/skins/default/templates/faq.html:122 +msgid "Goal of this site is..." +msgstr "" + +#: forum/skins/default/templates/faq.html:122 +msgid "" +"So questions and answers can be edited like wiki pages by experienced users " +"of this site and this improves the overall quality of the knowledge base " +"content." +msgstr "" + +#: forum/skins/default/templates/faq.html:123 +msgid "If this approach is not for you, we respect your choice." +msgstr "" + +#: forum/skins/default/templates/faq.html:127 +msgid "Still have questions?" +msgstr "" + +#: forum/skins/default/templates/faq.html:128 +#, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "" +"Please ask your question, help make our " +"community better!" + +#: forum/skins/default/templates/faq.html:130 +#: forum/skins/default/templates/header.html:27 +msgid "questions" +msgstr "" + +#: forum/skins/default/templates/faq.html:130 +msgid "." +msgstr "" + +#: forum/skins/default/templates/feedback.html:6 +msgid "Feedback" +msgstr "" + +#: forum/skins/default/templates/feedback.html:11 +msgid "Give us your feedback!" +msgstr "" + +#: forum/skins/default/templates/feedback.html:17 +#, python-format +msgid "" +"\n" +" Dear %(user_name)s, we look " +"forward to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: forum/skins/default/templates/feedback.html:24 +msgid "" +"\n" +" Dear visitor, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: forum/skins/default/templates/feedback.html:41 +msgid "(this field is required)" +msgstr "" + +#: forum/skins/default/templates/feedback.html:49 +msgid "Send Feedback" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:3 +#, python-format +msgid "" +"\n" +"Hello, this is a %(site_title)s forum feedback message\n" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:9 +msgid "Sender is" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:11 +#: forum/skins/default/templates/feedback_email.txt:14 +msgid "email" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:13 +msgid "anonymous" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:19 +msgid "Message body:" +msgstr "" + +#: forum/skins/default/templates/footer.html:8 +#: forum/skins/default/templates/header.html:14 +msgid "about" +msgstr "" + +#: forum/skins/default/templates/footer.html:9 +#: forum/skins/default/templates/header.html:15 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "faq" +msgstr "" + +#: forum/skins/default/templates/footer.html:10 +msgid "privacy policy" +msgstr "" + +#: forum/skins/default/templates/footer.html:19 +msgid "give feedback" +msgstr "" + +#: forum/skins/default/templates/header.html:10 +msgid "logout" +msgstr "" + +#: forum/skins/default/templates/header.html:12 +msgid "login" +msgstr "" + +#: forum/skins/default/templates/header.html:22 +msgid "back to home page" +msgstr "" + +#: forum/skins/default/templates/header.html:29 +msgid "users" +msgstr "people" + +#: forum/skins/default/templates/header.html:31 +msgid "books" +msgstr "" + +#: forum/skins/default/templates/header.html:33 +#: forum/templatetags/extra_tags.py:177 forum/templatetags/extra_tags.py:206 +msgid "badges" +msgstr "" + +#: forum/skins/default/templates/header.html:34 +#: forum/skins/default/templates/header.html:38 +msgid "ask a question" +msgstr "" + +#: forum/skins/default/templates/header.html:36 +msgid "unanswered questions" +msgstr "unanswered" + +#: forum/skins/default/templates/input_bar.html:33 +msgid "search" +msgstr "" + +#: forum/skins/default/templates/logout.html:6 +#: forum/skins/default/templates/logout.html:16 +msgid "Logout" +msgstr "" + +#: forum/skins/default/templates/logout.html:19 +msgid "" +"As a registered user you can login with your OpenID, log out of the site or " +"permanently remove your account." +msgstr "" +"Clicking Logout will log you out from the forumbut will not " +"sign you off from your OpenID provider.

If you wish to sign off " +"completely - please make sure to log out from your OpenID provider as well." + +#: forum/skins/default/templates/logout.html:20 +msgid "Logout now" +msgstr "Logout Now" + +#: forum/skins/default/templates/notarobot.html:3 +msgid "Please prove that you are a Human Being" +msgstr "" + +#: forum/skins/default/templates/notarobot.html:10 +msgid "I am a Human Being" +msgstr "" + +#: forum/skins/default/templates/pagesize.html:6 +msgid "posts per page" +msgstr "" + +#: forum/skins/default/templates/paginator.html:6 +#: forum/skins/default/templates/paginator.html:7 +msgid "previous" +msgstr "" + +#: forum/skins/default/templates/paginator.html:19 +msgid "current page" +msgstr "" + +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 +#, python-format +msgid "page number %(num)s" +msgstr "page %(num)s" + +#: forum/skins/default/templates/paginator.html:33 +msgid "next page" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:9 +#, python-format +msgid "%(rev_count)s revision" +msgid_plural "%(rev_count)s revisions" +msgstr[0] "" + +#: forum/skins/default/templates/post_contributor_info.html:15 +msgid "asked" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:18 +msgid "answered" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:20 +msgid "posted" +msgstr "" + +#: forum/skins/default/templates/post_contributor_info.html:41 +msgid "updated" +msgstr "" + +#: forum/skins/default/templates/privacy.html:6 +#: forum/skins/default/templates/privacy.html:11 +msgid "Privacy policy" +msgstr "" + +#: forum/skins/default/templates/privacy.html:15 +msgid "general message about privacy" +msgstr "" +"Respecting users privacy is an important core principle of this Q&A " +"forum. Information on this page details how this forum protects your " +"privacy, and what type of information is collected." + +#: forum/skins/default/templates/privacy.html:18 +msgid "Site Visitors" +msgstr "" + +#: forum/skins/default/templates/privacy.html:20 +msgid "what technical information is collected about visitors" +msgstr "" +"Information on question views, revisions of questions and answers - both " +"times and content are recorded for each user in order to correctly count " +"number of views, maintain data integrity and report relevant updates." + +#: forum/skins/default/templates/privacy.html:23 +msgid "Personal Information" +msgstr "" + +#: forum/skins/default/templates/privacy.html:25 +msgid "details on personal information policies" +msgstr "" +"Members of this community may choose to display personally identifiable " +"information in their profiles. Forum will never display such information " +"without a request from the user." + +#: forum/skins/default/templates/privacy.html:28 +msgid "Other Services" +msgstr "" + +#: forum/skins/default/templates/privacy.html:30 +msgid "details on sharing data with third parties" +msgstr "" +"None of the data that is not openly shown on the forum by the choice of the " +"user is shared with any third party." + +#: forum/skins/default/templates/privacy.html:35 +msgid "cookie policy details" +msgstr "" +"Forum software relies on the internet cookie technology to keep track of " +"user sessions. Cookies must be enabled in your browser so that forum can " +"work for you." + +#: forum/skins/default/templates/privacy.html:37 +msgid "Policy Changes" +msgstr "" + +#: forum/skins/default/templates/privacy.html:38 +msgid "how privacy policies can be changed" +msgstr "" +"These policies may be adjusted to improve protection of user's privacy. " +"Whenever such changes occur, users will be notified via the internal " +"messaging system. " + +#: forum/skins/default/templates/question.html:78 +#: forum/skins/default/templates/question.html:79 +#: forum/skins/default/templates/question.html:95 +#: forum/skins/default/templates/question.html:97 +msgid "i like this post (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:81 +#: forum/skins/default/templates/question.html:99 +#: forum/skins/default/templates/question.html:251 +msgid "current number of votes" +msgstr "" + +#: forum/skins/default/templates/question.html:90 +#: forum/skins/default/templates/question.html:91 +#: forum/skins/default/templates/question.html:104 +#: forum/skins/default/templates/question.html:105 +msgid "i dont like this post (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:109 +#: forum/skins/default/templates/question.html:110 +msgid "mark this question as favorite (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:116 +#: forum/skins/default/templates/question.html:117 +msgid "remove favorite mark from this question (click again to restore mark)" +msgstr "" + +#: forum/skins/default/templates/question.html:141 +#: forum/skins/default/templates/question.html:288 +#: forum/skins/default/templates/revisions_answer.html:58 +#: forum/skins/default/templates/revisions_question.html:58 +msgid "edit" +msgstr "" + +#: forum/skins/default/templates/question.html:146 +msgid "reopen" +msgstr "" + +#: forum/skins/default/templates/question.html:150 +msgid "close" +msgstr "" + +#: forum/skins/default/templates/question.html:156 +#: forum/skins/default/templates/question.html:293 +msgid "" +"report as offensive (i.e containing spam, advertising, malicious text, etc.)" +msgstr "" + +#: forum/skins/default/templates/question.html:157 +#: forum/skins/default/templates/question.html:294 +msgid "flag offensive" +msgstr "" + +#: forum/skins/default/templates/question.html:165 +#: forum/skins/default/templates/question.html:305 +msgid "delete" +msgstr "" + +#: forum/skins/default/templates/question.html:183 +#: forum/skins/default/templates/question.html:325 +msgid "delete this comment" +msgstr "" + +#: forum/skins/default/templates/question.html:194 +#: forum/skins/default/templates/question.html:336 +msgid "add comment" +msgstr "post a comment" + +#: forum/skins/default/templates/question.html:198 +#: forum/skins/default/templates/question.html:340 +#, python-format +msgid "see %(counter)s more" +msgid_plural "see %(counter)s more" +msgstr[0] "" + +#: forum/skins/default/templates/question.html:200 +#: forum/skins/default/templates/question.html:342 +#, python-format +msgid "see %(counter)s more comment" +msgid_plural "" +"see %(counter)s more comments\n" +" " +msgstr[0] "" + +#: forum/skins/default/templates/question.html:213 +#, python-format +msgid "" +"The question has been closed for the following reason \"%(close_reason)s\" by" +msgstr "" + +#: forum/skins/default/templates/question.html:215 +#, python-format +msgid "close date %(closed_at)s" +msgstr "" + +#: forum/skins/default/templates/question.html:223 +#, fuzzy, python-format +msgid "" +"\n" +" %(counter)s Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +"\n" +"(one comment)" +msgstr[1] "" +"\n" +"(%(comment_count)s comments)" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers will be shown first" +msgstr "" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers" +msgstr "oldest" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers will be shown first" +msgstr "" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers" +msgstr "newest" + +#: forum/skins/default/templates/question.html:235 +msgid "most voted answers will be shown first" +msgstr "" + +#: forum/skins/default/templates/question.html:235 +msgid "popular answers" +msgstr "most voted" + +#: forum/skins/default/templates/question.html:249 +#: forum/skins/default/templates/question.html:250 +msgid "i like this answer (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:256 +#: forum/skins/default/templates/question.html:257 +msgid "i dont like this answer (click again to cancel)" +msgstr "" + +#: forum/skins/default/templates/question.html:262 +#: forum/skins/default/templates/question.html:263 +msgid "mark this answer as favorite (click again to undo)" +msgstr "" + +#: forum/skins/default/templates/question.html:268 +#: forum/skins/default/templates/question.html:269 +msgid "the author of the question has selected this answer as correct" +msgstr "" + +#: forum/skins/default/templates/question.html:282 +msgid "answer permanent link" +msgstr "" + +#: forum/skins/default/templates/question.html:283 +msgid "permanent link" +msgstr "link" + +#: forum/skins/default/templates/question.html:305 +msgid "undelete" +msgstr "" + +#: forum/skins/default/templates/question.html:364 +#: forum/skins/default/templates/question.html:367 +msgid "Notify me once a day when there are any new answers" +msgstr "" +"Notify me once a day by email when there are any new " +"answers or updates" + +#: forum/skins/default/templates/question.html:370 +msgid "Notify me weekly when there are any new answers" +msgstr "" +"Notify me weekly when there are any new answers or updates" + +#: forum/skins/default/templates/question.html:375 +#, python-format +msgid "" +"You can always adjust frequency of email updates from your %(profile_url)s" +msgstr "" +"(note: you can always change how often you receive updates)" + +#: forum/skins/default/templates/question.html:380 +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "" +"Here (once you log in) you will be able to sign " +"up for the periodic email updates about this question." + +#: forum/skins/default/templates/question.html:391 +msgid "Your answer" +msgstr "" + +#: forum/skins/default/templates/question.html:393 +msgid "Be the first one to answer this question!" +msgstr "" + +#: forum/skins/default/templates/question.html:399 +msgid "you can answer anonymously and then login" +msgstr "" +"Please start posting your answer anonymously " +"- your answer will be saved within the current session and published after " +"you log in or create a new account. Please try to give a substantial " +"answer, for discussions, please use comments and " +"please do remember to vote (after you log in)!" + +#: forum/skins/default/templates/question.html:403 +msgid "answer your own question only to give an answer" +msgstr "" +"You are welcome to answer your own question, " +"but please make sure to give an answer. Remember that you " +"can always revise your original question. Please " +"use comments for discussions and please don't " +"forget to vote :) for the answers that you liked (or perhaps did " +"not like)! " + +#: forum/skins/default/templates/question.html:405 +msgid "please only give an answer, no discussions" +msgstr "" +"Please try to give a substantial answer. If " +"you wanted to comment on the question or answer, just use the " +"commenting tool. Please remember that you can always revise " +"your answers - no need to answer the same question twice. Also, " +"please don't forget to vote - it really helps to select the " +"best questions and answers!" + +#: forum/skins/default/templates/question.html:441 +msgid "Login/Signup to Post Your Answer" +msgstr "" + +#: forum/skins/default/templates/question.html:444 +msgid "Answer Your Own Question" +msgstr "" + +#: forum/skins/default/templates/question.html:446 +msgid "Answer the question" +msgstr "Post Your Answer" + +#: forum/skins/default/templates/question.html:460 +msgid "Question tags" +msgstr "Tags" + +#: forum/skins/default/templates/question.html:465 +#: forum/skins/default/templates/questions.html:257 +#: forum/skins/default/templates/tag_selector.html:11 +#: forum/skins/default/templates/tag_selector.html:28 +#, python-format +msgid "see questions tagged '%(tag_name)s'" +msgstr "" + +#: forum/skins/default/templates/question.html:471 +msgid "question asked" +msgstr "Asked" + +#: forum/skins/default/templates/question.html:474 +msgid "question was seen" +msgstr "Seen" + +#: forum/skins/default/templates/question.html:474 +msgid "times" +msgstr "" + +#: forum/skins/default/templates/question.html:477 +msgid "last updated" +msgstr "Last updated" + +#: forum/skins/default/templates/question.html:483 +msgid "Related questions" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:6 +msgid "Please decide if you like this question or not by voting" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:12 +msgid "" +"\n" +" vote\n" +" " +msgid_plural "" +"\n" +" votes\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_counter_widget.html:21 +msgid "this answer has been accepted to be correct" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:27 +msgid "" +"\n" +" answer \n" +" " +msgid_plural "" +"\n" +" answers \n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_counter_widget.html:39 +msgid "" +"\n" +" view\n" +" " +msgid_plural "" +"\n" +" views\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_edit.html:5 +#: forum/skins/default/templates/question_edit.html:66 +msgid "Edit question" +msgstr "" + +#: forum/skins/default/templates/question_edit_tips.html:4 +msgid "question tips" +msgstr "Tips" + +#: forum/skins/default/templates/question_edit_tips.html:7 +msgid "please ask a relevant question" +msgstr "ask a question interesting to this community" + +#: forum/skins/default/templates/question_edit_tips.html:10 +msgid "please try provide enough details" +msgstr "provide enough details" + +#: forum/skins/default/templates/question_retag.html:4 +#: forum/skins/default/templates/question_retag.html:53 +msgid "Change tags" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:40 +msgid "up to 5 tags, less than 20 characters each" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:83 +msgid "Why use and modify tags?" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:86 +msgid "tags help us keep Questions organized" +msgstr "" + +#: forum/skins/default/templates/question_retag.html:94 +msgid "tag editors receive special awards from the community" +msgstr "" + +#: forum/skins/default/templates/question_summary_list_roll.html:13 +msgid "answers" +msgstr "" + +#: forum/skins/default/templates/questions.html:8 +msgid "Questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:32 +msgid "Found by tags" +msgstr "Tagged questions" + +#: forum/skins/default/templates/questions.html:36 +msgid "Search results" +msgstr "" + +#: forum/skins/default/templates/questions.html:38 +msgid "Found by title" +msgstr "" + +#: forum/skins/default/templates/questions.html:42 +msgid "Unanswered questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:44 +msgid "All questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:51 +msgid "In:" +msgstr "" + +#: forum/skins/default/templates/questions.html:53 +msgid "see unanswered questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:55 +msgid "see your favorite questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:59 +msgid "Sort by:" +msgstr "" + +#: forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/questions.html:75 +msgid "click to see the newest questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:70 +msgid "click to see the oldest questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:83 +#: forum/skins/default/templates/questions.html:94 +msgid "click to see the most recently updated questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:89 +msgid "click to see the least recently updated questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:102 +#: forum/skins/default/templates/questions.html:113 +msgid "click to see hottest questions" +msgstr "questions with most answers" + +#: forum/skins/default/templates/questions.html:102 +msgid "less answers" +msgstr "" + +#: forum/skins/default/templates/questions.html:108 +msgid "click to see coldest questions" +msgstr "questions with fewest answers" + +#: forum/skins/default/templates/questions.html:108 +#: forum/skins/default/templates/questions.html:113 +msgid "more answers" +msgstr "" + +#: forum/skins/default/templates/questions.html:121 +#: forum/skins/default/templates/questions.html:132 +msgid "click to see most voted questions" +msgstr "" + +#: forum/skins/default/templates/questions.html:121 +msgid "unpopular" +msgstr "" + +#: forum/skins/default/templates/questions.html:127 +msgid "click to see least voted questions" +msgstr "least voted questions" + +#: forum/skins/default/templates/questions.html:127 +#: forum/skins/default/templates/questions.html:132 +msgid "popular" +msgstr "" + +#: forum/skins/default/templates/questions.html:141 +#, fuzzy, python-format +msgid " %(q_num)s question found" +msgid_plural "%(q_num)s questions found" +msgstr[0] "One question" +msgstr[1] "" + +#: forum/skins/default/templates/questions.html:143 +#, fuzzy, python-format +msgid "%(q_num)s question" +msgid_plural "%(q_num)s questions" +msgstr[0] "One question" +msgstr[1] "" + +#: forum/skins/default/templates/questions.html:147 +#, python-format +msgid "with %(author_name)s's contributions" +msgstr "" + +#: forum/skins/default/templates/questions.html:151 +msgid "tagged" +msgstr "" + +#: forum/skins/default/templates/questions.html:157 +msgid "Search tips:" +msgstr "" + +#: forum/skins/default/templates/questions.html:161 +msgid "reset author" +msgstr "" + +#: forum/skins/default/templates/questions.html:165 +msgid "reset tags" +msgstr "" + +#: forum/skins/default/templates/questions.html:169 +#: forum/skins/default/templates/questions.html:173 +msgid "start over" +msgstr "" + +#: forum/skins/default/templates/questions.html:175 +msgid " - to expand, or dig in by adding more tags and revising the query." +msgstr "" + +#: forum/skins/default/templates/questions.html:178 +msgid "Search tip:" +msgstr "" + +#: forum/skins/default/templates/questions.html:178 +msgid "add tags and a query to focus your search" +msgstr "" + +#: forum/skins/default/templates/questions.html:190 +msgid "There are no unanswered questions here" +msgstr "" + +#: forum/skins/default/templates/questions.html:193 +msgid "No favorite questions here. " +msgstr "" + +#: forum/skins/default/templates/questions.html:194 +msgid "Please start (bookmark) some questions when you visit them" +msgstr "" + +#: forum/skins/default/templates/questions.html:199 +msgid "You can expand your search by " +msgstr "" + +#: forum/skins/default/templates/questions.html:203 +msgid "resetting author" +msgstr "" + +#: forum/skins/default/templates/questions.html:207 +msgid "resetting tags" +msgstr "" + +#: forum/skins/default/templates/questions.html:211 +#: forum/skins/default/templates/questions.html:215 +msgid "starting over" +msgstr "" + +#: forum/skins/default/templates/questions.html:220 +msgid "Please always feel free to ask your question!" +msgstr "" + +#: forum/skins/default/templates/questions.html:224 +msgid "Did not find what you were looking for?" +msgstr "" + +#: forum/skins/default/templates/questions.html:225 +msgid "Please, post your question!" +msgstr "" + +#: forum/skins/default/templates/questions.html:241 +msgid "Contributors" +msgstr "" + +#: forum/skins/default/templates/questions.html:254 +msgid "Related tags" +msgstr "Tags" + +#: forum/skins/default/templates/reopen.html:6 +#: forum/skins/default/templates/reopen.html:16 +msgid "Reopen question" +msgstr "" + +#: forum/skins/default/templates/reopen.html:19 +msgid "Open the previously closed question" +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "The question was closed for the following reason " +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "reason - leave blank in english" +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "on " +msgstr "" + +#: forum/skins/default/templates/reopen.html:22 +msgid "date closed" +msgstr "" + +#: forum/skins/default/templates/reopen.html:29 +msgid "Reopen this question" +msgstr "" + +#: forum/skins/default/templates/revisions_answer.html:7 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:8 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "Revision history" +msgstr "" + +#: forum/skins/default/templates/revisions_answer.html:50 +#: forum/skins/default/templates/revisions_question.html:50 +msgid "click to hide/show revision" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:5 +msgid "Interesting tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:15 +#, python-format +msgid "remove '%(tag_name)s' from the list of interesting tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:21 +#: forum/skins/default/templates/tag_selector.html:38 +msgid "Add" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:22 +msgid "Ignored tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:32 +#, python-format +msgid "remove '%(tag_name)s' from the list of ignored tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:41 +msgid "keep ignored questions hidden" +msgstr "" + +#: forum/skins/default/templates/tags.html:6 +#: forum/skins/default/templates/tags.html:30 +msgid "Tag list" +msgstr "" + +#: forum/skins/default/templates/tags.html:32 +msgid "sorted alphabetically" +msgstr "" + +#: forum/skins/default/templates/tags.html:32 +msgid "by name" +msgstr "" + +#: forum/skins/default/templates/tags.html:33 +msgid "sorted by frequency of tag use" +msgstr "" + +#: forum/skins/default/templates/tags.html:33 +msgid "by popularity" +msgstr "" + +#: forum/skins/default/templates/tags.html:39 +#, python-format +msgid "" +"All tags matching '%(stag)s'" +msgstr "" + +#: forum/skins/default/templates/tags.html:42 +msgid "Nothing found" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:6 +msgid "Edit user profile" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:19 +msgid "edit profile" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:33 +#: forum/skins/default/templates/user_info.html:53 +msgid "Registered user" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:40 +msgid "Screen Name" +msgstr "" + +#: forum/skins/default/templates/user_edit.html:89 +#: forum/skins/default/templates/user_email_subscriptions.html:20 +msgid "Update" +msgstr "" + +#: forum/skins/default/templates/user_email_subscriptions.html:8 +msgid "Email subscription settings" +msgstr "" + +#: forum/skins/default/templates/user_email_subscriptions.html:9 +msgid "email subscription settings info" +msgstr "" +"Adjust frequency of email updates. Receive " +"updates on interesting questions by email,
help the community by answering questions of your colleagues. If you do not wish to " +"receive emails - select 'no email' on all items below.
Updates are only " +"sent when there is any new activity on selected items." + +#: forum/skins/default/templates/user_email_subscriptions.html:21 +msgid "Stop sending email" +msgstr "Stop Email" + +#: forum/skins/default/templates/user_info.html:18 +msgid "change picture" +msgstr "" + +#: forum/skins/default/templates/user_info.html:25 +#: forum/skins/default/templates/users.html:26 forum/views/users.py:933 +msgid "reputation" +msgstr "karma" + +#: forum/skins/default/templates/user_info.html:35 +msgid "Moderate this user" +msgstr "" + +#: forum/skins/default/templates/user_info.html:47 +msgid "update profile" +msgstr "" + +#: forum/skins/default/templates/user_info.html:57 +msgid "real name" +msgstr "" + +#: forum/skins/default/templates/user_info.html:62 +msgid "member for" +msgstr "member since" + +#: forum/skins/default/templates/user_info.html:67 +msgid "last seen" +msgstr "" + +#: forum/skins/default/templates/user_info.html:73 +msgid "user website" +msgstr "" + +#: forum/skins/default/templates/user_info.html:79 +msgid "location" +msgstr "" + +#: forum/skins/default/templates/user_info.html:86 +msgid "age" +msgstr "" + +#: forum/skins/default/templates/user_info.html:87 +msgid "age unit" +msgstr "years old" + +#: forum/skins/default/templates/user_info.html:93 +msgid "todays unused votes" +msgstr "" + +#: forum/skins/default/templates/user_info.html:94 +msgid "votes left" +msgstr "" + +#: forum/skins/default/templates/user_reputation.html:29 +msgid "Your karma change log." +msgstr "" + +#: forum/skins/default/templates/user_reputation.html:31 +#, python-format +msgid "%(user_name)s's karma change log" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:11 +#, python-format +msgid "%(counter)s Question" +msgid_plural "%(counter)s Questions" +msgstr[0] "" + +#: forum/skins/default/templates/user_stats.html:16 +#, python-format +msgid "%(counter)s Answer" +msgid_plural "%(counter)s Answers" +msgstr[0] "" + +#: forum/skins/default/templates/user_stats.html:24 +#, python-format +msgid "the answer has been voted for %(answer_score)s times" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:24 +msgid "this answer has been selected as correct" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:34 +#, python-format +msgid "(%(comment_count)s comment)" +msgid_plural "the answer has been commented %(comment_count)s times" +msgstr[0] "" + +#: forum/skins/default/templates/user_stats.html:44 +#, python-format +msgid "%(cnt)s Vote" +msgid_plural "%(cnt)s Votes " +msgstr[0] "" + +#: forum/skins/default/templates/user_stats.html:50 +msgid "thumb up" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:51 +msgid "user has voted up this many times" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:55 +msgid "thumb down" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:56 +msgid "user voted down this many times" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:64 +#, python-format +msgid "%(counter)s Tag" +msgid_plural "%(counter)s Tags" +msgstr[0] "" + +#: forum/skins/default/templates/user_stats.html:72 +#, python-format +msgid "" +"see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " +msgstr "" + +#: forum/skins/default/templates/user_stats.html:86 +#, python-format +msgid "%(counter)s Badge" +msgid_plural "%(counter)s Badges" +msgstr[0] "" + +#: forum/skins/default/templates/user_tabs.html:7 +msgid "User profile" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:7 forum/views/users.py:907 +msgid "overview" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:9 forum/views/users.py:915 +msgid "recent activity" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:12 forum/views/users.py:925 +msgid "comments and answers to others questions" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:13 forum/views/users.py:924 +msgid "responses" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:16 +msgid "graph of user reputation" +msgstr "Graph of user karma" + +#: forum/skins/default/templates/user_tabs.html:17 +msgid "reputation history" +msgstr "karma history" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:951 +msgid "user vote record" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:950 +msgid "casted votes" +msgstr "votes" + +#: forum/skins/default/templates/user_tabs.html:23 +msgid "questions that user selected as his/her favorite" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:24 +msgid "favorites" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:27 forum/views/users.py:960 +msgid "email subscription settings" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:28 forum/views/users.py:959 +msgid "email subscriptions" +msgstr "" + +#: forum/skins/default/templates/users.html:6 +#: forum/skins/default/templates/users.html:24 +msgid "Users" +msgstr "" + +#: forum/skins/default/templates/users.html:27 +msgid "recent" +msgstr "" + +#: forum/skins/default/templates/users.html:29 +msgid "by username" +msgstr "" + +#: forum/skins/default/templates/users.html:35 +#, python-format +msgid "users matching query %(suser)s:" +msgstr "" + +#: forum/skins/default/templates/users.html:39 +msgid "Nothing found." +msgstr "" + +#: forum/skins/default/templates/users_questions.html:11 +msgid "this questions was selected as favorite" +msgstr "" + +#: forum/skins/default/templates/users_questions.html:12 +msgid "thumb-up on" +msgstr "" + +#: forum/skins/default/templates/users_questions.html:19 +msgid "thumb-up off" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:3 +#: forum/skins/default/templates/authopenid/changeemail.html:9 +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Change email" +msgstr "Change Email" + +#: forum/skins/default/templates/authopenid/changeemail.html:11 +msgid "Save your email address" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:16 +#, python-format +msgid "change %(email)s info" +msgstr "" +"Enter your new email into the box below if " +"you'd like to use another email for update subscriptions." +"
Currently you are using %(email)s" + +#: forum/skins/default/templates/authopenid/changeemail.html:18 +#, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "" +"Please enter your email address in the box below. Valid email address is required on this Q&A forum. If you like, " +"you can receive updates on interesting questions or entire " +"forum via email. Also, your email is used to create a unique gravatar image for your account. " +"Email addresses are never shown or otherwise shared with anybody else." + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your new Email" +msgstr "" +"Your new Email: (will not be shown to " +"anyone, must be valid)" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your Email" +msgstr "" +"Your Email (must be valid, never shown to others)" + +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Save Email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:49 +msgid "Validate email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:52 +#, python-format +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "" +"An email with a validation link has been sent to %" +"(email)s. Please follow the emailed link with your " +"web browser. Email validation is necessary to help insure the proper use of " +"email on Q&A. If you would like to use " +"another email, please change it again." + +#: forum/skins/default/templates/authopenid/changeemail.html:57 +msgid "Email not changed" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:60 +#, python-format +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" +"Your email address %(email)s has not been changed." +" If you decide to change it later - you can always do it by editing " +"it in your user profile or by using the previous form again." + +#: forum/skins/default/templates/authopenid/changeemail.html:65 +msgid "Email changed" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:68 +#, python-format +msgid "your current %(email)s can be used for this" +msgstr "" +"Your email address is now set to %(email)s. " +"Updates on the questions that you like most will be sent to this address. " +"Email notifications are sent once a day or less frequently - only when there " +"are any news." + +#: forum/skins/default/templates/authopenid/changeemail.html:73 +msgid "Email verified" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:76 +msgid "thanks for verifying email" +msgstr "" +"Thank you for verifying your email! Now " +"you can ask and answer questions. Also if " +"you find a very interesting question you can subscribe for the " +"updates - then will be notified about changes once a day or less frequently." + +#: forum/skins/default/templates/authopenid/changeemail.html:81 +msgid "email key not sent" +msgstr "Validation email not sent" + +#: forum/skins/default/templates/authopenid/changeemail.html:84 +#, python-format +msgid "email key not sent %(email)s change email here %(change_link)s" +msgstr "" +"Your current email address %(email)s has been " +"validated before so the new key was not sent. You can change email used for update subscriptions if necessary." + +#: forum/skins/default/templates/authopenid/changeopenid.html:8 +msgid "Account: change OpenID URL" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:12 +msgid "" +"This is where you can change your OpenID URL. Make sure you remember it!" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:14 +#: forum/skins/default/templates/authopenid/delete.html:14 +#: forum/skins/default/templates/authopenid/delete.html:24 +msgid "Please correct errors below:" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:29 +msgid "OpenID URL:" +msgstr "" + +#: forum/skins/default/templates/authopenid/changepw.html:7 +msgid "Account: change password" +msgstr "Change your password" + +#: forum/skins/default/templates/authopenid/changepw.html:8 +msgid "This is where you can change your password. Make sure you remember it!" +msgstr "" +"To change your password please fill out and " +"submit this form" + +#: forum/skins/default/templates/authopenid/complete.html:19 +msgid "Connect your OpenID with this site" +msgstr "New user signup" + +#: forum/skins/default/templates/authopenid/complete.html:22 +msgid "Connect your OpenID with your account on this site" +msgstr "New user signup" + +#: forum/skins/default/templates/authopenid/complete.html:27 +#, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your %" +"(provider)s login. Please create your screen name " +"and save your email address. Saved email address will let " +"you subscribe for the updates on the most interesting " +"questions and will be used to create and retrieve your unique avatar image - " +"gravatar.

" + +#: forum/skins/default/templates/authopenid/complete.html:31 +#, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" +"

Oops... looks like screen name %(username)s is " +"already used in another account.

Please choose another screen " +"name to use with your %(provider)s login. Also, a valid email address is " +"required on the Q&A forum. Your email is " +"used to create a unique gravatar image for your account. If you like, you can receive " +"updates on the interesting questions or entire forum by email. " +"Email addresses are never shown or otherwise shared with anybody else.

" + +#: forum/skins/default/templates/authopenid/complete.html:35 +#, python-format +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your %" +"(provider)s login.

You can either keep your screen " +"name the same as your %(provider)s login name or choose some other " +"nickname.

Also, please save a valid email address. " +"With the email you can subscribe for the updates on the " +"most interesting questions. Email address is also used to create and " +"retrieve your unique avatar image - gravatar.

" + +#: forum/skins/default/templates/authopenid/complete.html:38 +#, python-format +msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" +msgstr "" +"

You are here for the first time with your " +"Facebook login. Please create your screen name and " +"save your email address. Saved email address will let you " +"subscribe for the updates on the most interesting questions " +"and will be used to create and retrieve your unique avatar image - gravatar.

" + +#: forum/skins/default/templates/authopenid/complete.html:42 +msgid "This account already exists, please use another." +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:57 +msgid "Sorry, looks like we have some errors:" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:82 +msgid "Screen name label" +msgstr "Screen Name (will be shown to others)" + +#: forum/skins/default/templates/authopenid/complete.html:89 +msgid "Email address label" +msgstr "" +"Email Address (will not be shared with " +"anyone, must be valid)" + +#: forum/skins/default/templates/authopenid/complete.html:95 +#: forum/skins/default/templates/authopenid/signup.html:18 +msgid "receive updates motivational blurb" +msgstr "" +"Receive forum updates by email - this will help our " +"community grow and become more useful.
By default Q&A forum sends up to one email digest per " +"week - only when there is anything new.
If you like, please " +"adjust this now or any time later from your user account." + +#: forum/skins/default/templates/authopenid/complete.html:99 +#: forum/skins/default/templates/authopenid/signup.html:22 +msgid "please select one of the options above" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:102 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:103 +msgid "create account" +msgstr "Signup" + +#: forum/skins/default/templates/authopenid/complete.html:112 +msgid "Existing account" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:113 +msgid "user name" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:114 +msgid "password" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:121 +msgid "Register" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:122 +#: forum/skins/default/templates/authopenid/signin.html:168 +msgid "Forgot your password?" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:2 +msgid "Thank you for registering at our Q&A forum!" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:4 +msgid "Your account details are:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:6 +msgid "Username:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:7 +#: forum/skins/default/templates/authopenid/delete.html:19 +msgid "Password:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:9 +msgid "Please sign in here:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:12 +#: forum/skins/default/templates/authopenid/email_validation.txt:14 +#: forum/skins/default/templates/authopenid/sendpw_email.txt:8 +msgid "" +"Sincerely,\n" +"Forum Administrator" +msgstr "" +"Sincerely,\n" +"Q&A Forum Administrator" + +#: forum/skins/default/templates/authopenid/delete.html:8 +msgid "Account: delete account" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:12 +msgid "" +"Note: After deleting your account, anyone will be able to register this " +"username." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:16 +msgid "Check confirm box, if you want delete your account." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:31 +msgid "I am sure I want to delete my account." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "Password/OpenID URL" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "(required for your security)" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:34 +msgid "Delete account permanently" +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:2 +msgid "Greetings from the Q&A forum" +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:4 +msgid "To make use of the Forum, please follow the link below:" +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:8 +msgid "Following the link above will help us verify your email address." +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:10 +msgid "" +"If you beleive that this message was sent in mistake - \n" +"no further action is needed. Just ingore this email, we apologize\n" +"for any inconvenience" +msgstr "" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:4 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:7 +msgid "Traditional login information" +msgstr "" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:12 +#, python-format +msgid "" +"how to login with password through external login website or use %" +"(feedback_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw.html:4 +#: forum/skins/default/templates/authopenid/sendpw.html:7 +msgid "Send new password" +msgstr "Recover password" + +#: forum/skins/default/templates/authopenid/sendpw.html:10 +msgid "password recovery information" +msgstr "" +"Forgot you password? No problems - just get a new " +"one!
Please follow the following steps:
• submit your " +"user name below and check your email
follow the " +"activation link for the new password - sent to you by email and " +"login with the suggested password
• at this you might want to " +"change your password to something you can remember better" + +#: forum/skins/default/templates/authopenid/sendpw.html:21 +msgid "Reset password" +msgstr "Send me a new password" + +#: forum/skins/default/templates/authopenid/sendpw.html:22 +msgid "return to login" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:2 +#, python-format +msgid "" +"Someone has requested to reset your password on %(site_url)s.\n" +"If it were not you, it is safe to ignore this email." +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:5 +#, python-format +msgid "" +"email explanation how to use new %(password)s for %(username)s\n" +"with the %(key_link)s" +msgstr "" +"To change your password, please follow these steps:\n" +"* visit this link: %(key_link)s\n" +"* login with user name %(username)s and password %(password)s\n" +"* go to your user profile and set the password to something you can remember" + +#: forum/skins/default/templates/authopenid/signin.html:5 +#: forum/skins/default/templates/authopenid/signin.html:21 +msgid "User login" +msgstr "User login" + +#: forum/skins/default/templates/authopenid/signin.html:28 +#, python-format +msgid "" +"\n" +" Your answer to %(title)s %(summary)s will be posted once you " +"log in\n" +" " +msgstr "" +"\n" +"Your answer to \"%(title)s %(summary)s...\" is saved and will be " +"posted once you log in." + +#: forum/skins/default/templates/authopenid/signin.html:35 +#, python-format +msgid "" +"Your question \n" +" %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" +"Your question \"%(title)s %(summary)s...\" is saved and will be " +"posted once you log in." + +#: forum/skins/default/templates/authopenid/signin.html:42 +msgid "Click to sign in through any of these services." +msgstr "" +"

Please select your favorite login method below." +"

External login services use OpenID technology, where your password " +"always stays confidential between you and your login provider and you don't " +"have to remember another one.

" + +# msgid "Click to sign in through any of these services." +# msgstr "" +# "

Please select your favorite login method +# below." +# "

External login services use OpenID technology, where your password " +# "always stays confidential between you and your login provider and you don't +# " +# "have to remember another one. " +# "Askbot option requires your login name and " +# "password entered here.

" +#: forum/skins/default/templates/authopenid/signin.html:144 +msgid "Enter your Provider user name" +msgstr "" +"Enter your Provider user name
(or " +"select another login method above)" + +#: forum/skins/default/templates/authopenid/signin.html:151 +msgid "" +"Enter your OpenID " +"web address" +msgstr "" +"Enter your OpenID web address
(or choose " +"another login method above)" + +#: forum/skins/default/templates/authopenid/signin.html:153 +#: forum/skins/default/templates/authopenid/signin.html:166 +msgid "Login" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:157 +msgid "Enter your login name and password" +msgstr "" +"Enter your Askbot login and password
(or select your OpenID provider above)" + +#: forum/skins/default/templates/authopenid/signin.html:161 +msgid "Login name" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:163 +msgid "Password" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:167 +msgid "Create account" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:178 +msgid "Why use OpenID?" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:181 +msgid "with openid it is easier" +msgstr "With the OpenID you don't need to create new username and password." + +#: forum/skins/default/templates/authopenid/signin.html:184 +msgid "reuse openid" +msgstr "You can safely re-use the same login for all OpenID-enabled websites." + +#: forum/skins/default/templates/authopenid/signin.html:187 +msgid "openid is widely adopted" +msgstr "" +"There are > 160,000,000 OpenID account in use. Over 10,000 sites are OpenID-" +"enabled." + +#: forum/skins/default/templates/authopenid/signin.html:190 +msgid "openid is supported open standard" +msgstr "OpenID is based on an open standard, supported by many organizations." + +#: forum/skins/default/templates/authopenid/signin.html:195 +msgid "Find out more" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:196 +msgid "Get OpenID" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:4 +msgid "Signup" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:8 +msgid "Create login name and password" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:10 +msgid "Traditional signup info" +msgstr "" +"If you prefer, create your forum login name and " +"password here. However, please keep in mind that we also support " +"OpenID login method. With OpenID you can " +"simply reuse your external login (e.g. Gmail or AOL) without ever sharing " +"your login details with anyone and having to remember yet another password." + +#: forum/skins/default/templates/authopenid/signup.html:25 +msgid "" +"Please read and type in the two words below to help us prevent automated " +"account creation." +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:27 +msgid "Create Account" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:28 +msgid "or" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:29 +msgid "return to OpenID login" +msgstr "" + +#: forum/skins/default/templates/fbconnect/xd_receiver.html:5 +#, python-format +msgid "Connect to %(APP_SHORT_NAME)s with Facebook!" +msgstr "" + +#: forum/templatetags/extra_filters.py:100 +msgid "no items in counter" +msgstr "no" + +#: forum/templatetags/extra_tags.py:53 +#, python-format +msgid "%(username)s gravatar image" +msgstr "" + +#: forum/templatetags/extra_tags.py:178 forum/templatetags/extra_tags.py:205 +msgid "reputation points" +msgstr "karma" + +#: forum/templatetags/extra_tags.py:265 +msgid "2 days ago" +msgstr "" + +#: forum/templatetags/extra_tags.py:267 +msgid "yesterday" +msgstr "" + +#: forum/templatetags/extra_tags.py:269 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/templatetags/extra_tags.py:271 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/utils/forms.py:30 +msgid "this field is required" +msgstr "" + +#: forum/utils/forms.py:45 +msgid "choose a username" +msgstr "Choose screen name" + +#: forum/utils/forms.py:50 +msgid "user name is required" +msgstr "" + +#: forum/utils/forms.py:51 +msgid "sorry, this name is taken, please choose another" +msgstr "" + +#: forum/utils/forms.py:52 +msgid "sorry, this name is not allowed, please choose another" +msgstr "" + +#: forum/utils/forms.py:53 +msgid "sorry, there is no user with this name" +msgstr "" + +#: forum/utils/forms.py:54 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" + +#: forum/utils/forms.py:55 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "" + +#: forum/utils/forms.py:109 +msgid "your email address" +msgstr "Your email (never shared)" + +#: forum/utils/forms.py:110 +msgid "email address is required" +msgstr "" + +#: forum/utils/forms.py:111 +msgid "please enter a valid email address" +msgstr "" + +#: forum/utils/forms.py:112 +msgid "this email is already used by someone else, please choose another" +msgstr "" + +#: forum/utils/forms.py:140 +msgid "choose password" +msgstr "Password" + +#: forum/utils/forms.py:141 +msgid "password is required" +msgstr "" + +#: forum/utils/forms.py:144 +msgid "retype password" +msgstr "Password (please retype)" + +#: forum/utils/forms.py:145 +msgid "please, retype your password" +msgstr "" + +#: forum/utils/forms.py:146 +msgid "sorry, entered passwords did not match, please try again" +msgstr "" + +#: forum/views/commands.py:209 +#, python-format +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "" +"Your subscription is saved, but email address %(email)s needs to be " +"validated, please see more details here" + +#: forum/views/commands.py:217 +msgid "email update frequency has been set to daily" +msgstr "" + +#: forum/views/meta.py:35 +msgid "Q&A forum feedback" +msgstr "" + +#: forum/views/meta.py:36 +msgid "Thanks for the feedback!" +msgstr "" + +#: forum/views/meta.py:44 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "" + +#: forum/views/users.py:867 forum/views/users.py:871 +msgid "changes saved" +msgstr "" + +#: forum/views/users.py:877 +msgid "email updates canceled" +msgstr "" + +#: forum/views/users.py:908 +msgid "user profile" +msgstr "" + +#: forum/views/users.py:909 +msgid "user profile overview" +msgstr "" + +#: forum/views/users.py:916 +msgid "recent user activity" +msgstr "" + +#: forum/views/users.py:917 +msgid "profile - recent activity" +msgstr "" + +#: forum/views/users.py:926 +msgid "profile - responses" +msgstr "" + +#: forum/views/users.py:934 +msgid "user reputation in the community" +msgstr "user karma" + +#: forum/views/users.py:935 +msgid "profile - user reputation" +msgstr "Profile - User's Karma" + +#: forum/views/users.py:941 +msgid "favorite questions" +msgstr "" + +#: forum/views/users.py:942 +msgid "users favorite questions" +msgstr "" + +#: forum/views/users.py:943 +msgid "profile - favorite questions" +msgstr "" + +#: forum/views/users.py:952 +msgid "profile - votes" +msgstr "" + +#: forum/views/users.py:961 +msgid "profile - email subscriptions" +msgstr "" + +#: forum/views/writers.py:70 +msgid "uploading images is limited to users with >60 reputation points" +msgstr "sorry, file uploading requires karma >60" + +#: forum/views/writers.py:72 +msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" +msgstr "" + +#: forum/views/writers.py:74 +#, python-format +msgid "maximum upload file size is %sK" +msgstr "" + +#: forum/views/writers.py:76 +#, python-format +msgid "" +"Error uploading file. Please contact the site administrator. Thank you. %s" +msgstr "" + +#: forum_modules/authentication/auth.py:27 +msgid "Email Validation" +msgstr "" + +#: forum_modules/authentication/auth.py:38 +msgid "Thank you, your email is now validated." +msgstr "" + +#: forum_modules/authentication/auth.py:62 +msgid "Your password was changed" +msgstr "" + +#: forum_modules/authentication/auth.py:64 +msgid "New password set" +msgstr "New password created" + +#: forum_modules/authentication/auth.py:130 +#, python-format +msgid "Welcome back %s, you are now logged in" +msgstr "" + +#: forum_modules/books/urls.py:7 forum_modules/books/urls.py:8 +#: forum_modules/books/urls.py:9 +msgid "books/" +msgstr "" + +#~ msgid "please login" +#~ msgstr "please sign-in" + +#~ msgid "welcome to website" +#~ msgstr "Welcome to Q&A forum" + +#~ msgid "Recent awards" +#~ msgstr "Recent badges" + +#~ msgid "all awards" +#~ msgstr "all badges" + +#~ msgid "complete list of questions" +#~ msgstr "list of all questions" + +#~ msgid "popular tags" +#~ msgstr "tags" + +#~ msgid "list of unanswered questions" +#~ msgstr "unanswered questions" + +#~ msgid "" +#~ " have total %(q_num)s questions containing %(searchtitle)s in full text " +#~ msgid_plural "" +#~ " have total %(q_num)s questions containing %(searchtitle)s in full text " +#~ msgstr[0] "" +#~ "
%(q_num)s

question containing " +#~ "%(searchtitle)s

" +#~ msgstr[1] "" +#~ "
%(q_num)s

questions containing " +#~ "%(searchtitle)s

" + +#~ msgid " have total %(q_num)s questions containing %(searchtitle)s " +#~ msgid_plural " have total %(q_num)s questions containing %(searchtitle)s " +#~ msgstr[0] "" +#~ "
%(q_num)s

question with title " +#~ "containing %(searchtitle)s

" +#~ msgstr[1] "" +#~ "
%(q_num)s

questions with title " +#~ "containing %(searchtitle)s

" + +#~ msgid " have total %(q_num)s unanswered questions " +#~ msgid_plural " have total %(q_num)s unanswered questions " +#~ msgstr[0] "" +#~ "
%(q_num)s
questions without " +#~ "accepted answers" +#~ msgstr[1] "" +#~ "
%(q_num)s
questions without " +#~ "accepted answers" + +#~ msgid "Most recently answered ones are shown first." +#~ msgstr "Most recently answered questions are shown first." + +#~ msgid "Questions sorted by number of responses." +#~ msgstr "Questions sorted by the number of answers." + +#~ msgid "Most answered questions are shown first." +#~ msgstr " " + +#~ msgid "avatar, see %(gravatar_faq_url)s" +#~ msgstr "gravatar" + +#~ msgid "" +#~ "Sincerely,
\n" +#~ " Forum Administrator" +#~ msgstr "" +#~ "Sincerely,\n" +#~ "Q&A Forum Administrator" + +#~ msgid "" +#~ "\n" +#~ " have total %(q_num)s unanswered questions\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " have total %(q_num)s unanswered questions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "
%(q_num)s

question without an " +#~ "accepted answer

" +#~ msgstr[1] "" +#~ "\n" +#~ "
%(q_num)s

questions without an " +#~ "accepted answer

" + +#~ msgid "" +#~ "\n" +#~ " have total %(q_num)s questions\n" +#~ " " +#~ msgid_plural "" +#~ "\n" +#~ " have total %(q_num)s questions\n" +#~ " " +#~ msgstr[0] "" +#~ "\n" +#~ "
%(q_num)s

question

" +#~ msgstr[1] "" +#~ "\n" +#~ "
%(q_num)s

questions

" diff --git a/askbot/locale/zh-cn/LC_MESSAGES/django.mo b/askbot/locale/zh-cn/LC_MESSAGES/django.mo new file mode 100644 index 00000000..a73a9675 Binary files /dev/null and b/askbot/locale/zh-cn/LC_MESSAGES/django.mo differ diff --git a/askbot/locale/zh-cn/LC_MESSAGES/django.po b/askbot/locale/zh-cn/LC_MESSAGES/django.po new file mode 100644 index 00000000..e08a05d2 --- /dev/null +++ b/askbot/locale/zh-cn/LC_MESSAGES/django.po @@ -0,0 +1,4531 @@ +# Original chinese localization of CNPROG package. +# Copyright (C) 2009 Gang Chen +# This file is distributed under the same license as the CNPROG package. +# Evgeny Fadeev , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-09 19:43-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" + +#: django_authopenid/forms.py:71 django_authopenid/views.py:132 +#, fuzzy +msgid "i-names are not supported" +msgstr "基本的HTML标签也是支æŒçš„" + +#: django_authopenid/forms.py:134 +msgid "Account with this name already exists on the forum" +msgstr "" + +#: django_authopenid/forms.py:135 +msgid "can't have two logins to the same account yet, sorry." +msgstr "" + +#: django_authopenid/forms.py:157 +msgid "Please enter valid username and password (both are case-sensitive)." +msgstr "" + +#: django_authopenid/forms.py:160 django_authopenid/forms.py:210 +msgid "This account is inactive." +msgstr "" + +#: django_authopenid/forms.py:162 +#, fuzzy +msgid "Login failed." +msgstr "用户å" + +#: django_authopenid/forms.py:164 +#, fuzzy +msgid "Please enter username and password" +msgstr "使用å¸å·å¯†ç ç™»å½•" + +#: django_authopenid/forms.py:166 +#, fuzzy +msgid "Please enter your password" +msgstr "é‡è®¾å¯†ç " + +#: django_authopenid/forms.py:168 +#, fuzzy +msgid "Please enter user name" +msgstr "请帮助我们回答" + +#: django_authopenid/forms.py:206 +msgid "" +"Please enter a valid username and password. Note that " +"both fields are case-sensitive." +msgstr "" + +#: django_authopenid/forms.py:229 +#, fuzzy +msgid "Current password" +msgstr "确认密ç " + +#: django_authopenid/forms.py:240 +msgid "" +"Old password is incorrect. Please enter the correct " +"password." +msgstr "" + +#: django_authopenid/forms.py:305 +msgid "Your user name (required)" +msgstr "" + +#: django_authopenid/forms.py:320 +msgid "Incorrect username." +msgstr "选择一个用户å" + +#: django_authopenid/urls.py:23 django_authopenid/urls.py:24 +#: django_authopenid/urls.py:25 django_authopenid/urls.py:27 +#: fbconnect/urls.py:12 fbconnect/urls.py:13 fbconnect/urls.py:14 +msgid "signin/" +msgstr "" + +#: django_authopenid/urls.py:24 fbconnect/urls.py:13 fbconnect/urls.py:17 +#, fuzzy +msgid "newquestion/" +msgstr "æé—®" + +#: django_authopenid/urls.py:25 fbconnect/urls.py:14 fbconnect/urls.py:18 +#, fuzzy +msgid "newanswer/" +msgstr "回答" + +#: django_authopenid/urls.py:26 +msgid "signout/" +msgstr "" + +#: django_authopenid/urls.py:27 +msgid "complete/" +msgstr "" + +#: django_authopenid/urls.py:29 fbconnect/urls.py:16 fbconnect/urls.py:17 +#: fbconnect/urls.py:18 +#, fuzzy +msgid "register/" +msgstr "确认" + +#: django_authopenid/urls.py:30 +#, fuzzy +msgid "signup/" +msgstr "注册å¸å·" + +#: django_authopenid/urls.py:32 +msgid "sendpw/" +msgstr "" + +#: django_authopenid/urls.py:33 django_authopenid/urls.py:37 +#, fuzzy +msgid "password/" +msgstr "密ç " + +#: django_authopenid/urls.py:33 +msgid "confirm/" +msgstr "" + +#: django_authopenid/urls.py:38 django_authopenid/urls.py:39 +#: django_authopenid/urls.py:40 django_authopenid/urls.py:41 +msgid "email/" +msgstr "" + +#: django_authopenid/urls.py:38 +msgid "validate/" +msgstr "" + +# user_info.html +#: django_authopenid/urls.py:39 +#, fuzzy +msgid "change/" +msgstr "年龄" + +#: django_authopenid/urls.py:40 +msgid "sendkey/" +msgstr "" + +#: django_authopenid/urls.py:41 +msgid "verify/" +msgstr "" + +#: django_authopenid/urls.py:42 +#, fuzzy +msgid "openid/" +msgstr "用åŒä¸€ä¸ªå¸å·å¯ç™»å½•äº’è”网所有激活OpenID的网站" + +#: django_authopenid/urls.py:43 forum/urls.py:52 forum/urls.py:56 +msgid "delete/" +msgstr "删除" + +#: django_authopenid/urls.py:51 +msgid "external-login/forgot-password/" +msgstr "" + +#: django_authopenid/urls.py:54 +msgid "external-login/signup/" +msgstr "" + +#: django_authopenid/views.py:139 +#, python-format +msgid "OpenID %(openid_url)s is invalid" +msgstr "" + +#: django_authopenid/views.py:614 +msgid "Welcome email subject line" +msgstr "" + +#: django_authopenid/views.py:720 +#, fuzzy +msgid "Password changed." +msgstr "密ç " + +#: django_authopenid/views.py:732 django_authopenid/views.py:738 +#, python-format +msgid "your email needs to be validated see %(details_url)s" +msgstr "" + +#: django_authopenid/views.py:759 +msgid "Email verification subject line" +msgstr "" + +#: django_authopenid/views.py:850 +msgid "your email was not changed" +msgstr "" + +#: django_authopenid/views.py:898 django_authopenid/views.py:1056 +#, python-format +msgid "No OpenID %s found associated in our database" +msgstr "" + +#: django_authopenid/views.py:902 django_authopenid/views.py:1063 +#, python-format +msgid "The OpenID %s isn't associated to current user logged in" +msgstr "" + +#: django_authopenid/views.py:910 +msgid "Email Changed." +msgstr "" + +#: django_authopenid/views.py:988 +msgid "This OpenID is already associated with another account." +msgstr "" + +#: django_authopenid/views.py:993 +#, python-format +msgid "OpenID %s is now associated with your account." +msgstr "" + +# todo please check this in chinese +#: django_authopenid/views.py:1066 +#, fuzzy +msgid "Account deleted." +msgstr "å–消" + +#: django_authopenid/views.py:1118 +#, fuzzy +msgid "Request for new password" +msgstr "é‡è®¾å¯†ç " + +#: django_authopenid/views.py:1132 +#, fuzzy +msgid "A new password and the activation link were sent to your email address." +msgstr "和您的邮件地å€æ˜¯ç»‘定的" + +#: django_authopenid/views.py:1164 +#, python-format +msgid "" +"Could not change password. Confirmation key '%s' is not " +"registered." +msgstr "" + +#: django_authopenid/views.py:1174 +msgid "" +"Can not change password. User don't exist anymore in our " +"database." +msgstr "" + +#: django_authopenid/views.py:1184 +#, python-format +msgid "Password changed for %s. You may now sign in." +msgstr "" + +#: forum/auth.py:505 +#, fuzzy +msgid "Your question and all of it's answers have been deleted" +msgstr "你正在查看的问题或者回答已ç»è¢«åˆ é™¤ï¼›" + +#: forum/auth.py:507 +#, fuzzy +msgid "Your question has been deleted" +msgstr "你正在查看的问题或者回答已ç»è¢«åˆ é™¤ï¼›" + +#: forum/auth.py:510 +#, fuzzy +msgid "The question and all of it's answers have been deleted" +msgstr "你正在查看的问题或者回答已ç»è¢«åˆ é™¤ï¼›" + +#: forum/auth.py:512 +#, fuzzy +msgid "The question has been deleted" +msgstr "你正在查看的问题或者回答已ç»è¢«åˆ é™¤ï¼›" + +#: forum/const.py:8 +msgid "duplicate question" +msgstr "完全é‡å¤çš„问题" + +# chinese translation is domain specific +#: forum/const.py:9 +#, fuzzy +msgid "question is off-topic or not relevant" +msgstr "ä¸æ˜¯ç¼–程技术问题" + +#: forum/const.py:10 +msgid "too subjective and argumentative" +msgstr "太主观性ã€å¼•èµ·äº‰åµçš„问题" + +#: forum/const.py:11 +#, fuzzy +msgid "not a real question" +msgstr "我è¦æé—®" + +#: forum/const.py:12 +msgid "the question is answered, right answer was accepted" +msgstr "问题已ç»è§£å†³ï¼Œå·²å¾—到正确答案" + +#: forum/const.py:13 +#, fuzzy +msgid "question is not relevant or outdated" +msgstr "å·²ç»è¿‡æ—¶ã€ä¸å¯é‡çŽ°çš„问题" + +#: forum/const.py:14 +#, fuzzy +msgid "question contains offensive or malicious remarks" +msgstr "æ¶æ„言论" + +#: forum/const.py:15 +msgid "spam or advertising" +msgstr "垃圾广告" + +#: forum/const.py:16 +msgid "too localized" +msgstr "" + +#: forum/const.py:37 forum/skins/default/templates/questions.html:70 +#: forum/skins/default/templates/questions.html:75 +msgid "newest" +msgstr "最新问题" + +#: forum/const.py:38 forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/users.html:28 +msgid "oldest" +msgstr "最先加入" + +#: forum/const.py:39 forum/skins/default/templates/questions.html:89 +#: forum/skins/default/templates/questions.html:94 +#, fuzzy +msgid "active" +msgstr "活跃问题" + +#: forum/const.py:40 forum/skins/default/templates/questions.html:83 +#, fuzzy +msgid "inactive" +msgstr "活跃问题" + +#: forum/const.py:41 +msgid "hottest" +msgstr "热门问题" + +#: forum/const.py:42 +#, fuzzy +msgid "coldest" +msgstr "最先加入" + +# "最有价值问题" +# "最新问题" +#: forum/const.py:43 +msgid "most voted" +msgstr "最有价值的问题" + +# "最有价值问题" +# "最新问题" +#: forum/const.py:44 +#, fuzzy +msgid "least voted" +msgstr "最有价值的问题" + +#: forum/const.py:45 +#, fuzzy +msgid "relevance" +msgstr "设置" + +#: forum/const.py:52 forum/skins/default/templates/questions.html:52 +msgid "all" +msgstr "" + +#: forum/const.py:53 forum/skins/default/templates/questions.html:53 +#, fuzzy +msgid "unanswered" +msgstr "回答" + +#: forum/const.py:54 forum/skins/default/templates/questions.html:55 +#, fuzzy +msgid "favorite" +msgstr "收è—" + +#: forum/const.py:97 +msgid "question" +msgstr "æé—®" + +#: forum/const.py:98 forum/skins/default/templates/book.html:110 +msgid "answer" +msgstr "回答" + +#: forum/const.py:99 +msgid "commented question" +msgstr "评论问题" + +#: forum/const.py:100 +#, fuzzy +msgid "commented answer" +msgstr "修改回答" + +#: forum/const.py:101 +msgid "edited question" +msgstr "修改问题" + +#: forum/const.py:102 +msgid "edited answer" +msgstr "修改回答" + +#: forum/const.py:103 +msgid "received award" +msgstr "获奖" + +#: forum/const.py:104 +msgid "marked best answer" +msgstr "标记最佳答案" + +#: forum/const.py:105 +msgid "upvoted" +msgstr "投赞æˆç¥¨" + +#: forum/const.py:106 +msgid "downvoted" +msgstr "投å对票" + +#: forum/const.py:107 +msgid "canceled vote" +msgstr "撤销投票" + +#: forum/const.py:108 +msgid "deleted question" +msgstr "删除问题" + +#: forum/const.py:109 +msgid "deleted answer" +msgstr "删除回答" + +#: forum/const.py:110 +msgid "marked offensive" +msgstr "标记垃圾帖" + +#: forum/const.py:111 +msgid "updated tags" +msgstr "更新标签" + +#: forum/const.py:112 +msgid "selected favorite" +msgstr "收è—" + +#: forum/const.py:113 +msgid "completed user profile" +msgstr "完æˆä¸ªäººæ‰€æœ‰èµ„æ–™" + +#: forum/const.py:114 +msgid "email update sent to user" +msgstr "" + +#: forum/const.py:118 +#, fuzzy +msgid "question_answered" +msgstr "æ问时间" + +#: forum/const.py:119 +#, fuzzy +msgid "question_commented" +msgstr "æ问时间" + +#: forum/const.py:120 +msgid "answer_commented" +msgstr "" + +#: forum/const.py:121 +msgid "answer_accepted" +msgstr "" + +#: forum/const.py:125 +msgid "[closed]" +msgstr "[已关闭]" + +#: forum/const.py:126 +msgid "[deleted]" +msgstr "[已删除]" + +#: forum/const.py:127 forum/views/readers.py:396 forum/views/readers.py:417 +msgid "initial version" +msgstr "åˆå§‹ç‰ˆæœ¬" + +#: forum/const.py:128 +msgid "retagged" +msgstr "更新了标签" + +#: forum/const.py:132 +msgid "exclude ignored tags" +msgstr "" + +#: forum/const.py:132 +msgid "allow only selected tags" +msgstr "" + +#: forum/feed.py:18 +msgid " - " +msgstr "-" + +#: forum/feed.py:18 +msgid "latest questions" +msgstr "最新问题" + +#: forum/forms.py:23 forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "title" +msgstr "标题" + +#: forum/forms.py:24 +msgid "please enter a descriptive title for your question" +msgstr "" +"请输入对问题具有æ述性质的标题 - “帮忙ï¼ç´§æ€¥æ±‚助ï¼â€ä¸æ˜¯å»ºè®®çš„æ问方å¼ã€‚" + +#: forum/forms.py:29 +msgid "title must be > 10 characters" +msgstr "标题的长度必须大于10" + +#: forum/forms.py:38 +msgid "content" +msgstr "内容" + +#: forum/forms.py:44 +msgid "question content must be > 10 characters" +msgstr "内容至少è¦10个字符" + +#: forum/forms.py:53 forum/skins/default/templates/header.html:28 +msgid "tags" +msgstr "标签" + +#: forum/forms.py:55 +msgid "" +"Tags are short keywords, with no spaces within. Up to five tags can be used." +msgstr "" + +#: forum/forms.py:62 forum/skins/default/templates/question_retag.html:39 +msgid "tags are required" +msgstr " 标签ä¸èƒ½ä¸ºç©ºã€‚" + +#: forum/forms.py:70 +#, fuzzy, python-format +msgid "please use %(tag_count)d tag or less" +msgid_plural "please use %(tag_count)d tags or less" +msgstr[0] "最多åªèƒ½æœ‰5个标签" +msgstr[1] "最多åªèƒ½æœ‰5个标签" + +#: forum/forms.py:79 +#, fuzzy, python-format +msgid "each tag must be shorter than %(max_chars)d character" +msgid_plural "each tag must be shorter than %(max_chars)d characters" +msgstr[0] "æ¯ä¸ªæ ‡ç­¾çš„长度ä¸è¶…过20" +msgstr[1] "æ¯ä¸ªæ ‡ç­¾çš„长度ä¸è¶…过20" + +#: forum/forms.py:87 +msgid "use-these-chars-in-tags" +msgstr "" + +# index.html +#: forum/forms.py:97 +#: forum/skins/default/templates/post_contributor_info.html:7 +#: forum/skins/default/templates/question_summary_list_roll.html:26 +#: forum/skins/default/templates/question_summary_list_roll.html:38 +msgid "community wiki" +msgstr "社区Wiki" + +#: forum/forms.py:98 +msgid "" +"if you choose community wiki option, the question and answer do not generate " +"points and name of author will not be shown" +msgstr "选择社区wiki模å¼ï¼Œé—®ç­”ä¸è®¡ç®—积分,签å也ä¸æ˜¾ç¤ºä½œè€…ä¿¡æ¯" + +#: forum/forms.py:114 +msgid "update summary:" +msgstr "更新概è¦ï¼š" + +#: forum/forms.py:115 +msgid "" +"enter a brief summary of your revision (e.g. fixed spelling, grammar, " +"improved style, this field is optional)" +msgstr "" +"输入本次修改的简å•æ¦‚述(如:修改了别字,修正了语法,改进了样å¼ç­‰ã€‚éžå¿…å¡«" +"项。)" + +#: forum/forms.py:118 +msgid "Automatically accept user's contributions for the email updates" +msgstr "" + +#: forum/forms.py:209 +#, fuzzy +msgid "Your name:" +msgstr "用户å" + +#: forum/forms.py:210 +#, fuzzy +msgid "Email (not shared with anyone):" +msgstr "电å­é‚®ä»¶ï¼ˆç”¨äºŽå¤´åƒæ˜¾ç¤ºæœåŠ¡ï¼‰" + +#: forum/forms.py:211 +#, fuzzy +msgid "Your message:" +msgstr "Copyright(c)2009.CNPROG.COM" + +#: forum/forms.py:294 +msgid "this email does not have to be linked to gravatar" +msgstr "ä¸ä¼šå…¬å¼€ï¼Œç”¨äºŽå¤´åƒæ˜¾ç¤ºæœåŠ¡" + +#: forum/forms.py:296 +#, fuzzy +msgid "Screen name" +msgstr "姓å" + +#: forum/forms.py:297 +msgid "Real name" +msgstr "真实姓å" + +#: forum/forms.py:298 +msgid "Website" +msgstr "个人网站" + +#: forum/forms.py:299 +msgid "Location" +msgstr "城市" + +#: forum/forms.py:300 +msgid "Date of birth" +msgstr "生日" + +#: forum/forms.py:300 +msgid "will not be shown, used to calculate age, format: YYYY-MM-DD" +msgstr "ä¸ä¼šå…¬å¼€ï¼Œåªä¼šæ˜¾ç¤ºæ‚¨çš„年龄,格å¼ä¸ºï¼šYYYY-MM-DD" + +#: forum/forms.py:301 forum/skins/default/templates/account_settings.html:21 +#: forum/skins/default/templates/authopenid/settings.html:21 +msgid "Profile" +msgstr "个人简介" + +#: forum/forms.py:332 forum/forms.py:333 +msgid "this email has already been registered, please use another one" +msgstr "该电å­é‚®ä»¶å·²è¢«æ³¨å†Œï¼Œè¯·é€‰æ‹©å¦ä¸€ä¸ªå†è¯•ã€‚" + +#: forum/forms.py:339 +msgid "Choose email tag filter" +msgstr "" + +#: forum/forms.py:355 forum/forms.py:356 +msgid "weekly" +msgstr "" + +#: forum/forms.py:355 forum/forms.py:356 +#, fuzzy +msgid "no email" +msgstr "æ›´æ¢ç”µå­é‚®ä»¶" + +#: forum/forms.py:356 +msgid "daily" +msgstr "" + +#: forum/forms.py:371 +msgid "Asked by me" +msgstr "" + +#: forum/forms.py:374 +msgid "Answered by me" +msgstr "" + +#: forum/forms.py:377 +msgid "Individually selected" +msgstr "" + +#: forum/forms.py:380 +msgid "Entire forum (tag filtered)" +msgstr "" + +#: forum/forms.py:434 +msgid "okay, let's try!" +msgstr "" + +#: forum/forms.py:435 +msgid "no community email please, thanks" +msgstr "" + +#: forum/forms.py:438 +msgid "please choose one of the options above" +msgstr "" + +#: forum/urls.py:28 +#, fuzzy +msgid "upfiles/" +msgstr "个人资料" + +# footer.html +#: forum/urls.py:33 +#, fuzzy +msgid "about/" +msgstr "关于本站" + +#: forum/urls.py:34 +#, fuzzy +msgid "faq/" +msgstr "常è§é—®é¢˜" + +#: forum/urls.py:35 +#, fuzzy +msgid "privacy/" +msgstr "éšç§æ”¿ç­–" + +#: forum/urls.py:36 +#, fuzzy +msgid "logout/" +msgstr "退出登录" + +#: forum/urls.py:37 forum/urls.py:38 forum/urls.py:39 forum/urls.py:56 +#, fuzzy +msgid "answers/" +msgstr "回答" + +#: forum/urls.py:37 forum/urls.py:49 forum/urls.py:52 forum/urls.py:56 +#, fuzzy +msgid "comments/" +msgstr "评论" + +#: forum/urls.py:38 forum/urls.py:43 forum/urls.py:78 +#: forum/skins/default/templates/user_info.html:47 +#, fuzzy +msgid "edit/" +msgstr "编辑" + +#: forum/urls.py:39 forum/urls.py:48 +#, fuzzy +msgid "revisions/" +msgstr "版本" + +#: forum/urls.py:40 forum/urls.py:41 forum/urls.py:42 forum/urls.py:43 +#: forum/urls.py:44 forum/urls.py:45 forum/urls.py:46 forum/urls.py:47 +#: forum/urls.py:48 forum/urls.py:49 forum/urls.py:52 +#, fuzzy +msgid "questions/" +msgstr "问题" + +#: forum/urls.py:41 forum_modules/books/urls.py:8 +#, fuzzy +msgid "ask/" +msgstr "æ问于" + +#: forum/urls.py:42 +#, fuzzy +msgid "unanswered/" +msgstr "回答" + +#: forum/urls.py:44 +#, fuzzy +msgid "close/" +msgstr "关闭" + +#: forum/urls.py:45 +#, fuzzy +msgid "reopen/" +msgstr "打开" + +#: forum/urls.py:46 +#, fuzzy +msgid "answer/" +msgstr "回答" + +#: forum/urls.py:47 +#, fuzzy +msgid "vote/" +msgstr "票" + +#: forum/urls.py:50 +#, fuzzy +msgid "command/" +msgstr "评论" + +#: forum/urls.py:60 forum/views/readers.py:265 +#, fuzzy +msgid "question/" +msgstr "æé—®" + +#: forum/urls.py:61 forum/urls.py:62 +#, fuzzy +msgid "tags/" +msgstr "标签" + +#: forum/urls.py:64 forum/urls.py:68 +msgid "mark-tag/" +msgstr "" + +#: forum/urls.py:64 +msgid "interesting/" +msgstr "" + +#: forum/urls.py:68 +msgid "ignored/" +msgstr "" + +#: forum/urls.py:72 +msgid "unmark-tag/" +msgstr "" + +#: forum/urls.py:76 forum/urls.py:78 forum/urls.py:79 +#, fuzzy +msgid "users/" +msgstr "用户" + +#: forum/urls.py:77 +msgid "moderate-user/" +msgstr "" + +#: forum/urls.py:80 forum/urls.py:81 +#, fuzzy +msgid "badges/" +msgstr "奖牌榜" + +#: forum/urls.py:82 +msgid "messages/" +msgstr "" + +#: forum/urls.py:82 +msgid "markread/" +msgstr "" + +#: forum/urls.py:84 +msgid "nimda/" +msgstr "" + +#: forum/urls.py:86 +msgid "upload/" +msgstr "" + +#: forum/urls.py:87 +#, fuzzy +msgid "search/" +msgstr "æœç´¢" + +#: forum/urls.py:88 +#, fuzzy +msgid "feedback/" +msgstr "问题å馈" + +#: forum/urls.py:89 forum/urls.py:90 +#, fuzzy +msgid "account/" +msgstr "æ–°å¸å·" + +# base_content.html +#: forum/importers/stackexchange/management/commands/load_stackexchange.py:124 +#, fuzzy +msgid "Congratulations, you are now an Administrator" +msgstr "æ­å–œæ‚¨ï¼Œç¤¾åŒºç»™æ‚¨é¢å‘了奖牌" + +#: forum/management/commands/send_email_alerts.py:236 +msgid "email update message subject" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:238 +#, python-format +msgid "%(name)s, this is an update message header for %(num)d question" +msgid_plural "%(name)s, this is an update message header for %(num)d questions" +msgstr[0] "" +msgstr[1] "" + +#: forum/management/commands/send_email_alerts.py:255 +#, fuzzy +msgid "new question" +msgstr "æé—®" + +#: forum/management/commands/send_email_alerts.py:272 +msgid "" +"Please visit the forum and see what's new! Could you spread the word about " +"it - can somebody you know help answering those questions or benefit from " +"posting one?" +msgstr "" + +#: forum/management/commands/send_email_alerts.py:284 +msgid "" +"Your most frequent subscription setting is 'daily' on selected questions. If " +"you are receiving more than one email per dayplease tell about this issue to " +"the forum administrator." +msgstr "" + +#: forum/management/commands/send_email_alerts.py:290 +msgid "" +"Your most frequent subscription setting is 'weekly' if you are receiving " +"this email more than once a week please report this issue to the forum " +"administrator." +msgstr "" + +#: forum/management/commands/send_email_alerts.py:296 +msgid "" +"There is a chance that you may be receiving links seen before - due to a " +"technicality that will eventually go away. " +msgstr "" + +#: forum/management/commands/send_email_alerts.py:311 +#, python-format +msgid "" +"go to %(link)s to change frequency of email updates or %(email)s " +"administrator" +msgstr "" + +#: forum/middleware/anon_user.py:34 +#, python-format +msgid "First time here? Check out the FAQ!" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "disciplined" +msgstr "" + +#: forum/migrations/0005_install_badges.py:10 +msgid "Deleted own post with score of 3 or higher" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Peer Pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "peer-pressure" +msgstr "" + +#: forum/migrations/0005_install_badges.py:11 +msgid "Deleted own post with score of -3 or lower" +msgstr "" + +#: forum/migrations/0005_install_badges.py:12 +#, fuzzy +msgid "Nice answer" +msgstr "修改回答" + +#: forum/migrations/0005_install_badges.py:12 +#, fuzzy +msgid "nice-answer" +msgstr "回答" + +#: forum/migrations/0005_install_badges.py:12 +#, fuzzy +msgid "Answer voted up 10 times" +msgstr "该用户投的赞æˆç¥¨æ€»æ•°" + +#: forum/migrations/0005_install_badges.py:13 +#, fuzzy +msgid "Nice Question" +msgstr "问题列表" + +#: forum/migrations/0005_install_badges.py:13 +#, fuzzy +msgid "nice-question" +msgstr "æé—®" + +#: forum/migrations/0005_install_badges.py:13 +#, fuzzy +msgid "Question voted up 10 times" +msgstr "该用户投的赞æˆç¥¨æ€»æ•°" + +#: forum/migrations/0005_install_badges.py:14 +#, fuzzy +msgid "Pundit" +msgstr "编辑" + +#: forum/migrations/0005_install_badges.py:14 +#, fuzzy +msgid "pundit" +msgstr "编辑" + +#: forum/migrations/0005_install_badges.py:14 +msgid "Left 10 comments with score of 10 or more" +msgstr "" + +#: forum/migrations/0005_install_badges.py:15 +#, fuzzy +msgid "Popular Question" +msgstr "现在æé—®" + +#: forum/migrations/0005_install_badges.py:15 +#, fuzzy +msgid "popular-question" +msgstr "æé—®" + +#: forum/migrations/0005_install_badges.py:15 +msgid "Asked a question with 1,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "Citizen patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "citizen-patrol" +msgstr "" + +#: forum/migrations/0005_install_badges.py:16 +msgid "First flagged post" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "Cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "cleanup" +msgstr "" + +#: forum/migrations/0005_install_badges.py:17 +msgid "First rollback" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "Critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +msgid "critic" +msgstr "" + +#: forum/migrations/0005_install_badges.py:18 +#, fuzzy +msgid "First down vote" +msgstr "投å对票" + +#: forum/migrations/0005_install_badges.py:19 +#, fuzzy +msgid "Editor" +msgstr "编辑" + +#: forum/migrations/0005_install_badges.py:19 +#, fuzzy +msgid "editor" +msgstr "编辑" + +#: forum/migrations/0005_install_badges.py:19 +msgid "First edit" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +msgid "Organizer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:20 +#, fuzzy +msgid "organizer" +msgstr "您的回答" + +#: forum/migrations/0005_install_badges.py:20 +msgid "First retag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "Scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +msgid "scholar" +msgstr "" + +#: forum/migrations/0005_install_badges.py:21 +#, fuzzy +msgid "First accepted answer on your own question" +msgstr "ä¸æ˜¯ä¸€ä¸ªå¯ä»¥å›žç­”的“问题â€" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "student" +msgstr "" + +#: forum/migrations/0005_install_badges.py:22 +msgid "Asked first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:23 +#, fuzzy +msgid "Supporter" +msgstr "投赞æˆç¥¨" + +#: forum/migrations/0005_install_badges.py:23 +#, fuzzy +msgid "supporter" +msgstr "投赞æˆç¥¨" + +#: forum/migrations/0005_install_badges.py:23 +#, fuzzy +msgid "First up vote" +msgstr "投赞æˆç¥¨" + +#: forum/migrations/0005_install_badges.py:24 +#, fuzzy +msgid "Teacher" +msgstr "æœç´¢" + +#: forum/migrations/0005_install_badges.py:24 +#, fuzzy +msgid "teacher" +msgstr "æœç´¢" + +#: forum/migrations/0005_install_badges.py:24 +msgid "Answered first question with at least one up vote" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "Autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +msgid "autobiographer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:25 +#, fuzzy +msgid "Completed all user profile fields" +msgstr "完æˆä¸ªäººæ‰€æœ‰èµ„æ–™" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Self-Learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "self-learner" +msgstr "" + +#: forum/migrations/0005_install_badges.py:26 +msgid "Answered your own question with at least 3 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:27 +#, fuzzy +msgid "Great Answer" +msgstr "回答" + +#: forum/migrations/0005_install_badges.py:27 +#, fuzzy +msgid "great-answer" +msgstr "回答" + +#: forum/migrations/0005_install_badges.py:27 +#, fuzzy +msgid "Answer voted up 100 times" +msgstr "该用户投的赞æˆç¥¨æ€»æ•°" + +#: forum/migrations/0005_install_badges.py:28 +#, fuzzy +msgid "Great Question" +msgstr "给任何问题整ç†æ ‡ç­¾" + +#: forum/migrations/0005_install_badges.py:28 +#, fuzzy +msgid "great-question" +msgstr "给任何问题整ç†æ ‡ç­¾" + +#: forum/migrations/0005_install_badges.py:28 +#, fuzzy +msgid "Question voted up 100 times" +msgstr "该用户投的赞æˆç¥¨æ€»æ•°" + +#: forum/migrations/0005_install_badges.py:29 +#, fuzzy +msgid "Stellar Question" +msgstr "还有其他问题?" + +#: forum/migrations/0005_install_badges.py:29 +#, fuzzy +msgid "stellar-question" +msgstr "个问题" + +#: forum/migrations/0005_install_badges.py:29 +msgid "Question favorited by 100 users" +msgstr "" + +# close.html +#: forum/migrations/0005_install_badges.py:30 +#, fuzzy +msgid "Famous question" +msgstr "关闭问题" + +#: forum/migrations/0005_install_badges.py:30 +#, fuzzy +msgid "famous-question" +msgstr "æé—®" + +#: forum/migrations/0005_install_badges.py:30 +msgid "Asked a question with 10,000 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:31 +msgid "Actively participated in the private alpha" +msgstr "" + +#: forum/migrations/0005_install_badges.py:32 +#, fuzzy +msgid "Good Answer" +msgstr "个回答" + +#: forum/migrations/0005_install_badges.py:32 +#, fuzzy +msgid "good-answer" +msgstr "回答" + +#: forum/migrations/0005_install_badges.py:32 +#, fuzzy +msgid "Answer voted up 25 times" +msgstr "该用户投的赞æˆç¥¨æ€»æ•°" + +#: forum/migrations/0005_install_badges.py:33 +#, fuzzy +msgid "Good Question" +msgstr "问题列表" + +#: forum/migrations/0005_install_badges.py:33 +#, fuzzy +msgid "good-question" +msgstr "æé—®" + +#: forum/migrations/0005_install_badges.py:33 +#, fuzzy +msgid "Question voted up 25 times" +msgstr "该用户投的赞æˆç¥¨æ€»æ•°" + +#: forum/migrations/0005_install_badges.py:34 +#, fuzzy +msgid "Favorite Question" +msgstr "收è—" + +#: forum/migrations/0005_install_badges.py:34 +#, fuzzy +msgid "favorite-question" +msgstr "收è—" + +#: forum/migrations/0005_install_badges.py:34 +msgid "Question favorited by 25 users" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Civic duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "civic-duty" +msgstr "" + +#: forum/migrations/0005_install_badges.py:35 +msgid "Voted 300 times" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Strunk & White" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "strunk-and-white" +msgstr "" + +#: forum/migrations/0005_install_badges.py:36 +msgid "Edited 100 entries" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "generalist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:37 +msgid "Active in many different tags" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Expert" +msgstr "" + +#: forum/migrations/0005_install_badges.py:38 +#, fuzzy +msgid "expert" +msgstr "文本" + +#: forum/migrations/0005_install_badges.py:38 +msgid "Very active in one tag" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "yearling" +msgstr "" + +#: forum/migrations/0005_install_badges.py:39 +msgid "Active member for a year" +msgstr "" + +#: forum/migrations/0005_install_badges.py:40 +#, fuzzy +msgid "Notable Question" +msgstr "全部问题" + +#: forum/migrations/0005_install_badges.py:40 +#, fuzzy +msgid "notable-question" +msgstr "全部问题" + +#: forum/migrations/0005_install_badges.py:40 +msgid "Asked a question with 2,500 views" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "Enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "enlightened" +msgstr "" + +#: forum/migrations/0005_install_badges.py:41 +msgid "First answer was accepted with at least 10 up votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:42 +msgid "Actively participated in the private beta" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "Guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +msgid "guru" +msgstr "" + +#: forum/migrations/0005_install_badges.py:43 +#, fuzzy +msgid "Accepted answer and voted up 40 times" +msgstr "该用户投的赞æˆç¥¨æ€»æ•°" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "necromancer" +msgstr "" + +#: forum/migrations/0005_install_badges.py:44 +msgid "Answered a question more than 60 days later with at least 5 votes" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "Taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +msgid "taxonomist" +msgstr "" + +#: forum/migrations/0005_install_badges.py:45 +#, fuzzy +msgid "Created a tag used by 50 questions" +msgstr "打开关闭任何人的问题" + +#: forum/models/question.py:499 +#, fuzzy, python-format +msgid "%(author)s modified the question" +msgstr "由于以下原因,你è¦å…³é—­è¿™ä¸ªé—®é¢˜" + +#: forum/models/question.py:503 +#, python-format +msgid "%(people)s posted %(new_answer_count)s new answers" +msgstr "" + +#: forum/models/question.py:508 +#, fuzzy, python-format +msgid "%(people)s commented the question" +msgstr "评论问题" + +#: forum/models/question.py:513 +#, fuzzy, python-format +msgid "%(people)s commented answers" +msgstr "修改回答" + +#: forum/models/question.py:515 +#, fuzzy, python-format +msgid "%(people)s commented an answer" +msgstr "修改回答" + +#: forum/models/repute.py:13 forum/skins/default/templates/badges.html:54 +msgid "gold" +msgstr "金牌" + +#: forum/models/repute.py:14 forum/skins/default/templates/badges.html:62 +msgid "silver" +msgstr "银牌" + +#: forum/models/repute.py:15 forum/skins/default/templates/badges.html:69 +msgid "bronze" +msgstr "" + +#: forum/models/tag.py:81 +#, fuzzy +msgid "interesting" +msgstr "修改问题" + +#: forum/models/tag.py:81 +msgid "ignored" +msgstr "" + +#: forum/models/user.py:36 +msgid "Entire forum" +msgstr "" + +#: forum/models/user.py:37 +#, fuzzy +msgid "Questions that I asked" +msgstr "æ问时间" + +#: forum/models/user.py:38 +#, fuzzy +msgid "Questions that I answered" +msgstr "您正在æµè§ˆçš„问题å«æœ‰ä»¥ä¸‹æ ‡ç­¾" + +#: forum/models/user.py:39 +#, fuzzy +msgid "Individually selected questions" +msgstr "删除问题" + +#: forum/models/user.py:42 +msgid "Weekly" +msgstr "" + +#: forum/models/user.py:43 +msgid "Daily" +msgstr "" + +#: forum/models/user.py:44 +#, fuzzy +msgid "No email" +msgstr "æ›´æ¢ç”µå­é‚®ä»¶" + +#: forum/skins/default/templates/404.html:24 +msgid "Sorry, could not find the page you requested." +msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰æ‰¾åˆ°æ‚¨è¯·æ±‚的页é¢ï¼" + +#: forum/skins/default/templates/404.html:26 +msgid "This might have happened for the following reasons:" +msgstr "有å¯èƒ½æ˜¯ä»¥ä¸‹åŽŸå› å¯¼è‡´ï¼š" + +#: forum/skins/default/templates/404.html:28 +msgid "this question or answer has been deleted;" +msgstr "你正在查看的问题或者回答已ç»è¢«åˆ é™¤ï¼›" + +#: forum/skins/default/templates/404.html:29 +msgid "url has error - please check it;" +msgstr "请求的地å€æœ‰è¯¯ - 请核实原始URL地å€ï¼›" + +#: forum/skins/default/templates/404.html:30 +msgid "" +"the page you tried to visit is protected or you don't have sufficient " +"points, see" +msgstr "访问的页é¢è¢«ä¿æŠ¤æˆ–你的积分ä¸å¤Ÿï¼Œå‚è§" + +#: forum/skins/default/templates/404.html:31 +msgid "if you believe this error 404 should not have occured, please" +msgstr "如果你确信ä¸è¯¥å‡ºçŽ°404错误,请" + +#: forum/skins/default/templates/404.html:32 +msgid "report this problem" +msgstr "报告这个问题" + +#: forum/skins/default/templates/404.html:41 +#: forum/skins/default/templates/500.html:27 +msgid "back to previous page" +msgstr "返回å‰é¡µ" + +#: forum/skins/default/templates/404.html:42 +#: forum/skins/default/templates/questions.html:52 +msgid "see all questions" +msgstr "查看最新问题" + +#: forum/skins/default/templates/404.html:43 +msgid "see all tags" +msgstr "查看标签列表" + +#: forum/skins/default/templates/500.html:22 +msgid "sorry, system error" +msgstr "" + +#: forum/skins/default/templates/500.html:24 +msgid "system error log is recorded, error will be fixed as soon as possible" +msgstr "" + +#: forum/skins/default/templates/500.html:25 +msgid "please report the error to the site administrators if you wish" +msgstr "" + +#: forum/skins/default/templates/500.html:28 +#, fuzzy +msgid "see latest questions" +msgstr "最新问题" + +#: forum/skins/default/templates/500.html:29 +#, fuzzy +msgid "see tags" +msgstr "标记垃圾帖" + +# footer.html +#: forum/skins/default/templates/about.html:6 +#: forum/skins/default/templates/about.html:11 +#, fuzzy +msgid "About" +msgstr "关于本站" + +#: forum/skins/default/templates/account_settings.html:4 +#: forum/skins/default/templates/authopenid/settings.html:4 +msgid "Account functions" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:29 +#: forum/skins/default/templates/authopenid/changepw.html:5 +#: forum/skins/default/templates/authopenid/changepw.html:14 +#: forum/skins/default/templates/authopenid/settings.html:29 +msgid "Change password" +msgstr "修改密ç " + +#: forum/skins/default/templates/account_settings.html:30 +#: forum/skins/default/templates/authopenid/settings.html:30 +msgid "Give your account a new password." +msgstr "" + +#: forum/skins/default/templates/account_settings.html:32 +#: forum/skins/default/templates/authopenid/settings.html:31 +msgid "Change email " +msgstr "æ›´æ¢ç”µå­é‚®ä»¶" + +#: forum/skins/default/templates/account_settings.html:33 +#: forum/skins/default/templates/authopenid/settings.html:32 +msgid "Add or update the email address associated with your account." +msgstr "" + +#: forum/skins/default/templates/account_settings.html:35 +#: forum/skins/default/templates/authopenid/changeopenid.html:4 +#: forum/skins/default/templates/authopenid/changeopenid.html:30 +#: forum/skins/default/templates/authopenid/settings.html:34 +msgid "Change OpenID" +msgstr "æ›´æ¢OpenID地å€" + +#: forum/skins/default/templates/account_settings.html:36 +#: forum/skins/default/templates/authopenid/settings.html:35 +msgid "Change openid associated to your account" +msgstr "" + +#: forum/skins/default/templates/account_settings.html:39 +#: forum/skins/default/templates/authopenid/delete.html:4 +#: forum/skins/default/templates/authopenid/settings.html:38 +msgid "Delete account" +msgstr "删除å¸å·" + +#: forum/skins/default/templates/account_settings.html:40 +#: forum/skins/default/templates/authopenid/settings.html:39 +msgid "Erase your username and all your data from website" +msgstr "" + +#: forum/skins/default/templates/answer_edit.html:5 +#: forum/skins/default/templates/answer_edit.html:48 +msgid "Edit answer" +msgstr "修改回答" + +#: forum/skins/default/templates/answer_edit.html:25 +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:26 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:46 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:25 +#: forum/skins/default/templates/question_edit.html:28 +msgid "hide preview" +msgstr "ç¦ç”¨é¢„览" + +#: forum/skins/default/templates/answer_edit.html:28 +#: forum/skins/default/templates/ask.html:29 +#: forum/skins/default/templates/question.html:49 +#: forum/skins/default/templates/question_edit.html:28 +msgid "show preview" +msgstr "å¯ç”¨é¢„览" + +#: forum/skins/default/templates/answer_edit.html:48 +#: forum/skins/default/templates/question_edit.html:66 +#: forum/skins/default/templates/question_retag.html:53 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "back" +msgstr "返回" + +#: forum/skins/default/templates/answer_edit.html:53 +#: forum/skins/default/templates/question_edit.html:71 +#: forum/skins/default/templates/revisions_answer.html:52 +#: forum/skins/default/templates/revisions_question.html:52 +msgid "revision" +msgstr "版本" + +#: forum/skins/default/templates/answer_edit.html:56 +#: forum/skins/default/templates/question_edit.html:75 +msgid "select revision" +msgstr "选择版本" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:418 +#: forum/skins/default/templates/question_edit.html:92 +msgid "Toggle the real time Markdown editor preview" +msgstr "打开或者关闭Markdown编辑器的实时预览" + +#: forum/skins/default/templates/answer_edit.html:63 +#: forum/skins/default/templates/ask.html:98 +#: forum/skins/default/templates/ask_form.html:39 +#: forum/skins/default/templates/question.html:419 +#: forum/skins/default/templates/question_edit.html:92 +msgid "toggle preview" +msgstr "预览开关" + +# synonym of above in Edit question +#: forum/skins/default/templates/answer_edit.html:72 +#: forum/skins/default/templates/question_edit.html:118 +#: forum/skins/default/templates/question_retag.html:74 +msgid "Save edit" +msgstr "现在修改" + +#: forum/skins/default/templates/answer_edit.html:73 +#: forum/skins/default/templates/close.html:29 +#: forum/skins/default/templates/feedback.html:50 +#: forum/skins/default/templates/question_edit.html:119 +#: forum/skins/default/templates/question_retag.html:75 +#: forum/skins/default/templates/reopen.html:30 +#: forum/skins/default/templates/user_edit.html:90 +#: forum/skins/default/templates/authopenid/changeemail.html:40 +msgid "Cancel" +msgstr "å–消" + +#: forum/skins/default/templates/answer_edit_tips.html:4 +msgid "answer tips" +msgstr "å—欢迎的æé—®" + +#: forum/skins/default/templates/answer_edit_tips.html:7 +msgid "please make your answer relevant to this community" +msgstr "您的问题与编程相关å—?" + +#: forum/skins/default/templates/answer_edit_tips.html:10 +msgid "try to give an answer, rather than engage into a discussion" +msgstr "建议您æ的问题是å¯ä»¥è¢«ç­”å¤çš„,而ä¸ä»…仅是å¯ä»¥è®¨è®ºã€‚" + +#: forum/skins/default/templates/answer_edit_tips.html:13 +#, fuzzy +msgid "please try to provide details" +msgstr "请详细æ述您的问题。" + +#: forum/skins/default/templates/answer_edit_tips.html:16 +#: forum/skins/default/templates/question_edit_tips.html:13 +msgid "be clear and concise" +msgstr "我们推è您使用中文æ述问题,这样å¯ä»¥å¾—到更多的答å¤æœºä¼šã€‚" + +#: forum/skins/default/templates/answer_edit_tips.html:20 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "see frequently asked questions" +msgstr "查看常è§é—®é¢˜" + +#: forum/skins/default/templates/answer_edit_tips.html:26 +#: forum/skins/default/templates/question_edit_tips.html:23 +msgid "Markdown tips" +msgstr "Markdown快速å‚考" + +#: forum/skins/default/templates/answer_edit_tips.html:29 +#: forum/skins/default/templates/question_edit_tips.html:26 +#, fuzzy +msgid "*italic* or __italic__" +msgstr "*斜体* 或者 _斜体_" + +#: forum/skins/default/templates/answer_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:29 +msgid "**bold** or __bold__" +msgstr "**加粗** 或者 __加粗__ " + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/question_edit_tips.html:32 +msgid "link" +msgstr "链接" + +#: forum/skins/default/templates/answer_edit_tips.html:35 +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:32 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "text" +msgstr "文本" + +#: forum/skins/default/templates/answer_edit_tips.html:39 +#: forum/skins/default/templates/question_edit_tips.html:37 +msgid "image" +msgstr "图片" + +#: forum/skins/default/templates/answer_edit_tips.html:43 +#: forum/skins/default/templates/question_edit_tips.html:41 +msgid "numbered list:" +msgstr "列表:" + +#: forum/skins/default/templates/answer_edit_tips.html:48 +#: forum/skins/default/templates/question_edit_tips.html:46 +msgid "basic HTML tags are also supported" +msgstr "基本的HTML标签也是支æŒçš„" + +#: forum/skins/default/templates/answer_edit_tips.html:52 +#: forum/skins/default/templates/question_edit_tips.html:50 +msgid "learn more about Markdown" +msgstr "有关Markdown详细说明" + +#: forum/skins/default/templates/ask.html:5 +#: forum/skins/default/templates/ask.html:62 +msgid "Ask a question" +msgstr "我è¦æé—®" + +#: forum/skins/default/templates/ask.html:69 +#: forum/skins/default/templates/ask_form.html:11 +#, fuzzy +msgid "login to post question info" +msgstr "问题按æ问时间显示排åºã€‚新加入的问题将显示在最å‰é¢ã€‚" + +#: forum/skins/default/templates/ask.html:75 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" + +#: forum/skins/default/templates/ask.html:113 +#: forum/skins/default/templates/ask_form.html:54 +msgid "(required)" +msgstr "" + +#: forum/skins/default/templates/ask.html:120 +#: forum/skins/default/templates/ask_form.html:61 +msgid "Login/signup to post your question" +msgstr "" + +#: forum/skins/default/templates/ask.html:122 +#: forum/skins/default/templates/ask_form.html:63 +msgid "Ask your question" +msgstr "现在æé—®" + +#: forum/skins/default/templates/ask_form.html:15 +#, python-format +msgid "" +"must have valid %(email)s to post, \n" +" see %(email_validation_faq_url)s\n" +" " +msgstr "" + +#: forum/skins/default/templates/badge.html:6 +#: forum/skins/default/templates/badge.html:17 +msgid "Badge" +msgstr "奖牌" + +#: forum/skins/default/templates/badge.html:26 +msgid "user received this badge:" +msgid_plural "users received this badge:" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/badges.html:6 +#, fuzzy +msgid "Badges summary" +msgstr "奖牌列表" + +#: forum/skins/default/templates/badges.html:17 +msgid "Badges" +msgstr "枚奖牌" + +#: forum/skins/default/templates/badges.html:21 +msgid "Community gives you awards for your questions, answers and votes." +msgstr "" +"æ出问题,给予回答,投出你的票 - CNProg 会针对你在社区的表现,授予你å„类奖" +"牌。" + +#: forum/skins/default/templates/badges.html:22 +#, fuzzy, python-format +msgid "" +"Below is the list of available badges and number \n" +" of times each type of badge has been awarded. Give us feedback at %" +"(feedback_faq_url)s.\n" +" " +msgstr "这里列出社区所有的奖牌,以åŠåˆ°ç›®å‰ä¸ºæ­¤ï¼Œæ¯ä¸ªå¥–牌被授予的用户人数。" + +#: forum/skins/default/templates/badges.html:51 +msgid "Community badges" +msgstr "社区奖牌" + +#: forum/skins/default/templates/badges.html:57 +msgid "gold badge description" +msgstr "" + +#: forum/skins/default/templates/badges.html:65 +msgid "silver badge description" +msgstr "" + +#: forum/skins/default/templates/badges.html:68 +msgid "bronze badge: often given as a special honor" +msgstr "铜牌:时常授予之特殊è£èª‰" + +#: forum/skins/default/templates/badges.html:72 +#, fuzzy +msgid "bronze badge description" +msgstr "答读者问" + +# templates/book.html 78 +#: forum/skins/default/templates/book.html:7 +msgid "reading channel" +msgstr "读书频é“" + +#: forum/skins/default/templates/book.html:26 +msgid "[author]" +msgstr "ã€ä½œè€…】" + +#: forum/skins/default/templates/book.html:30 +msgid "[publisher]" +msgstr "ã€å‡ºç‰ˆç¤¾ã€‘" + +#: forum/skins/default/templates/book.html:34 +msgid "[publication date]" +msgstr "ã€å‡ºç‰ˆæ—¥æœŸã€‘" + +#: forum/skins/default/templates/book.html:38 +msgid "[price]" +msgstr "ã€ä»·æ ¼ã€‘" + +#: forum/skins/default/templates/book.html:39 +msgid "currency unit" +msgstr "" + +#: forum/skins/default/templates/book.html:42 +msgid "[pages]" +msgstr "ã€é¡µæ•°ã€‘" + +#: forum/skins/default/templates/book.html:43 +msgid "pages abbreviation" +msgstr "" + +#: forum/skins/default/templates/book.html:46 +msgid "[tags]" +msgstr "ã€æ ‡ç­¾ã€‘" + +#: forum/skins/default/templates/book.html:56 +msgid "author blog" +msgstr "作者åšå®¢" + +#: forum/skins/default/templates/book.html:62 +msgid "book directory" +msgstr "书ç±ç›®å½•" + +#: forum/skins/default/templates/book.html:66 +msgid "buy online" +msgstr "网上购买" + +#: forum/skins/default/templates/book.html:79 +msgid "reader questions" +msgstr "答读者问" + +#: forum/skins/default/templates/book.html:82 +msgid "ask the author" +msgstr "å‘作者æé—®" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:18 +msgid "this question was selected as favorite" +msgstr "这个问题被" + +#: forum/skins/default/templates/book.html:88 +#: forum/skins/default/templates/book.html:93 +#: forum/skins/default/templates/users_questions.html:11 +#: forum/skins/default/templates/users_questions.html:18 +msgid "number of times" +msgstr "ä½ç”¨æˆ·æ”¶è—" + +#: forum/skins/default/templates/book.html:105 +#: forum/skins/default/templates/question_summary_list_roll.html:14 +msgid "votes" +msgstr "票" + +#: forum/skins/default/templates/book.html:108 +msgid "the answer has been accepted to be correct" +msgstr "有答案已被接å—为正确答案" + +#: forum/skins/default/templates/book.html:115 +#: forum/skins/default/templates/question_summary_list_roll.html:15 +msgid "views" +msgstr "æµè§ˆ" + +# this is how above two are supposed to be +#: forum/skins/default/templates/book.html:125 +#: forum/skins/default/templates/question.html:136 +#: forum/skins/default/templates/question_list.html:19 +#: forum/skins/default/templates/question_summary_list_roll.html:52 +#: forum/skins/default/templates/tags.html:50 +#: forum/skins/default/templates/users_questions.html:34 +#, fuzzy, python-format +msgid "see questions tagged '%(tag)s'" +msgstr "查看有关'%(tagname)s'的问题" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to book RSS feed" +msgstr "RSS订阅该图书最新问题" + +#: forum/skins/default/templates/book.html:147 +msgid "subscribe to the questions feed" +msgstr "订阅最>新问题" + +# close.html +#: forum/skins/default/templates/close.html:6 +#: forum/skins/default/templates/close.html:16 +msgid "Close question" +msgstr "关闭问题" + +#: forum/skins/default/templates/close.html:19 +msgid "Close the question" +msgstr "由于以下原因,你è¦å…³é—­è¿™ä¸ªé—®é¢˜" + +#: forum/skins/default/templates/close.html:25 +msgid "Reasons" +msgstr "原因" + +#: forum/skins/default/templates/close.html:28 +msgid "OK to close" +msgstr "确定关闭" + +#: forum/skins/default/templates/email_base.html:11 +#, fuzzy +msgid "home" +msgstr "首页" + +#: forum/skins/default/templates/faq.html:11 +msgid "Frequently Asked Questions " +msgstr "常è§é—®é¢˜" + +#: forum/skins/default/templates/faq.html:16 +msgid "What kinds of questions can I ask here?" +msgstr "我å¯ä»¥åœ¨è¿™é‡Œæ问什么样的问题?" + +#: forum/skins/default/templates/faq.html:17 +msgid "" +"Most importanly - questions should be relevant to this " +"community." +msgstr "毫无疑问,首先必须是技术编程问题ï¼" + +#: forum/skins/default/templates/faq.html:18 +msgid "" +"Before asking the question - please make sure to use search to see whether " +"your question has alredy been answered." +msgstr "" +"æ问之å‰ï¼Œå……分利用系统的自动查找ã€æ ‡ç­¾å’Œæœç´¢ï¼Œçœ‹çœ‹æ˜¯å¦å·²ç»æœ‰ä¸€æ ·çš„问题并有了" +"答案。" + +#: forum/skins/default/templates/faq.html:21 +msgid "What questions should I avoid asking?" +msgstr "什么样的问题我ä¸è¯¥åœ¨è¿™é‡Œæ问?" + +#: forum/skins/default/templates/faq.html:22 +msgid "" +"Please avoid asking questions that are not relevant to this community, too " +"subjective and argumentative." +msgstr "" +"与程åºå‘˜æˆ–技术无关的,引起争åµæˆ–太过于主观性等è¿èƒŒç¤¾" +"区宗旨的内容。本站建立是为了帮助大众程åºå‘˜è§£å†³å®žé™…技术问题,我们需è¦å®ž" +"际的问题ï¼" + +#: forum/skins/default/templates/faq.html:27 +msgid "What should I avoid in my answers?" +msgstr "什么样的回答是ä¸å—欢迎的?" + +#: forum/skins/default/templates/faq.html:28 +msgid "" +"is a Q&A site, not a discussion group. Therefore - please avoid having " +"discussions in your answers, comment facility allows some space for brief " +"discussions." +msgstr "" +"希望用户æ供针对æ问的技术回答,å¯ä»¥æ˜¯è¿›ä¸€æ­¥äº†è§£é—®é¢˜å®žè´¨ï¼Œç»™äºˆå‚考方案,或完" +"全解决问题的回答。我们希望通过问答的形å¼è§£å†³ç”¨æˆ·çš„实际问题。因此,我们ä¸>欢迎在回答中出现ä¸æ˜¯å›žç­”问题的内容,包括针对他人回" +"答的讨论,和其他无æ„义的浪费网络资æºè¡Œä¸ºã€‚CNProg建议您使用评论功能æ¥è®¨è®ºä½ çš„æ„è§å’Œæƒ³æ³•ã€‚" + +#: forum/skins/default/templates/faq.html:32 +msgid "Who moderates this community?" +msgstr "è°æ˜¯ç¤¾åŒºçš„管ç†å‘˜ï¼Ÿ" + +#: forum/skins/default/templates/faq.html:33 +msgid "The short answer is: you." +msgstr "答案是:æ¯ä¸ªç”¨æˆ·ã€‚" + +#: forum/skins/default/templates/faq.html:34 +msgid "This website is moderated by the users." +msgstr "社区没有严格æ„义上的管ç†å‘˜èº«ä»½" + +#: forum/skins/default/templates/faq.html:35 +msgid "" +"The reputation system allows users earn the authorization to perform a " +"variety of moderation tasks." +msgstr "" +"通过积分è¿ä½œï¼Œæ¯ä¸ªç”¨æˆ·éƒ½æœ‰æƒé™åˆ›å»ºæ ‡ç­¾ï¼Œè¿›è¡Œå¯¹æ‰€æœ‰é—®" +"题ã€å›žç­”的投票ã€ç¼–辑ã€å…³é—­ç­‰æ“作。" + +#: forum/skins/default/templates/faq.html:40 +msgid "How does reputation system work?" +msgstr "什么是社区积分?" + +#: forum/skins/default/templates/faq.html:41 +#, fuzzy +msgid "Rep system summary" +msgstr "更新概è¦ï¼š" + +#: forum/skins/default/templates/faq.html:42 +msgid "" +"For example, if you ask an interesting question or give a helpful answer, " +"your input will be upvoted. On the other hand if the answer is misleading - " +"it will be downvoted. Each vote in favor will generate 10 " +"points, each vote against will subtract 2 points. There is " +"a limit of 200 points that can be accumulated per question " +"or answer. The table below explains reputation point requirements for each " +"type of moderation task." +msgstr "" + +#: forum/skins/default/templates/faq.html:53 +#: forum/skins/default/templates/user_votes.html:15 +msgid "upvote" +msgstr "投赞æˆç¥¨" + +#: forum/skins/default/templates/faq.html:57 +#, fuzzy +msgid "use tags" +msgstr "标记垃圾帖" + +# todo - check if it's indeed plural +#: forum/skins/default/templates/faq.html:62 +msgid "add comments" +msgstr "添加评论" + +#: forum/skins/default/templates/faq.html:66 +#: forum/skins/default/templates/user_votes.html:17 +msgid "downvote" +msgstr "投å对票" + +#: forum/skins/default/templates/faq.html:69 +#, fuzzy +msgid "open and close own questions" +msgstr "打开关闭任何人的问题" + +#: forum/skins/default/templates/faq.html:73 +msgid "retag questions" +msgstr "给任何问题整ç†æ ‡ç­¾" + +#: forum/skins/default/templates/faq.html:78 +msgid "edit community wiki questions" +msgstr "编辑wiki类问题" + +#: forum/skins/default/templates/faq.html:83 +msgid "edit any answer" +msgstr "编辑任何问题或答案" + +#: forum/skins/default/templates/faq.html:87 +#, fuzzy +msgid "open any closed question" +msgstr "打开关闭任何人的问题" + +#: forum/skins/default/templates/faq.html:91 +msgid "delete any comment" +msgstr "删除任何一个评论" + +#: forum/skins/default/templates/faq.html:95 +msgid "delete any questions and answers and perform other moderation tasks" +msgstr "删除任何一个问题或答案,åŠå…¶ä»–管ç†åŠŸèƒ½" + +#: forum/skins/default/templates/faq.html:103 +msgid "how to validate email title" +msgstr "" + +#: forum/skins/default/templates/faq.html:105 +#, python-format +msgid "" +"how to validate email info with %(send_email_key_url)s %(gravatar_faq_url)s" +msgstr "" + +#: forum/skins/default/templates/faq.html:110 +msgid "what is gravatar" +msgstr "" + +#: forum/skins/default/templates/faq.html:111 +msgid "gravatar faq info" +msgstr "" + +#: forum/skins/default/templates/faq.html:114 +msgid "To register, do I need to create new password?" +msgstr "我需è¦æ³¨å†Œä¸€ä¸ªæ–°ç”¨æˆ·å—?" + +#: forum/skins/default/templates/faq.html:115 +msgid "" +"No, you don't have to. You can login through any service that supports " +"OpenID, e.g. Google, Yahoo, AOL, etc." +msgstr "" +"ä¸éœ€è¦ã€‚社区æ供了OpenID的登录支æŒï¼Œä½ è¦ç”¨Googleã€Yahoo等任何支æŒOpenID登录的" +"å¸å·å°±å¯ä»¥ä½¿ç”¨ç³»ç»Ÿã€‚" + +#: forum/skins/default/templates/faq.html:116 +msgid "Login now!" +msgstr "马上登录" + +#: forum/skins/default/templates/faq.html:121 +msgid "Why other people can edit my questions/answers?" +msgstr "为什么其他人å¯ä»¥ä¿®æ”¹æˆ‘的问题/回答?" + +#: forum/skins/default/templates/faq.html:122 +msgid "Goal of this site is..." +msgstr "CNProg 是为了帮助程åºå‘˜è§£å†³æ›´å¤šé—®é¢˜ï¼Œæ›´åŠ æ–¹ä¾¿çš„解决问题。" + +#: forum/skins/default/templates/faq.html:122 +msgid "" +"So questions and answers can be edited like wiki pages by experienced users " +"of this site and this improves the overall quality of the knowledge base " +"content." +msgstr "" +"所以问题和答案都是如Wiki一样å¯ç¼–辑的,我们希望社区能帮助用户沉淀ã€ç§¯ç´¯æ›´å¤šæœ‰" +"用的知识和ç»éªŒã€‚" + +#: forum/skins/default/templates/faq.html:123 +msgid "If this approach is not for you, we respect your choice." +msgstr "如果您ä¸å–œæ¬¢è¿™ç§æ–¹å¼ï¼Œæˆ‘们尊é‡ä½ çš„选择。" + +#: forum/skins/default/templates/faq.html:127 +msgid "Still have questions?" +msgstr "还有其他问题?" + +#: forum/skins/default/templates/faq.html:128 +#, fuzzy, python-format +msgid "" +"Please ask your question at %(ask_question_url)s, help make our community " +"better!" +msgstr "如果您对社区还有其他疑问,请一起æ¥å®Œå–„我们的" + +#: forum/skins/default/templates/faq.html:130 +#: forum/skins/default/templates/header.html:27 +msgid "questions" +msgstr "问题" + +#: forum/skins/default/templates/faq.html:130 +msgid "." +msgstr "。" + +#: forum/skins/default/templates/feedback.html:6 +#, fuzzy +msgid "Feedback" +msgstr "问题å馈" + +#: forum/skins/default/templates/feedback.html:11 +msgid "Give us your feedback!" +msgstr "" + +#: forum/skins/default/templates/feedback.html:17 +#, python-format +msgid "" +"\n" +" Dear %(user_name)s, we look " +"forward to hearing your feedback. \n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: forum/skins/default/templates/feedback.html:24 +msgid "" +"\n" +" Dear visitor, we look forward to " +"hearing your feedback.\n" +" Please type and send us your message below.\n" +" " +msgstr "" + +#: forum/skins/default/templates/feedback.html:41 +#, fuzzy +msgid "(this field is required)" +msgstr " 标签ä¸èƒ½ä¸ºç©ºã€‚" + +#: forum/skins/default/templates/feedback.html:49 +#, fuzzy +msgid "Send Feedback" +msgstr "问题å馈" + +#: forum/skins/default/templates/feedback_email.txt:3 +#, python-format +msgid "" +"\n" +"Hello, this is a %(site_title)s forum feedback message\n" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:9 +#, fuzzy +msgid "Sender is" +msgstr "å—欢迎的æé—®" + +#: forum/skins/default/templates/feedback_email.txt:11 +#: forum/skins/default/templates/feedback_email.txt:14 +msgid "email" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:13 +msgid "anonymous" +msgstr "" + +#: forum/skins/default/templates/feedback_email.txt:19 +msgid "Message body:" +msgstr "" + +# footer.html +#: forum/skins/default/templates/footer.html:8 +#: forum/skins/default/templates/header.html:14 +msgid "about" +msgstr "关于本站" + +#: forum/skins/default/templates/footer.html:9 +#: forum/skins/default/templates/header.html:15 +#: forum/skins/default/templates/question_edit_tips.html:17 +msgid "faq" +msgstr "常è§é—®é¢˜" + +#: forum/skins/default/templates/footer.html:10 +msgid "privacy policy" +msgstr "éšç§æ”¿ç­–" + +#: forum/skins/default/templates/footer.html:19 +#, fuzzy +msgid "give feedback" +msgstr "问题å馈" + +#: forum/skins/default/templates/header.html:10 +msgid "logout" +msgstr "退出登录" + +#: forum/skins/default/templates/header.html:12 +msgid "login" +msgstr "登录" + +#: forum/skins/default/templates/header.html:22 +msgid "back to home page" +msgstr "回到首页" + +#: forum/skins/default/templates/header.html:29 +msgid "users" +msgstr "用户" + +#: forum/skins/default/templates/header.html:31 +msgid "books" +msgstr "读书" + +#: forum/skins/default/templates/header.html:33 +#: forum/templatetags/extra_tags.py:177 forum/templatetags/extra_tags.py:206 +msgid "badges" +msgstr "奖牌榜" + +#: forum/skins/default/templates/header.html:34 +#: forum/skins/default/templates/header.html:38 +msgid "ask a question" +msgstr "我è¦æé—®" + +#: forum/skins/default/templates/header.html:36 +msgid "unanswered questions" +msgstr "没有回答的问题" + +#: forum/skins/default/templates/input_bar.html:33 +msgid "search" +msgstr "æœç´¢" + +#: forum/skins/default/templates/logout.html:6 +#: forum/skins/default/templates/logout.html:16 +msgid "Logout" +msgstr "退出登录" + +#: forum/skins/default/templates/logout.html:19 +msgid "" +"As a registered user you can login with your OpenID, log out of the site or " +"permanently remove your account." +msgstr "" +"您是系统的注册用户,å¯ä»¥éšæ—¶ä½¿ç”¨OpenIDå¸å·" +"登录系统或者注销登录。" + +#: forum/skins/default/templates/logout.html:20 +msgid "Logout now" +msgstr "点击退出登录" + +#: forum/skins/default/templates/notarobot.html:3 +msgid "Please prove that you are a Human Being" +msgstr "" + +#: forum/skins/default/templates/notarobot.html:10 +msgid "I am a Human Being" +msgstr "" + +#: forum/skins/default/templates/pagesize.html:6 +msgid "posts per page" +msgstr "æ¯é¡µæ˜¾ç¤ºï¼š" + +#: forum/skins/default/templates/paginator.html:6 +#: forum/skins/default/templates/paginator.html:7 +msgid "previous" +msgstr "上一页" + +#: forum/skins/default/templates/paginator.html:19 +msgid "current page" +msgstr "当å‰é¡µ" + +#: forum/skins/default/templates/paginator.html:22 +#: forum/skins/default/templates/paginator.html:29 +#, fuzzy, python-format +msgid "page number %(num)s" +msgstr "第" + +#: forum/skins/default/templates/paginator.html:33 +msgid "next page" +msgstr "下一页" + +#: forum/skins/default/templates/post_contributor_info.html:9 +#, fuzzy, python-format +msgid "%(rev_count)s revision" +msgid_plural "%(rev_count)s revisions" +msgstr[0] "当å‰ç‰ˆæœ¬" +msgstr[1] "当å‰ç‰ˆæœ¬" + +#: forum/skins/default/templates/post_contributor_info.html:15 +msgid "asked" +msgstr "æ问于" + +#: forum/skins/default/templates/post_contributor_info.html:18 +#, fuzzy +msgid "answered" +msgstr "回答" + +#: forum/skins/default/templates/post_contributor_info.html:20 +#, fuzzy +msgid "posted" +msgstr "投赞æˆç¥¨" + +#: forum/skins/default/templates/post_contributor_info.html:41 +msgid "updated" +msgstr "更新于" + +#: forum/skins/default/templates/privacy.html:6 +#: forum/skins/default/templates/privacy.html:11 +msgid "Privacy policy" +msgstr "éšç§æ”¿ç­–" + +#: forum/skins/default/templates/privacy.html:15 +msgid "general message about privacy" +msgstr "" +"CNProg承认用户éšç§çš„é‡è¦æ€§ã€‚本文件概述在您æµè§ˆCNProg过程中所接收和收集的个人" +"ä¿¡æ¯çš„ç§ç±»ï¼Œä»¥åŠCNProg所采å–çš„ä¿æŠ¤ä¿¡æ¯çš„一些措施。CNProg希望这将有助于您在知" +"情的情况下,就和我们 共享个人信æ¯çš„问题作出决定。" + +#: forum/skins/default/templates/privacy.html:18 +msgid "Site Visitors" +msgstr "网站访问者" + +#: forum/skins/default/templates/privacy.html:20 +msgid "what technical information is collected about visitors" +msgstr "" +"当您访问本网站或使用我们的æŸäº›åœ¨çº¿æœåŠ¡æ—¶ï¼ŒæœåŠ¡å™¨ä¼šè‡ªåŠ¨è®°å½•ä¿¡æ¯ï¼ŒåŒ…括但ä¸é™äºŽ" +"URLã€IP地å€ã€æµè§ˆå™¨çš„类型ã€å±å¹•åˆ†è¾¨çŽ‡ã€ç³»ç»Ÿç±»åž‹å’Œä½¿ç”¨çš„语言以åŠè®¿é—®æ—¥æœŸå’Œæ—¶" +"间。我们的目的是为了å‘您>æ供更好的用户æœåŠ¡ï¼ŒåŒ…括å¯èƒ½ä¸ºæ‚¨æ供定制的在线æœåŠ¡ã€‚" + +#: forum/skins/default/templates/privacy.html:23 +msgid "Personal Information" +msgstr "个人身份信æ¯" + +#: forum/skins/default/templates/privacy.html:25 +msgid "details on personal information policies" +msgstr "" +"在登录使用CNProgçš„æ问和回答功能时,我们è¦æ±‚使用者æ供用户åã€å¯†ç ã€ç”µå­é‚®ä»¶" +"等信æ¯ã€‚CNProg收集这类关于个人身份的信æ¯åªæ˜¯ä¸ºäº†ç™»å½•ç³»ç»ŸèŽ·å¾—使用功能的目的。" +"我们ä¸ä¼šå‘任何其他社区用 户ã€ä¸ªäººæˆ–第三方é€éœ²æ‚¨çš„密ç æˆ–者电å­é‚®ä»¶ä¿¡æ¯ã€‚用户å¯" +"以选择性地填写用户资料ã€ä¸ªäººç½‘ç«™ã€å¹´é¾„ã€åŸŽå¸‚等信æ¯ï¼Œæˆ‘们收集这些内容为了使用" +"户能够更容易和更满æ„地使用CNProgæ供的网页和æœåŠ¡ã€‚" + +#: forum/skins/default/templates/privacy.html:28 +msgid "Other Services" +msgstr "其他æœåŠ¡" + +#: forum/skins/default/templates/privacy.html:30 +msgid "details on sharing data with third parties" +msgstr "" +"CNProgå¯èƒ½ä¼šæ”¶é›†å’Œç»Ÿè®¡ç”¨æˆ·è®¿é—®æœ¬ç«™çš„概况数æ®ã€‚例如,CNProgå¯èƒ½ä¼šæ£€æµ‹ç½‘站最æµ" +"行的部分功能。CNProgå¯èƒ½ä¼šå…¬å¼€æ˜¾ç¤ºæˆ–者æ供给第三方使用该数æ®ã€‚但是,CNProgä¸" +"会公开您的身份信æ¯ã€‚" + +#: forum/skins/default/templates/privacy.html:35 +msgid "cookie policy details" +msgstr "" +"访问CNProg时,我们会å‘您的计算机å‘é€ä¸€ä¸ªæˆ–多个专门用于识别您的æµè§ˆå™¨çš„Cookie" +"(包å«ä¸€ä¸ªå­—符串的å°æ–‡ä»¶ï¼‰ã€‚ 使用 Cookie 的目的是通过储存用户å好ã€è·Ÿè¸ªç”¨æˆ·å€¾" +"å‘(例如æœç´¢æ–¹æ³•ï¼‰æ¥æ高我们的æœåŠ¡è´¨é‡ã€‚大多数æµè§ˆå™¨çš„åˆå§‹è®¾ç½®å‡ä¸ºæŽ¥å— " +"Cookie,但也å¯ä»¥å°†å…¶é‡ç½®ä¸ºæ‹’ç»æ‰€æœ‰ Cookie 或在收到 Cookie æ—¶æ示。ä¸è¿‡ï¼Œå¦‚æžœ" +"ç¦ç”¨ Cookie,æŸäº›åŠŸèƒ½å’ŒæœåŠ¡å¯èƒ½æ— æ³•æ­£å¸¸è¿è¡Œã€‚" + +#: forum/skins/default/templates/privacy.html:37 +msgid "Policy Changes" +msgstr "政策更改" + +#: forum/skins/default/templates/privacy.html:38 +#, fuzzy +msgid "how privacy policies can be changed" +msgstr "" +"我们å¯èƒ½åœ¨äº‹å…ˆé€šçŸ¥æˆ–ä¸é€šçŸ¥çš„情况下éšæ—¶æ›´æ”¹æ­¤'éšç§æ”¿ç­–',我们建议用户时常查看" +"CNProgéšç§æ”¿ç­–的改动,在任何改动生效åŽæ‚¨çš„继续访问和使用本站,我们å‡è®¾æ‚¨å·²åŒ" +"æ„了CNProg以上的所有æ¡æ¬¾ã€‚" + +#: forum/skins/default/templates/question.html:78 +#: forum/skins/default/templates/question.html:79 +#: forum/skins/default/templates/question.html:95 +#: forum/skins/default/templates/question.html:97 +msgid "i like this post (click again to cancel)" +msgstr "这篇帖å­æœ‰ä»·å€¼ï¼ˆå†æ¬¡ç‚¹å‡»å–消æ“作)" + +#: forum/skins/default/templates/question.html:81 +#: forum/skins/default/templates/question.html:99 +#: forum/skins/default/templates/question.html:251 +msgid "current number of votes" +msgstr "当å‰æ€»ç¥¨æ•°" + +#: forum/skins/default/templates/question.html:90 +#: forum/skins/default/templates/question.html:91 +#: forum/skins/default/templates/question.html:104 +#: forum/skins/default/templates/question.html:105 +msgid "i dont like this post (click again to cancel)" +msgstr "这篇帖å­æ²¡æœ‰ä»·å€¼ï¼ˆå†æ¬¡ç‚¹å‡»å–消æ“作)" + +#: forum/skins/default/templates/question.html:109 +#: forum/skins/default/templates/question.html:110 +msgid "mark this question as favorite (click again to cancel)" +msgstr "我è¦æ”¶è—这个问题(å†æ¬¡ç‚¹å‡»å–消æ“作)" + +#: forum/skins/default/templates/question.html:116 +#: forum/skins/default/templates/question.html:117 +msgid "remove favorite mark from this question (click again to restore mark)" +msgstr "我è¦æ”¶è—这个问题(å†æ¬¡ç‚¹å‡»å–消æ“作)" + +#: forum/skins/default/templates/question.html:141 +#: forum/skins/default/templates/question.html:288 +#: forum/skins/default/templates/revisions_answer.html:58 +#: forum/skins/default/templates/revisions_question.html:58 +msgid "edit" +msgstr "编辑" + +#: forum/skins/default/templates/question.html:146 +msgid "reopen" +msgstr "打开" + +#: forum/skins/default/templates/question.html:150 +msgid "close" +msgstr "关闭" + +#: forum/skins/default/templates/question.html:156 +#: forum/skins/default/templates/question.html:293 +msgid "" +"report as offensive (i.e containing spam, advertising, malicious text, etc.)" +msgstr "检举该帖为垃“水帖â€ï¼ˆå«å¹¿å‘Šã€äººèº«æ”»å‡»ã€æ¶æ„言论等)" + +#: forum/skins/default/templates/question.html:157 +#: forum/skins/default/templates/question.html:294 +msgid "flag offensive" +msgstr "垃圾帖?" + +#: forum/skins/default/templates/question.html:165 +#: forum/skins/default/templates/question.html:305 +msgid "delete" +msgstr "删除" + +#: forum/skins/default/templates/question.html:183 +#: forum/skins/default/templates/question.html:325 +#, fuzzy +msgid "delete this comment" +msgstr "删除任何一个评论" + +#: forum/skins/default/templates/question.html:194 +#: forum/skins/default/templates/question.html:336 +msgid "add comment" +msgstr "添加评论" + +#: forum/skins/default/templates/question.html:198 +#: forum/skins/default/templates/question.html:340 +#, fuzzy, python-format +msgid "see %(counter)s more" +msgid_plural "see %(counter)s more" +msgstr[0] "" +"个 没有回答的 问题。" +msgstr[1] "" +"个 没有回答的 问题。" + +#: forum/skins/default/templates/question.html:200 +#: forum/skins/default/templates/question.html:342 +#, fuzzy, python-format +msgid "see %(counter)s more comment" +msgid_plural "" +"see %(counter)s more comments\n" +" " +msgstr[0] "" +"个 没有回答的 问题。" +msgstr[1] "" +"个 没有回答的 问题。" + +#: forum/skins/default/templates/question.html:213 +#, fuzzy, python-format +msgid "" +"The question has been closed for the following reason \"%(close_reason)s\" by" +msgstr "问题以“%sâ€çš„原因已被" + +#: forum/skins/default/templates/question.html:215 +#, fuzzy, python-format +msgid "close date %(closed_at)s" +msgstr "由于以下原因,你è¦å…³é—­è¿™ä¸ªé—®é¢˜" + +#: forum/skins/default/templates/question.html:223 +#, python-format +msgid "" +"\n" +" %(counter)s Answer:\n" +" " +msgid_plural "" +"\n" +" %(counter)s Answers:\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers will be shown first" +msgstr "最先回答显示在最å‰é¢" + +#: forum/skins/default/templates/question.html:231 +msgid "oldest answers" +msgstr "最先回答" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers will be shown first" +msgstr "最晚回答显示在最å‰é¢" + +#: forum/skins/default/templates/question.html:233 +msgid "newest answers" +msgstr "最近回答" + +#: forum/skins/default/templates/question.html:235 +msgid "most voted answers will be shown first" +msgstr "投票次数最多的显示在最å‰é¢" + +#: forum/skins/default/templates/question.html:235 +msgid "popular answers" +msgstr "投票最多" + +#: forum/skins/default/templates/question.html:249 +#: forum/skins/default/templates/question.html:250 +msgid "i like this answer (click again to cancel)" +msgstr "这篇帖å­æœ‰ä»·å€¼ï¼ˆå†æ¬¡ç‚¹å‡»å–消æ“作)" + +#: forum/skins/default/templates/question.html:256 +#: forum/skins/default/templates/question.html:257 +msgid "i dont like this answer (click again to cancel)" +msgstr "这篇帖å­æ²¡æœ‰ä»·å€¼ï¼ˆå†æ¬¡ç‚¹å‡»å–消æ“作)" + +#: forum/skins/default/templates/question.html:262 +#: forum/skins/default/templates/question.html:263 +msgid "mark this answer as favorite (click again to undo)" +msgstr "最佳答案(å†æ¬¡ç‚¹å‡»å–消æ“作)" + +#: forum/skins/default/templates/question.html:268 +#: forum/skins/default/templates/question.html:269 +msgid "the author of the question has selected this answer as correct" +msgstr "这个答案已ç»è¢«æ问作者标记为最佳答案" + +#: forum/skins/default/templates/question.html:282 +msgid "answer permanent link" +msgstr "该回答的链接地å€" + +#: forum/skins/default/templates/question.html:283 +msgid "permanent link" +msgstr "永久链接" + +# todo please check this in chinese +#: forum/skins/default/templates/question.html:305 +msgid "undelete" +msgstr "å–消" + +#: forum/skins/default/templates/question.html:364 +#: forum/skins/default/templates/question.html:367 +msgid "Notify me once a day when there are any new answers" +msgstr "" + +#: forum/skins/default/templates/question.html:370 +msgid "Notify me weekly when there are any new answers" +msgstr "" + +#: forum/skins/default/templates/question.html:375 +#, python-format +msgid "" +"You can always adjust frequency of email updates from your %(profile_url)s" +msgstr "" + +#: forum/skins/default/templates/question.html:380 +msgid "once you sign in you will be able to subscribe for any updates here" +msgstr "" + +#: forum/skins/default/templates/question.html:391 +msgid "Your answer" +msgstr "您的回答" + +#: forum/skins/default/templates/question.html:393 +#, fuzzy +msgid "Be the first one to answer this question!" +msgstr "ä¸æ˜¯ä¸€ä¸ªå¯ä»¥å›žç­”的“问题â€" + +#: forum/skins/default/templates/question.html:399 +msgid "you can answer anonymously and then login" +msgstr "" + +#: forum/skins/default/templates/question.html:403 +msgid "answer your own question only to give an answer" +msgstr "" + +#: forum/skins/default/templates/question.html:405 +#, fuzzy +msgid "please only give an answer, no discussions" +msgstr "建议您æ的问题是å¯ä»¥è¢«ç­”å¤çš„,而ä¸ä»…仅是å¯ä»¥è®¨è®ºã€‚" + +#: forum/skins/default/templates/question.html:441 +msgid "Login/Signup to Post Your Answer" +msgstr "" + +#: forum/skins/default/templates/question.html:444 +#, fuzzy +msgid "Answer Your Own Question" +msgstr "回答该问题" + +#: forum/skins/default/templates/question.html:446 +msgid "Answer the question" +msgstr "回答该问题" + +#: forum/skins/default/templates/question.html:460 +msgid "Question tags" +msgstr "您正在æµè§ˆçš„问题å«æœ‰ä»¥ä¸‹æ ‡ç­¾" + +# this is how above two are supposed to be +#: forum/skins/default/templates/question.html:465 +#: forum/skins/default/templates/questions.html:257 +#: forum/skins/default/templates/tag_selector.html:11 +#: forum/skins/default/templates/tag_selector.html:28 +#, fuzzy, python-format +msgid "see questions tagged '%(tag_name)s'" +msgstr "查看有关'%(tagname)s'的问题" + +#: forum/skins/default/templates/question.html:471 +#, fuzzy +msgid "question asked" +msgstr "æ问时间" + +#: forum/skins/default/templates/question.html:474 +msgid "question was seen" +msgstr "ç›®å‰æµè§ˆæ•°é‡" + +#: forum/skins/default/templates/question.html:474 +msgid "times" +msgstr "次" + +#: forum/skins/default/templates/question.html:477 +msgid "last updated" +msgstr "最åŽæ›´æ–°æ—¶é—´" + +#: forum/skins/default/templates/question.html:483 +#, fuzzy +msgid "Related questions" +msgstr "相似的问题" + +#: forum/skins/default/templates/question_counter_widget.html:6 +msgid "Please decide if you like this question or not by voting" +msgstr "" + +#: forum/skins/default/templates/question_counter_widget.html:12 +msgid "" +"\n" +" vote\n" +" " +msgid_plural "" +"\n" +" votes\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_counter_widget.html:21 +#, fuzzy +msgid "this answer has been accepted to be correct" +msgstr "有答案已被接å—为正确答案" + +#: forum/skins/default/templates/question_counter_widget.html:27 +msgid "" +"\n" +" answer \n" +" " +msgid_plural "" +"\n" +" answers \n" +" " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/question_counter_widget.html:39 +msgid "" +"\n" +" view\n" +" " +msgid_plural "" +"\n" +" views\n" +" " +msgstr[0] "" +msgstr[1] "" + +# page title +#: forum/skins/default/templates/question_edit.html:5 +#: forum/skins/default/templates/question_edit.html:66 +msgid "Edit question" +msgstr "修改问题" + +#: forum/skins/default/templates/question_edit_tips.html:4 +msgid "question tips" +msgstr "å—欢迎的æé—®" + +#: forum/skins/default/templates/question_edit_tips.html:7 +#, fuzzy +msgid "please ask a relevant question" +msgstr "我è¦æé—®" + +#: forum/skins/default/templates/question_edit_tips.html:10 +#, fuzzy +msgid "please try provide enough details" +msgstr "请详细æ述您的问题。" + +#: forum/skins/default/templates/question_retag.html:4 +#: forum/skins/default/templates/question_retag.html:53 +msgid "Change tags" +msgstr "修改问题标签" + +# todo: remove magic numbers from this file +#: forum/skins/default/templates/question_retag.html:40 +msgid "up to 5 tags, less than 20 characters each" +msgstr "最多5个标签,æ¯ä¸ªæ ‡ç­¾é•¿åº¦å°äºŽ20个字符。" + +#: forum/skins/default/templates/question_retag.html:83 +msgid "Why use and modify tags?" +msgstr "为什么我åªèƒ½ä¿®æ”¹é—®é¢˜æ ‡ç­¾ï¼Ÿ" + +#: forum/skins/default/templates/question_retag.html:86 +#, fuzzy +msgid "tags help us keep Questions organized" +msgstr "CNProg用标签æ¥åˆ†ç±»ç³»ç»Ÿçš„ä¿¡æ¯" + +#: forum/skins/default/templates/question_retag.html:94 +msgid "tag editors receive special awards from the community" +msgstr "修改标签的用户将授予特殊的社区奖牌" + +#: forum/skins/default/templates/question_summary_list_roll.html:13 +msgid "answers" +msgstr "回答" + +#: forum/skins/default/templates/questions.html:8 +msgid "Questions" +msgstr "问题列表" + +#: forum/skins/default/templates/questions.html:32 +msgid "Found by tags" +msgstr "标签问题" + +#: forum/skins/default/templates/questions.html:36 +msgid "Search results" +msgstr "" + +#: forum/skins/default/templates/questions.html:38 +msgid "Found by title" +msgstr "查询结果" + +#: forum/skins/default/templates/questions.html:42 +msgid "Unanswered questions" +msgstr "没有回答的问题" + +#: forum/skins/default/templates/questions.html:44 +msgid "All questions" +msgstr "所有问题" + +#: forum/skins/default/templates/questions.html:51 +msgid "In:" +msgstr "" + +#: forum/skins/default/templates/questions.html:53 +#, fuzzy +msgid "see unanswered questions" +msgstr "没有回答的问题" + +#: forum/skins/default/templates/questions.html:55 +#, fuzzy +msgid "see your favorite questions" +msgstr "用户收è—的问题" + +#: forum/skins/default/templates/questions.html:59 +msgid "Sort by:" +msgstr "" + +#: forum/skins/default/templates/questions.html:64 +#: forum/skins/default/templates/questions.html:75 +#, fuzzy +msgid "click to see the newest questions" +msgstr "最新问题" + +#: forum/skins/default/templates/questions.html:70 +#, fuzzy +msgid "click to see the oldest questions" +msgstr "最新问题" + +#: forum/skins/default/templates/questions.html:83 +#: forum/skins/default/templates/questions.html:94 +#, fuzzy +msgid "click to see the most recently updated questions" +msgstr "最近被更新的问题" + +#: forum/skins/default/templates/questions.html:89 +#, fuzzy +msgid "click to see the least recently updated questions" +msgstr "最近被更新的问题" + +#: forum/skins/default/templates/questions.html:102 +#: forum/skins/default/templates/questions.html:113 +#, fuzzy +msgid "click to see hottest questions" +msgstr "被回å¤æœ€å¤šçš„问题" + +#: forum/skins/default/templates/questions.html:102 +#, fuzzy +msgid "less answers" +msgstr "最先回答" + +#: forum/skins/default/templates/questions.html:108 +#, fuzzy +msgid "click to see coldest questions" +msgstr "最新问题" + +#: forum/skins/default/templates/questions.html:108 +#: forum/skins/default/templates/questions.html:113 +#, fuzzy +msgid "more answers" +msgstr "您的回答" + +#: forum/skins/default/templates/questions.html:121 +#: forum/skins/default/templates/questions.html:132 +#, fuzzy +msgid "click to see most voted questions" +msgstr "投票次数最多的问题" + +#: forum/skins/default/templates/questions.html:121 +#, fuzzy +msgid "unpopular" +msgstr "å—欢迎的标签" + +#: forum/skins/default/templates/questions.html:127 +#, fuzzy +msgid "click to see least voted questions" +msgstr "投票次数最多的问题" + +#: forum/skins/default/templates/questions.html:127 +#: forum/skins/default/templates/questions.html:132 +#, fuzzy +msgid "popular" +msgstr "å—欢迎的标签" + +#: forum/skins/default/templates/questions.html:141 +#, fuzzy, python-format +msgid " %(q_num)s question found" +msgid_plural "%(q_num)s questions found" +msgstr[0] "个" +msgstr[1] "个" + +#: forum/skins/default/templates/questions.html:143 +#, fuzzy, python-format +msgid "%(q_num)s question" +msgid_plural "%(q_num)s questions" +msgstr[0] "个" +msgstr[1] "个" + +#: forum/skins/default/templates/questions.html:147 +#, python-format +msgid "with %(author_name)s's contributions" +msgstr "" + +#: forum/skins/default/templates/questions.html:151 +#, fuzzy +msgid "tagged" +msgstr "更新了标签" + +#: forum/skins/default/templates/questions.html:157 +#, fuzzy +msgid "Search tips:" +msgstr "å—欢迎的æé—®" + +#: forum/skins/default/templates/questions.html:161 +#, fuzzy +msgid "reset author" +msgstr "å‘作者æé—®" + +#: forum/skins/default/templates/questions.html:165 +#, fuzzy +msgid "reset tags" +msgstr "标记垃圾帖" + +#: forum/skins/default/templates/questions.html:169 +#: forum/skins/default/templates/questions.html:173 +msgid "start over" +msgstr "" + +#: forum/skins/default/templates/questions.html:175 +msgid " - to expand, or dig in by adding more tags and revising the query." +msgstr "" + +#: forum/skins/default/templates/questions.html:178 +msgid "Search tip:" +msgstr "" + +#: forum/skins/default/templates/questions.html:178 +msgid "add tags and a query to focus your search" +msgstr "" + +#: forum/skins/default/templates/questions.html:190 +#, fuzzy +msgid "There are no unanswered questions here" +msgstr "" +"您正在æµè§ˆæ‰€æœ‰

%(num_q)s
个

问题按 " +"问题创建时间 排åºã€‚最新加入的问题将显示在最å‰é¢ã€‚

" + +#: forum/skins/default/templates/questions.html:193 +#, fuzzy +msgid "No favorite questions here. " +msgstr "收è—" + +#: forum/skins/default/templates/questions.html:194 +msgid "Please start (bookmark) some questions when you visit them" +msgstr "" + +#: forum/skins/default/templates/questions.html:199 +msgid "You can expand your search by " +msgstr "" + +#: forum/skins/default/templates/questions.html:203 +#, fuzzy +msgid "resetting author" +msgstr "å‘作者æé—®" + +# book.html line 123 must be empty in english +#: forum/skins/default/templates/questions.html:207 +#, fuzzy +msgid "resetting tags" +msgstr "的问题" + +#: forum/skins/default/templates/questions.html:211 +#: forum/skins/default/templates/questions.html:215 +msgid "starting over" +msgstr "" + +#: forum/skins/default/templates/questions.html:220 +#, fuzzy +msgid "Please always feel free to ask your question!" +msgstr "我è¦æé—®" + +#: forum/skins/default/templates/questions.html:224 +msgid "Did not find what you were looking for?" +msgstr "" + +#: forum/skins/default/templates/questions.html:225 +#, fuzzy +msgid "Please, post your question!" +msgstr "现在æé—®" + +#: forum/skins/default/templates/questions.html:241 +msgid "Contributors" +msgstr "" + +#: forum/skins/default/templates/questions.html:254 +msgid "Related tags" +msgstr "相关标签" + +#: forum/skins/default/templates/reopen.html:6 +#: forum/skins/default/templates/reopen.html:16 +msgid "Reopen question" +msgstr "é‡è®¾é—®é¢˜" + +#: forum/skins/default/templates/reopen.html:19 +msgid "Open the previously closed question" +msgstr "你将打开这个已ç»è¢«å…³é—­çš„问题" + +#: forum/skins/default/templates/reopen.html:22 +#, fuzzy +msgid "The question was closed for the following reason " +msgstr "问题曾以" + +#: forum/skins/default/templates/reopen.html:22 +msgid "reason - leave blank in english" +msgstr "的原因被" + +#: forum/skins/default/templates/reopen.html:22 +#, fuzzy +msgid "on " +msgstr "于" + +#: forum/skins/default/templates/reopen.html:22 +msgid "date closed" +msgstr "关闭" + +#: forum/skins/default/templates/reopen.html:29 +#, fuzzy +msgid "Reopen this question" +msgstr "确定打开这个问题" + +# revisions_answer.html +#: forum/skins/default/templates/revisions_answer.html:7 +#: forum/skins/default/templates/revisions_answer.html:38 +#: forum/skins/default/templates/revisions_question.html:8 +#: forum/skins/default/templates/revisions_question.html:38 +msgid "Revision history" +msgstr "版本历å²" + +#: forum/skins/default/templates/revisions_answer.html:50 +#: forum/skins/default/templates/revisions_question.html:50 +msgid "click to hide/show revision" +msgstr "" + +# book.html line 123 must be empty in english +#: forum/skins/default/templates/tag_selector.html:5 +#, fuzzy +msgid "Interesting tags" +msgstr "的问题" + +#: forum/skins/default/templates/tag_selector.html:15 +#, python-format +msgid "remove '%(tag_name)s' from the list of interesting tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:21 +#: forum/skins/default/templates/tag_selector.html:38 +msgid "Add" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:22 +#, fuzzy +msgid "Ignored tags" +msgstr "修改问题标签" + +#: forum/skins/default/templates/tag_selector.html:32 +#, python-format +msgid "remove '%(tag_name)s' from the list of ignored tags" +msgstr "" + +#: forum/skins/default/templates/tag_selector.html:41 +#, fuzzy +msgid "keep ignored questions hidden" +msgstr "打开关闭任何人的问题" + +#: forum/skins/default/templates/tags.html:6 +#: forum/skins/default/templates/tags.html:30 +msgid "Tag list" +msgstr "标签列表" + +#: forum/skins/default/templates/tags.html:32 +msgid "sorted alphabetically" +msgstr "按å称的字æ¯å…ˆåŽé¡ºåºæŽ’åº" + +#: forum/skins/default/templates/tags.html:32 +msgid "by name" +msgstr "按å称排åº" + +#: forum/skins/default/templates/tags.html:33 +msgid "sorted by frequency of tag use" +msgstr "按标签被使用的次数排åº" + +#: forum/skins/default/templates/tags.html:33 +#, fuzzy +msgid "by popularity" +msgstr "按æµè¡Œç¨‹åº¦æŽ’åº" + +#: forum/skins/default/templates/tags.html:39 +#, python-format +msgid "" +"All tags matching '%(stag)s'" +msgstr "" + +#: forum/skins/default/templates/tags.html:42 +#, fuzzy +msgid "Nothing found" +msgstr "没有找到相关数æ®ã€‚" + +#: forum/skins/default/templates/user_edit.html:6 +msgid "Edit user profile" +msgstr "修改个人资料" + +#: forum/skins/default/templates/user_edit.html:19 +msgid "edit profile" +msgstr "修改资料" + +#: forum/skins/default/templates/user_edit.html:33 +#: forum/skins/default/templates/user_info.html:53 +msgid "Registered user" +msgstr "注册用户" + +#: forum/skins/default/templates/user_edit.html:40 +#, fuzzy +msgid "Screen Name" +msgstr "当å‰é¡µ" + +#: forum/skins/default/templates/user_edit.html:89 +#: forum/skins/default/templates/user_email_subscriptions.html:20 +msgid "Update" +msgstr "æ›´æ–°" + +#: forum/skins/default/templates/user_email_subscriptions.html:8 +msgid "Email subscription settings" +msgstr "" + +#: forum/skins/default/templates/user_email_subscriptions.html:9 +msgid "email subscription settings info" +msgstr "" + +#: forum/skins/default/templates/user_email_subscriptions.html:21 +msgid "Stop sending email" +msgstr "" + +#: forum/skins/default/templates/user_info.html:18 +msgid "change picture" +msgstr "" + +#: forum/skins/default/templates/user_info.html:25 +#: forum/skins/default/templates/users.html:26 forum/views/users.py:933 +msgid "reputation" +msgstr "积分" + +#: forum/skins/default/templates/user_info.html:35 +msgid "Moderate this user" +msgstr "" + +#: forum/skins/default/templates/user_info.html:47 +msgid "update profile" +msgstr "更新我的资料" + +#: forum/skins/default/templates/user_info.html:57 +msgid "real name" +msgstr "姓å" + +#: forum/skins/default/templates/user_info.html:62 +msgid "member for" +msgstr "已加入" + +#: forum/skins/default/templates/user_info.html:67 +msgid "last seen" +msgstr "上次活动时间" + +#: forum/skins/default/templates/user_info.html:73 +msgid "user website" +msgstr "个人网站" + +#: forum/skins/default/templates/user_info.html:79 +msgid "location" +msgstr "城市" + +# user_info.html +#: forum/skins/default/templates/user_info.html:86 +msgid "age" +msgstr "年龄" + +#: forum/skins/default/templates/user_info.html:87 +msgid "age unit" +msgstr "å²" + +#: forum/skins/default/templates/user_info.html:93 +msgid "todays unused votes" +msgstr "今日剩余投票数" + +#: forum/skins/default/templates/user_info.html:94 +msgid "votes left" +msgstr "票" + +#: forum/skins/default/templates/user_reputation.html:29 +msgid "Your karma change log." +msgstr "" + +#: forum/skins/default/templates/user_reputation.html:31 +#, python-format +msgid "%(user_name)s's karma change log" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:11 +#, python-format +msgid "%(counter)s Question" +msgid_plural "%(counter)s Questions" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:16 +#, python-format +msgid "%(counter)s Answer" +msgid_plural "%(counter)s Answers" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:24 +#, fuzzy, python-format +msgid "the answer has been voted for %(answer_score)s times" +msgstr "该回答总共有%d个投票" + +#: forum/skins/default/templates/user_stats.html:24 +msgid "this answer has been selected as correct" +msgstr "该回答已被设为最佳答案" + +#: forum/skins/default/templates/user_stats.html:34 +#, fuzzy, python-format +msgid "(%(comment_count)s comment)" +msgid_plural "the answer has been commented %(comment_count)s times" +msgstr[0] "添加评论" +msgstr[1] "添加评论" + +#: forum/skins/default/templates/user_stats.html:44 +#, python-format +msgid "%(cnt)s Vote" +msgid_plural "%(cnt)s Votes " +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:50 +msgid "thumb up" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:51 +msgid "user has voted up this many times" +msgstr "该用户投的赞æˆç¥¨æ€»æ•°" + +#: forum/skins/default/templates/user_stats.html:55 +msgid "thumb down" +msgstr "" + +#: forum/skins/default/templates/user_stats.html:56 +#, fuzzy +msgid "user voted down this many times" +msgstr "用户投的å对票总数" + +#: forum/skins/default/templates/user_stats.html:64 +#, python-format +msgid "%(counter)s Tag" +msgid_plural "%(counter)s Tags" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_stats.html:72 +#, fuzzy, python-format +msgid "" +"see other questions with %(view_user)s's contributions tagged '%(tag_name)s' " +msgstr "查看有关'%s'的问题" + +#: forum/skins/default/templates/user_stats.html:86 +#, python-format +msgid "%(counter)s Badge" +msgid_plural "%(counter)s Badges" +msgstr[0] "" +msgstr[1] "" + +#: forum/skins/default/templates/user_tabs.html:7 +msgid "User profile" +msgstr "用户概览" + +#: forum/skins/default/templates/user_tabs.html:7 forum/views/users.py:907 +msgid "overview" +msgstr "概览" + +#: forum/skins/default/templates/user_tabs.html:9 forum/views/users.py:915 +msgid "recent activity" +msgstr "最近活动" + +#: forum/skins/default/templates/user_tabs.html:12 forum/views/users.py:925 +msgid "comments and answers to others questions" +msgstr "其他用户的回å¤å’Œè¯„论" + +#: forum/skins/default/templates/user_tabs.html:13 forum/views/users.py:924 +msgid "responses" +msgstr "回应" + +#: forum/skins/default/templates/user_tabs.html:16 +msgid "graph of user reputation" +msgstr "用户的社区积分历å²" + +#: forum/skins/default/templates/user_tabs.html:17 +msgid "reputation history" +msgstr "积分" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:951 +msgid "user vote record" +msgstr "用户所有投票" + +#: forum/skins/default/templates/user_tabs.html:20 forum/views/users.py:950 +msgid "casted votes" +msgstr "投票" + +#: forum/skins/default/templates/user_tabs.html:23 +msgid "questions that user selected as his/her favorite" +msgstr "用户收è—的问题" + +#: forum/skins/default/templates/user_tabs.html:24 +msgid "favorites" +msgstr "收è—" + +#: forum/skins/default/templates/user_tabs.html:27 forum/views/users.py:960 +msgid "email subscription settings" +msgstr "" + +#: forum/skins/default/templates/user_tabs.html:28 forum/views/users.py:959 +#, fuzzy +msgid "email subscriptions" +msgstr "全部问题" + +#: forum/skins/default/templates/users.html:6 +#: forum/skins/default/templates/users.html:24 +msgid "Users" +msgstr "用户列表" + +#: forum/skins/default/templates/users.html:27 +msgid "recent" +msgstr "最新加入" + +#: forum/skins/default/templates/users.html:29 +msgid "by username" +msgstr "用户å" + +#: forum/skins/default/templates/users.html:35 +#, fuzzy, python-format +msgid "users matching query %(suser)s:" +msgstr "" +"匹é…查询 '%s' 的所有用户å:" + +#: forum/skins/default/templates/users.html:39 +msgid "Nothing found." +msgstr "没有找到相关数æ®ã€‚" + +#: forum/skins/default/templates/users_questions.html:11 +#, fuzzy +msgid "this questions was selected as favorite" +msgstr "这个问题被" + +#: forum/skins/default/templates/users_questions.html:12 +msgid "thumb-up on" +msgstr "" + +#: forum/skins/default/templates/users_questions.html:19 +msgid "thumb-up off" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:3 +#: forum/skins/default/templates/authopenid/changeemail.html:9 +#: forum/skins/default/templates/authopenid/changeemail.html:38 +msgid "Change email" +msgstr "æ›´æ¢ç”µå­é‚®ä»¶" + +#: forum/skins/default/templates/authopenid/changeemail.html:11 +#, fuzzy +msgid "Save your email address" +msgstr "您的电å­é‚®ä»¶åœ°å€" + +#: forum/skins/default/templates/authopenid/changeemail.html:16 +#, fuzzy, python-format +msgid "change %(email)s info" +msgstr "æ›´æ¢ç”µå­é‚®ä»¶" + +#: forum/skins/default/templates/authopenid/changeemail.html:18 +#, python-format +msgid "here is why email is required, see %(gravatar_faq_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your new Email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:31 +msgid "Your Email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:38 +#, fuzzy +msgid "Save Email" +msgstr "æ›´æ¢ç”µå­é‚®ä»¶" + +#: forum/skins/default/templates/authopenid/changeemail.html:49 +#, fuzzy +msgid "Validate email" +msgstr "æ›´æ¢ç”µå­é‚®ä»¶" + +#: forum/skins/default/templates/authopenid/changeemail.html:52 +#, python-format +msgid "validate %(email)s info or go to %(change_email_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:57 +msgid "Email not changed" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:60 +#, python-format +msgid "old %(email)s kept, if you like go to %(change_email_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:65 +#, fuzzy +msgid "Email changed" +msgstr "密ç " + +#: forum/skins/default/templates/authopenid/changeemail.html:68 +#, python-format +msgid "your current %(email)s can be used for this" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:73 +msgid "Email verified" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:76 +msgid "thanks for verifying email" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:81 +msgid "email key not sent" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeemail.html:84 +#, python-format +msgid "email key not sent %(email)s change email here %(change_link)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:8 +#, fuzzy +msgid "Account: change OpenID URL" +msgstr "æ›´æ¢OpenID地å€" + +#: forum/skins/default/templates/authopenid/changeopenid.html:12 +msgid "" +"This is where you can change your OpenID URL. Make sure you remember it!" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:14 +#: forum/skins/default/templates/authopenid/delete.html:14 +#: forum/skins/default/templates/authopenid/delete.html:24 +msgid "Please correct errors below:" +msgstr "" + +#: forum/skins/default/templates/authopenid/changeopenid.html:29 +msgid "OpenID URL:" +msgstr "" + +#: forum/skins/default/templates/authopenid/changepw.html:7 +#, fuzzy +msgid "Account: change password" +msgstr "修改密ç " + +#: forum/skins/default/templates/authopenid/changepw.html:8 +msgid "This is where you can change your password. Make sure you remember it!" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:19 +msgid "Connect your OpenID with this site" +msgstr "绑定OpenID" + +#: forum/skins/default/templates/authopenid/complete.html:22 +msgid "Connect your OpenID with your account on this site" +msgstr "绑定OpenIDå¸å·" + +#: forum/skins/default/templates/authopenid/complete.html:27 +#, python-format +msgid "register new %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:31 +#, python-format +msgid "" +"%(username)s already exists, choose another name for \n" +" %(provider)s. Email is required too, see %" +"(gravatar_faq_url)s\n" +" " +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:35 +#, python-format +msgid "" +"register new external %(provider)s account info, see %(gravatar_faq_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:38 +#, python-format +msgid "register new Facebook connect account info, see %(gravatar_faq_url)s" +msgstr "" + +# todo: review this message may be confusing user +#: forum/skins/default/templates/authopenid/complete.html:42 +msgid "This account already exists, please use another." +msgstr "输入您的新å¸å·æˆ–者指定已ç»å­˜åœ¨çš„å¸å·ã€‚" + +#: forum/skins/default/templates/authopenid/complete.html:57 +msgid "Sorry, looks like we have some errors:" +msgstr "请注æ„以下错误:" + +#: forum/skins/default/templates/authopenid/complete.html:82 +msgid "Screen name label" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:89 +#, fuzzy +msgid "Email address label" +msgstr "您的电å­é‚®ä»¶åœ°å€" + +#: forum/skins/default/templates/authopenid/complete.html:95 +#: forum/skins/default/templates/authopenid/signup.html:18 +msgid "receive updates motivational blurb" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:99 +#: forum/skins/default/templates/authopenid/signup.html:22 +msgid "please select one of the options above" +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:102 +msgid "Tag filter tool will be your right panel, once you log in." +msgstr "" + +#: forum/skins/default/templates/authopenid/complete.html:103 +msgid "create account" +msgstr "创建å¸å·" + +#: forum/skins/default/templates/authopenid/complete.html:112 +msgid "Existing account" +msgstr "å·²ç»å­˜åœ¨çš„用户" + +#: forum/skins/default/templates/authopenid/complete.html:113 +msgid "user name" +msgstr "用户å" + +#: forum/skins/default/templates/authopenid/complete.html:114 +msgid "password" +msgstr "密ç " + +#: forum/skins/default/templates/authopenid/complete.html:121 +msgid "Register" +msgstr "确认" + +#: forum/skins/default/templates/authopenid/complete.html:122 +#: forum/skins/default/templates/authopenid/signin.html:168 +msgid "Forgot your password?" +msgstr "忘记密ç ï¼Ÿ" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:2 +msgid "Thank you for registering at our Q&A forum!" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:4 +msgid "Your account details are:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:6 +#, fuzzy +msgid "Username:" +msgstr "您的大å" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:7 +#: forum/skins/default/templates/authopenid/delete.html:19 +#, fuzzy +msgid "Password:" +msgstr "密ç " + +#: forum/skins/default/templates/authopenid/confirm_email.txt:9 +msgid "Please sign in here:" +msgstr "" + +#: forum/skins/default/templates/authopenid/confirm_email.txt:12 +#: forum/skins/default/templates/authopenid/email_validation.txt:14 +#: forum/skins/default/templates/authopenid/sendpw_email.txt:8 +msgid "" +"Sincerely,\n" +"Forum Administrator" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:8 +#, fuzzy +msgid "Account: delete account" +msgstr "删除å¸å·" + +#: forum/skins/default/templates/authopenid/delete.html:12 +msgid "" +"Note: After deleting your account, anyone will be able to register this " +"username." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:16 +msgid "Check confirm box, if you want delete your account." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:31 +msgid "I am sure I want to delete my account." +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "Password/OpenID URL" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:32 +msgid "(required for your security)" +msgstr "" + +#: forum/skins/default/templates/authopenid/delete.html:34 +#, fuzzy +msgid "Delete account permanently" +msgstr "删除å¸å·" + +#: forum/skins/default/templates/authopenid/email_validation.txt:2 +msgid "Greetings from the Q&A forum" +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:4 +msgid "To make use of the Forum, please follow the link below:" +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:8 +msgid "Following the link above will help us verify your email address." +msgstr "" + +#: forum/skins/default/templates/authopenid/email_validation.txt:10 +msgid "" +"If you beleive that this message was sent in mistake - \n" +"no further action is needed. Just ingore this email, we apologize\n" +"for any inconvenience" +msgstr "" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:4 +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:7 +#, fuzzy +msgid "Traditional login information" +msgstr "个人身份信æ¯" + +#: forum/skins/default/templates/authopenid/external_legacy_login_info.html:12 +#, python-format +msgid "" +"how to login with password through external login website or use %" +"(feedback_url)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw.html:4 +#: forum/skins/default/templates/authopenid/sendpw.html:7 +msgid "Send new password" +msgstr "å‘é€æ–°å¯†ç " + +#: forum/skins/default/templates/authopenid/sendpw.html:10 +msgid "password recovery information" +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw.html:21 +msgid "Reset password" +msgstr "é‡è®¾å¯†ç " + +#: forum/skins/default/templates/authopenid/sendpw.html:22 +msgid "return to login" +msgstr "返回登录" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:2 +#, python-format +msgid "" +"Someone has requested to reset your password on %(site_url)s.\n" +"If it were not you, it is safe to ignore this email." +msgstr "" + +#: forum/skins/default/templates/authopenid/sendpw_email.txt:5 +#, python-format +msgid "" +"email explanation how to use new %(password)s for %(username)s\n" +"with the %(key_link)s" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:5 +#: forum/skins/default/templates/authopenid/signin.html:21 +msgid "User login" +msgstr "用户登录" + +#: forum/skins/default/templates/authopenid/signin.html:28 +#, python-format +msgid "" +"\n" +" Your answer to %(title)s %(summary)s will be posted once you " +"log in\n" +" " +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:35 +#, python-format +msgid "" +"Your question \n" +" %(title)s %(summary)s will be posted once you log in\n" +" " +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:42 +msgid "Click to sign in through any of these services." +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:144 +msgid "Enter your Provider user name" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:151 +msgid "" +"Enter your OpenID " +"web address" +msgstr "" + +#: forum/skins/default/templates/authopenid/signin.html:153 +#: forum/skins/default/templates/authopenid/signin.html:166 +msgid "Login" +msgstr "登录" + +#: forum/skins/default/templates/authopenid/signin.html:157 +#, fuzzy +msgid "Enter your login name and password" +msgstr "使用å¸å·å¯†ç ç™»å½•" + +#: forum/skins/default/templates/authopenid/signin.html:161 +msgid "Login name" +msgstr "用户å" + +#: forum/skins/default/templates/authopenid/signin.html:163 +msgid "Password" +msgstr "密ç " + +#: forum/skins/default/templates/authopenid/signin.html:167 +#, fuzzy +msgid "Create account" +msgstr "创建å¸å·" + +#: forum/skins/default/templates/authopenid/signin.html:178 +msgid "Why use OpenID?" +msgstr "为什么需è¦OpenID登录?" + +#: forum/skins/default/templates/authopenid/signin.html:181 +msgid "with openid it is easier" +msgstr "" +"构建在OpenID网络认è¯ä¸Šçš„本系统,ä¸éœ€è¦ä½ æ³¨å†Œæ–°çš„å¸å·ï¼Œå³å¯ä½¿ç”¨æˆ‘们系统的所有" +"功能" + +#: forum/skins/default/templates/authopenid/signin.html:184 +msgid "reuse openid" +msgstr "用åŒä¸€ä¸ªå¸å·å¯ç™»å½•äº’è”网所有激活OpenID的网站" + +#: forum/skins/default/templates/authopenid/signin.html:187 +msgid "openid is widely adopted" +msgstr "全世界有1.6亿OpenIDå¸å·ï¼Œå’Œ10,000个支æŒOpenID的站点" + +#: forum/skins/default/templates/authopenid/signin.html:190 +msgid "openid is supported open standard" +msgstr "OpenID是有开放标准,并且有相关的基金组织æ供支æŒ" + +#: forum/skins/default/templates/authopenid/signin.html:195 +msgid "Find out more" +msgstr "查看更多" + +#: forum/skins/default/templates/authopenid/signin.html:196 +msgid "Get OpenID" +msgstr "获å–OpenID" + +#: forum/skins/default/templates/authopenid/signup.html:4 +msgid "Signup" +msgstr "注册å¸å·" + +#: forum/skins/default/templates/authopenid/signup.html:8 +#, fuzzy +msgid "Create login name and password" +msgstr "使用å¸å·å¯†ç ç™»å½•" + +#: forum/skins/default/templates/authopenid/signup.html:10 +msgid "Traditional signup info" +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:25 +msgid "" +"Please read and type in the two words below to help us prevent automated " +"account creation." +msgstr "" + +#: forum/skins/default/templates/authopenid/signup.html:27 +#, fuzzy +msgid "Create Account" +msgstr "创建å¸å·" + +#: forum/skins/default/templates/authopenid/signup.html:28 +msgid "or" +msgstr "或者" + +#: forum/skins/default/templates/authopenid/signup.html:29 +#, fuzzy +msgid "return to OpenID login" +msgstr "返回登录" + +#: forum/skins/default/templates/fbconnect/xd_receiver.html:5 +#, python-format +msgid "Connect to %(APP_SHORT_NAME)s with Facebook!" +msgstr "" + +#: forum/templatetags/extra_filters.py:100 +#, fuzzy +msgid "no items in counter" +msgstr "no" + +#: forum/templatetags/extra_tags.py:53 +#, python-format +msgid "%(username)s gravatar image" +msgstr "" + +#: forum/templatetags/extra_tags.py:178 forum/templatetags/extra_tags.py:205 +#, fuzzy +msgid "reputation points" +msgstr "积分" + +#: forum/templatetags/extra_tags.py:265 +#, fuzzy +msgid "2 days ago" +msgstr "于%s关闭" + +#: forum/templatetags/extra_tags.py:267 +msgid "yesterday" +msgstr "" + +#: forum/templatetags/extra_tags.py:269 +#, python-format +msgid "%(hr)d hour ago" +msgid_plural "%(hr)d hours ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/templatetags/extra_tags.py:271 +#, python-format +msgid "%(min)d min ago" +msgid_plural "%(min)d mins ago" +msgstr[0] "" +msgstr[1] "" + +#: forum/utils/forms.py:30 +#, fuzzy +msgid "this field is required" +msgstr " 标签ä¸èƒ½ä¸ºç©ºã€‚" + +#: forum/utils/forms.py:45 +msgid "choose a username" +msgstr "选择一个用户å" + +#: forum/utils/forms.py:50 +#, fuzzy +msgid "user name is required" +msgstr " 标签ä¸èƒ½ä¸ºç©ºã€‚" + +#: forum/utils/forms.py:51 +#, fuzzy +msgid "sorry, this name is taken, please choose another" +msgstr "对ä¸èµ·ï¼Œæ‚¨ä¸èƒ½æ³¨å†Œè¯¥ç”¨æˆ·å,请æ¢ä¸€ä¸ªè¯•è¯•" + +#: forum/utils/forms.py:52 +#, fuzzy +msgid "sorry, this name is not allowed, please choose another" +msgstr "对ä¸èµ·ï¼Œæ‚¨ä¸èƒ½æ³¨å†Œè¯¥ç”¨æˆ·å,请æ¢ä¸€ä¸ªè¯•è¯•" + +#: forum/utils/forms.py:53 +msgid "sorry, there is no user with this name" +msgstr "" + +#: forum/utils/forms.py:54 +msgid "sorry, we have a serious error - user name is taken by several users" +msgstr "" + +#: forum/utils/forms.py:55 +msgid "user name can only consist of letters, empty space and underscore" +msgstr "" + +#: forum/utils/forms.py:109 +msgid "your email address" +msgstr "您的电å­é‚®ä»¶åœ°å€" + +#: forum/utils/forms.py:110 +#, fuzzy +msgid "email address is required" +msgstr " 标签ä¸èƒ½ä¸ºç©ºã€‚" + +#: forum/utils/forms.py:111 +msgid "please enter a valid email address" +msgstr "" + +#: forum/utils/forms.py:112 +#, fuzzy +msgid "this email is already used by someone else, please choose another" +msgstr "该电å­é‚®ä»¶å·²è¢«æ³¨å†Œï¼Œè¯·é€‰æ‹©å¦ä¸€ä¸ªå†è¯•ã€‚" + +#: forum/utils/forms.py:140 +msgid "choose password" +msgstr "密ç " + +#: forum/utils/forms.py:141 +#, fuzzy +msgid "password is required" +msgstr " 标签ä¸èƒ½ä¸ºç©ºã€‚" + +#: forum/utils/forms.py:144 +msgid "retype password" +msgstr "确认密ç " + +#: forum/utils/forms.py:145 +#, fuzzy +msgid "please, retype your password" +msgstr "确认密ç " + +#: forum/utils/forms.py:146 +msgid "sorry, entered passwords did not match, please try again" +msgstr "" + +#: forum/views/commands.py:209 +#, python-format +msgid "subscription saved, %(email)s needs validation, see %(details_url)s" +msgstr "" + +#: forum/views/commands.py:217 +msgid "email update frequency has been set to daily" +msgstr "" + +#: forum/views/meta.py:35 +msgid "Q&A forum feedback" +msgstr "" + +#: forum/views/meta.py:36 +msgid "Thanks for the feedback!" +msgstr "" + +#: forum/views/meta.py:44 +msgid "We look forward to hearing your feedback! Please, give it next time :)" +msgstr "" + +#: forum/views/users.py:867 forum/views/users.py:871 +msgid "changes saved" +msgstr "" + +#: forum/views/users.py:877 +msgid "email updates canceled" +msgstr "" + +#: forum/views/users.py:908 +#, fuzzy +msgid "user profile" +msgstr "用户概览" + +#: forum/views/users.py:909 +#, fuzzy +msgid "user profile overview" +msgstr "用户概览" + +#: forum/views/users.py:916 +#, fuzzy +msgid "recent user activity" +msgstr "最近活动" + +#: forum/views/users.py:917 +#, fuzzy +msgid "profile - recent activity" +msgstr "最近活动" + +#: forum/views/users.py:926 +msgid "profile - responses" +msgstr "回应 - 用户资料" + +#: forum/views/users.py:934 +msgid "user reputation in the community" +msgstr "用户社区积分" + +#: forum/views/users.py:935 +msgid "profile - user reputation" +msgstr "积分 - 用户资料" + +#: forum/views/users.py:941 +#, fuzzy +msgid "favorite questions" +msgstr "收è—" + +#: forum/views/users.py:942 +msgid "users favorite questions" +msgstr "用户收è—的问题" + +#: forum/views/users.py:943 +msgid "profile - favorite questions" +msgstr "æ”¶è— - 用户资料" + +#: forum/views/users.py:952 +msgid "profile - votes" +msgstr "投票 - 用户资料" + +#: forum/views/users.py:961 +#, fuzzy +msgid "profile - email subscriptions" +msgstr "æ”¶è— - 用户资料" + +#: forum/views/writers.py:70 +msgid "uploading images is limited to users with >60 reputation points" +msgstr "上传图片åªé™äºŽç§¯åˆ†+60以上注册用户!" + +# todo take these out of settings +#: forum/views/writers.py:72 +msgid "allowed file types are 'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'" +msgstr "åªå…许上传'jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff'类型的文件ï¼" + +#: forum/views/writers.py:74 +#, python-format +msgid "maximum upload file size is %sK" +msgstr "åªå…许上传%sK大å°çš„文件ï¼" + +#: forum/views/writers.py:76 +#, fuzzy, python-format +msgid "" +"Error uploading file. Please contact the site administrator. Thank you. %s" +msgstr "在文件上传过程中产生了错误,请è”系管ç†å‘˜ï¼Œè°¢è°¢^_^" + +#: forum_modules/authentication/auth.py:27 +msgid "Email Validation" +msgstr "" + +#: forum_modules/authentication/auth.py:38 +msgid "Thank you, your email is now validated." +msgstr "" + +#: forum_modules/authentication/auth.py:62 +#, fuzzy +msgid "Your password was changed" +msgstr "密ç " + +#: forum_modules/authentication/auth.py:64 +#, fuzzy +msgid "New password set" +msgstr "密ç " + +#: forum_modules/authentication/auth.py:130 +#, python-format +msgid "Welcome back %s, you are now logged in" +msgstr "" + +#: forum_modules/books/urls.py:7 forum_modules/books/urls.py:8 +#: forum_modules/books/urls.py:9 +#, fuzzy +msgid "books/" +msgstr "读书" + +#, fuzzy +#~ msgid "account_settings" +#~ msgstr "设置" + +#~ msgid "The users have been awarded with badges:" +#~ msgstr "用户已被授予该奖牌:" + +#, fuzzy +#~ msgid "one revision" +#~ msgid_plural "%(rev_count)s revisions" +#~ msgstr[0] "版本" +#~ msgstr[1] "版本" + +#, fuzzy +#~ msgid " One question found" +#~ msgid_plural "%(q_num)s questions found" +#~ msgstr[0] "" +#~ "问题按æ问时间显示排åºã€‚新加入的问题将显示在最å‰é¢ã€‚" +#~ msgstr[1] "" +#~ "问题按æ问时间显示排åºã€‚新加入的问题将显示在最å‰é¢ã€‚" + +# translation and user name validation are language-specific +#~ msgid "invalid user name" +#~ msgstr "用户ååªèƒ½åŒ…å«è‹±æ–‡å­—æ¯ã€æ•°å­—和下划线" + +# minimal length of user name may be language specific +#~ msgid "username too short" +#~ msgstr "用户å太短,请使用三个或三个以上字符" + +#~ msgid "this name is already in use - please try anoter" +#~ msgstr "该用户å已被注册,请æ¢ä¸€ä¸ªè¯•è¯•" + +#~ msgid "" +#~ "This email is already registered in our database. Please " +#~ "choose another." +#~ msgstr "该电å­é‚®ä»¶å·²è¢«æ³¨å†Œï¼Œè¯·é€‰æ‹©å¦ä¸€ä¸ªå†è¯•ã€‚" + +#~ msgid "site title" +#~ msgstr "CNProg.com" + +#~ msgid "site slogan" +#~ msgstr "程åºå‘˜é—®ç­”社区" + +#~ msgid "meta site content" +#~ msgstr "" +#~ "中国程åºå‘˜çš„编程技术问答社区。我们åšä¸“业的ã€å¯å作编辑的技术问答社区。" + +#~ msgid "" +#~ "please use space to separate tags (this enables autocomplete feature)" +#~ msgstr "多个标签请用空格间隔-最多5个标签。(优先使用自动匹é…的英文标签。)" + +#~ msgid "" +#~ "please use following characters in tags: letters 'a-z', numbers, and " +#~ "characters '.-_#'" +#~ msgstr "标签请使用英文字æ¯ï¼Œä¸­æ–‡æˆ–者数字字符串(. - _ # 也å¯ä»¥ï¼‰" + +#~ msgid "user preference settings" +#~ msgstr "用户å‚数的设置" + +#~ msgid "profile - user preferences" +#~ msgstr "设置 - 用户资料" + +#, fuzzy +#~ msgid " ago" +#~ msgstr "å‰" + +#~ msgid "Save" +#~ msgstr "ä¿å­˜" + +#~ msgid "Use" +#~ msgstr "使用" + +#~ msgid "learn more about OpenID" +#~ msgstr "了解更多有关OpenIDçš„ä¿¡æ¯" + +#, fuzzy +#~ msgid "Get your own " +#~ msgstr "获å–您自己的" + +#~ msgid "Email: (won't be shown to anyone)" +#~ msgstr "电å­é‚®ä»¶:(ä¸ä¼šå…¬å¼€æ˜¾ç¤ºï¼‰" + +#~ msgid "" +#~ "gold badge descriptionGold badge is very rare. To obtain it you have to " +#~ "show profound knowledge and ability in addition to actively participating " +#~ "in the community. Gold badge is the highest award in this community." +#~ msgstr "" +#~ "金牌是å分罕è§çš„。你ä¸ä»…è¦å‚与社区的æé—®ã€å›žç­”ã€æŠ•ç¥¨ç­‰æ´»åŠ¨ï¼Œè€Œä¸”需è¦æœ‰é«˜æ·±" +#~ "的知识和能力æ‰èƒ½èŽ·å¾—。" + +#~ msgid "" +#~ "silver badge descriptionObtaining silver badge requires significant " +#~ "patience. If you got one, you've very significantly contributed to this " +#~ "community" +#~ msgstr "它是ä¸åŒå¯»å¸¸çš„è£èª‰ï¼Œåªè¦ä½ ä»˜å‡ºè¶³å¤Ÿçš„努力就会得到。" + +#~ msgid "Connect with Twitter" +#~ msgstr "åŒæ­¥Twitter消æ¯" + +#~ msgid "Twitter account name:" +#~ msgstr "è´¦å·:" + +#~ msgid "Twitter password:" +#~ msgstr "密ç :" + +#~ msgid "Send my Questions to Twitter" +#~ msgstr "å‘布我的æ问到我的Twitter" + +#~ msgid "Send my Answers to Twitter" +#~ msgstr "å‘布我的回答到我的Twitter" + +#, fuzzy +#~ msgid "" +#~ "bronze badge descriptionIf you are active in this community, you will get " +#~ "this medal - still it is a special honor." +#~ msgstr "铜牌会在你活跃于社区时产生,它相对容易获得,但也是一ç§ç‰¹æ®Šçš„è£èª‰ã€‚" + +#~ msgid "see" +#~ msgstr "查看" + +#, fuzzy +#~ msgid "About us" +#~ msgstr "关于本站" + +#, fuzzy +#~ msgid "Contact" +#~ msgstr "è”系我们" + +#~ msgid "my profile" +#~ msgstr "我的资料" + +#~ msgid "last updated questions" +#~ msgstr "最新更新的问题" + +# must have extra space after in english +#~ msgid "see questions tagged" +#~ msgstr "查看有关" + +#~ msgid "welcome to website" +#~ msgstr "CNProg欢迎您!" + +#~ msgid "Recent tags" +#~ msgstr "最新标签" + +#~ msgid "Recent awards" +#~ msgstr "最新奖牌" + +#~ msgid "given to" +#~ msgstr "授予" + +#~ msgid "all awards" +#~ msgstr "所有奖牌" + +#~ msgid "subscribe to last 30 questions by RSS" +#~ msgstr "RSS订阅最新30个问题" + +#~ msgid "Still looking for more? See" +#~ msgstr "在寻找更多问题å—?请查阅" + +#, fuzzy +#~ msgid "complete list of quesionts" +#~ msgstr "全部问题列表" + +#~ msgid "Account: change email" +#~ msgstr "修改电å­é‚®ä»¶" + +#, fuzzy +#~ msgid "Size per page:" +#~ msgstr "æ¯é¡µæ˜¾ç¤º" + +#~ msgid "Login to answer" +#~ msgstr "登录并回答该问题" + +#~ msgid "ago" +#~ msgstr "å‰" + +# index.html +#~ msgid "Community wiki" +#~ msgstr "社区Wiki" + +# must have extra space after in english +#, fuzzy +#~ msgid "Browse questions with tag of " +#~ msgstr "查看有关" + +#~ msgid "All tags matching query" +#~ msgstr "匹é…查询" + +#~ msgid "all tags - make this empty in english" +#~ msgstr "的所有标签" + +#~ msgid "most recently asked questions" +#~ msgstr "最新加入系统的问题" + +# in unanswered.html and somewhere else +#~ msgid "Have a total of" +#~ msgstr "您正在æµè§ˆæ‰€æœ‰" + +#~ msgid "image associated with your email address" +#~ msgstr "和您的邮件地å€æ˜¯ç»‘定的" + +#~ msgid "avatar" +#~ msgstr "修改头åƒ" + +#, fuzzy +#~ msgid "" +#~ "the answer has been commented %(answered_question.comment_count)s times" +#~ msgstr "该回答有%dæ¡è¯„论" + +#~ msgid "votes total" +#~ msgstr "个投票" + +#~ msgid "Tags" +#~ msgstr "个标签" + +#, fuzzy +#~ msgid "New password again" +#~ msgstr "å‘é€æ–°å¯†ç " + +#, fuzzy +#~ msgid "" +#~ "Your OpenID is accepted. Please complete this to finish registration." +#~ msgstr "您的OpenIDå¸å·å·²ç»éªŒè¯é€šè¿‡! 请完æˆæœ€åŽä¸€æ­¥ - 绑定OpenID到您的å¸å·ã€‚" + +#~ msgid "New account" +#~ msgstr "æ–°å¸å·" + +#~ msgid "User name (will be shown to others, cannot be modified)" +#~ msgstr "用户å(在社区显示å‹å¥½å称,ä¸å¯æ›´æ”¹ï¼‰" + +#~ msgid "Lost your password? No problem - here you can reset it." +#~ msgstr "丢失了您的密ç ï¼Ÿ ä½ å¯ä»¥åœ¨è¿™é‡Œé‡è®¾å¯†ç ã€‚" + +#~ msgid "" +#~ "Please enter your username below and new password will be sent to your " +#~ "registered e-mail" +#~ msgstr "请输入用户å,新的密ç ä¼šå‘é€åˆ°ä½ æ³¨å†Œæ—¶å€™å¡«å†™çš„电å­é‚®ä»¶ã€‚" + +# todo - check translation or see if it's indeed true +#~ msgid "" +#~ "Note: your new password will be activated only after you click the " +#~ "activation link in the email message" +#~ msgstr "注æ„: 新的密ç åªæœ‰æ‚¨åœ¨æ¿€æ´»é‚®ä»¶ä¸­çš„链接åŽæ‰ä¼šè¢«æ¿€æ´»ã€‚" + +#~ msgid "we support two login modes" +#~ msgstr "" +#~ "CNProg支æŒä¸¤ç§ç™»å½•æ¨¡å¼ã€‚您å¯ä»¥ä½¿ç”¨å¸å·ã€å¯†ç ç™»å½•ï¼Œæˆ–者使用OpenIDç™»" +#~ "录。" + +#~ msgid "Login with your OpenID" +#~ msgstr "使用OpenID登录" + +#~ msgid "select openid provider" +#~ msgstr "1)请选择您的å¸å·ç±»ï¼š" + +#~ msgid "verify openid link and login" +#~ msgstr "2)型并完æˆæ­£ç¡®çš„OpenID地å€ï¼ˆå¦‚:替æ¢â€œ{username}â€ä¸ºæ‚¨çš„对应å¸å·ï¼‰ï¼š" + +#, fuzzy +#~ msgid "Create new acccount" +#~ msgstr "注册新å¸å·" + +#~ msgid "" +#~ "We support two types of user registration: conventional username/" +#~ "password, and" +#~ msgstr "我们支æŒä¸¤ç§æ³¨å†Œæ–¹å¼ï¼Œä½ å¯ä»¥ä½¿ç”¨å¸¸è§„的用户åã€å¯†ç æ–¹å¼æ³¨å†Œï¼Œæˆ–者" + +#~ msgid "the OpenID method" +#~ msgstr "使用OpenIDå¸å·æ³¨å†Œ" + +#, fuzzy +#~ msgid "Sorry, looks like we have some errors" +#~ msgstr "请注æ„以下错误:" + +#~ msgid "Conventional registration" +#~ msgstr "请注æ„以下错误:" + +#~ msgid "choose a user name" +#~ msgstr "选择一个用户å" + +#~ msgid "back to login" +#~ msgstr "返回登录" + +#~ msgid "Register with your OpenID" +#~ msgstr "使用OpenID注册" + +#~ msgid "meta site keywords, comma separated" +#~ msgstr "" +#~ "技术问答社区,中国程åºå‘˜ï¼Œç¼–程技术社区,程åºå‘˜ç¤¾åŒºï¼Œç¨‹åºå‘˜è®ºå›ï¼Œç¨‹åºå‘˜" +#~ "wiki,程åºå‘˜åšå®¢" + +#~ msgid "what is this website" +#~ msgstr "" +#~ "CNProg是一个é¢å‘程åºå‘˜çš„å¯å作编辑的开放æºä»£ç é—®" +#~ "答社区。" + +#~ msgid "what can one do on this website" +#~ msgstr "" +#~ "您å¯ä»¥åœ¨è¿™é‡Œæé—®å„类程åºæŠ€æœ¯é—®é¢˜ - 问题ä¸åˆ†è¯­è¨€å’Œå¹³å°ã€‚ " +#~ "åŒæ—¶ä¹Ÿå¸Œæœ›æ‚¨å¯¹åŠ›æ‰€èƒ½åŠçš„问题,给予您的å®è´µç­”案。" + +#~ msgid "book technical Q&A" +#~ msgstr "图书相关的技术答疑" + +#~ msgid "blog" +#~ msgstr "Blog" + +#~ msgid "number of votes" +#~ msgstr "票数" + +#~ msgid "number - make blank in english" +#~ msgstr "页" + +#~ msgid "Change now" +#~ msgstr "现在修改" + +#~ msgid "uses tags for the classification of questions" +#~ msgstr "用标签æ¥åˆ†ç±»ç³»ç»Ÿçš„ä¿¡æ¯" + +#~ msgid "Found by tag" +#~ msgstr "标签问题" + +#~ msgid "" +#~ "\n" +#~ "\t\t\thave total %(q_num)s questions tagged %(tagname)s\n" +#~ "\t\t\t" +#~ msgid_plural "" +#~ "\n" +#~ "\t\t\thave total %(q_num)s questions tagged %(tagname)s\n" +#~ "\t\t\t" +#~ msgstr[0] "" +#~ "\n" +#~ "您正在æµè§ˆæ‰€æœ‰
%(q_num)s
个标记为%(tagname)s

" +#~ msgstr[1] "" +#~ "\n" +#~ "您正在æµè§ˆæ‰€æœ‰
%(q_num)s
个标记为%(tagname)s

" + +#~ msgid "" +#~ "\n" +#~ "\t\t\thave total %(q_num)s questions containing %(searchtitle)s\n" +#~ "\t\t\t" +#~ msgid_plural "" +#~ "\n" +#~ "\t\t\thave total %(q_num)s questions containing %(searchtitle)s\n" +#~ "\t\t\t" +#~ msgstr[0] "" +#~ "\n" +#~ "您正在æµè§ˆæ‰€æœ‰
%(q_num)s
个标题å«æœ‰" +#~ "%(searchtitle)s

" +#~ msgstr[1] "" +#~ "\n" +#~ "您正在æµè§ˆæ‰€æœ‰
%(q_num)s
个标题å«æœ‰" +#~ "%(searchtitle)s

" + +#~ msgid "tagged with" +#~ msgstr "标记为" + +#~ msgid "whose title contains" +#~ msgstr "标题å«æœ‰" + +#~ msgid "number of questions end of sentence" +#~ msgstr "的问题。" + +#~ msgid "Questions are sorted by the time of last update." +#~ msgstr "问题按最åŽæ›´æ–°æ—¶é—´æ˜¾ç¤ºæŽ’åºã€‚" + +#~ msgid "Most recently answered ones are shown first." +#~ msgstr "最åŽè¢«å›žç­”或者>更新的问题将显示在最å‰é¢ã€‚" + +#~ msgid "Questions sorted by number of responses." +#~ msgstr "问题按回å¤æ•°é‡æ˜¾ç¤ºæŽ’åºã€‚" + +#~ msgid "Most answered questions are shown first" +#~ msgstr "回å¤æœ€å¤šçš„问题将显示在最å‰é¢ã€‚" + +#~ msgid "Questions are sorted by the number of votes." +#~ msgstr "问题按投票数é‡æ˜¾ç¤ºæŽ’åºã€‚" + +#~ msgid "Most voted questions are shown first" +#~ msgstr "投票最多的问题将显示在最å‰é¢ã€‚" + +#~ msgid "" +#~ "Anyone can ask questions and give answers, points are not necessary for " +#~ "that." +#~ msgstr "对于正常使用社区进行æé—®ã€å›žç­”而言,积分ä¸æ˜¯å¿…须的。" + +#~ msgid "" +#~ "As we've said before, users help running this site. Point system helps " +#~ "select users who can administer this community." +#~ msgstr "" +#~ "我们一å†å£°æ˜Žï¼ŒCNProg由你æ¥è¿è¡Œå’Œç»´æŠ¤ã€‚如果你想帮助我们æ¥è¿ä½œCNProg,你需è¦" +#~ "一定的积分等级。" + +#~ msgid "" +#~ "Reputation points roughly measure how community trusts you. These points " +#~ "are given to you directly by other members of the community." +#~ msgstr "" +#~ "积分是一ç§ç”¨æ¥ç²—略衡é‡ç¤¾åŒºå¯¹ä½ æœ‰å¤šä¿¡ä»»çš„æ•°æ®ã€‚积分ä¸æ˜¯æœ‰è°æ¥æ”¯ä»˜æˆ–直接给予你的,而是你通过获得其他用户的支æŒå’Œä¿¡" +#~ "任“赚得â€çš„。" + +#~ msgid "" +#~ "For example, if you ask an interesting question or give a helpful answer, " +#~ "your input will be upvoted and you will gain more trust in the community." +#~ msgstr "" +#~ "举例æ¥è¯´ï¼Œå¦‚果你æ了一个éžå¸¸æœ‰å¸®åŠ©çš„问题或者åšäº†å¾ˆæœ‰ç”¨çš„回答,你将会被其他" +#~ "用户投赞æˆç¥¨ã€‚" + +#~ msgid "" +#~ "If on the other hand someone gives a misleading answer, the answer will " +#~ "be voted down and he/she loses some points." +#~ msgstr "" +#~ "相å,你æ了ä¸å—欢迎的问题,或者误导用户的回答,你将å¯èƒ½è¢«å…¶ä»–用户投å对" +#~ "票。æ¯ä¸ªèµžæˆ" + +#~ msgid "" +#~ "Each vote in favor will generate 10 points, each vote " +#~ "against will subtract 2 points." +#~ msgstr "" +#~ "票会帮你产生10个社区积分,æ¯ä¸ªå对票会相应扣除你" +#~ "2个积分。" + +#~ msgid "" +#~ "Through the votes of other people you can accumulate a maximum of " +#~ "200 points." +#~ msgstr "" +#~ "æ¯å¤©é€šè¿‡åˆ«äººæŠ•èµžæˆç¥¨ï¼Œä½ æœ€å¤šåªèƒ½äº§ç”Ÿ200个积分,这是上é™ã€‚" + +#~ msgid "After accumulating certain number of points, you can do more:" +#~ msgstr "当你累计到一定>积分,你å¯ä»¥åœ¨ç¤¾åŒºåšæ›´å¤šçš„事情:" + +#~ msgid "gold badge: the highest honor and is very rare" +#~ msgstr "金牌:å分罕è§ä¹‹æœ€é«˜è£è€€" + +#~ msgid "" +#~ "silver badge: occasionally awarded for the very high quality contributions" +#~ msgstr "银牌:å¶å°”é¢å‘之优质奖章" + +#~ msgid "Gold badge is very rare." +#~ msgstr "金牌是å分罕è§çš„。" + +#~ msgid "Gold badge is the highest award in this community." +#~ msgstr "获得金牌æ„味ç€ä½ åœ¨æŸä¸ªå±‚次上已ç»è¾¾åˆ°äº†é¡¶å³°ã€‚" + +#~ msgid "Obtaining silver badge requires significant patience." +#~ msgstr "银牌需è¦ç»è¿‡é•¿æ—¶é—´çš„奋斗æ‰èƒ½èŽ·å¾—。" diff --git a/askbot/management/__init__.py b/askbot/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/management/commands/__init__.py b/askbot/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/management/commands/base_command.py b/askbot/management/commands/base_command.py new file mode 100644 index 00000000..46a2d7a7 --- /dev/null +++ b/askbot/management/commands/base_command.py @@ -0,0 +1,25 @@ +""" +#------------------------------------------------------------------------------- +# Name: Award badges command +# Purpose: This is a command file croning in background process regularly to +# query database and award badges for user's special acitivities. +# +# Author: Mike, Sailing +# +# Created: 22/01/2009 +# Copyright: (c) Mike 2009 +# Licence: GPL V2 +#------------------------------------------------------------------------------- +""" +#!/usr/bin/env python +#encoding:utf-8 + +from django.core.management.base import NoArgsCommand + +class BaseCommand(NoArgsCommand): + def update_activities_auditted(self, cursor, activity_ids): + # update processed rows to auditted + if len(activity_ids): + query = "UPDATE activity SET is_auditted = 1 WHERE id in (%s)"\ + % ','.join('%s' % item for item in activity_ids) + cursor.execute(query) diff --git a/askbot/management/commands/clean_award_badges.py b/askbot/management/commands/clean_award_badges.py new file mode 100644 index 00000000..49e79fca --- /dev/null +++ b/askbot/management/commands/clean_award_badges.py @@ -0,0 +1,59 @@ +""" +#------------------------------------------------------------------------------- +# Name: Award badges command +# Purpose: This is a command file croning in background process regularly to +# query database and award badges for user's special acitivities. +# +# Author: Mike +# +# Created: 18/01/2009 +# Copyright: (c) Mike 2009 +# Licence: GPL V2 +#------------------------------------------------------------------------------- +""" +#!/usr/bin/env python +#encoding:utf-8 +from django.core.management.base import NoArgsCommand +from django.db import connection +from django.contrib.contenttypes.models import ContentType +from askbot import models + +class Command(NoArgsCommand): + def handle_noargs(self, **options): + try: + try: + self.clean_awards() + except Exception, e: + print e + finally: + connection.close() + + def clean_awards(self): + models.Award.objects.all().delete() + + award_type =ContentType.objects.get_for_model(models.Award) + models.Activity.objects.filter(content_type=award_type).delete() + + for user in models.User.objects.all(): + user.gold = 0 + user.silver = 0 + user.bronze = 0 + user.save() + + for badge in models.Badge.objects.all(): + badge.awarded_count = 0 + badge.save() + + query = "UPDATE activity SET is_auditted = 0" + cursor = connection.cursor() + try: + cursor.execute(query) + finally: + cursor.close() + connection.close() + +def main(): + pass + +if __name__ == '__main__': + main() diff --git a/askbot/management/commands/message_to_everyone.py b/askbot/management/commands/message_to_everyone.py new file mode 100644 index 00000000..c020c178 --- /dev/null +++ b/askbot/management/commands/message_to_everyone.py @@ -0,0 +1,12 @@ +from django.core.management.base import NoArgsCommand +from django.contrib.auth.models import User +import sys + +class Command(NoArgsCommand): + def handle_noargs(self, **options): + msg = None + if msg == None: + print 'to run this command, please first edit the file %s' % __file__ + sys.exit(1) + for u in User.objects.all(): + u.message_set.create(message = msg % u.username) diff --git a/askbot/management/commands/multi_award_badges.py b/askbot/management/commands/multi_award_badges.py new file mode 100644 index 00000000..430c6364 --- /dev/null +++ b/askbot/management/commands/multi_award_badges.py @@ -0,0 +1,293 @@ +#encoding:utf-8 +""" +#------------------------------------------------------------------------------- +# Name: Award badges command +# Purpose: This is a command file croning in background process regularly to +# query database and award badges for user's special acitivities. +# +# Author: Mike, Sailing +# +# Created: 22/01/2009 +# Copyright: (c) Mike 2009 +# Licence: GPL V2 +#------------------------------------------------------------------------------- +""" +#!/usr/bin/env python + +from django.db import connection +from django.shortcuts import get_object_or_404 +from django.contrib.contenttypes.models import ContentType + +from askbot.models import Badge, User, Award, Question, Answer, Tag +from askbot import const +from askbot.management.commands.base_command import BaseCommand + +class Command(BaseCommand): + def handle_noargs(self, **options): + try: + try: + self.delete_question_be_voted_up_3() + self.delete_answer_be_voted_up_3() + self.delete_question_be_vote_down_3() + self.delete_answer_be_voted_down_3() + self.answer_be_voted_up_10() + self.question_be_voted_up_10() + self.question_view_1000() + self.answer_self_question_be_voted_up_3() + self.answer_be_voted_up_100() + self.question_be_voted_up_100() + self.question_be_favorited_100() + self.question_view_10000() + self.answer_be_voted_up_25() + self.question_be_voted_up_25() + self.question_be_favorited_25() + self.question_view_2500() + self.answer_be_accepted_and_voted_up_40() + self.question_be_answered_after_60_days_and_be_voted_up_5() + self.created_tag_be_used_in_question_50() + except Exception, e: + print e + finally: + connection.close() + + def delete_question_be_voted_up_3(self): + """ + (1, '炼狱法师', 3, '炼狱法师', '删除自己有3个以上赞æˆç¥¨çš„帖å­', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM activity act, question q WHERE act.object_id = q.id AND\ + act.activity_type = %s AND\ + q.vote_up_count >=3 AND \ + act.is_auditted = 0" % (const.TYPE_ACTIVITY_DELETE_QUESTION) + self.__process_activities_badge(query, 1, Question) + + def delete_answer_be_voted_up_3(self): + """ + (1, '炼狱法师', 3, '炼狱法师', '删除自己有3个以上赞æˆç¥¨çš„帖å­', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM activity act, answer an WHERE act.object_id = an.id AND\ + act.activity_type = %s AND\ + an.vote_up_count >=3 AND \ + act.is_auditted = 0" % (const.TYPE_ACTIVITY_DELETE_ANSWER) + self.__process_activities_badge(query, 1, Answer) + + def delete_question_be_vote_down_3(self): + """ + (2, '压力白领', 3, '压力白领', '删除自己有3个以上å对票的帖å­', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM activity act, question q WHERE act.object_id = q.id AND\ + act.activity_type = %s AND\ + q.vote_down_count >=3 AND \ + act.is_auditted = 0" % (const.TYPE_ACTIVITY_DELETE_QUESTION) + content_type = ContentType.objects.get_for_model(Question) + self.__process_activities_badge(query, 2, Question) + + def delete_answer_be_voted_down_3(self): + """ + (2, '压力白领', 3, '压力白领', '删除自己有3个以上å对票的帖å­', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM activity act, answer an WHERE act.object_id = an.id AND\ + act.activity_type = %s AND\ + an.vote_down_count >=3 AND \ + act.is_auditted = 0" % (const.TYPE_ACTIVITY_DELETE_ANSWER) + self.__process_activities_badge(query, 2, Answer) + + def answer_be_voted_up_10(self): + """ + (3, '优秀回答', 3, '优秀回答', '回答好评10次以上', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM \ + activity act, answer a WHERE act.object_id = a.id AND\ + act.activity_type = %s AND \ + a.vote_up_count >= 10 AND\ + act.is_auditted = 0" % (const.TYPE_ACTIVITY_ANSWER) + self.__process_activities_badge(query, 3, Answer) + + def question_be_voted_up_10(self): + """ + (4, '优秀问题', 3, '优秀问题', '问题好评10次以上', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM \ + activity act, question q WHERE act.object_id = q.id AND\ + act.activity_type = %s AND \ + q.vote_up_count >= 10 AND\ + act.is_auditted = 0" % (const.TYPE_ACTIVITY_ASK_QUESTION) + self.__process_activities_badge(query, 4, Question) + + def question_view_1000(self): + """ + (6, 'æµè¡Œé—®é¢˜', 3, 'æµè¡Œé—®é¢˜', '问题的æµè§ˆé‡è¶…过1000人次', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM \ + activity act, question q WHERE act.activity_type = %s AND\ + act.object_id = q.id AND \ + q.view_count >= 1000 AND\ + act.object_id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" \ + % (const.TYPE_ACTIVITY_ASK_QUESTION, 6) + self.__process_activities_badge(query, 6, Question, False) + + def answer_self_question_be_voted_up_3(self): + """ + (17, '自学æˆæ‰', 3, '自学æˆæ‰', '回答自己的问题并且有3个以上赞æˆç¥¨', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM \ + activity act, answer an WHERE act.activity_type = %s AND\ + act.object_id = an.id AND\ + an.vote_up_count >= 3 AND\ + act.user_id = (SELECT user_id FROM question q WHERE q.id = an.question_id) AND\ + act.object_id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" \ + % (const.TYPE_ACTIVITY_ANSWER, 17) + self.__process_activities_badge(query, 17, Question, False) + + def answer_be_voted_up_100(self): + """ + (18, '最有价值回答', 1, '最有价值回答', '回答超过100次赞æˆç¥¨', 1, 0), + """ + query = "SELECT an.id, an.author_id FROM answer an WHERE an.vote_up_count >= 100 AND an.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (18) + + self.__process_badge(query, 18, Answer) + + def question_be_voted_up_100(self): + """ + (19, '最有价值问题', 1, '最有价值问题', '问题超过100次赞æˆç¥¨', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.vote_up_count >= 100 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (19) + + self.__process_badge(query, 19, Question) + + def question_be_favorited_100(self): + """ + (20, '万人迷', 1, '万人迷', '问题被100人以上收è—', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.favourite_count >= 100 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (20) + + self.__process_badge(query, 20, Question) + + def question_view_10000(self): + """ + (21, 'è‘—å问题', 1, 'è‘—å问题', '问题的æµè§ˆé‡è¶…过10000人次', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.view_count >= 10000 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (21) + + self.__process_badge(query, 21, Question) + + def answer_be_voted_up_25(self): + """ + (23, 'æžå¥½å›žç­”', 2, 'æžå¥½å›žç­”', '回答超过25次赞æˆç¥¨', 1, 0), + """ + query = "SELECT a.id, a.author_id FROM answer a WHERE a.vote_up_count >= 25 AND a.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (23) + + self.__process_badge(query, 23, Answer) + + def question_be_voted_up_25(self): + """ + (24, 'æžå¥½é—®é¢˜', 2, 'æžå¥½é—®é¢˜', '问题超过25次赞æˆç¥¨', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.vote_up_count >= 25 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (24) + + self.__process_badge(query, 24, Question) + + def question_be_favorited_25(self): + """ + (25, 'å—欢迎问题', 2, 'å—欢迎问题', '问题被25人以上收è—', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.favourite_count >= 25 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (25) + + self.__process_badge(query, 25, Question) + + def question_view_2500(self): + """ + (31, '最å—关注问题', 2, '最å—关注问题', '问题的æµè§ˆé‡è¶…过2500人次', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.view_count >= 2500 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (31) + + self.__process_badge(query, 31, Question) + + def answer_be_accepted_and_voted_up_40(self): + """ + (34, '导师', 2, '导师', '被指定为最佳答案并且赞æˆç¥¨40以上', 1, 0), + """ + query = "SELECT a.id, a.author_id FROM answer a WHERE a.vote_up_count >= 40 AND\ + a.accepted = 1 AND\ + a.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (34) + + self.__process_badge(query, 34, Answer) + + def question_be_answered_after_60_days_and_be_voted_up_5(self): + """ + (35, '巫师', 2, '巫师', '在æé—®60天之åŽå›žç­”并且赞æˆç¥¨5次以上', 1, 0), + """ + query = "SELECT a.id, a.author_id FROM question q, answer a WHERE q.id = a.question_id AND\ + DATEDIFF(a.added_at, q.added_at) >= 60 AND\ + a.vote_up_count >= 5 AND \ + a.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (35) + + self.__process_badge(query, 35, Answer) + + def created_tag_be_used_in_question_50(self): + """ + (36, '分类专家', 2, '分类专家', '创建的标签被50个以上问题使用', 1, 0); + """ + query = "SELECT t.id, t.created_by_id FROM tag t, auth_user u WHERE t.created_by_id = u.id AND \ + t. used_count >= 50 AND \ + t.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (36) + + self.__process_badge(query, 36, Tag) + + def __process_activities_badge(self, query, badge, content_object, update_auditted=True): + content_type = ContentType.objects.get_for_model(content_object) + + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + if update_auditted: + activity_ids = [] + badge = get_object_or_404(Badge, id=badge) + for row in rows: + activity_id = row[0] + user_id = row[1] + object_id = row[2] + + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + + if update_auditted: + activity_ids.append(activity_id) + + if update_auditted: + self.update_activities_auditted(cursor, activity_ids) + finally: + cursor.close() + + def __process_badge(self, query, badge, content_object): + content_type = ContentType.objects.get_for_model(Answer) + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + badge = get_object_or_404(Badge, id=badge) + for row in rows: + object_id = row[0] + user_id = row[1] + + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + finally: + cursor.close() diff --git a/askbot/management/commands/once_award_badges.py b/askbot/management/commands/once_award_badges.py new file mode 100644 index 00000000..6351ac9a --- /dev/null +++ b/askbot/management/commands/once_award_badges.py @@ -0,0 +1,357 @@ +#!/usr/bin/env python +#encoding:utf-8 +#------------------------------------------------------------------------------- +# Name: Award badges command +# Purpose: This is a command file croning in background process regularly to +# query database and award badges for user's special acitivities. +# +# Author: Mike, Sailing +# +# Created: 18/01/2009 +# Copyright: (c) Mike 2009 +# Licence: GPL V2 +#------------------------------------------------------------------------------- + +from datetime import datetime, date +from django.db import connection +from django.shortcuts import get_object_or_404 +from django.contrib.contenttypes.models import ContentType + +from askbot.models import User, Activity, Badge, Award, Question, Answer +from askbot import const +from base_command import BaseCommand +""" +(1, '炼狱法师', 3, '炼狱法师', '删除自己有3个以上赞æˆç¥¨çš„帖å­', 1, 0), +(2, '压力白领', 3, '压力白领', '删除自己有3个以上å对票的帖å­', 1, 0), +(3, '优秀回答', 3, '优秀回答', '回答好评10次以上', 1, 0), +(4, '优秀问题', 3, '优秀问题', '问题好评10次以上', 1, 0), +(5, '评论家', 3, '评论家', '评论10次以上', 0, 0), +(6, 'æµè¡Œé—®é¢˜', 3, 'æµè¡Œé—®é¢˜', '问题的æµè§ˆé‡è¶…过1000人次', 1, 0), +(7, '巡逻兵', 3, '巡逻兵', '第一次标记垃圾帖å­', 0, 0), +(8, '清æ´å·¥', 3, '清æ´å·¥', '第一次撤销投票', 0, 0), +(9, '批评家', 3, '批评家', '第一次å对票', 0, 0), +(10, 'å°ç¼–', 3, 'å°ç¼–', '第一次编辑更新', 0, 0), +(11, 'æ‘é•¿', 3, 'æ‘é•¿', '第一次é‡æ–°æ ‡ç­¾', 0, 0), +(12, '学者', 3, '学者', '第一次标记答案', 0, 0), +(13, '学生', 3, '学生', '第一次æ问并且有一次以上赞æˆç¥¨', 0, 0), +(14, '支æŒè€…', 3, '支æŒè€…', '第一次赞æˆç¥¨', 0, 0), +(15, '教师', 3, '教师', '第一次回答问题并且得到一个以上赞æˆç¥¨', 0, 0), +(16, '自传作者', 3, '自传作者', '完整填写用户资料所有选项', 0, 0), +(17, '自学æˆæ‰', 3, '自学æˆæ‰', '回答自己的问题并且有3个以上赞æˆç¥¨', 1, 0), +(18, '最有价值回答', 1, '最有价值回答', '回答超过100次赞æˆç¥¨', 1, 0), +(19, '最有价值问题', 1, '最有价值问题', '问题超过100次赞æˆç¥¨', 1, 0), +(20, '万人迷', 1, '万人迷', '问题被100人以上收è—', 1, 0), +(21, 'è‘—å问题', 1, 'è‘—å问题', '问题的æµè§ˆé‡è¶…过10000人次', 1, 0), +(22, 'alpha用户', 2, 'alpha用户', '内测期间的活跃用户', 0, 0), +(23, 'æžå¥½å›žç­”', 2, 'æžå¥½å›žç­”', '回答超过25次赞æˆç¥¨', 1, 0), +(24, 'æžå¥½é—®é¢˜', 2, 'æžå¥½é—®é¢˜', '问题超过25次赞æˆç¥¨', 1, 0), +(25, 'å—欢迎问题', 2, 'å—欢迎问题', '问题被25人以上收è—', 1, 0), +(26, '优秀市民', 2, '优秀市民', '投票300次以上', 0, 0), +(27, '编辑主任', 2, '编辑主任', '编辑了100个帖å­', 0, 0), +(28, '通æ‰', 2, '通æ‰', '在多个标签领域活跃', 0, 0), +(29, '专家', 2, '专家', '在一个标签领域活跃出众', 0, 0), +(30, 'è€é¸Ÿ', 2, 'è€é¸Ÿ', '活跃超过一年的用户', 0, 0), +(31, '最å—关注问题', 2, '最å—关注问题', '问题的æµè§ˆé‡è¶…过2500人次', 1, 0), +(32, '学问家', 2, '学问家', '第一次回答被投赞æˆç¥¨10次以上', 0, 0), +(33, 'beta用户', 2, 'beta用户', 'beta期间活跃å‚与', 0, 0), +(34, '导师', 2, '导师', '被指定为最佳答案并且赞æˆç¥¨40以上', 1, 0), +(35, '巫师', 2, '巫师', '在æé—®60天之åŽå›žç­”并且赞æˆç¥¨5次以上', 1, 0), +(36, '分类专家', 2, '分类专家', '创建的标签被50个以上问题使用', 1, 0); + + +TYPE_ACTIVITY_ASK_QUESTION=1 +TYPE_ACTIVITY_ANSWER=2 +TYPE_ACTIVITY_COMMENT_QUESTION=3 +TYPE_ACTIVITY_COMMENT_ANSWER=4 +TYPE_ACTIVITY_UPDATE_QUESTION=5 +TYPE_ACTIVITY_UPDATE_ANSWER=6 +TYPE_ACTIVITY_PRIZE=7 +TYPE_ACTIVITY_MARK_ANSWER=8 +TYPE_ACTIVITY_VOTE_UP=9 +TYPE_ACTIVITY_VOTE_DOWN=10 +TYPE_ACTIVITY_CANCEL_VOTE=11 +TYPE_ACTIVITY_DELETE_QUESTION=12 +TYPE_ACTIVITY_DELETE_ANSWER=13 +TYPE_ACTIVITY_MARK_OFFENSIVE=14 +TYPE_ACTIVITY_UPDATE_TAGS=15 +TYPE_ACTIVITY_FAVORITE=16 +TYPE_ACTIVITY_USER_FULL_UPDATED = 17 +""" + +BADGE_AWARD_TYPE_FIRST = { + const.TYPE_ACTIVITY_MARK_OFFENSIVE : 7, + const.TYPE_ACTIVITY_CANCEL_VOTE: 8, + const.TYPE_ACTIVITY_VOTE_DOWN : 9, + const.TYPE_ACTIVITY_UPDATE_QUESTION : 10, + const.TYPE_ACTIVITY_UPDATE_ANSWER : 10, + const.TYPE_ACTIVITY_UPDATE_TAGS : 11, + const.TYPE_ACTIVITY_MARK_ANSWER : 12, + const.TYPE_ACTIVITY_VOTE_UP : 14, + const.TYPE_ACTIVITY_USER_FULL_UPDATED: 16 + +} + +class Command(BaseCommand): + def handle_noargs(self, **options): + try: + try: + self.alpha_user() + self.beta_user() + self.first_type_award() + self.first_ask_be_voted() + self.first_answer_be_voted() + self.first_answer_be_voted_10() + self.vote_count_300() + self.edit_count_100() + self.comment_count_10() + except Exception, e: + print e + finally: + connection.close() + + def alpha_user(self): + """ + Before Jan 25, 2009(Chinese New Year Eve and enter into Beta for CNProg), every registered user + will be awarded the "Alpha" badge if he has any activities. + """ + alpha_end_date = date(2009, 1, 25) + if date.today() < alpha_end_date: + badge = get_object_or_404(Badge, id=22) + for user in User.objects.all(): + award = Award.objects.filter(user=user, badge=badge) + if award and not badge.multiple: + continue + activities = Activity.objects.filter(user=user) + if len(activities) > 0: + new_award = Award(user=user, badge=badge) + new_award.save() + + def beta_user(self): + """ + Before Feb 25, 2009, every registered user + will be awarded the "Beta" badge if he has any activities. + """ + beta_end_date = date(2009, 2, 25) + if date.today() < beta_end_date: + badge = get_object_or_404(Badge, id=33) + for user in User.objects.all(): + award = Award.objects.filter(user=user, badge=badge) + if award and not badge.multiple: + continue + activities = Activity.objects.filter(user=user) + if len(activities) > 0: + new_award = Award(user=user, badge=badge) + new_award.save() + + def first_type_award(self): + + activity_types = ','.join('%s' % item for item in BADGE_AWARD_TYPE_FIRST.keys()) + # ORDER BY user_id, activity_type + query = "SELECT id, user_id, activity_type, content_type_id, object_id FROM activity WHERE is_auditted = 0 AND activity_type IN (%s) ORDER BY user_id, activity_type" % activity_types + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + # collect activity_id in current process + activity_ids = [] + last_user_id = 0 + last_activity_type = 0 + for row in rows: + activity_ids.append(row[0]) + user_id = row[1] + activity_type = row[2] + content_type_id = row[3] + object_id = row[4] + + # if the user and activity are same as the last, continue + if user_id == last_user_id and activity_type == last_activity_type: + continue; + + user = get_object_or_404(User, id=user_id) + badge = get_object_or_404(Badge, id=BADGE_AWARD_TYPE_FIRST[activity_type]) + content_type = get_object_or_404(ContentType, id=content_type_id) + + count = Award.objects.filter(user=user, badge=badge).count() + if count and not badge.multiple: + continue + else: + # new award + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + + # set the current user_id and activity_type to last + last_user_id = user_id + last_activity_type = activity_type + + # update processed rows to auditted + self.update_activities_auditted(cursor, activity_ids) + finally: + cursor.close() + + def first_ask_be_voted(self): + """ + For user asked question and got first upvote, we award him following badge: + """ + query = ('SELECT act.user_id, q.vote_up_count, act.object_id FROM ' \ + + 'activity act, question q WHERE act.activity_type = %s AND ' \ + + 'act.object_id = q.id AND ' \ + + 'act.user_id NOT IN ' \ + + '(SELECT distinct user_id FROM award WHERE badge_id = %s)') \ + % (const.TYPE_ACTIVITY_ASK_QUESTION, 13) + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + badge = get_object_or_404(Badge, id=13) + content_type = ContentType.objects.get_for_model(Question) + awarded_users = [] + for row in rows: + user_id = row[0] + vote_up_count = row[1] + object_id = row[2] + if vote_up_count > 0 and user_id not in awarded_users: + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + awarded_users.append(user_id) + finally: + cursor.close() + + def first_answer_be_voted(self): + """ + When user answerd questions and got first upvote, we award him following badge: + + (15, '教师', 3, '教师', '第一次回答问题并且得到一个以上赞æˆç¥¨', 0, 0), + """ + query = ("SELECT act.user_id, a.vote_up_count, act.object_id FROM "\ + + "activity act, answer a WHERE act.activity_type = %s AND "\ + + "act.object_id = a.id AND "\ + + "act.user_id NOT IN "\ + + "(SELECT distinct user_id FROM award WHERE badge_id = %s)") \ + % (const.TYPE_ACTIVITY_ANSWER, 15) + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + awarded_users = [] + badge = get_object_or_404(Badge, id=15) + content_type = ContentType.objects.get_for_model(Answer) + for row in rows: + user_id = row[0] + vote_up_count = row[1] + object_id = row[2] + if vote_up_count > 0 and user_id not in awarded_users: + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + awarded_users.append(user_id) + finally: + cursor.close() + + def first_answer_be_voted_10(self): + """ + (32, '学问家', 2, '学问家', '第一次回答被投赞æˆç¥¨10次以上', 0, 0) + """ + query = ("SELECT act.user_id, act.object_id FROM " \ + + "activity act, answer a WHERE act.object_id = a.id AND "\ + + "act.activity_type = %s AND "\ + + "a.vote_up_count >= 10 AND "\ + + "act.user_id NOT IN "\ + + "(SELECT user_id FROM award WHERE badge_id = %s)") \ + % (const.TYPE_ACTIVITY_ANSWER, 32) + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + awarded_users = [] + badge = get_object_or_404(Badge, id=32) + content_type = ContentType.objects.get_for_model(Answer) + for row in rows: + user_id = row[0] + if user_id not in awarded_users: + user = get_object_or_404(User, id=user_id) + object_id = row[1] + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + awarded_users.append(user_id) + finally: + cursor.close() + + def vote_count_300(self): + """ + (26, '优秀市民', 2, '优秀市民', '投票300次以上', 0, 0) + """ + query = ("SELECT count(*) vote_count, user_id FROM activity WHERE " \ + + "activity_type = %s OR " \ + + "activity_type = %s AND " \ + + "user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s) " \ + + "GROUP BY user_id HAVING vote_count >= 300") \ + % ( + const.TYPE_ACTIVITY_VOTE_UP, + const.TYPE_ACTIVITY_VOTE_DOWN, + 2 + ) + + self.__award_for_count_num(query, 26) + + def edit_count_100(self): + """ + (27, '编辑主任', 2, '编辑主任', '编辑了100个帖å­', 0, 0) + """ + query = ("SELECT count(*) vote_count, user_id FROM activity WHERE " \ + + "activity_type = %s OR " \ + + "activity_type = %s AND " \ + + "user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s) " \ + + "GROUP BY user_id HAVING vote_count >= 100" )\ + % ( + const.TYPE_ACTIVITY_UPDATE_QUESTION, + const.TYPE_ACTIVITY_UPDATE_ANSWER, + 27 + ) + + self.__award_for_count_num(query, 27) + + def comment_count_10(self): + """ + (5, '评论家', 3, '评论家', '评论10次以上', 0, 0), + """ + query = ("SELECT count(*) vote_count, user_id FROM activity WHERE " \ + + "activity_type = %s OR " \ + + "activity_type = %s AND " \ + + "user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s) " \ + + "GROUP BY user_id HAVING vote_count >= 10" )\ + % ( + const.TYPE_ACTIVITY_COMMENT_QUESTION, + const.TYPE_ACTIVITY_COMMENT_ANSWER, + 5 + ) + self.__award_for_count_num(query, 5) + + def __award_for_count_num(self, query, badge): + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + awarded_users = [] + badge = get_object_or_404(Badge, id=badge) + for row in rows: + vote_count = row[0] + user_id = row[1] + + if user_id not in awarded_users: + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge)#todo: will this work with content_object null? + award.save() + awarded_users.append(user_id) + finally: + cursor.close() + +def main(): + pass + +if __name__ == '__main__': + main() diff --git a/askbot/management/commands/pg_base_command.py b/askbot/management/commands/pg_base_command.py new file mode 100644 index 00000000..3ff7853d --- /dev/null +++ b/askbot/management/commands/pg_base_command.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +#encoding:utf-8 +#------------------------------------------------------------------------------- +# Name: Award badges command +# Purpose: This is a command file croning in background process regularly to +# query database and award badges for user's special acitivities. +# +# Author: Mike, Sailing +# +# Created: 22/01/2009 +# Copyright: (c) Mike 2009 +# Licence: GPL V2 +#------------------------------------------------------------------------------- + +from datetime import datetime, date +from django.core.management.base import NoArgsCommand +from django.db import connection +from django.shortcuts import get_object_or_404 +from django.contrib.contenttypes.models import ContentType + +from askbot.models import * +from askbot.const import * + +class BaseCommand(NoArgsCommand): + def update_activities_auditted(self, cursor, activity_ids): + # update processed rows to auditted + if len(activity_ids): + query = "UPDATE activity SET is_auditted = TRUE WHERE id in (%s)"\ + % ','.join('%s' % item for item in activity_ids) + cursor.execute(query) + + + + + diff --git a/askbot/management/commands/pg_clean_award_badges.py b/askbot/management/commands/pg_clean_award_badges.py new file mode 100644 index 00000000..934d1f1d --- /dev/null +++ b/askbot/management/commands/pg_clean_award_badges.py @@ -0,0 +1,59 @@ +#------------------------------------------------------------------------------- +# Name: Award badges command +# Purpose: This is a command file croning in background process regularly to +# query database and award badges for user's special acitivities. +# +# Author: Mike +# +# Created: 18/01/2009 +# Copyright: (c) Mike 2009 +# Licence: GPL V2 +#------------------------------------------------------------------------------- +#!/usr/bin/env python +#encoding:utf-8 +from django.core.management.base import NoArgsCommand +from django.db import connection +from django.shortcuts import get_object_or_404 +from django.contrib.contenttypes.models import ContentType + +from askbot.models import * + +class Command(NoArgsCommand): + def handle_noargs(self, **options): + try: + try: + self.clean_awards() + except Exception, e: + print e + finally: + connection.close() + + def clean_awards(self): + Award.objects.all().delete() + + award_type =ContentType.objects.get_for_model(Award) + Activity.objects.filter(content_type=award_type).delete() + + for user in User.objects.all(): + user.gold = 0 + user.silver = 0 + user.bronze = 0 + user.save() + + for badge in Badge.objects.all(): + badge.awarded_count = 0 + badge.save() + + query = "UPDATE activity SET is_auditted = FALSE" + cursor = connection.cursor() + try: + cursor.execute(query) + finally: + cursor.close() + connection.close() + +def main(): + pass + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/askbot/management/commands/pg_multi_award_badges.py b/askbot/management/commands/pg_multi_award_badges.py new file mode 100644 index 00000000..6a4ef2f6 --- /dev/null +++ b/askbot/management/commands/pg_multi_award_badges.py @@ -0,0 +1,348 @@ +#!/usr/bin/env python +#encoding:utf-8 +#------------------------------------------------------------------------------- +# Name: Award badges command +# Purpose: This is a command file croning in background process regularly to +# query database and award badges for user's special acitivities. +# +# Author: Mike, Sailing +# +# Created: 22/01/2009 +# Copyright: (c) Mike 2009 +# Licence: GPL V2 +#------------------------------------------------------------------------------- + +from datetime import datetime, date +from django.core.management.base import NoArgsCommand +from django.db import connection +from django.shortcuts import get_object_or_404 +from django.contrib.contenttypes.models import ContentType + +from askbot.models import * +from askbot.const import * +from pg_base_command import BaseCommand +""" +(1, '????', 3, '????', '?????3?????????', 1, 0), +(2, '????', 3, '????', '?????3?????????', 1, 0), +(3, '????', 3, '????', '????10???', 1, 0), +(4, '????', 3, '????', '????10???', 1, 0), +(5, '???', 3, '???', '??10???', 0, 0), +(6, '????', 3, '????', '????????1000??', 1, 0), +(7, '???', 3, '???', '?????????', 0, 0), +(8, '???', 3, '???', '???????', 0, 0), +(9, '???', 3, '???', '??????', 0, 0), +(10, '??', 3, '??', '???????', 0, 0), +(11, '??', 3, '??', '???????', 0, 0), +(12, '??', 3, '??', '???????', 0, 0), +(13, '??', 3, '??', '???????????????', 0, 0), +(14, '???', 3, '???', '??????', 0, 0), +(15, '??', 3, '??', '??????????????????', 0, 0), +(16, '????', 3, '????', '????????????', 0, 0), +(17, '????', 3, '????', '??????????3??????', 1, 0), +(18, '??????', 1, '??????', '????100????', 1, 0), +(19, '??????', 1, '??????', '????100????', 1, 0), +(20, '???', 1, '???', '???100?????', 1, 0), +(21, '????', 1, '????', '????????10000??', 1, 0), +(22, 'alpha??', 2, 'alpha??', '?????????', 0, 0), +(23, '????', 2, '????', '????25????', 1, 0), +(24, '????', 2, '????', '????25????', 1, 0), +(25, '?????', 2, '?????', '???25?????', 1, 0), +(26, '????', 2, '????', '??300???', 0, 0), +(27, '????', 2, '????', '???100???', 0, 0), +(28, '??', 2, '??', '?????????', 0, 0), +(29, '??', 2, '??', '???????????', 0, 0), +(30, '??', 2, '??', '?????????', 0, 0), +(31, '??????', 2, '??????', '????????2500??', 1, 0), +(32, '???', 2, '???', '??????????10???', 0, 0), +(33, 'beta??', 2, 'beta??', 'beta??????', 0, 0), +(34, '??', 2, '??', '?????????????40??', 1, 0), +(35, '??', 2, '??', '???60??????????5???', 1, 0), +(36, '????', 2, '????', '??????50???????', 1, 0); + + +TYPE_ACTIVITY_ASK_QUESTION=1 +TYPE_ACTIVITY_ANSWER=2 +TYPE_ACTIVITY_COMMENT_QUESTION=3 +TYPE_ACTIVITY_COMMENT_ANSWER=4 +TYPE_ACTIVITY_UPDATE_QUESTION=5 +TYPE_ACTIVITY_UPDATE_ANSWER=6 +TYPE_ACTIVITY_PRIZE=7 +TYPE_ACTIVITY_MARK_ANSWER=8 +TYPE_ACTIVITY_VOTE_UP=9 +TYPE_ACTIVITY_VOTE_DOWN=10 +TYPE_ACTIVITY_CANCEL_VOTE=11 +TYPE_ACTIVITY_DELETE_QUESTION=12 +TYPE_ACTIVITY_DELETE_ANSWER=13 +TYPE_ACTIVITY_MARK_OFFENSIVE=14 +TYPE_ACTIVITY_UPDATE_TAGS=15 +TYPE_ACTIVITY_FAVORITE=16 +TYPE_ACTIVITY_USER_FULL_UPDATED = 17 +""" + +class Command(BaseCommand): + def handle_noargs(self, **options): + try: + try: + self.delete_question_be_voted_up_3() + self.delete_answer_be_voted_up_3() + self.delete_question_be_vote_down_3() + self.delete_answer_be_voted_down_3() + self.answer_be_voted_up_10() + self.question_be_voted_up_10() + self.question_view_1000() + self.answer_self_question_be_voted_up_3() + self.answer_be_voted_up_100() + self.question_be_voted_up_100() + self.question_be_favorited_100() + self.question_view_10000() + self.answer_be_voted_up_25() + self.question_be_voted_up_25() + self.question_be_favorited_25() + self.question_view_2500() + self.answer_be_accepted_and_voted_up_40() + self.question_be_answered_after_60_days_and_be_voted_up_5() + self.created_tag_be_used_in_question_50() + except Exception, e: + print e + finally: + connection.close() + + def delete_question_be_voted_up_3(self): + """ + (1, '????', 3, '????', '?????3?????????', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM activity act, question q WHERE act.object_id = q.id AND\ + act.activity_type = %s AND\ + q.vote_up_count >=3 AND \ + not act.is_auditted" % (TYPE_ACTIVITY_DELETE_QUESTION) + self.__process_activities_badge(query, 1, Question) + + def delete_answer_be_voted_up_3(self): + """ + (1, '????', 3, '????', '?????3?????????', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM activity act, answer an WHERE act.object_id = an.id AND\ + act.activity_type = %s AND\ + an.vote_up_count >=3 AND \ + not act.is_auditted" % (TYPE_ACTIVITY_DELETE_ANSWER) + self.__process_activities_badge(query, 1, Answer) + + def delete_question_be_vote_down_3(self): + """ + (2, '????', 3, '????', '?????3?????????', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM activity act, question q WHERE act.object_id = q.id AND\ + act.activity_type = %s AND\ + q.vote_down_count >=3 AND \ + not act.is_auditted" % (TYPE_ACTIVITY_DELETE_QUESTION) + content_type = ContentType.objects.get_for_model(Question) + self.__process_activities_badge(query, 2, Question) + + def delete_answer_be_voted_down_3(self): + """ + (2, '????', 3, '????', '?????3?????????', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM activity act, answer an WHERE act.object_id = an.id AND\ + act.activity_type = %s AND\ + an.vote_down_count >=3 AND \ + not act.is_auditted" % (TYPE_ACTIVITY_DELETE_ANSWER) + self.__process_activities_badge(query, 2, Answer) + + def answer_be_voted_up_10(self): + """ + (3, '????', 3, '????', '????10???', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM \ + activity act, answer a WHERE act.object_id = a.id AND\ + act.activity_type = %s AND \ + a.vote_up_count >= 10 AND\ + not act.is_auditted" % (TYPE_ACTIVITY_ANSWER) + self.__process_activities_badge(query, 3, Answer) + + def question_be_voted_up_10(self): + """ + (4, '????', 3, '????', '????10???', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM \ + activity act, question q WHERE act.object_id = q.id AND\ + act.activity_type = %s AND \ + q.vote_up_count >= 10 AND\ + not act.is_auditted" % (TYPE_ACTIVITY_ASK_QUESTION) + self.__process_activities_badge(query, 4, Question) + + def question_view_1000(self): + """ + (6, '????', 3, '????', '????????1000??', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM \ + activity act, question q WHERE act.activity_type = %s AND\ + act.object_id = q.id AND \ + q.view_count >= 1000 AND\ + act.object_id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (TYPE_ACTIVITY_ASK_QUESTION, 6) + self.__process_activities_badge(query, 6, Question, False) + + def answer_self_question_be_voted_up_3(self): + """ + (17, '????', 3, '????', '??????????3??????', 1, 0), + """ + query = "SELECT act.id, act.user_id, act.object_id FROM \ + activity act, answer an WHERE act.activity_type = %s AND\ + act.object_id = an.id AND\ + an.vote_up_count >= 3 AND\ + act.user_id = (SELECT user_id FROM question q WHERE q.id = an.question_id) AND\ + act.object_id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (TYPE_ACTIVITY_ANSWER, 17) + self.__process_activities_badge(query, 17, Question, False) + + def answer_be_voted_up_100(self): + """ + (18, '??????', 1, '??????', '????100????', 1, 0), + """ + query = "SELECT an.id, an.author_id FROM answer an WHERE an.vote_up_count >= 100 AND an.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (18) + + self.__process_badge(query, 18, Answer) + + def question_be_voted_up_100(self): + """ + (19, '??????', 1, '??????', '????100????', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.vote_up_count >= 100 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (19) + + self.__process_badge(query, 19, Question) + + def question_be_favorited_100(self): + """ + (20, '???', 1, '???', '???100?????', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.favourite_count >= 100 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (20) + + self.__process_badge(query, 20, Question) + + def question_view_10000(self): + """ + (21, '????', 1, '????', '????????10000??', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.view_count >= 10000 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (21) + + self.__process_badge(query, 21, Question) + + def answer_be_voted_up_25(self): + """ + (23, '????', 2, '????', '????25????', 1, 0), + """ + query = "SELECT a.id, a.author_id FROM answer a WHERE a.vote_up_count >= 25 AND a.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (23) + + self.__process_badge(query, 23, Answer) + + def question_be_voted_up_25(self): + """ + (24, '????', 2, '????', '????25????', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.vote_up_count >= 25 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (24) + + self.__process_badge(query, 24, Question) + + def question_be_favorited_25(self): + """ + (25, '?????', 2, '?????', '???25?????', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.favourite_count >= 25 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (25) + + self.__process_badge(query, 25, Question) + + def question_view_2500(self): + """ + (31, '??????', 2, '??????', '????????2500??', 1, 0), + """ + query = "SELECT q.id, q.author_id FROM question q WHERE q.view_count >= 2500 AND q.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (31) + + self.__process_badge(query, 31, Question) + + def answer_be_accepted_and_voted_up_40(self): + """ + (34, '??', 2, '??', '?????????????40??', 1, 0), + """ + query = "SELECT a.id, a.author_id FROM answer a WHERE a.vote_up_count >= 40 AND\ + a.accepted AND\ + a.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (34) + + self.__process_badge(query, 34, Answer) + + def question_be_answered_after_60_days_and_be_voted_up_5(self): + """ + (35, '??', 2, '??', '???60??????????5???', 1, 0), + """ + query = "SELECT a.id, a.author_id FROM question q, answer a WHERE q.id = a.question_id AND\ + (a.added_at + '60 day'::INTERVAL) >= q.added_at AND\ + a.vote_up_count >= 5 AND \ + a.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (35) + + self.__process_badge(query, 35, Answer) + + def created_tag_be_used_in_question_50(self): + """ + (36, '????', 2, '????', '??????50???????', 1, 0); + """ + query = "SELECT t.id, t.created_by_id FROM tag t, auth_user u WHERE t.created_by_id = u.id AND \ + t. used_count >= 50 AND \ + t.id NOT IN \ + (SELECT object_id FROM award WHERE award.badge_id = %s)" % (36) + + self.__process_badge(query, 36, Tag) + + def __process_activities_badge(self, query, badge, content_object, update_auditted=True): + content_type = ContentType.objects.get_for_model(content_object) + + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + if update_auditted: + activity_ids = [] + badge = get_object_or_404(Badge, id=badge) + for row in rows: + activity_id = row[0] + user_id = row[1] + object_id = row[2] + + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + + if update_auditted: + activity_ids.append(activity_id) + + if update_auditted: + self.update_activities_auditted(cursor, activity_ids) + finally: + cursor.close() + + def __process_badge(self, query, badge, content_object): + content_type = ContentType.objects.get_for_model(Answer) + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + badge = get_object_or_404(Badge, id=badge) + for row in rows: + object_id = row[0] + user_id = row[1] + + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + finally: + cursor.close() diff --git a/askbot/management/commands/pg_once_award_badges.py b/askbot/management/commands/pg_once_award_badges.py new file mode 100644 index 00000000..7decbc2d --- /dev/null +++ b/askbot/management/commands/pg_once_award_badges.py @@ -0,0 +1,350 @@ +#!/usr/bin/env python +#encoding:utf-8 +#------------------------------------------------------------------------------- +# Name: Award badges command +# Purpose: This is a command file croning in background process regularly to +# query database and award badges for user's special acitivities. +# +# Author: Mike, Sailing +# +# Created: 18/01/2009 +# Copyright: (c) Mike 2009 +# Licence: GPL V2 +#------------------------------------------------------------------------------- + +from datetime import datetime, date +from django.db import connection +from django.shortcuts import get_object_or_404 +from django.contrib.contenttypes.models import ContentType + +from askbot.models import * +from askbot.const import * +from pg_base_command import BaseCommand +""" +(1, '????', 3, '????', '?????3?????????', 1, 0), +(2, '????', 3, '????', '?????3?????????', 1, 0), +(3, '????', 3, '????', '????10???', 1, 0), +(4, '????', 3, '????', '????10???', 1, 0), +(5, '???', 3, '???', '??10???', 0, 0), +(6, '????', 3, '????', '????????1000??', 1, 0), +(7, '???', 3, '???', '?????????', 0, 0), +(8, '???', 3, '???', '???????', 0, 0), +(9, '???', 3, '???', '??????', 0, 0), +(10, '??', 3, '??', '???????', 0, 0), +(11, '??', 3, '??', '???????', 0, 0), +(12, '??', 3, '??', '???????', 0, 0), +(13, '??', 3, '??', '???????????????', 0, 0), +(14, '???', 3, '???', '??????', 0, 0), +(15, '??', 3, '??', '??????????????????', 0, 0), +(16, '????', 3, '????', '????????????', 0, 0), +(17, '????', 3, '????', '??????????3??????', 1, 0), +(18, '??????', 1, '??????', '????100????', 1, 0), +(19, '??????', 1, '??????', '????100????', 1, 0), +(20, '???', 1, '???', '???100?????', 1, 0), +(21, '????', 1, '????', '????????10000??', 1, 0), +(22, 'alpha??', 2, 'alpha??', '?????????', 0, 0), +(23, '????', 2, '????', '????25????', 1, 0), +(24, '????', 2, '????', '????25????', 1, 0), +(25, '?????', 2, '?????', '???25?????', 1, 0), +(26, '????', 2, '????', '??300???', 0, 0), +(27, '????', 2, '????', '???100???', 0, 0), +(28, '??', 2, '??', '?????????', 0, 0), +(29, '??', 2, '??', '???????????', 0, 0), +(30, '??', 2, '??', '?????????', 0, 0), +(31, '??????', 2, '??????', '????????2500??', 1, 0), +(32, '???', 2, '???', '??????????10???', 0, 0), +(33, 'beta??', 2, 'beta??', 'beta??????', 0, 0), +(34, '??', 2, '??', '?????????????40??', 1, 0), +(35, '??', 2, '??', '???60??????????5???', 1, 0), +(36, '????', 2, '????', '??????50???????', 1, 0); + + +TYPE_ACTIVITY_ASK_QUESTION=1 +TYPE_ACTIVITY_ANSWER=2 +TYPE_ACTIVITY_COMMENT_QUESTION=3 +TYPE_ACTIVITY_COMMENT_ANSWER=4 +TYPE_ACTIVITY_UPDATE_QUESTION=5 +TYPE_ACTIVITY_UPDATE_ANSWER=6 +TYPE_ACTIVITY_PRIZE=7 +TYPE_ACTIVITY_MARK_ANSWER=8 +TYPE_ACTIVITY_VOTE_UP=9 +TYPE_ACTIVITY_VOTE_DOWN=10 +TYPE_ACTIVITY_CANCEL_VOTE=11 +TYPE_ACTIVITY_DELETE_QUESTION=12 +TYPE_ACTIVITY_DELETE_ANSWER=13 +TYPE_ACTIVITY_MARK_OFFENSIVE=14 +TYPE_ACTIVITY_UPDATE_TAGS=15 +TYPE_ACTIVITY_FAVORITE=16 +TYPE_ACTIVITY_USER_FULL_UPDATED = 17 +""" + +BADGE_AWARD_TYPE_FIRST = { + TYPE_ACTIVITY_MARK_OFFENSIVE : 7, + TYPE_ACTIVITY_CANCEL_VOTE: 8, + TYPE_ACTIVITY_VOTE_DOWN : 9, + TYPE_ACTIVITY_UPDATE_QUESTION : 10, + TYPE_ACTIVITY_UPDATE_ANSWER : 10, + TYPE_ACTIVITY_UPDATE_TAGS : 11, + TYPE_ACTIVITY_MARK_ANSWER : 12, + TYPE_ACTIVITY_VOTE_UP : 14, + TYPE_ACTIVITY_USER_FULL_UPDATED: 16 + +} + +class Command(BaseCommand): + def handle_noargs(self, **options): + try: + try: + self.alpha_user() + self.beta_user() + self.first_type_award() + self.first_ask_be_voted() + self.first_answer_be_voted() + self.first_answer_be_voted_10() + self.vote_count_300() + self.edit_count_100() + self.comment_count_10() + except Exception, e: + print e + finally: + connection.close() + + def alpha_user(self): + """ + Before Jan 25, 2009(Chinese New Year Eve and enter into Beta for CNProg), every registered user + will be awarded the "Alpha" badge if he has any activities. + """ + alpha_end_date = date(2009, 1, 25) + if date.today() < alpha_end_date: + badge = get_object_or_404(Badge, id=22) + for user in User.objects.all(): + award = Award.objects.filter(user=user, badge=badge) + if award and not badge.multiple: + continue + activities = Activity.objects.filter(user=user) + if len(activities) > 0: + new_award = Award(user=user, badge=badge) + new_award.save() + + def beta_user(self): + """ + Before Feb 25, 2009, every registered user + will be awarded the "Beta" badge if he has any activities. + """ + beta_end_date = date(2009, 2, 25) + if date.today() < beta_end_date: + badge = get_object_or_404(Badge, id=33) + for user in User.objects.all(): + award = Award.objects.filter(user=user, badge=badge) + if award and not badge.multiple: + continue + activities = Activity.objects.filter(user=user) + if len(activities) > 0: + new_award = Award(user=user, badge=badge) + new_award.save() + + def first_type_award(self): + """ + This will award below badges for users first behaviors: + + (7, '???', 3, '???', '?????????', 0, 0), + (8, '???', 3, '???', '???????', 0, 0), + (9, '???', 3, '???', '??????', 0, 0), + (10, '??', 3, '??', '???????', 0, 0), + (11, '??', 3, '??', '???????', 0, 0), + (12, '??', 3, '??', '???????', 0, 0), + (14, '???', 3, '???', '??????', 0, 0), + (16, '????', 3, '????', '????????????', 0, 0), + """ + activity_types = ','.join('%s' % item for item in BADGE_AWARD_TYPE_FIRST.keys()) + # ORDER BY user_id, activity_type + query = "SELECT id, user_id, activity_type, content_type_id, object_id FROM activity WHERE not is_auditted AND activity_type IN (%s) ORDER BY user_id, activity_type" % activity_types + + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + # collect activity_id in current process + activity_ids = [] + last_user_id = 0 + last_activity_type = 0 + for row in rows: + activity_ids.append(row[0]) + user_id = row[1] + activity_type = row[2] + content_type_id = row[3] + object_id = row[4] + + # if the user and activity are same as the last, continue + if user_id == last_user_id and activity_type == last_activity_type: + continue; + + user = get_object_or_404(User, id=user_id) + badge = get_object_or_404(Badge, id=BADGE_AWARD_TYPE_FIRST[activity_type]) + content_type = get_object_or_404(ContentType, id=content_type_id) + + count = Award.objects.filter(user=user, badge=badge).count() + if count and not badge.multiple: + continue + else: + # new award + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + + # set the current user_id and activity_type to last + last_user_id = user_id + last_activity_type = activity_type + + # update processed rows to auditted + self.update_activities_auditted(cursor, activity_ids) + finally: + cursor.close() + + def first_ask_be_voted(self): + """ + For user asked question and got first upvote, we award him following badge: + + (13, '??', 3, '??', '???????????????', 0, 0), + """ + query = "SELECT act.user_id, q.vote_up_count, act.object_id FROM " \ + "activity act, question q WHERE act.activity_type = %s AND " \ + "act.object_id = q.id AND " \ + "act.user_id NOT IN (SELECT distinct user_id FROM award WHERE badge_id = %s)" % (TYPE_ACTIVITY_ASK_QUESTION, 13) + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + badge = get_object_or_404(Badge, id=13) + content_type = ContentType.objects.get_for_model(Question) + awarded_users = [] + for row in rows: + user_id = row[0] + vote_up_count = row[1] + object_id = row[2] + if vote_up_count > 0 and user_id not in awarded_users: + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + awarded_users.append(user_id) + finally: + cursor.close() + + def first_answer_be_voted(self): + """ + When user answerd questions and got first upvote, we award him following badge: + + (15, '??', 3, '??', '??????????????????', 0, 0), + """ + query = "SELECT act.user_id, a.vote_up_count, act.object_id FROM " \ + "activity act, answer a WHERE act.activity_type = %s AND " \ + "act.object_id = a.id AND " \ + "act.user_id NOT IN (SELECT distinct user_id FROM award WHERE badge_id = %s)" % (TYPE_ACTIVITY_ANSWER, 15) + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + awarded_users = [] + badge = get_object_or_404(Badge, id=15) + content_type = ContentType.objects.get_for_model(Answer) + for row in rows: + user_id = row[0] + vote_up_count = row[1] + object_id = row[2] + if vote_up_count > 0 and user_id not in awarded_users: + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + awarded_users.append(user_id) + finally: + cursor.close() + + def first_answer_be_voted_10(self): + """ + (32, '???', 2, '???', '??????????10???', 0, 0) + """ + query = "SELECT act.user_id, act.object_id FROM " \ + "activity act, answer a WHERE act.object_id = a.id AND " \ + "act.activity_type = %s AND " \ + "a.vote_up_count >= 10 AND " \ + "act.user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s)" % (TYPE_ACTIVITY_ANSWER, 32) + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + awarded_users = [] + badge = get_object_or_404(Badge, id=32) + content_type = ContentType.objects.get_for_model(Answer) + for row in rows: + user_id = row[0] + if user_id not in awarded_users: + user = get_object_or_404(User, id=user_id) + object_id = row[1] + award = Award(user=user, badge=badge, content_type=content_type, object_id=object_id) + award.save() + awarded_users.append(user_id) + finally: + cursor.close() + + def vote_count_300(self): + """ + (26, '????', 2, '????', '??300???', 0, 0) + """ + query = "SELECT count(*) as vote_count, user_id FROM activity WHERE " \ + "activity_type = %s OR " \ + "activity_type = %s AND " \ + "user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s) " \ + "GROUP BY user_id HAVING count(*) >= 300" % (TYPE_ACTIVITY_VOTE_UP, TYPE_ACTIVITY_VOTE_DOWN, 26) + + self.__award_for_count_num(query, 26) + + def edit_count_100(self): + """ + (27, '????', 2, '????', '???100???', 0, 0) + """ + query = "SELECT count(*) as vote_count, user_id FROM activity WHERE " \ + "activity_type = %s OR " \ + "activity_type = %s AND " \ + "user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s) " \ + "GROUP BY user_id HAVING count(*) >= 100" % (TYPE_ACTIVITY_UPDATE_QUESTION, TYPE_ACTIVITY_UPDATE_ANSWER, 27) + + self.__award_for_count_num(query, 27) + + def comment_count_10(self): + """ + (5, '???', 3, '???', '??10???', 0, 0), + """ + query = "SELECT count(*) as vote_count, user_id FROM activity WHERE " \ + "activity_type = %s OR " \ + "activity_type = %s AND " \ + "user_id NOT IN (SELECT user_id FROM award WHERE badge_id = %s) " \ + "GROUP BY user_id HAVING count(*) >= 10" % (TYPE_ACTIVITY_COMMENT_QUESTION, TYPE_ACTIVITY_COMMENT_ANSWER, 5) + self.__award_for_count_num(query, 5) + + def __award_for_count_num(self, query, badge): + cursor = connection.cursor() + try: + cursor.execute(query) + rows = cursor.fetchall() + + awarded_users = [] + badge = get_object_or_404(Badge, id=badge) + for row in rows: + vote_count = row[0] + user_id = row[1] + + if user_id not in awarded_users: + user = get_object_or_404(User, id=user_id) + award = Award(user=user, badge=badge) + award.save() + awarded_users.append(user_id) + finally: + cursor.close() + +def main(): + pass + +if __name__ == '__main__': + main() diff --git a/askbot/management/commands/sample_command.py b/askbot/management/commands/sample_command.py new file mode 100644 index 00000000..bcdcb58e --- /dev/null +++ b/askbot/management/commands/sample_command.py @@ -0,0 +1,7 @@ +from django.core.management.base import NoArgsCommand +from askbot.models import Comment + +class Command(NoArgsCommand): + def handle_noargs(self, **options): + objs = Comment.objects.all() + print objs \ No newline at end of file diff --git a/askbot/management/commands/send_email_alerts.py b/askbot/management/commands/send_email_alerts.py new file mode 100644 index 00000000..94474963 --- /dev/null +++ b/askbot/management/commands/send_email_alerts.py @@ -0,0 +1,477 @@ +from django.core.management.base import NoArgsCommand +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 Comment +from django.core.mail import EmailMessage +from django.utils.translation import ugettext as _ +from django.utils.translation import ungettext +import datetime +from django.conf import settings +from askbot.conf import settings as askbot_settings +from django.utils.datastructures import SortedDict +from django.contrib.contenttypes.models import ContentType +from askbot import const + +DEBUG_THIS_COMMAND = False + +def get_all_origin_posts(mentions): + origin_posts = set() + for mention in mentions: + post = mention.content_object + origin_posts.add(post.get_origin_post()) + return list(origin_posts) + +#todo: refactor this as class +def extend_question_list(src, dst, limit=False, add_mention=False): + """src is a query set with questions + or None + dst - is an ordered dictionary + update reporting cutoff time for each question + to the latest value to be more permissive about updates + """ + if src is None:#is not QuerySet + return #will not do anything if subscription of this type is not used + if limit and len(dst.keys()) >= askbot_settings.MAX_ALERTS_PER_EMAIL: + return + cutoff_time = src.cutoff_time#todo: this limits use of function to query sets + #but sometimes we have a list on the input (like in the case of comment) + for q in src: + if q in dst: + meta_data = dst[q] + else: + meta_data = {'cutoff_time': cutoff_time} + dst[q] = meta_data + + if cutoff_time > meta_data['cutoff_time']: + #the latest cutoff time wins for a given question + #if the question falls into several subscription groups + #this makes mailer more eager in sending email + meta_data['cutoff_time'] = cutoff_time + if add_mention: + if 'mentions' in meta_data: + meta_data['mentions'] += 1 + else: + meta_data['mentions'] = 1 + +def format_action_count(string, number, output): + if number > 0: + output.append(_(string) % {'num':number}) + +class Command(NoArgsCommand): + def handle_noargs(self, **options): + try: + try: + self.send_email_alerts() + except Exception, e: + print e + finally: + connection.close() + + def get_updated_questions_for_user(self,user): + """ + retreive relevant question updates for the user + according to their subscriptions and recorded question + views + """ + + user_feeds = EmailFeedSetting.objects.filter(subscriber=user).exclude(frequency='n') + + should_proceed = False + for feed in user_feeds: + if feed.should_send_now() == True: + should_proceed = True + break + + #shortcirquit - if there is no ripe feed to work on for this user + if should_proceed == False: + return {} + + #these are placeholders for separate query sets per question group + #there are four groups - one for each EmailFeedSetting.feed_type + #and each group has subtypes A and B + #that's because of the strange thing commented below + #see note on Q and F objects marked with todo tag + q_sel_A = None + q_sel_B = None + + q_ask_A = None + q_ask_B = None + + q_ans_A = None + q_ans_B = None + + q_all_A = None + q_all_B = None + + q_m_and_c_A = None#mentions and post comments + q_m_and_c_B = None + + #base question query set for this user + #basic things - not deleted, not closed, not too old + #not last edited by the same user + base_qs = Question.objects.exclude( + last_activity_by=user + ).exclude( + last_activity_at__lt=user.date_joined#exclude old stuff + ).exclude( + deleted=True + ).exclude( + closed=True + ).order_by('-last_activity_at') + #todo: for some reason filter on did not work as expected ~Q(viewed__who=user) | + # Q(viewed__who=user,viewed__when__lt=F('last_activity_at')) + #returns way more questions than you might think it should + #so because of that I've created separate query sets Q_set2 and Q_set3 + #plus two separate queries run faster! + + #build two two queries based + + #questions that are not seen by the user at all + not_seen_qs = base_qs.filter(~Q(viewed__who=user)) + #questions that were seen, but before last modification + seen_before_last_mod_qs = base_qs.filter( + Q( + viewed__who=user, + viewed__when__lt=F('last_activity_at') + ) + ) + + for feed in user_feeds: + #each group of updates represented by the corresponding + #query set has it's own cutoff time + #that cutoff time is computed for each user individually + #and stored as a parameter "cutoff_time" + # + #we won't send email for a given question if an email has been + #sent after that cutoff_time + if feed.should_send_now(): + + if DEBUG_THIS_COMMAND == False: + feed.mark_reported_now() + cutoff_time = feed.get_previous_report_cutoff_time() + + #shorten variables for convenience + Q_set_A = not_seen_qs + Q_set_B = seen_before_last_mod_qs + + if feed.feed_type == 'q_sel': + q_sel_A = Q_set_A.filter(followed_by=user) + q_sel_A.cutoff_time = cutoff_time #store cutoff time per query set + q_sel_B = Q_set_B.filter(followed_by=user) + q_sel_B.cutoff_time = cutoff_time #store cutoff time per query set + + elif feed.feed_type == 'q_ask': + q_ask_A = Q_set_A.filter(author=user) + q_ask_A.cutoff_time = cutoff_time + q_ask_B = Q_set_B.filter(author=user) + q_ask_B.cutoff_time = cutoff_time + + elif feed.feed_type == 'q_ans': + q_ans_A = Q_set_A.filter(answers__author=user) + q_ans_A = q_ans_A[:askbot_settings.MAX_ALERTS_PER_EMAIL] + q_ans_A.cutoff_time = cutoff_time + + q_ans_B = Q_set_B.filter(answers__author=user) + q_ans_B = q_ans_B[:askbot_settings.MAX_ALERTS_PER_EMAIL] + q_ans_B.cutoff_time = cutoff_time + + elif feed.feed_type == 'q_all': + if user.tag_filter_setting == 'ignored': + + ignored_tags = Tag.objects.filter( + user_selections__reason='bad', + user_selections__user=user + ) + + q_all_A = Q_set_A.exclude( tags__in=ignored_tags ) + + q_all_B = Q_set_B.exclude( tags__in=ignored_tags ) + else: + selected_tags = Tag.objects.filter( + user_selections__reason='good', + user_selections__user=user + ) + q_all_A = Q_set_A.filter( tags__in=selected_tags ) + q_all_B = Q_set_B.filter( tags__in=selected_tags ) + + q_all_A = q_all_A[:askbot_settings.MAX_ALERTS_PER_EMAIL] + q_all_B = q_all_B[:askbot_settings.MAX_ALERTS_PER_EMAIL] + q_all_A.cutoff_time = cutoff_time + q_all_B.cutoff_time = cutoff_time + + #build ordered list questions for the email report + q_list = SortedDict() + + #todo: refactor q_list into a separate class + extend_question_list(q_sel_A, q_list) + extend_question_list(q_sel_B, q_list) + + #build list of comment and mention responses here + #it is separate because posts are not marked as changed + #when people add comments + #mention responses could be collected in the loop above, but + #it is inconvenient, because feed_type m_and_c bundles the two + #also we collect metadata for these here + if user_feeds.exists(feed_type='m_and_c'): + feed = user_feeds.get(feed_type='m_and_c') + if feed.should_report_now(): + cutoff_time = feed.get_previous_report_cutoff_time() + comments = Comment.objects.filter( + added_at__gt = cutoff_time, + user__ne = user, + ) + q_commented = list() + for c in comments: + post = c.content_object + if post.author != user: + continue + + #skip is post was seen by the user after + #the comment posting time + + if isinstance(post, Question): + q_commented.append(post) + elif isinstance(post, Answer): + q_commented.append(post.question) + + for q in q_commented: + if q in q_list: + meta_data = q_list[q] + if meta_data['cutoff_time'] < cutoff_time: + meta_data['cutoff_time'] = cutoff_time + if 'comments' in meta_data: + meta_data['comments'] += 1 + else: + meta_data['comments'] = 1 + + mentions = Activity.objects.get_mentions( + mentioned_at__gt = cutoff_time, + mentioned_whom = user + ) + + mention_posts = get_all_origin_posts(mentions) + q_mentions_id = [q.id for q in mention_posts] + + q_mentions_A = Q_set_A.filter(id__in = q_mentions_id) + q_mentions_A.cutoff_time = cutoff_time + extend_question_list(q_mentions_A, q_list, add_mention=True) + + q_mentions_B = Q_set_B.filter(id__in = q_mentions_id) + q_mentions_B.cutoff_time = cutoff_time + extend_question_list(q_mentions_B, q_list, add_mention=True) + + if user.tag_filter_setting == 'interesting': + extend_question_list(q_all_A, q_list) + extend_question_list(q_all_B, q_list) + + extend_question_list(q_ask_A, q_list, limit=True) + extend_question_list(q_ask_B, q_list, limit=True) + + extend_question_list(q_ans_A, q_list, limit=True) + extend_question_list(q_ans_B, q_list, limit=True) + + if user.tag_filter_setting == 'ignored': + extend_question_list(q_all_A, q_list, limit=True) + extend_question_list(q_all_B, q_list, limit=True) + + ctype = ContentType.objects.get_for_model(Question) + EMAIL_UPDATE_ACTIVITY = const.TYPE_ACTIVITY_EMAIL_UPDATE_SENT + + #up to this point we still don't know if emails about + #collected questions were sent recently + #the next loop examines activity record and decides + #for each question, whether it needs to be included or not + #into the report + + for q, meta_data in q_list.items(): + #this loop edits meta_data for each question + #so that user will receive counts on new edits new answers, etc + #and marks questions that need to be skipped + #because an email about them was sent recently enough + + #also it keeps a record of latest email activity per question per user + try: + #todo: is it possible to use content_object here, instead of + #content type and object_id pair? + update_info = Activity.objects.get( + user=user, + content_type=ctype, + object_id=q.id, + activity_type=EMAIL_UPDATE_ACTIVITY + ) + emailed_at = update_info.active_at + except Activity.DoesNotExist: + update_info = Activity( + user=user, + content_object=q, + activity_type=EMAIL_UPDATE_ACTIVITY + ) + emailed_at = datetime.datetime(1970, 1, 1)#long time ago + except Activity.MultipleObjectsReturned: + raise Exception( + 'server error - multiple question email activities ' + 'found per user-question pair' + ) + + cutoff_time = meta_data['cutoff_time']#cutoff time for the question + + #skip question if we need to wait longer because + #the delay before the next email has not yet elapsed + #or if last email was sent after the most recent modification + if emailed_at > cutoff_time or emailed_at > q.last_activity_at: + meta_data['skip'] = True + continue + + #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( + question=q, + revised_at__gt=emailed_at + ) + + q_rev = q_rev.exclude(author=user) + + #now update all sorts of metadata per question + meta_data['q_rev'] = len(q_rev) + if len(q_rev) > 0 and q.added_at == q_rev[0].revised_at: + meta_data['q_rev'] = 0 + meta_data['new_q'] = True + else: + meta_data['new_q'] = False + + new_ans = Answer.objects.filter( + question=q, + added_at__gt=emailed_at + ) + + new_ans = new_ans.exclude(author=user) + meta_data['new_ans'] = len(new_ans) + ans_rev = AnswerRevision.objects.filter( + answer__question=q, + revised_at__gt=emailed_at + ) + ans_rev = ans_rev.exclude(author=user) + meta_data['ans_rev'] = len(ans_rev) + + #finally skip question if there are no news indeed + if len(q_rev) + len(new_ans) + len(ans_rev) == 0: + meta_data['skip'] = True + else: + meta_data['skip'] = False + update_info.active_at = datetime.datetime.now() + if DEBUG_THIS_COMMAND == False: + update_info.save() #save question email update activity + #q_list is actually an ordered dictionary + #print 'user %s gets %d' % (user.username, len(q_list.keys())) + #todo: sort question list by update time + return q_list + + def send_email_alerts(self): + #does not change the database, only sends the email + #todo: move this to template + for user in User.objects.all(): + #todo: q_list is a dictionary, not a list + q_list = self.get_updated_questions_for_user(user) + if len(q_list.keys()) == 0: + continue + num_q = 0 + num_moot = 0 + for meta_data in q_list.values(): + if meta_data['skip']: + num_moot = True + else: + num_q += 1 + if num_q > 0: + url_prefix = askbot_settings.APP_URL + subject = _('email update message subject') + print 'have %d updated questions for %s' % (num_q, user.username) + text = ungettext('%(name)s, this is an update message header for %(num)d question', + '%(name)s, this is an update message header for %(num)d questions',num_q) \ + % {'num':num_q, 'name':user.username} + + text += '
    ' + items_added = 0 + items_unreported = 0 + for q, meta_data in q_list.items(): + act_list = [] + if meta_data['skip']: + continue + if items_added >= askbot_settings.MAX_ALERTS_PER_EMAIL: + items_unreported = num_q - items_added #may be inaccurate actually, but it's ok + + else: + items_added += 1 + if meta_data['new_q']: + act_list.append(_('new question')) + format_action_count('%(num)d rev', meta_data['q_rev'],act_list) + format_action_count('%(num)d ans', meta_data['new_ans'],act_list) + format_action_count('%(num)d ans rev',meta_data['ans_rev'],act_list) + act_token = ', '.join(act_list) + text += '
  • %s (%s)
  • ' \ + % (url_prefix + q.get_absolute_url(), q.title, act_token) + text += '
' + text += '

' + #if len(q_list.keys()) >= askbot_settings.MAX_ALERTS_PER_EMAIL: + # text += _('There may be more questions updated since ' + # 'you have logged in last time as this list is ' + # 'abridged for your convinience. Please visit ' + # 'the askbot and see what\'s new!
' + # ) + + text += _( + 'Please visit the askbot and see what\'s new! ' + 'Could you spread the word about it - ' + 'can somebody you know help answering those questions or ' + 'benefit from posting one?' + ) + + feeds = EmailFeedSetting.objects.filter( + subscriber=user, + ) + feed_freq = [feed.frequency for feed in feeds] + text += '

' + if 'd' in feed_freq: + text += _('Your most frequent subscription setting is \'daily\' ' + 'on selected questions. If you are receiving more than one ' + 'email per day' + 'please tell about this issue to the askbot administrator.' + ) + elif 'w' in feed_freq: + text += _('Your most frequent subscription setting is \'weekly\' ' + 'if you are receiving this email more than once a week ' + 'please report this issue to the askbot administrator.' + ) + text += ' ' + text += _( + 'There is a chance that you may be receiving links seen ' + 'before - due to a technicality that will eventually go away. ' + ) + # text += '

' + #if num_moot > 0: + # text += '

' + # text += ungettext('There is also one question which was recently '\ + # +'updated but you might not have seen its latest version.', + # 'There are also %(num)d more questions which were recently updated '\ + # +'but you might not have seen their latest version.',num_moot) \ + # % {'num':num_moot,} + # text += _('Perhaps you could look up previously sent askbot reminders in your mailbox.') + # text += '

' + + link = url_prefix + user.get_profile_url() + '?sort=email_subscriptions' + text += _('go to %(email_settings_link)s to change frequency of email updates or %(admin_email)s administrator') \ + % {'email_settings_link':link, 'admin_email':settings.ADMINS[0][1]} + if DEBUG_THIS_COMMAND == False: + msg = EmailMessage(subject, text, settings.DEFAULT_FROM_EMAIL, [user.email]) + msg.content_subtype = 'html' + msg.send() + else: + msg2 = EmailMessage( + subject, + text, + settings.DEFAULT_FROM_EMAIL, + ['your@email.com'] + ) + msg2.content_subtype = 'html' + msg2.send() diff --git a/askbot/management/commands/subscribe_everyone.py b/askbot/management/commands/subscribe_everyone.py new file mode 100644 index 00000000..d45d33ec --- /dev/null +++ b/askbot/management/commands/subscribe_everyone.py @@ -0,0 +1,33 @@ +from django.core.management.base import NoArgsCommand +from django.db import connection +from askbot.models import EmailFeedSetting, User +from django.core.mail import EmailMessage + +class Command(NoArgsCommand): + def handle_noargs(self, **options): + try: + try: + self.subscribe_everyone() + except Exception, e: + print e + finally: + connection.close() + + def subscribe_everyone(self): + + feed_type_info = EmailFeedSetting.FEED_TYPES + for user in User.objects.all(): + for feed_type in feed_type_info: + try: + feed_setting = EmailFeedSetting.objects.get( + subscriber=user, + feed_type = feed_type[0] + ) + except EmailFeedSetting.DoesNotExist: + feed_setting = EmailFeedSetting( + subscriber=user, + feed_type=feed_type[0] + ) + feed_setting.frequency = 'w' + feed_setting.reported_at = None + feed_setting.save() diff --git a/askbot/middleware/__init__.py b/askbot/middleware/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/middleware/anon_user.py b/askbot/middleware/anon_user.py new file mode 100644 index 00000000..06e9dfd0 --- /dev/null +++ b/askbot/middleware/anon_user.py @@ -0,0 +1,36 @@ +from django.utils.translation import ugettext as _ +from askbot.user_messages import create_message, get_and_delete_messages +from askbot.conf import settings as askbot_settings +from askbot import const + +class AnonymousMessageManager(object): + def __init__(self, request): + self.request = request + def create(self, message=''): + create_message(self.request, message) + def get_and_delete(self): + messages = get_and_delete_messages(self.request) + return messages + +def dummy_deepcopy(*arg): + """this is necessary to prevent deepcopy() on anonymous user object + that now contains reference to request, which cannot be deepcopied + """ + return None + +class ConnectToSessionMessagesMiddleware(object): + def process_request(self, request): + if not request.user.is_authenticated(): + #plug on deepcopy which may be called by django db "driver" + request.user.__deepcopy__ = dummy_deepcopy + #here request is linked to anon user + request.user.message_set = AnonymousMessageManager(request) + request.user.get_and_delete_messages = \ + request.user.message_set.get_and_delete + + #also set the first greeting one time per session only + if 'greeting_set' not in request.session: + request.session['greeting_set'] = True + msg = _(const.GREETING_FOR_ANONYMOUS_USER) \ + % askbot_settings.GREETING_URL + request.user.message_set.create(message=msg) diff --git a/askbot/middleware/cancel.py b/askbot/middleware/cancel.py new file mode 100644 index 00000000..45764d82 --- /dev/null +++ b/askbot/middleware/cancel.py @@ -0,0 +1,15 @@ +from django.http import HttpResponseRedirect +from askbot.utils.forms import get_next_url +import logging +class CancelActionMiddleware(object): + def process_view(self, request, view_func, view_args, view_kwargs): + if 'cancel' in request.REQUEST: + #todo use session messages for the anonymous users + try: + msg = getattr(view_func,'CANCEL_MESSAGE') + except AttributeError: + msg = 'action canceled' + request.user.message_set.create(message=msg) + return HttpResponseRedirect(get_next_url(request)) + else: + return None diff --git a/askbot/middleware/pagesize.py b/askbot/middleware/pagesize.py new file mode 100644 index 00000000..20af6aa6 --- /dev/null +++ b/askbot/middleware/pagesize.py @@ -0,0 +1,39 @@ +import logging +import traceback +import sys +# used in questions +QUESTIONS_PAGE_SIZE = 10 +class QuestionsPageSizeMiddleware(object): + def process_request(self, request): + # Set flag to False by default. If it is True, then need to be saved. + page_size_changed = False + # get page_size from session, if failed then get default value + user_page_size = request.session.get("page_size", QUESTIONS_PAGE_SIZE) + # set page_size equal to logon user specified value in database + if request.user.is_authenticated() \ + and request.user.questions_per_page > 0: + user_page_size = request.user.questions_per_page + + try: + # get new page_size from UI selection + page_size = int(request.GET.get('page_size', user_page_size)) + if page_size != user_page_size: + page_size_changed = True + + except ValueError: + page_size = user_page_size + + # save this page_size to user database + if page_size_changed: + if request.user.is_authenticated(): + user = request.user + user.questions_per_page = page_size + user.save() + # put page_size into session + request.session["page_size"] = page_size + + def process_exception(self, request, exception): + exc_type, exc_value, exc_traceback = sys.exc_info() + logging.debug(''.join(traceback.format_tb(exc_traceback))) + logging.debug(exc_type) + logging.debug(exc_value) diff --git a/askbot/middleware/spaceless.py b/askbot/middleware/spaceless.py new file mode 100644 index 00000000..16b11522 --- /dev/null +++ b/askbot/middleware/spaceless.py @@ -0,0 +1,15 @@ +""" +Middleware that strips whitespace between html tags +copied from David Cramer's blog +http://www.davidcramer.net/code/369/spaceless-html-in-django.html +""" +from django.utils.html import strip_spaces_between_tags as short + +class SpacelessMiddleware(object): + def process_response(self, request, response): + """strips whitespace from all documents + whose content type is text/html + """ + if 'text/html' in response['Content-Type']: + response.content = short(response.content) + return response diff --git a/askbot/middleware/view_log.py b/askbot/middleware/view_log.py new file mode 100644 index 00000000..fa38f29a --- /dev/null +++ b/askbot/middleware/view_log.py @@ -0,0 +1,72 @@ +import logging +from django.conf import settings +from askbot.views.readers import questions as questions_view +from askbot.views.commands import vote +from django.views.static import serve +from askbot.views.writers import delete_comment, question_comments, answer_comments +from askbot.views.readers import question_revisions, answer_revisions + +#todo: the list is getting bigger and bigger - maybe there is a better way to +#trigger reset of sarch state? +IGNORED_VIEWS = (serve, vote, delete_comment, + question_comments, answer_comments, + question_revisions, answer_revisions) + +class ViewLog(object): + """must be modified only in this middlware + however, can be read anywhere else + """ + def __init__(self): + self.views = [] + self.depth = 3 #todo maybe move this to const.py + + def get_previous(self, num): + if num > self.depth - 1: + raise Exception("view log depth exceeded") + elif num < 0: + raise Exception("num must be positive"); + elif num <= len(self.views) - 1: + return self.views[num] + else: + return None + + def set_current(self, view_name): + self.views.insert(0, view_name) + if len(self.views) > self.depth: + self.views.pop() + + def __str__(self): + return str(self.views) + ' depth=%d' % self.depth + +class ViewLogMiddleware(object): + def process_view(self, request, view_func, view_args, view_kwargs): + if view_func == questions_view: + view_str = 'questions' + elif view_func in IGNORED_VIEWS: + return + else: + view_str = view_func.__name__ + if view_str == 'wrap': + return + + if settings.DEBUG == True: + #todo: dependency! + from debug_toolbar.views import debug_media as debug_media_view + if view_func == debug_media_view: + return + else: + view_str = view_func.__name__ + + if request.user.is_authenticated(): + user_name = request.user.username + else: + user_name = request.META['REMOTE_ADDR'] + logging.debug('user %s, view %s' % (request.user.username, view_str)) + + if 'view_log' in request.session: + view_log = request.session['view_log'] + else: + view_log = ViewLog() + + view_log.set_current(view_str) + request.session['view_log'] = view_log diff --git a/askbot/migrations/0001_initial.py b/askbot/migrations/0001_initial.py new file mode 100644 index 00000000..31f6827b --- /dev/null +++ b/askbot/migrations/0001_initial.py @@ -0,0 +1,1550 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +app_dir_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'Vote' + if app_dir_name == 'forum': + db.create_table(u'vote', ( + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('voted_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='votes', to=orm['auth.User'])), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('vote', self.gf('django.db.models.fields.SmallIntegerField')()), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['Vote']) + + # Adding unique constraint on 'Vote', fields ['content_type', 'object_id', 'user'] + db.create_unique(u'vote', ['content_type_id', 'object_id', 'user_id']) + + # Adding model 'FlaggedItem' + db.create_table(u'flagged_item', ( + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('flagged_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='flaggeditems', to=orm['auth.User'])), + )) + db.send_create_signal('forum', ['FlaggedItem']) + + # Adding unique constraint on 'FlaggedItem', fields ['content_type', 'object_id', 'user'] + db.create_unique(u'flagged_item', ['content_type_id', 'object_id', 'user_id']) + + # Adding model 'Comment' + db.create_table(u'comment', ( + ('comment', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='comments', to=orm['auth.User'])), + )) + db.send_create_signal('forum', ['Comment']) + + # Adding model 'Tag' + db.create_table(u'tag', ( + ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), + ('deleted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='created_tags', to=orm['auth.User'])), + ('deleted_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='deleted_tags', null=True, to=orm['auth.User'])), + ('used_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('deleted_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['Tag']) + + # Adding model 'MarkedTag' + db.create_table('forum_markedtag', ( + ('reason', self.gf('django.db.models.fields.CharField')(max_length=16)), + ('tag', self.gf('django.db.models.fields.related.ForeignKey')(related_name='user_selections', to=orm['forum.Tag'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='tag_selections', to=orm['auth.User'])), + )) + db.send_create_signal('forum', ['MarkedTag']) + + # Adding model 'Question' + db.create_table(u'question', ( + ('wiki', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('vote_up_count', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('answer_accepted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('offensive_flag_count', self.gf('django.db.models.fields.SmallIntegerField')(default=0)), + ('closed_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('deleted_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_activity_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='last_active_in_questions', to=orm['auth.User'])), + ('view_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('locked_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('score', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='questions', to=orm['auth.User'])), + ('comment_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('html', self.gf('django.db.models.fields.TextField')()), + ('vote_down_count', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('closed', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('last_edited_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='last_edited_questions', null=True, to=orm['auth.User'])), + ('favourite_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('deleted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=180)), + ('answer_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('last_activity_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('closed_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='closed_questions', null=True, to=orm['auth.User'])), + ('close_reason', self.gf('django.db.models.fields.SmallIntegerField')(null=True, blank=True)), + ('locked', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('locked_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='locked_questions', null=True, to=orm['auth.User'])), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('deleted_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='deleted_questions', null=True, to=orm['auth.User'])), + ('wikified_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + )) + db.send_create_signal('forum', ['Question']) + + # Adding M2M table for field followed_by on 'Question' + db.create_table(u'question_followed_by', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('question', models.ForeignKey(orm['forum.question'], null=False)), + ('user', models.ForeignKey(orm['auth.user'], null=False)) + )) + db.create_unique(u'question_followed_by', ['question_id', 'user_id']) + + # Adding M2M table for field tags on 'Question' + db.create_table(u'question_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('question', models.ForeignKey(orm['forum.question'], null=False)), + ('tag', models.ForeignKey(orm['forum.tag'], null=False)) + )) + db.create_unique(u'question_tags', ['question_id', 'tag_id']) + + # Adding model 'QuestionView' + db.create_table('forum_questionview', ( + ('when', self.gf('django.db.models.fields.DateTimeField')()), + ('who', self.gf('django.db.models.fields.related.ForeignKey')(related_name='question_views', to=orm['auth.User'])), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='viewed', to=orm['forum.Question'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['QuestionView']) + + # Adding model 'FavoriteQuestion' + db.create_table(u'favorite_question', ( + ('question', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['forum.Question'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='user_favorite_questions', to=orm['auth.User'])), + )) + db.send_create_signal('forum', ['FavoriteQuestion']) + + # Adding model 'QuestionRevision' + db.create_table(u'question_revision', ( + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='questionrevisions', to=orm['auth.User'])), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('title', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='revisions', to=orm['forum.Question'])), + ('revised_at', self.gf('django.db.models.fields.DateTimeField')()), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=300, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('revision', self.gf('django.db.models.fields.PositiveIntegerField')()), + )) + db.send_create_signal('forum', ['QuestionRevision']) + + # Adding model 'AnonymousQuestion' + db.create_table('forum_anonymousquestion', ( + ('wiki', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('ip_addr', self.gf('django.db.models.fields.IPAddressField')(max_length=15)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True)), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('title', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=180)), + ('session_key', self.gf('django.db.models.fields.CharField')(max_length=40)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['AnonymousQuestion']) + + # Adding model 'Answer' + db.create_table(u'answer', ( + ('wiki', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('vote_up_count', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('offensive_flag_count', self.gf('django.db.models.fields.SmallIntegerField')(default=0)), + ('deleted_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('locked_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('score', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='answers', to=orm['auth.User'])), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='answers', to=orm['forum.Question'])), + ('comment_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('html', self.gf('django.db.models.fields.TextField')()), + ('vote_down_count', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('last_edited_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='last_edited_answers', null=True, to=orm['auth.User'])), + ('accepted_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('deleted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('accepted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('locked', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('locked_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='locked_answers', null=True, to=orm['auth.User'])), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('deleted_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='deleted_answers', null=True, to=orm['auth.User'])), + ('wikified_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + )) + db.send_create_signal('forum', ['Answer']) + + # Adding model 'AnswerRevision' + db.create_table(u'answer_revision', ( + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='answerrevisions', to=orm['auth.User'])), + ('text', self.gf('django.db.models.fields.TextField')()), + ('revised_at', self.gf('django.db.models.fields.DateTimeField')()), + ('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['forum.Answer'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('revision', self.gf('django.db.models.fields.PositiveIntegerField')()), + )) + db.send_create_signal('forum', ['AnswerRevision']) + + # Adding model 'AnonymousAnswer' + db.create_table('forum_anonymousanswer', ( + ('wiki', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('ip_addr', self.gf('django.db.models.fields.IPAddressField')(max_length=15)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='anonymous_answers', to=orm['forum.Question'])), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=180)), + ('session_key', self.gf('django.db.models.fields.CharField')(max_length=40)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['AnonymousAnswer']) + + # Adding model 'Activity' + db.create_table(u'activity', ( + ('is_auditted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('active_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('activity_type', self.gf('django.db.models.fields.SmallIntegerField')()), + )) + db.send_create_signal('forum', ['Activity']) + + # Adding model 'EmailFeedSetting' + db.create_table('forum_emailfeedsetting', ( + ('reported_at', self.gf('django.db.models.fields.DateTimeField')(null=True)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('subscriber', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('feed_type', self.gf('django.db.models.fields.CharField')(max_length=16)), + ('frequency', self.gf('django.db.models.fields.CharField')(default='n', max_length=8)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['EmailFeedSetting']) + + # Adding model 'ValidationHash' + db.create_table('forum_validationhash', ( + ('hash_code', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), + ('seed', self.gf('django.db.models.fields.CharField')(max_length=12)), + ('expiration', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2010, 4, 25, 13, 14, 41, 581000))), + ('type', self.gf('django.db.models.fields.CharField')(max_length=12)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + )) + db.send_create_signal('forum', ['ValidationHash']) + + # Adding unique constraint on 'ValidationHash', fields ['user', 'type'] + db.create_unique('forum_validationhash', ['user_id', 'type']) + + # Adding model 'AuthKeyUserAssociation' + db.create_table('forum_authkeyuserassociation', ( + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='auth_keys', to=orm['auth.User'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('key', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), + ('provider', self.gf('django.db.models.fields.CharField')(max_length=64)), + )) + db.send_create_signal('forum', ['AuthKeyUserAssociation']) + + # Adding model 'Badge' + db.create_table(u'badge', ( + ('multiple', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('description', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('awarded_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('type', self.gf('django.db.models.fields.SmallIntegerField')()), + ('slug', self.gf('django.db.models.fields.SlugField')(db_index=True, max_length=50, blank=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=50)), + )) + db.send_create_signal('forum', ['Badge']) + + # Adding unique constraint on 'Badge', fields ['name', 'type'] + db.create_unique(u'badge', ['name', 'type']) + + # Adding model 'Award' + db.create_table(u'award', ( + ('awarded_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('notified', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='award_user', to=orm['auth.User'])), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('badge', self.gf('django.db.models.fields.related.ForeignKey')(related_name='award_badge', to=orm['forum.Badge'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['Award']) + + # Adding model 'Repute' + db.create_table(u'repute', ( + ('positive', self.gf('django.db.models.fields.SmallIntegerField')(default=0)), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['forum.Question'])), + ('negative', self.gf('django.db.models.fields.SmallIntegerField')(default=0)), + ('reputation_type', self.gf('django.db.models.fields.SmallIntegerField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('reputed_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('reputation', self.gf('django.db.models.fields.IntegerField')(default=1)), + )) + db.send_create_signal('forum', ['Repute']) + + # Adding model 'Book' + db.create_table(u'book', ( + ('publication', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('short_name', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('author', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('cover_img', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('price', self.gf('django.db.models.fields.DecimalField')(max_digits=6, decimal_places=2)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('pages', self.gf('django.db.models.fields.SmallIntegerField')()), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('published_at', self.gf('django.db.models.fields.DateTimeField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('forum', ['Book']) + + # Adding M2M table for field questions on 'Book' + db.create_table('book_question', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('book', models.ForeignKey(orm['forum.book'], null=False)), + ('question', models.ForeignKey(orm['forum.question'], null=False)) + )) + db.create_unique('book_question', ['book_id', 'question_id']) + + # Adding model 'BookAuthorInfo' + db.create_table(u'book_author_info', ( + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['forum.Book'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('blog_url', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('forum', ['BookAuthorInfo']) + + # Adding model 'BookAuthorRss' + db.create_table(u'book_author_rss', ( + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('url', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['forum.Book'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('rss_created_at', self.gf('django.db.models.fields.DateTimeField')()), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['BookAuthorRss']) + else: + db.create_table(u'vote', ( + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('voted_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='votes', to=orm['auth.User'])), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('vote', self.gf('django.db.models.fields.SmallIntegerField')()), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['Vote']) + + # Adding unique constraint on 'Vote', fields ['content_type', 'object_id', 'user'] + db.create_unique(u'vote', ['content_type_id', 'object_id', 'user_id']) + + # Adding model 'FlaggedItem' + db.create_table(u'flagged_item', ( + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('flagged_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='flaggeditems', to=orm['auth.User'])), + )) + db.send_create_signal('askbot', ['FlaggedItem']) + + # Adding unique constraint on 'FlaggedItem', fields ['content_type', 'object_id', 'user'] + db.create_unique(u'flagged_item', ['content_type_id', 'object_id', 'user_id']) + + # Adding model 'Comment' + db.create_table(u'comment', ( + ('comment', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='comments', to=orm['auth.User'])), + )) + db.send_create_signal('askbot', ['Comment']) + + # Adding model 'Tag' + db.create_table(u'tag', ( + ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), + ('deleted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='created_tags', to=orm['auth.User'])), + ('deleted_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='deleted_tags', null=True, to=orm['auth.User'])), + ('used_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('deleted_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['Tag']) + + # Adding model 'MarkedTag' + db.create_table('askbot_markedtag', ( + ('reason', self.gf('django.db.models.fields.CharField')(max_length=16)), + ('tag', self.gf('django.db.models.fields.related.ForeignKey')(related_name='user_selections', to=orm['askbot.Tag'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='tag_selections', to=orm['auth.User'])), + )) + db.send_create_signal('askbot', ['MarkedTag']) + + # Adding model 'Question' + db.create_table(u'question', ( + ('wiki', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('vote_up_count', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('answer_accepted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('offensive_flag_count', self.gf('django.db.models.fields.SmallIntegerField')(default=0)), + ('closed_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('deleted_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_activity_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='last_active_in_questions', to=orm['auth.User'])), + ('view_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('locked_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('score', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='questions', to=orm['auth.User'])), + ('comment_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('html', self.gf('django.db.models.fields.TextField')()), + ('vote_down_count', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('closed', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('last_edited_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='last_edited_questions', null=True, to=orm['auth.User'])), + ('favourite_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('deleted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=180)), + ('answer_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('last_activity_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('closed_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='closed_questions', null=True, to=orm['auth.User'])), + ('close_reason', self.gf('django.db.models.fields.SmallIntegerField')(null=True, blank=True)), + ('locked', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('locked_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='locked_questions', null=True, to=orm['auth.User'])), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('deleted_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='deleted_questions', null=True, to=orm['auth.User'])), + ('wikified_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + )) + db.send_create_signal('askbot', ['Question']) + + # Adding M2M table for field followed_by on 'Question' + db.create_table(u'question_followed_by', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('question', models.ForeignKey(orm['askbot.question'], null=False)), + ('user', models.ForeignKey(orm['auth.user'], null=False)) + )) + db.create_unique(u'question_followed_by', ['question_id', 'user_id']) + + # Adding M2M table for field tags on 'Question' + db.create_table(u'question_tags', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('question', models.ForeignKey(orm['askbot.question'], null=False)), + ('tag', models.ForeignKey(orm['askbot.tag'], null=False)) + )) + db.create_unique(u'question_tags', ['question_id', 'tag_id']) + + # Adding model 'QuestionView' + db.create_table('askbot_questionview', ( + ('when', self.gf('django.db.models.fields.DateTimeField')()), + ('who', self.gf('django.db.models.fields.related.ForeignKey')(related_name='question_views', to=orm['auth.User'])), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='viewed', to=orm['askbot.Question'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['QuestionView']) + + # Adding model 'FavoriteQuestion' + db.create_table(u'favorite_question', ( + ('question', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['askbot.Question'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='user_favorite_questions', to=orm['auth.User'])), + )) + db.send_create_signal('askbot', ['FavoriteQuestion']) + + # Adding model 'QuestionRevision' + db.create_table(u'question_revision', ( + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='questionrevisions', to=orm['auth.User'])), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('title', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='revisions', to=orm['askbot.Question'])), + ('revised_at', self.gf('django.db.models.fields.DateTimeField')()), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=300, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('revision', self.gf('django.db.models.fields.PositiveIntegerField')()), + )) + db.send_create_signal('askbot', ['QuestionRevision']) + + # Adding model 'AnonymousQuestion' + db.create_table('askbot_anonymousquestion', ( + ('wiki', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('ip_addr', self.gf('django.db.models.fields.IPAddressField')(max_length=15)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True)), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('title', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=180)), + ('session_key', self.gf('django.db.models.fields.CharField')(max_length=40)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['AnonymousQuestion']) + + # Adding model 'Answer' + db.create_table(u'answer', ( + ('wiki', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('vote_up_count', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('offensive_flag_count', self.gf('django.db.models.fields.SmallIntegerField')(default=0)), + ('deleted_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('locked_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('score', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='answers', to=orm['auth.User'])), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='answers', to=orm['askbot.Question'])), + ('comment_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('html', self.gf('django.db.models.fields.TextField')()), + ('vote_down_count', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('last_edited_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='last_edited_answers', null=True, to=orm['auth.User'])), + ('accepted_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('deleted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('accepted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('locked', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('locked_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='locked_answers', null=True, to=orm['auth.User'])), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('deleted_by', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='deleted_answers', null=True, to=orm['auth.User'])), + ('wikified_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + )) + db.send_create_signal('askbot', ['Answer']) + + # Adding model 'AnswerRevision' + db.create_table(u'answer_revision', ( + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='answerrevisions', to=orm['auth.User'])), + ('text', self.gf('django.db.models.fields.TextField')()), + ('revised_at', self.gf('django.db.models.fields.DateTimeField')()), + ('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'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('revision', self.gf('django.db.models.fields.PositiveIntegerField')()), + )) + db.send_create_signal('askbot', ['AnswerRevision']) + + # Adding model 'AnonymousAnswer' + db.create_table('askbot_anonymousanswer', ( + ('wiki', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('ip_addr', self.gf('django.db.models.fields.IPAddressField')(max_length=15)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(related_name='anonymous_answers', to=orm['askbot.Question'])), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('summary', self.gf('django.db.models.fields.CharField')(max_length=180)), + ('session_key', self.gf('django.db.models.fields.CharField')(max_length=40)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['AnonymousAnswer']) + + # Adding model 'Activity' + db.create_table(u'activity', ( + ('is_auditted', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('active_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('activity_type', self.gf('django.db.models.fields.SmallIntegerField')()), + )) + db.send_create_signal('askbot', ['Activity']) + + # Adding model 'EmailFeedSetting' + db.create_table('askbot_emailfeedsetting', ( + ('reported_at', self.gf('django.db.models.fields.DateTimeField')(null=True)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('subscriber', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('feed_type', self.gf('django.db.models.fields.CharField')(max_length=16)), + ('frequency', self.gf('django.db.models.fields.CharField')(default='n', max_length=8)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['EmailFeedSetting']) + + # Adding model 'ValidationHash' + db.create_table('askbot_validationhash', ( + ('hash_code', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), + ('seed', self.gf('django.db.models.fields.CharField')(max_length=12)), + ('expiration', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2010, 4, 25, 13, 14, 41, 581000))), + ('type', self.gf('django.db.models.fields.CharField')(max_length=12)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + )) + db.send_create_signal('askbot', ['ValidationHash']) + + # Adding unique constraint on 'ValidationHash', fields ['user', 'type'] + db.create_unique('askbot_validationhash', ['user_id', 'type']) + + # Adding model 'AuthKeyUserAssociation' + db.create_table('askbot_authkeyuserassociation', ( + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='auth_keys', to=orm['auth.User'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('key', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)), + ('provider', self.gf('django.db.models.fields.CharField')(max_length=64)), + )) + db.send_create_signal('askbot', ['AuthKeyUserAssociation']) + + # Adding model 'Badge' + db.create_table(u'badge', ( + ('multiple', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('description', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('awarded_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)), + ('type', self.gf('django.db.models.fields.SmallIntegerField')()), + ('slug', self.gf('django.db.models.fields.SlugField')(db_index=True, max_length=50, blank=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=50)), + )) + db.send_create_signal('askbot', ['Badge']) + + # Adding unique constraint on 'Badge', fields ['name', 'type'] + db.create_unique(u'badge', ['name', 'type']) + + # Adding model 'Award' + db.create_table(u'award', ( + ('awarded_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('notified', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='award_user', to=orm['auth.User'])), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('badge', self.gf('django.db.models.fields.related.ForeignKey')(related_name='award_badge', to=orm['askbot.Badge'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['Award']) + + # Adding model 'Repute' + db.create_table(u'repute', ( + ('positive', self.gf('django.db.models.fields.SmallIntegerField')(default=0)), + ('question', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['askbot.Question'])), + ('negative', self.gf('django.db.models.fields.SmallIntegerField')(default=0)), + ('reputation_type', self.gf('django.db.models.fields.SmallIntegerField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('reputed_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('reputation', self.gf('django.db.models.fields.IntegerField')(default=1)), + )) + db.send_create_signal('askbot', ['Repute']) + + # Adding model 'Book' + db.create_table(u'book', ( + ('publication', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('short_name', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('author', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('cover_img', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('price', self.gf('django.db.models.fields.DecimalField')(max_digits=6, decimal_places=2)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('pages', self.gf('django.db.models.fields.SmallIntegerField')()), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('published_at', self.gf('django.db.models.fields.DateTimeField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('askbot', ['Book']) + + # Adding M2M table for field questions on 'Book' + db.create_table('book_question', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('book', models.ForeignKey(orm['askbot.book'], null=False)), + ('question', models.ForeignKey(orm['askbot.question'], null=False)) + )) + db.create_unique('book_question', ['book_id', 'question_id']) + + # Adding model 'BookAuthorInfo' + db.create_table(u'book_author_info', ( + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['askbot.Book'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('blog_url', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('askbot', ['BookAuthorInfo']) + + # Adding model 'BookAuthorRss' + db.create_table(u'book_author_rss', ( + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('url', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['askbot.Book'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('rss_created_at', self.gf('django.db.models.fields.DateTimeField')()), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['BookAuthorRss']) + + + def backwards(self, orm): + + if app_dir_name == 'forum': + # Deleting model 'Vote' + db.delete_table(u'vote') + + # Removing unique constraint on 'Vote', fields ['content_type', 'object_id', 'user'] + db.delete_unique(u'vote', ['content_type_id', 'object_id', 'user_id']) + + # Deleting model 'FlaggedItem' + db.delete_table(u'flagged_item') + + # Removing unique constraint on 'FlaggedItem', fields ['content_type', 'object_id', 'user'] + db.delete_unique(u'flagged_item', ['content_type_id', 'object_id', 'user_id']) + + # Deleting model 'Comment' + db.delete_table(u'comment') + + # Deleting model 'Tag' + db.delete_table(u'tag') + + # Deleting model 'MarkedTag' + db.delete_table('forum_markedtag') + + # Deleting model 'Question' + db.delete_table(u'question') + + # Removing M2M table for field followed_by on 'Question' + db.delete_table('question_followed_by') + + # Removing M2M table for field tags on 'Question' + db.delete_table('question_tags') + + # Deleting model 'QuestionView' + db.delete_table('forum_questionview') + + # Deleting model 'FavoriteQuestion' + db.delete_table(u'favorite_question') + + # Deleting model 'QuestionRevision' + db.delete_table(u'question_revision') + + # Deleting model 'AnonymousQuestion' + db.delete_table('forum_anonymousquestion') + + # Deleting model 'Answer' + db.delete_table(u'answer') + + # Deleting model 'AnswerRevision' + db.delete_table(u'answer_revision') + + # Deleting model 'AnonymousAnswer' + db.delete_table('forum_anonymousanswer') + + # Deleting model 'Activity' + db.delete_table(u'activity') + + # Deleting model 'EmailFeedSetting' + db.delete_table('forum_emailfeedsetting') + + # Deleting model 'ValidationHash' + db.delete_table('forum_validationhash') + + # Removing unique constraint on 'ValidationHash', fields ['user', 'type'] + db.delete_unique('forum_validationhash', ['user_id', 'type']) + + # Deleting model 'AuthKeyUserAssociation' + db.delete_table('forum_authkeyuserassociation') + + # Deleting model 'Badge' + db.delete_table(u'badge') + + # Removing unique constraint on 'Badge', fields ['name', 'type'] + db.delete_unique(u'badge', ['name', 'type']) + + # Deleting model 'Award' + db.delete_table(u'award') + + # Deleting model 'Repute' + db.delete_table(u'repute') + + # Deleting model 'Book' + db.delete_table(u'book') + + # Removing M2M table for field questions on 'Book' + db.delete_table('book_question') + + # Deleting model 'BookAuthorInfo' + db.delete_table(u'book_author_info') + + # Deleting model 'BookAuthorRss' + db.delete_table(u'book_author_rss') + else: + # Deleting model 'Vote' + db.delete_table(u'vote') + + # Removing unique constraint on 'Vote', fields ['content_type', 'object_id', 'user'] + db.delete_unique(u'vote', ['content_type_id', 'object_id', 'user_id']) + + # Deleting model 'FlaggedItem' + db.delete_table(u'flagged_item') + + # Removing unique constraint on 'FlaggedItem', fields ['content_type', 'object_id', 'user'] + db.delete_unique(u'flagged_item', ['content_type_id', 'object_id', 'user_id']) + + # Deleting model 'Comment' + db.delete_table(u'comment') + + # Deleting model 'Tag' + db.delete_table(u'tag') + + # Deleting model 'MarkedTag' + db.delete_table('askbot_markedtag') + + # Deleting model 'Question' + db.delete_table(u'question') + + # Removing M2M table for field followed_by on 'Question' + db.delete_table('question_followed_by') + + # Removing M2M table for field tags on 'Question' + db.delete_table('question_tags') + + # Deleting model 'QuestionView' + db.delete_table('askbot_questionview') + + # Deleting model 'FavoriteQuestion' + db.delete_table(u'favorite_question') + + # Deleting model 'QuestionRevision' + db.delete_table(u'question_revision') + + # Deleting model 'AnonymousQuestion' + db.delete_table('askbot_anonymousquestion') + + # Deleting model 'Answer' + db.delete_table(u'answer') + + # Deleting model 'AnswerRevision' + db.delete_table(u'answer_revision') + + # Deleting model 'AnonymousAnswer' + db.delete_table('askbot_anonymousanswer') + + # Deleting model 'Activity' + db.delete_table(u'activity') + + # Deleting model 'EmailFeedSetting' + db.delete_table('askbot_emailfeedsetting') + + # Deleting model 'ValidationHash' + db.delete_table('askbot_validationhash') + + # Removing unique constraint on 'ValidationHash', fields ['user', 'type'] + db.delete_unique('askbot_validationhash', ['user_id', 'type']) + + # Deleting model 'AuthKeyUserAssociation' + db.delete_table('askbot_authkeyuserassociation') + + # Deleting model 'Badge' + db.delete_table(u'badge') + + # Removing unique constraint on 'Badge', fields ['name', 'type'] + db.delete_unique(u'badge', ['name', 'type']) + + # Deleting model 'Award' + db.delete_table(u'award') + + # Deleting model 'Repute' + db.delete_table(u'repute') + + # Deleting model 'Book' + db.delete_table(u'book') + + # Removing M2M table for field questions on 'Book' + db.delete_table('book_question') + + # Deleting model 'BookAuthorInfo' + db.delete_table(u'book_author_info') + + # Deleting model 'BookAuthorRss' + db.delete_table(u'book_author_rss') + + + if app_dir_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', [], {}), + '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', 'blank': 'True'}), + '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['forum.Question']"}), + 'score': ('django.db.models.fields.IntegerField', [], {'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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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': '300'}), + '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': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.Tag']"}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 4, 25, 13, 14, 41, 714642)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', [], {}), + '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', 'blank': 'True'}), + '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'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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': '300'}), + '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': "'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', [], {'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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['askbot.Tag']"}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 4, 25, 13, 14, 41, 714642)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = [app_dir_name] diff --git a/askbot/migrations/0002_auto__add_field_answer_text__chg_field_answer_html__add_field_question.py b/askbot/migrations/0002_auto__add_field_answer_text__chg_field_answer_html__add_field_question.py new file mode 100644 index 00000000..9b8cdab7 --- /dev/null +++ b/askbot/migrations/0002_auto__add_field_answer_text__chg_field_answer_html__add_field_question.py @@ -0,0 +1,700 @@ +# encoding: utf-8 +import os +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 'Answer.text' + db.add_column(u'answer', 'text', self.gf('django.db.models.fields.TextField')(null=True), keep_default=False) + + # Changing field 'Answer.html' + db.alter_column(u'answer', 'html', self.gf('django.db.models.fields.TextField')(null=True)) + + # Adding field 'Question.text' + db.add_column(u'question', 'text', self.gf('django.db.models.fields.TextField')(null=True), keep_default=False) + + # Changing field 'Question.html' + db.alter_column(u'question', 'html', self.gf('django.db.models.fields.TextField')(null=True)) + + + def backwards(self, orm): + + # Deleting field 'Answer.text' + db.delete_column(u'answer', 'text') + + # Changing field 'Answer.html' + db.alter_column(u'answer', 'html', self.gf('django.db.models.fields.TextField')()) + + # Deleting field 'Question.text' + db.delete_column(u'question', 'text') + + # Changing field 'Question.html' + db.alter_column(u'question', 'html', self.gf('django.db.models.fields.TextField')()) + + app_dir_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + + if app_dir_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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': '300'}), + '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': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 4, 25, 16, 21, 32, 856067)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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': '300'}), + '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': "'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', [], {'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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 4, 25, 16, 21, 32, 856067)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = [app_dir_name] diff --git a/askbot/migrations/0003_copy_denorm_text_record_to_posts_for_fulltext_search.py b/askbot/migrations/0003_copy_denorm_text_record_to_posts_for_fulltext_search.py new file mode 100644 index 00000000..3227a24f --- /dev/null +++ b/askbot/migrations/0003_copy_denorm_text_record_to_posts_for_fulltext_search.py @@ -0,0 +1,687 @@ +# encoding: utf-8 +import datetime +import os +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + for q in orm.Question.objects.all(): + r = q.revisions.all()[0] #cannot use get_latest_revision() + q.text = r.text + q.save() + for a in orm.Answer.objects.all(): + r = a.revisions.all()[0] + a.text = r.text + a.save() + + def backwards(self, orm): + "Write your backwards methods here." + pass#there's no need to clean data here, just delete columns + + forum_app_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + if forum_app_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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': '300'}), + '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': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 4, 25, 16, 24, 24, 604164)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + + complete_apps = ['forum'] + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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': '300'}), + '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': "'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', [], {'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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 4, 25, 16, 24, 24, 604164)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0004_install_full_text_indexes_for_mysql.py b/askbot/migrations/0004_install_full_text_indexes_for_mysql.py new file mode 100644 index 00000000..ccf70fd2 --- /dev/null +++ b/askbot/migrations/0004_install_full_text_indexes_for_mysql.py @@ -0,0 +1,720 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +Q_INDEX_NAME = 'askbot_question_full_text_index' +A_INDEX_NAME = 'askbot_answer_full_text_index' + +def get_create_full_text_index_sql(index_name, table_name, column_list): + column_sql = '(%s)' % ','.join(column_list) + sql = 'CREATE FULLTEXT INDEX %s on %s %s' % (index_name, table_name, column_sql) + return sql + +def get_drop_index_sql(index_name, table_name): + return 'ALTER TABLE %s DROP INDEX %s' % (table_name, index_name) + +class Migration(DataMigration): + + def forwards(self, orm): + """install fulltext indices for mysql + will work only for MyISAM engine + and will probably fail otherwise + """ + if db.backend_name == 'mysql': + #todo: extract column names by introspection + question_index_sql = get_create_full_text_index_sql( + Q_INDEX_NAME, + orm.Question._meta.db_table, + ('title','text','tagnames',) + ) + db.execute(question_index_sql) + + answer_index_sql = get_create_full_text_index_sql( + A_INDEX_NAME, + orm.Answer._meta.db_table, + ('text',) + ) + db.execute(answer_index_sql) + + def backwards(self, orm): + "code for removal of full text indices in mysql" + if db.backend_name == 'mysql': + db.execute( + get_drop_index_sql( + Q_INDEX_NAME, + orm.Question._meta.db_table, + ) + ) + db.execute( + get_drop_index_sql( + A_INDEX_NAME, + orm.Answer._meta.db_table, + ) + ) + + forum_app_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + if forum_app_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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': '300'}), + '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': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 4, 25, 19, 13, 13, 325125)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + + complete_apps = ['forum'] + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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': '300'}), + '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': "'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', [], {'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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 4, 25, 19, 13, 13, 325125)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0005_install_badges.py b/askbot/migrations/0005_install_badges.py new file mode 100644 index 00000000..c8efda9c --- /dev/null +++ b/askbot/migrations/0005_install_badges.py @@ -0,0 +1,751 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +_ = lambda v:v #fake translation function so that badges are translated, but database takes keys + +INITIAL_BADGE_DATA = ( + (_('Disciplined'), 3, _('disciplined'), _('Deleted own post with score of 3 or higher'), True, 0), + (_('Peer Pressure'), 3, _('peer-pressure'), _('Deleted own post with score of -3 or lower'), True, 0), + (_('Nice answer'), 3, _('nice-answer'), _('Answer voted up 10 times'), True, 0), + (_('Nice Question'), 3, _('nice-question'), _('Question voted up 10 times'), True, 0), + (_('Pundit'), 3, _('pundit'), _('Left 10 comments with score of 10 or more'), False, 0), + (_('Popular Question'), 3, _('popular-question'), _('Asked a question with 1,000 views'), True, 0), + (_('Citizen patrol'), 3, _('citizen-patrol'), _('First flagged post'), False, 0), + (_('Cleanup'), 3, _('cleanup'), _('First rollback'), False, 0), + (_('Critic'), 3, _('critic'), _('First down vote'), False, 0), + (_('Editor'), 3, _('editor'), _('First edit'), False, 0), + (_('Organizer'), 3, _('organizer'), _('First retag'), False, 0), + (_('Scholar'), 3, _('scholar'), _('First accepted answer on your own question'), False, 0), + (_('Student'), 3, _('student'), _('Asked first question with at least one up vote'), False, 0), + (_('Supporter'), 3, _('supporter'), _('First up vote'), False, 0), + (_('Teacher'), 3, _('teacher'), _('Answered first question with at least one up vote'), False, 0), + (_('Autobiographer'), 3, _('autobiographer'), _('Completed all user profile fields'), False, 0), + (_('Self-Learner'), 3, _('self-learner'), _('Answered your own question with at least 3 up votes'), True, 0), + (_('Great Answer'), 1, _('great-answer'), _('Answer voted up 100 times'), True, 0), + (_('Great Question'), 1, _('great-question'), _('Question voted up 100 times'), True, 0), + (_('Stellar Question'), 1, _('stellar-question'), _('Question favorited by 100 users'), True, 0), + (_('Famous question'), 1, _('famous-question'), _('Asked a question with 10,000 views'), True, 0), + (_('Alpha'), 2, _('alpha'), _('Actively participated in the private alpha'), False, 0), + (_('Good Answer'), 2, _('good-answer'), _('Answer voted up 25 times'), True, 0), + (_('Good Question'), 2, _('good-question'), _('Question voted up 25 times'), True, 0), + (_('Favorite Question'), 2, _('favorite-question'), _('Question favorited by 25 users'), True, 0), + (_('Civic duty'), 2, _('civic-duty'), _('Voted 300 times'), False, 0), + (_('Strunk & White'), 2, _('strunk-and-white'), _('Edited 100 entries'), False, 0), + (_('Generalist'), 2, _('generalist'), _('Active in many different tags'), False, 0), + (_('Expert'), 2, _('expert'), _('Very active in one tag'), False, 0), + (_('Yearling'), 2, _('yearling'), _('Active member for a year'), False, 0), + (_('Notable Question'), 2, _('notable-question'), _('Asked a question with 2,500 views'), True, 0), + (_('Enlightened'), 2, _('enlightened'), _('First answer was accepted with at least 10 up votes'), False, 0), + (_('Beta'), 2, _('beta'), _('Actively participated in the private beta'), False, 0), + (_('Guru'), 2, _('guru'), _('Accepted answer and voted up 40 times'), True, 0), + (_('Necromancer'), 2, _('necromancer'), _('Answered a question more than 60 days later with at least 5 votes'), True, 0), + (_('Taxonomist'), 2, _('taxonomist'), _('Created a tag used by 50 questions'), True, 0) +) + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + + for entry in INITIAL_BADGE_DATA: + name = entry[0] + type = entry[1] + slug = entry[2] + description = entry[3] + multiple = entry[4] + + try: + badge = orm.Badge.objects.get(name=name) + print 'already have badge %s' % name + except orm.Badge.DoesNotExist: + print 'adding new badge %s' % name + badge = orm.Badge() + badge.name = name + + badge.type = type + badge.slug = slug + badge.description = description + badge.multiple = multiple + badge.save() + + + def backwards(self, orm): + "Write your backwards methods here." + for entry in INITIAL_BADGE_DATA: + name = entry[0] + try: + badge = orm.Badge.objects.get(name = name) + badge.award_badge.clear() + badge.delete() + print 'deleted badge %s' % name + except orm.Badge.DoesNotExist: + print 'no such badge %s - so skipping' % name + pass + + forum_app_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + if forum_app_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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': '300'}), + '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': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 2, 12, 29, 51, 920204)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + + complete_apps = ['forum'] + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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': '300'}), + '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': "'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', [], {'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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 2, 12, 29, 51, 920204)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0006_add_subscription_setting_for_comments_and_mentions.py b/askbot/migrations/0006_add_subscription_setting_for_comments_and_mentions.py new file mode 100644 index 00000000..15c9111f --- /dev/null +++ b/askbot/migrations/0006_add_subscription_setting_for_comments_and_mentions.py @@ -0,0 +1,719 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models +try: + from forum import const +except ImportError: + from askbot import const + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + print '' + print '**************' + print 'Adding subscription on comment responses and name mentions for each user. ' + print 'frequency will be automatically set to the most frequent selection ' + print 'that user made for any other types of subscriptions' + print '' + + for user in orm['auth.User'].objects.all(): + + feeds = orm.EmailFeedSetting.objects.filter(subscriber=user) + freqs = set([f.frequency for f in feeds]) + + if 'i' in freqs: + frequency = 'i' + elif 'd' in freqs: + frequency = 'd' + elif 'w' in freqs: + frequency = 'w' + else: + frequency = 'n' + + new_feed = orm.EmailFeedSetting( + subscriber = user, + frequency = frequency, + feed_type = 'm_and_c', + ) + new_feed.save() + verbose_frequency = dict(const.NOTIFICATION_DELIVERY_SCHEDULE_CHOICES)[frequency] + print 'added \'%s\' subscription for %s (%d)' % ( + verbose_frequency, + user.username, + user.id + ) + + def backwards(self, orm): + "Write your backwards methods here." + feeds = orm.EmailFeedSetting.objects.filter(feed_type = 'm_and_c') + n = len(feeds) + feeds.delete() + print 'deleted %d feeds' % n + + forum_app_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + if forum_app_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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': '300'}), + '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': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 16, 15, 7, 19, 596607)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + + complete_apps = ['forum'] + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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': '300'}), + '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': "'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', [], {'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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 16, 15, 7, 19, 596607)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0007_install_mentions_model.py b/askbot/migrations/0007_install_mentions_model.py new file mode 100644 index 00000000..f5a712ad --- /dev/null +++ b/askbot/migrations/0007_install_mentions_model.py @@ -0,0 +1,708 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +app_dir_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'Mention' + db.create_table(u'mention', ( + ('mentioned_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='mentions_sent', to=orm['auth.User'])), + ('mentioned_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('mentioned_whom', self.gf('django.db.models.fields.related.ForeignKey')(related_name='mentions_received', to=orm['auth.User'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal(app_dir_name, ['Mention']) + + + def backwards(self, orm): + + # Deleting model 'Mention' + db.delete_table(u'mention') + + if app_dir_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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': '300'}), + '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': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.mention': { + 'Meta': {'object_name': 'Mention', 'db_table': "u'mention'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mentioned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'mentioned_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_sent'", 'to': "orm['auth.User']"}), + 'mentioned_whom': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_received'", 'to': "orm['auth.User']"}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 17, 13, 4, 34, 910299)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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': '300'}), + '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': "'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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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.mention': { + 'Meta': {'object_name': 'Mention', 'db_table': "u'mention'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mentioned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'mentioned_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_sent'", 'to': "orm['auth.User']"}), + 'mentioned_whom': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_received'", 'to': "orm['auth.User']"}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 17, 13, 4, 34, 910299)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = [app_dir_name] diff --git a/askbot/migrations/0008_add_html_field_to_comments.py b/askbot/migrations/0008_add_html_field_to_comments.py new file mode 100644 index 00000000..6da4b292 --- /dev/null +++ b/askbot/migrations/0008_add_html_field_to_comments.py @@ -0,0 +1,708 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +app_dir_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding field 'Comment.html' + db.add_column(u'comment', 'html', self.gf('django.db.models.fields.CharField')(default='', max_length=2048), keep_default=False) + + # Changing field 'Comment.comment' + db.alter_column(u'comment', 'comment', self.gf('django.db.models.fields.CharField')(max_length=2048)) + + def backwards(self, orm): + + # Deleting field 'Comment.html' + db.delete_column(u'comment', 'html') + + # Changing field 'Comment.comment' + db.alter_column(u'comment', 'comment', self.gf('django.db.models.fields.CharField')(max_length=300)) + + + if app_dir_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.mention': { + 'Meta': {'object_name': 'Mention', 'db_table': "u'mention'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mentioned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'mentioned_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_sent'", 'to': "orm['auth.User']"}), + 'mentioned_whom': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_received'", 'to': "orm['auth.User']"}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 17, 15, 29, 56, 802370)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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', [], {}), + '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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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.mention': { + 'Meta': {'object_name': 'Mention', 'db_table': "u'mention'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mentioned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'mentioned_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_sent'", 'to': "orm['auth.User']"}), + 'mentioned_whom': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_received'", 'to': "orm['auth.User']"}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 17, 15, 29, 56, 802370)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = [app_dir_name] diff --git a/askbot/migrations/0009_calculate_html_field_for_comments.py b/askbot/migrations/0009_calculate_html_field_for_comments.py new file mode 100644 index 00000000..a98447da --- /dev/null +++ b/askbot/migrations/0009_calculate_html_field_for_comments.py @@ -0,0 +1,854 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models +from django.utils.html import urlize +from django.template.defaultfilters import slugify +from django.core.urlresolvers import reverse +try: + from forum import const +except ImportError: + from askbot import const +import re + +def get_authors(question, orm = None): + authors = set() + for q_rev in orm.QuestionRevision.objects.filter(question=question): + authors.add(q_rev.author) + + q_comments = orm.Comment.objects.filter( + content_type__model='question', + object_id = question.id + ) + for q_c in q_comments: + authors.add(q_c.user) + + answers = orm.Answer.objects.filter( + question = question, + deleted = False + ) + for a in answers: + for a_rev in orm.AnswerRevision.objects.filter(answer = a): + authors.add(a_rev.author) + a_comments = orm.Comment.objects.filter( + content_type__model = 'answer', + object_id = a.id + ) + for a_c in a_comments: + authors.add(a_c.user) + return authors + +def get_absolute_url(user): + url = reverse( + 'user_profile', + kwargs={ + 'id':user.id, + 'slug': slugify(user.username) + } + ) + return u'@%s' % (url, user.username) + +def get_comment_continuation(matching_author): + if matching_author: + return get_absolute_url(matching_author) + else: + return '@' + +def maybe_save_mention( + context = None, + mentioned_whom = None, + orm = None, + comment_content_type = None + ): + if mentioned_whom and mentioned_whom != context.user: + m = orm['forum.Mention']( + mentioned_by = context.user, + mentioned_whom = mentioned_whom, + mentioned_at = context.added_at, + object_id = context.id, + content_type = comment_content_type, + ) + m.save() + +def extract_matching_author(text, ordered_authors): + for a in ordered_authors: + if text.startswith(a.username): + ulen = len(a.username) + if len(text) == ulen: + text = '' + elif text[ulen] in const.TWITTER_STYLE_MENTION_TERMINATION_CHARS: + text = text[ulen:] + else: + #near miss, here we could insert a warning that perhaps + #a termination character is needed + continue + return a, text + return None, text + + +def mentionize(text, comment = None, all_users = None, orm = None): + if comment.content_type.model == 'answer': + answer = orm.Answer.objects.get(id = comment.object_id) + question = answer.question + else: + question = orm.Question.objects.get(id = comment.object_id) + + #build ordered list of author names + authors = get_authors(question, orm = orm) + the_rest = all_users - authors + ordered_authors = list(authors) + list(the_rest) + + comment_content_type = orm.ContentType.objects.get(model='comment') + + output = '' + while '@' in text: + #the purpose of this loop is to convert any occurance of '@mention ' syntax + #to user account links leading space is required unless @ is the first + #character in whole text, also, either a punctuation or a ' ' char is required + #after the name + pos = text.index('@') + + output += text[:pos] + + if len(text) == pos + 1: + output += '@' + text = '' + break + + if pos > 0: + if text[pos-1] in const.TWITTER_STYLE_MENTION_TERMINATION_CHARS: + + text = text[pos+1:] + matching_author, text = extract_matching_author(text, ordered_authors) + output += get_comment_continuation(matching_author) + maybe_save_mention( + context = comment, + mentioned_whom = matching_author, + orm = orm, + comment_content_type = comment_content_type + ) + else: + text = text[pos+1:] + output += '@' + else: + text = text[1:] + matching_author, text = extract_matching_author(text, ordered_authors) + output += get_comment_continuation(matching_author) + maybe_save_mention( + context = comment, + mentioned_whom = matching_author, + orm = orm, + comment_content_type = comment_content_type + ) + + #append the rest of text that did not have @ symbols + output += text + return output + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + all_users = set(orm['auth.User'].objects.all()) + for comment in orm.Comment.objects.all(): + comment.html = mentionize( + urlize(comment.comment, nofollow=True), + comment = comment, + all_users = all_users, + orm = orm + ) + #print 'was %s' % comment.comment + #print 'now %s' % comment.html + comment.save() + + def backwards(self, orm): + "Write your backwards methods here." + for comment in orm.Comment.objects.all(): + comment.html = comment.comment + comment.save() + + forum_app_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + if forum_app_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.mention': { + 'Meta': {'object_name': 'Mention', 'db_table': "u'mention'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mentioned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'mentioned_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_sent'", 'to': "orm['auth.User']"}), + 'mentioned_whom': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_received'", 'to': "orm['auth.User']"}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 17, 15, 33, 45, 429877)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + + complete_apps = ['forum'] + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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', [], {}), + '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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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.mention': { + 'Meta': {'object_name': 'Mention', 'db_table': "u'mention'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mentioned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'mentioned_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_sent'", 'to': "orm['auth.User']"}), + 'mentioned_whom': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_received'", 'to': "orm['auth.User']"}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 17, 15, 33, 45, 429877)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0010_add_receiving_user_to_activity_model.py b/askbot/migrations/0010_add_receiving_user_to_activity_model.py new file mode 100644 index 00000000..5fb6ebe0 --- /dev/null +++ b/askbot/migrations/0010_add_receiving_user_to_activity_model.py @@ -0,0 +1,366 @@ +# 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 M2M table for field receiving_user on 'Activity' + db.create_table(u'activity_receiving_users', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('activity', models.ForeignKey(orm['forum.activity'], null=False)), + ('user', models.ForeignKey(orm['auth.user'], null=False)) + )) + db.create_unique(u'activity_receiving_users', ['activity_id', 'user_id']) + + + def backwards(self, orm): + + # Removing M2M table for field receiving_user on 'Activity' + db.delete_table('activity_receiving_users') + + + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'to': "orm['auth.User']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.mention': { + 'Meta': {'object_name': 'Mention', 'db_table': "u'mention'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mentioned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'mentioned_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_sent'", 'to': "orm['auth.User']"}), + 'mentioned_whom': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_received'", 'to': "orm['auth.User']"}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 18, 11, 49, 24, 344026)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + + complete_apps = ['forum'] diff --git a/askbot/migrations/0011_merge_mentions_into_activity.py b/askbot/migrations/0011_merge_mentions_into_activity.py new file mode 100644 index 00000000..de19a5d2 --- /dev/null +++ b/askbot/migrations/0011_merge_mentions_into_activity.py @@ -0,0 +1,724 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models +try: + from forum import const +except: + from askbot import const + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + for m in orm.Mention.objects.all(): + a = orm.Activity() + a.activity_type = const.TYPE_ACTIVITY_MENTION + a.user = m.mentioned_by + a.active_at = m.mentioned_at + a.object_id = m.object_id + a.content_type = m.content_type + a.save() + a.receiving_users.add(m.mentioned_whom) + m.delete() + + def backwards(self, orm): + "Write your backwards methods here." + m_type = const.TYPE_ACTIVITY_MENTION + for a in orm.Activity.objects.filter(activity_type = m_type): + m = orm.Mention() + m.mentioned_by = a.user + m.mentioned_whom = a.receiving_users.all()[0] + m.mentioned_at = a.active_at + m.content_type = a.content_type + m.object_id = a.object_id + a.delete() + m.save() + + forum_app_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + if forum_app_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'to': "orm['auth.User']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['forum.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['forum.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.comment': { + 'Meta': {'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.mention': { + 'Meta': {'object_name': 'Mention', 'db_table': "u'mention'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mentioned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'mentioned_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_sent'", 'to': "orm['auth.User']"}), + 'mentioned_whom': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_received'", 'to': "orm['auth.User']"}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 22, 21, 40, 30, 531379)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + + complete_apps = ['forum'] + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'to': "orm['auth.User']"}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.authkeyuserassociation': { + 'Meta': {'object_name': 'AuthKeyUserAssociation'}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_keys'", 'to': "orm['auth.User']"}) + }, + '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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.book': { + 'Meta': {'object_name': 'Book', 'db_table': "u'book'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cover_img': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'pages': ('django.db.models.fields.SmallIntegerField', [], {}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '6', 'decimal_places': '2'}), + 'publication': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'published_at': ('django.db.models.fields.DateTimeField', [], {}), + 'questions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'book'", 'db_table': "'book_question'", 'to': "orm['askbot.Question']"}), + 'short_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'tagnames': ('django.db.models.fields.CharField', [], {'max_length': '125'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorinfo': { + 'Meta': {'object_name': 'BookAuthorInfo', 'db_table': "u'book_author_info'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'blog_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_edited_at': ('django.db.models.fields.DateTimeField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.bookauthorrss': { + 'Meta': {'object_name': 'BookAuthorRss', 'db_table': "u'book_author_rss'"}, + 'added_at': ('django.db.models.fields.DateTimeField', [], {}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['askbot.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rss_created_at': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'askbot.comment': { + 'Meta': {'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', [], {}), + '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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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.mention': { + 'Meta': {'object_name': 'Mention', 'db_table': "u'mention'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mentioned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'mentioned_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_sent'", 'to': "orm['auth.User']"}), + 'mentioned_whom': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mentions_received'", 'to': "orm['auth.User']"}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 22, 21, 40, 30, 531379)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = ['askbot'] diff --git a/askbot/migrations/0012_delete_some_unused_models.py b/askbot/migrations/0012_delete_some_unused_models.py new file mode 100644 index 00000000..f34575e4 --- /dev/null +++ b/askbot/migrations/0012_delete_some_unused_models.py @@ -0,0 +1,755 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models +from django.db import connection + +app_dir_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Deleting model 'AuthKeyUserAssociation' + if app_dir_name == 'forum': + db.delete_table('forum_authkeyuserassociation') + else: + db.delete_table('askbot_authkeyuserassociation') + + # Deleting model 'BookAuthorInfo' + db.delete_table(u'book_author_info') + + # Deleting model 'Mention' + db.delete_table(u'mention') + + # Deleting model 'Book' + db.delete_table(u'book') + + # Removing M2M table for field questions on 'Book' + db.delete_table('book_question') + + # Deleting model 'BookAuthorRss' + db.delete_table(u'book_author_rss') + + + def backwards(self, orm): + + # Adding model 'AuthKeyUserAssociation' + if app_dir_name == 'forum': + db.create_table('forum_authkeyuserassociation', ( + ('key', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='auth_keys', to=orm['auth.User'])), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('provider', self.gf('django.db.models.fields.CharField')(max_length=64)), + )) + db.send_create_signal('forum', ['AuthKeyUserAssociation']) + + # Adding model 'BookAuthorInfo' + db.create_table(u'book_author_info', ( + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['forum.Book'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('blog_url', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('forum', ['BookAuthorInfo']) + + # Adding model 'Mention' + db.create_table(u'mention', ( + ('mentioned_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='mentions_sent', to=orm['auth.User'])), + ('mentioned_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('mentioned_whom', self.gf('django.db.models.fields.related.ForeignKey')(related_name='mentions_received', to=orm['auth.User'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['Mention']) + + # Adding model 'Book' + db.create_table(u'book', ( + ('publication', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('short_name', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('author', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('cover_img', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('price', self.gf('django.db.models.fields.DecimalField')(max_digits=6, decimal_places=2)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('pages', self.gf('django.db.models.fields.SmallIntegerField')()), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('published_at', self.gf('django.db.models.fields.DateTimeField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('forum', ['Book']) + + # Adding M2M table for field questions on 'Book' + db.create_table('book_question', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('book', models.ForeignKey(orm['forum.book'], null=False)), + ('question', models.ForeignKey(orm['forum.question'], null=False)) + )) + db.create_unique('book_question', ['book_id', 'question_id']) + + # Adding model 'BookAuthorRss' + db.create_table(u'book_author_rss', ( + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('url', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['forum.Book'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('rss_created_at', self.gf('django.db.models.fields.DateTimeField')()), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('forum', ['BookAuthorRss']) + else: + db.create_table('askbot_authkeyuserassociation', ( + ('key', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='auth_keys', to=orm['auth.User'])), + ('added_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('provider', self.gf('django.db.models.fields.CharField')(max_length=64)), + )) + db.send_create_signal('askbot', ['AuthKeyUserAssociation']) + + # Adding model 'BookAuthorInfo' + db.create_table(u'book_author_info', ( + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['askbot.Book'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('blog_url', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('askbot', ['BookAuthorInfo']) + + # Adding model 'Mention' + db.create_table(u'mention', ( + ('mentioned_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='mentions_sent', to=orm['auth.User'])), + ('mentioned_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), + ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), + ('mentioned_whom', self.gf('django.db.models.fields.related.ForeignKey')(related_name='mentions_received', to=orm['auth.User'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['Mention']) + + # Adding model 'Book' + db.create_table(u'book', ( + ('publication', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('short_name', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('author', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('cover_img', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('price', self.gf('django.db.models.fields.DecimalField')(max_digits=6, decimal_places=2)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('pages', self.gf('django.db.models.fields.SmallIntegerField')()), + ('tagnames', self.gf('django.db.models.fields.CharField')(max_length=125)), + ('published_at', self.gf('django.db.models.fields.DateTimeField')()), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('last_edited_at', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('askbot', ['Book']) + + # Adding M2M table for field questions on 'Book' + db.create_table('book_question', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('book', models.ForeignKey(orm['askbot.book'], null=False)), + ('question', models.ForeignKey(orm['askbot.question'], null=False)) + )) + db.create_unique('book_question', ['book_id', 'question_id']) + + # Adding model 'BookAuthorRss' + db.create_table(u'book_author_rss', ( + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('url', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('added_at', self.gf('django.db.models.fields.DateTimeField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['askbot.Book'])), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), + ('rss_created_at', self.gf('django.db.models.fields.DateTimeField')()), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('askbot', ['BookAuthorRss']) + + + if app_dir_name == 'forum': + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'to': "orm['auth.User']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.comment': { + 'Meta': {'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", 'to': "orm['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 29, 12, 2, 31, 449262)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + else: + models = { + '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']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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']", 'blank': 'True'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", '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': {'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'}) + }, + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'to': "orm['auth.User']"}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.comment': { + 'Meta': {'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', [], {}), + '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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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'", 'through': "'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'", 'to': "orm['auth.User']"}), + 'html': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + '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', 'blank': 'True'}), + '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'", '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 5, 29, 12, 2, 31, 449262)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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'}) + } + } + + complete_apps = [app_dir_name] diff --git a/askbot/migrations/0013_add_response_count__to_user.py b/askbot/migrations/0013_add_response_count__to_user.py new file mode 100644 index 00000000..30ca164e --- /dev/null +++ b/askbot/migrations/0013_add_response_count__to_user.py @@ -0,0 +1,322 @@ +# 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): + """adds integer field User.response_counter + if the field does not yet exist + this case checking is necessary to support syncdb of auth models + a bit hacky but we have to do it as long as we keep patching auth models + within the forum application + """ + try: + db.add_column( + u'auth_user', + 'response_count', + self.gf('django.db.models.fields.IntegerField')(default=0, ), + keep_default=False + ) + except: + print 'probably already have column User.response_count' + pass + + + def backwards(self, orm): + """remove field User.respose_count + """ + db.delete_column(u'auth_user', 'response_count') + + + models = { + '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': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + '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': {'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'}) + }, + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.comment': { + 'Meta': {'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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': "'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'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 6, 6, 20, 9, 43, 480777)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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'}) + } + } + + complete_apps = ['forum'] diff --git a/askbot/migrations/0014_rename_schema_from_forum_to_askbot.py b/askbot/migrations/0014_rename_schema_from_forum_to_askbot.py new file mode 100644 index 00000000..8af0e9d6 --- /dev/null +++ b/askbot/migrations/0014_rename_schema_from_forum_to_askbot.py @@ -0,0 +1,611 @@ +# encoding: utf-8 +import os +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +app_dir_name = os.path.basename(os.path.dirname(os.path.dirname(__file__))) + +class Migration(SchemaMigration): + + def forwards(self, orm): + try: + db.rename_table('forum_anonymousanswer', 'forum_anonymousanswer') + db.rename_table('forum_anonymousquestion', 'forum_anonymousquestion') + db.rename_table('forum_emailfeedsetting', 'forum_emailfeedsetting') + db.rename_table('forum_markedtag', 'forum_markedtag') + db.rename_table('forum_questionview', 'forum_questionview') + db.rename_table('forum_validationhash', 'forum_validationhash') + except: + pass + + + def backwards(self, orm): + if app_dirname == 'forum': + db.rename_table('forum_anonymousanswer', 'forum_anonymousanswer') + db.rename_table('forum_anonymousquestion', 'forum_anonymousquestion') + db.rename_table('forum_emailfeedsetting', 'forum_emailfeedsetting') + db.rename_table('forum_markedtag', 'forum_markedtag') + db.rename_table('forum_questionview', 'forum_questionview') + db.rename_table('forum_validationhash', 'forum_validationhash') + + + if app_dir_name == 'forum': + models = { + 'forum.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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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['forum.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', 'blank': 'True'}) + }, + 'forum.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'}), + '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', 'blank': 'True'}) + }, + 'forum.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.answerrevision': { + 'Meta': {'object_name': 'AnswerRevision', 'db_table': "u'answer_revision'"}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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', [], {}) + }, + 'forum.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['forum.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'forum.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'forum.comment': { + 'Meta': {'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['auth.User']"}) + }, + 'forum.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']"}) + }, + 'forum.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['forum.Question']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user_favorite_questions'", 'to': "orm['auth.User']"}) + }, + 'forum.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", 'to': "orm['auth.User']"}) + }, + 'forum.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['forum.Tag']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tag_selections'", 'to': "orm['auth.User']"}) + }, + 'forum.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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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': "'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'}), + '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', 'blank': 'True'}), + '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['forum.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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'forum.questionrevision': { + 'Meta': {'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'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'revisions'", 'to': "orm['forum.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'}) + }, + 'forum.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['forum.Question']"}), + 'when': ('django.db.models.fields.DateTimeField', [], {}), + 'who': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_views'", 'to': "orm['auth.User']"}) + }, + 'forum.repute': { + 'Meta': {'object_name': 'Repute', 'db_table': "u'repute'"}, + '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['forum.Question']"}), + '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']"}) + }, + 'forum.tag': { + 'Meta': {'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', 'blank': 'True'}), + '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'}) + }, + 'forum.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 6, 13, 23, 16, 4, 680070)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'forum.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': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + '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': {'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'}) + } + } + else: + 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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.comment': { + 'Meta': {'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', [], {}), + '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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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': "'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'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 6, 13, 23, 16, 4, 680070)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + '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': {'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 = [app_dir_name] diff --git a/askbot/migrations/0015_rename_forum_contenttypes_to_askbot.py b/askbot/migrations/0015_rename_forum_contenttypes_to_askbot.py new file mode 100644 index 00000000..854de75d --- /dev/null +++ b/askbot/migrations/0015_rename_forum_contenttypes_to_askbot.py @@ -0,0 +1,310 @@ +# 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): + "Write your forwards methods here." + content_types = orm['contenttypes.ContentType'].objects.filter(app_label='forum') + content_types.update(app_label='askbot') + pass + + + def backwards(self, orm): + "Write your backwards methods here." + content_types = orm['contenttypes.ContentType'].objects.filter(app_label='askbot') + content_types.update(app_label='forum') + pass + + 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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'receiving_users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'received_activity'", 'symmetrical': 'False', 'to': "orm['auth.User']"}), + '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', 'blank': 'True'}) + }, + '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'}), + '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', 'blank': 'True'}) + }, + 'askbot.answer': { + 'Meta': {'object_name': 'Answer', 'db_table': "u'answer'"}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.answerrevision': { + 'Meta': {'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.Badge']"}), + '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', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'award_user'", 'to': "orm['auth.User']"}) + }, + 'askbot.badge': { + 'Meta': {'unique_together': "(('name', 'type'),)", 'object_name': 'Badge', 'db_table': "u'badge'"}, + 'awarded_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'awarded_to': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'badges'", 'symmetrical': 'False', 'through': "'Award'", 'to': "orm['auth.User']"}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multiple': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '50', 'blank': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {}) + }, + 'askbot.comment': { + 'Meta': {'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', [], {}), + '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.flaggeditem': { + 'Meta': {'unique_together': "(('content_type', 'object_id', 'user'),)", 'object_name': 'FlaggedItem', 'db_table': "u'flagged_item'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'flagged_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + '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': "'flaggeditems'", '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + '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': "'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'}), + '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', 'blank': 'True'}), + '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', 'blank': 'True'}), + 'wikified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'askbot.questionrevision': { + 'Meta': {'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'}), + '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'"}, + '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']"}), + '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': {'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', 'blank': 'True'}), + '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.validationhash': { + 'Meta': {'unique_together': "(('user', 'type'),)", 'object_name': 'ValidationHash'}, + 'expiration': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2010, 6, 13, 23, 48, 5, 784060)'}), + 'hash_code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'seed': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + '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': {'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'}), + 'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}), + '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'}), + 'hide_ignored_questions': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + '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'}), + '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'}), + 'response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'tag_filter_setting': ('django.db.models.fields.CharField', [], {'default': "'ignored'", 'max_length': '16'}), + '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': {'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/__init__.py b/askbot/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py new file mode 100644 index 00000000..eb8d0185 --- /dev/null +++ b/askbot/models/__init__.py @@ -0,0 +1,696 @@ +import logging +import re +import hashlib +import datetime +from django.core.urlresolvers import reverse +from django.core.mail import EmailMessage +from askbot.search.indexer import create_fulltext_indexes +from django.db.models import signals as django_signals +from django.template import loader, Context +from django.utils.translation import ugettext as _ +from django.contrib.auth.models import User +from django.template.defaultfilters import slugify +from django.utils.safestring import mark_safe +from django.db import models +from django.conf import settings as django_settings +from django.contrib.contenttypes.models import ContentType +from askbot import const +from askbot.conf import settings as askbot_settings +from askbot.models.question import Question, QuestionRevision +from askbot.models.question import QuestionView, AnonymousQuestion +from askbot.models.question import FavoriteQuestion +from askbot.models.answer import Answer, AnonymousAnswer, AnswerRevision +from askbot.models.tag import Tag, MarkedTag +from askbot.models.meta import Vote, Comment, FlaggedItem +from askbot.models.user import Activity, ValidationHash, EmailFeedSetting +from askbot.models import signals +#from user import AuthKeyUserAssociation +from askbot.models.repute import Badge, Award, Repute +from askbot import auth + +User.add_to_class('is_approved', models.BooleanField(default=False)) +User.add_to_class('email_isvalid', models.BooleanField(default=False)) +User.add_to_class('email_key', models.CharField(max_length=32, null=True)) +#hardcoded initial reputaion of 1, no setting for this one +User.add_to_class('reputation', models.PositiveIntegerField(default=1)) +User.add_to_class('gravatar', models.CharField(max_length=32)) +User.add_to_class('gold', models.SmallIntegerField(default=0)) +User.add_to_class('silver', models.SmallIntegerField(default=0)) +User.add_to_class('bronze', models.SmallIntegerField(default=0)) +User.add_to_class('questions_per_page', + models.SmallIntegerField( + choices=const.QUESTIONS_PER_PAGE_USER_CHOICES, + default=10) + ) +User.add_to_class('last_seen', + models.DateTimeField(default=datetime.datetime.now)) +User.add_to_class('real_name', models.CharField(max_length=100, blank=True)) +User.add_to_class('website', models.URLField(max_length=200, blank=True)) +User.add_to_class('location', models.CharField(max_length=100, blank=True)) +User.add_to_class('date_of_birth', models.DateField(null=True, blank=True)) +User.add_to_class('about', models.TextField(blank=True)) +User.add_to_class('hide_ignored_questions', models.BooleanField(default=False)) +User.add_to_class('tag_filter_setting', + models.CharField( + max_length=16, + choices=const.TAG_EMAIL_FILTER_CHOICES, + default='ignored' + ) + ) +User.add_to_class('response_count', models.IntegerField(default=0)) + +def user_is_username_taken(cls,username): + try: + cls.objects.get(username=username) + return True + except cls.MultipleObjectsReturned: + return True + except cls.DoesNotExist: + return False + +def user_get_q_sel_email_feed_frequency(self): + #print 'looking for frequency for user %s' % self + try: + feed_setting = EmailFeedSetting.objects.get( + subscriber=self, + feed_type='q_sel' + ) + except Exception, e: + #print 'have error %s' % e.message + raise e + #print 'have freq=%s' % feed_setting.frequency + return feed_setting.frequency + +def get_messages(self): + messages = [] + for m in self.message_set.all(): + messages.append(m.message) + return messages + +def delete_messages(self): + self.message_set.all().delete() + +#todo: find where this is used and replace with get_absolute_url +def get_profile_url(self): + """Returns the URL for this User's profile.""" + return reverse( + 'user_profile', + kwargs={'id':self.id, 'slug':slugify(self.username)} + ) + +def user_get_absolute_url(self): + return self.get_profile_url() + +def get_profile_link(self): + profile_link = u'%s' \ + % (self.get_profile_url(),self.username) + + return mark_safe(profile_link) + +#series of methods for user vote-type commands +#same call signature func(self, post, timestamp=None, cancel=None) +#note that none of these have business logic checks internally +#these functions are used by the askbot app and +#by the data importer jobs from say stackexchange, where internal rules +#may be different +#maybe if we do use business rule checks here - we should add +#some flag allowing to bypass them for things like the data importers +def toggle_favorite_question(self, question, timestamp=None, cancel=False): + """cancel has no effect here, but is important for the SE loader + it is hoped that toggle will work and data will be consistent + but there is no guarantee, maybe it's better to be more strict + about processing the "cancel" option + another strange thing is that this function unlike others below + returns a value + """ + try: + fave = FavoriteQuestion.objects.get(question=question, user=self) + fave.delete() + result = False + except FavoriteQuestion.DoesNotExist: + if timestamp is None: + timestamp = datetime.datetime.now() + fave = FavoriteQuestion( + question = question, + user = self, + added_at = timestamp, + ) + fave.save() + result = True + Question.objects.update_favorite_count(question) + return result + +def _process_vote(user, post, timestamp=None, cancel=False, vote_type=None): + """"private" wrapper function that applies post upvotes/downvotes + and cancelations + """ + post_type = ContentType.objects.get_for_model(post) + #get or create the vote object + #return with noop in some situations + try: + vote = Vote.objects.get( + user = user, + content_type = post_type, + object_id = post.id, + ) + except Vote.DoesNotExist: + vote = None + if cancel: + if vote == None: + return + elif vote.is_opposite(vote_type): + return + else: + #we would call vote.delete() here + #but for now all that is handled by the + #legacy askbot.auth functions + #vote.delete() + pass + else: + if vote == None: + vote = Vote( + user = user, + content_object = post, + vote = vote_type, + voted_at = timestamp, + ) + elif vote.is_opposite(vote_type): + vote.vote = vote_type + else: + return + + #do the actual work + if vote_type == Vote.VOTE_UP: + if cancel: + auth.onUpVotedCanceled(vote, post, user, timestamp) + else: + auth.onUpVoted(vote, post, user, timestamp) + elif vote_type == Vote.VOTE_DOWN: + if cancel: + auth.onDownVotedCanceled(vote, post, user, timestamp) + else: + auth.onDownVoted(vote, post, user, timestamp) + +def upvote(self, post, timestamp=None, cancel=False): + _process_vote( + self,post, + timestamp=timestamp, + cancel=cancel, + vote_type=Vote.VOTE_UP + ) + +def downvote(self, post, timestamp=None, cancel=False): + _process_vote( + self,post, + timestamp=timestamp, + cancel=cancel, + vote_type=Vote.VOTE_DOWN + ) + +def accept_answer(self, answer, timestamp=None, cancel=False): + if cancel: + auth.onAnswerAcceptCanceled(answer, self, timestamp=timestamp) + else: + auth.onAnswerAccept(answer, self, timestamp=timestamp) + +def flag_post(user, post, timestamp=None, cancel=False): + if cancel:#todo: can't unflag? + return + if post.flagged_items.filter(user=user).count() > 0: + return + else: + flag = FlaggedItem( + user = user, + content_object = post, + flagged_at = timestamp, + ) + auth.onFlaggedItem(flag, post, user, timestamp=timestamp) + +User.add_to_class('is_username_taken',classmethod(user_is_username_taken)) +User.add_to_class( + 'get_q_sel_email_feed_frequency', + user_get_q_sel_email_feed_frequency + ) +User.add_to_class('get_absolute_url', user_get_absolute_url) +User.add_to_class('upvote', upvote) +User.add_to_class('downvote', downvote) +User.add_to_class('accept_answer', accept_answer) +User.add_to_class('flag_post', flag_post) +User.add_to_class('get_profile_url', get_profile_url) +User.add_to_class('get_profile_link', get_profile_link) +User.add_to_class('get_messages', get_messages) +User.add_to_class('delete_messages', delete_messages) +User.add_to_class('toggle_favorite_question', toggle_favorite_question) + +#todo: move this to askbot/utils ?? +def format_instant_notification_body( + to_user = None, + from_user = None, + post = None, + update_type = None, + template = None, + ): + """ + returns text of the instant notification body + that is built when post is updated + only update_types in const.RESPONSE_ACTIVITY_TYPE_MAP_FOR_TEMPLATES + are supported + """ + + site_url = askbot_settings.APP_URL + origin_post = post.get_origin_post() + #todo: create a better method to access "sub-urls" in user views + user_subscriptions_url = site_url + to_user.get_absolute_url() + \ + '?sort=email_subscriptions' + + if update_type == 'question_comment': + assert(isinstance(post, Comment)) + assert(isinstance(post.content_object, Question)) + elif update_type == 'answer_comment': + assert(isinstance(post, Comment)) + assert(isinstance(post.content_object, Answer)) + elif update_type in ('answer_update', 'new_answer'): + assert(isinstance(post, Answer)) + elif update_type in ('question_update', 'new_question'): + assert(isinstance(post, Question)) + + update_data = { + 'update_author_name': from_user.username, + 'post_url': site_url + post.get_absolute_url(), + 'origin_post_title': origin_post.title, + 'user_subscriptions_url': user_subscriptions_url + } + return template.render(Context(update_data)) + +#todo: action +def send_instant_notifications_about_activity_in_post( + update_activity = None, + post = None, + receiving_users = [], + ): + """ + function called when posts are updated + newly mentioned users are carried through to reduce + database hits + """ + + acceptable_types = const.RESPONSE_ACTIVITY_TYPES_FOR_INSTANT_NOTIFICATIONS + + if update_activity.activity_type not in acceptable_types: + return + + template = loader.get_template('instant_notification.html') + + update_type_map = const.RESPONSE_ACTIVITY_TYPE_MAP_FOR_TEMPLATES + update_type = update_type_map[update_activity.activity_type] + + for user in receiving_users: + + subject = _('email update message subject') + text = format_instant_notification_body( + to_user = user, + from_user = update_activity.user, + post = post, + update_type = update_type, + template = template, + ) + #todo: this could be packaged as an "action" - a bundle + #of executive function with the activity log recording + msg = EmailMessage( + subject, + text, + django_settings.DEFAULT_FROM_EMAIL, + [user.email] + ) + #msg.send() + print text + EMAIL_UPDATE_ACTIVITY = const.TYPE_ACTIVITY_EMAIL_UPDATE_SENT + email_activity = Activity( + user = user, + content_object = post.get_origin_post(), + activity_type = EMAIL_UPDATE_ACTIVITY + ) + email_activity.save() + + +#todo: move to utils +def calculate_gravatar_hash(instance, **kwargs): + """Calculates a User's gravatar hash from their email address.""" + if kwargs.get('raw', False): + return + instance.gravatar = hashlib.md5(instance.email).hexdigest() + + +def record_post_update_activity( + post, + newly_mentioned_users = list(), + updated_by = None, + timestamp = None, + created = False, + **kwargs + ): + """called upon signal askbot.models.signals.post_updated + which is sent at the end of save() method in posts + """ + assert(timestamp != None) + assert(updated_by != None) + + #todo: take into account created == True case + (activity_type, update_object) = post.get_updated_activity_data(created) + + update_activity = Activity( + user = updated_by, + active_at = timestamp, + content_object = post, + activity_type = activity_type + ) + update_activity.save() + + #what users are included depends on the post type + #for example for question - all Q&A contributors + #are included, for comments only authors of comments and parent + #post are included + receiving_users = post.get_response_receivers( + exclude_list = [updated_by, ] + ) + + update_activity.receiving_users.add(*receiving_users) + + assert(updated_by not in receiving_users) + + for user in set(receiving_users) | set(newly_mentioned_users): + user.response_count += 1 + user.save() + + #todo: weird thing is that only comments need the receiving_users + #argument to this call + notification_subscribers = post.get_instant_notification_subscribers( + potential_subscribers = receiving_users, + mentioned_users = newly_mentioned_users, + exclude_list = [updated_by, ] + ) + + send_instant_notifications_about_activity_in_post( + update_activity = update_activity, + post = post, + receiving_users = notification_subscribers, + ) + + +def record_award_event(instance, created, **kwargs): + """ + After we awarded a badge to user, we need to + record this activity and notify user. + We also recaculate awarded_count of this badge and user information. + """ + if created: + #todo: change this to community user who gives the award + activity = Activity( + user=instance.user, + active_at=instance.awarded_at, + content_object=instance, + activity_type=const.TYPE_ACTIVITY_PRIZE + ) + activity.save() + activity.receiving_users.add(instance.user) + + instance.badge.awarded_count += 1 + instance.badge.save() + + if instance.badge.type == Badge.GOLD: + instance.user.gold += 1 + if instance.badge.type == Badge.SILVER: + instance.user.silver += 1 + if instance.badge.type == Badge.BRONZE: + instance.user.bronze += 1 + instance.user.save() + +def notify_award_message(instance, created, **kwargs): + """ + Notify users when they have been awarded badges by using Django message. + """ + if created: + user = instance.user + + msg = (u"Congratulations, you have received a badge '%s'. " \ + + u"Check out your profile.") \ + % (instance.badge.name, user.get_profile_url()) + + user.message_set.create(message=msg) + +def record_answer_accepted(instance, created, **kwargs): + """ + when answer is accepted, we record this for question author + - who accepted it. + """ + if not created and instance.accepted: + activity = Activity( + user=instance.question.author, + active_at=datetime.datetime.now(), + content_object=instance, + activity_type=const.TYPE_ACTIVITY_MARK_ANSWER + ) + activity.save() + receiving_users = instance.get_author_list( + exclude_list = [instance.question.author] + ) + activity.receiving_users.add(*receiving_users) + + +def update_last_seen(instance, created, **kwargs): + """ + when user has activities, we update 'last_seen' time stamp for him + """ + #todo: in reality author of this activity must not be the receiving user + #but for now just have this plug, so that last seen timestamp is not + #perturbed by the email update sender + if instance.activity_type == const.TYPE_ACTIVITY_EMAIL_UPDATE_SENT: + return + user = instance.user + user.last_seen = datetime.datetime.now() + user.save() + + +def record_vote(instance, created, **kwargs): + """ + when user have voted + """ + if created: + if instance.vote == 1: + vote_type = const.TYPE_ACTIVITY_VOTE_UP + else: + vote_type = const.TYPE_ACTIVITY_VOTE_DOWN + + activity = Activity( + user=instance.user, + active_at=instance.voted_at, + content_object=instance, + activity_type=vote_type + ) + #todo: problem cannot access receiving user here + activity.save() + + +def record_cancel_vote(instance, **kwargs): + """ + when user canceled vote, the vote will be deleted. + """ + activity = Activity( + user=instance.user, + active_at=datetime.datetime.now(), + content_object=instance, + activity_type=const.TYPE_ACTIVITY_CANCEL_VOTE + ) + #todo: same problem - cannot access receiving user here + activity.save() + + +#todo: weird that there is no record delete answer or comment +#is this even necessary to keep track of? +def record_delete_question(instance, delete_by, **kwargs): + """ + when user deleted the question + """ + if instance.__class__ == "Question": + activity_type = const.TYPE_ACTIVITY_DELETE_QUESTION + else: + activity_type = const.TYPE_ACTIVITY_DELETE_ANSWER + + activity = Activity( + user=delete_by, + active_at=datetime.datetime.now(), + content_object=instance, + activity_type=activity_type + ) + #no need to set receiving user here + activity.save() + +def record_mark_offensive(instance, mark_by, **kwargs): + activity = Activity( + user=mark_by, + active_at=datetime.datetime.now(), + content_object=instance, + activity_type=const.TYPE_ACTIVITY_MARK_OFFENSIVE + ) + activity.save() + receiving_users = instance.get_author_list( + exclude_list = [mark_by] + ) + activity.receiving_users.add(*receiving_users) + +def record_update_tags(question, **kwargs): + """ + when user updated tags of the question + """ + activity = Activity( + user=question.author, + active_at=datetime.datetime.now(), + content_object=question, + activity_type=const.TYPE_ACTIVITY_UPDATE_TAGS + ) + activity.save() + +def record_favorite_question(instance, created, **kwargs): + """ + when user add the question in him favorite questions list. + """ + if created: + activity = Activity( + user=instance.user, + active_at=datetime.datetime.now(), + content_object=instance, + activity_type=const.TYPE_ACTIVITY_FAVORITE + ) + activity.save() + receiving_users = instance.question.get_author_list( + exclude_list = [instance.user] + ) + activity.receiving_users.add(*receiving_users) + +def record_user_full_updated(instance, **kwargs): + activity = Activity( + user=instance, + active_at=datetime.datetime.now(), + content_object=instance, + activity_type=const.TYPE_ACTIVITY_USER_FULL_UPDATED + ) + activity.save() + +def post_stored_anonymous_content( + sender, + user, + session_key, + signal, + *args, + **kwargs): + + aq_list = AnonymousQuestion.objects.filter(session_key = session_key) + aa_list = AnonymousAnswer.objects.filter(session_key = session_key) + #from askbot.conf import settings as askbot_settings + if askbot_settings.EMAIL_VALIDATION == True:#add user to the record + for aq in aq_list: + aq.author = user + aq.save() + for aa in aa_list: + aa.author = user + aa.save() + #maybe add pending posts message? + else: #just publish the questions + for aq in aq_list: + aq.publish(user) + for aa in aa_list: + aa.publish(user) + +#signal for User model save changes +django_signals.pre_save.connect(calculate_gravatar_hash, sender=User) +django_signals.post_save.connect(record_award_event, sender=Award) +django_signals.post_save.connect(notify_award_message, sender=Award) +django_signals.post_save.connect(record_answer_accepted, sender=Answer) +django_signals.post_save.connect(update_last_seen, sender=Activity) +django_signals.post_save.connect(record_vote, sender=Vote) +django_signals.post_save.connect( + record_favorite_question, + sender=FavoriteQuestion + ) +django_signals.post_delete.connect(record_cancel_vote, sender=Vote) + +#change this to real m2m_changed with Django1.2 +signals.delete_post_or_answer.connect(record_delete_question, sender=Question) +signals.delete_post_or_answer.connect(record_delete_question, sender=Answer) +signals.mark_offensive.connect(record_mark_offensive, sender=Question) +signals.mark_offensive.connect(record_mark_offensive, sender=Answer) +signals.tags_updated.connect(record_update_tags, sender=Question) +signals.user_updated.connect(record_user_full_updated, sender=User) +signals.user_logged_in.connect(post_stored_anonymous_content) +signals.post_updated.connect( + record_post_update_activity, + sender=Comment + ) +signals.post_updated.connect( + record_post_update_activity, + sender=Answer + ) +signals.post_updated.connect( + record_post_update_activity, + sender=Question + ) +#post_syncdb.connect(create_fulltext_indexes) + +#todo: wtf??? what is x=x about? +signals = signals + +Question = Question +QuestionRevision = QuestionRevision +QuestionView = QuestionView +FavoriteQuestion = FavoriteQuestion +AnonymousQuestion = AnonymousQuestion + +Answer = Answer +AnswerRevision = AnswerRevision +AnonymousAnswer = AnonymousAnswer + +Tag = Tag +Comment = Comment +Vote = Vote +FlaggedItem = FlaggedItem +MarkedTag = MarkedTag + +Badge = Badge +Award = Award +Repute = Repute + +Activity = Activity +EmailFeedSetting = EmailFeedSetting +ValidationHash = ValidationHash +#AuthKeyUserAssociation = AuthKeyUserAssociation + +__all__ = [ + 'signals', + + 'Question', + 'QuestionRevision', + 'QuestionView', + 'FavoriteQuestion', + 'AnonymousQuestion', + + 'Answer', + 'AnswerRevision', + 'AnonymousAnswer', + + 'Tag', + 'Comment', + 'Vote', + 'FlaggedItem', + 'MarkedTag', + + 'Badge', + 'Award', + 'Repute', + + 'Activity', + 'EmailFeedSetting', + 'ValidationHash', + #'AuthKeyUserAssociation', + + 'User', +] diff --git a/askbot/models/answer.py b/askbot/models/answer.py new file mode 100644 index 00000000..22951417 --- /dev/null +++ b/askbot/models/answer.py @@ -0,0 +1,232 @@ +import datetime +from django.db import models +from django.utils.http import urlquote as django_urlquote +from django.template.defaultfilters import slugify +from django.core.urlresolvers import reverse +from askbot.models.base import AnonymousContent, DeletableContent +from askbot.models.base import ContentRevision +from askbot.models.base import parse_post_text, parse_and_save_post +from askbot.models import content +from askbot.models.question import Question +from askbot import const + + +class AnswerManager(models.Manager): + def create_new(self, question=None, author=None, added_at=None, wiki=False, text='', email_notify=False): + answer = Answer( + question = question, + author = author, + added_at = added_at, + wiki = wiki, + text = text, + #.html field is denormalized by the save() call + ) + if answer.wiki: + answer.last_edited_by = answer.author + answer.last_edited_at = added_at + answer.wikified_at = added_at + + answer.parse_and_save(author = author) + + answer.add_revision( + revised_by = author, + revised_at = added_at, + text = text, + comment = const.POST_STATUS['default_version'], + ) + + #update question data + question.last_activity_at = added_at + question.last_activity_by = author + question.save() + Question.objects.update_answer_count(question) + + #set notification/delete + if email_notify: + if author not in question.followed_by.all(): + question.followed_by.add(author) + else: + #not sure if this is necessary. ajax should take care of this... + try: + question.followed_by.remove(author) + except: + pass + return answer + + def get_author_list(self, **kwargs): + authors = set() + for answer in self: + authors.update(answer.get_author_list(**kwargs)) + return list(authors) + + #GET_ANSWERS_FROM_USER_QUESTIONS = u'SELECT answer.* FROM answer INNER JOIN question ON answer.question_id = question.id WHERE question.author_id =%s AND answer.author_id <> %s' + def get_answers_from_question(self, question, user=None): + """ + Retrieves visibile answers for the given question. Delete answers + are only visibile to the person who deleted them. + """ + + if user is None or not user.is_authenticated(): + return self.filter(question=question, deleted=False) + else: + return self.filter(models.Q(question=question), + models.Q(deleted=False) | models.Q(deleted_by=user)) + + #todo: I think this method is not being used anymore, I'll just comment it for now + #def get_answers_from_questions(self, user_id): + # """ + # Retrieves visibile answers for the given question. Which are not included own answers + # """ + # cursor = connection.cursor() + # cursor.execute(self.GET_ANSWERS_FROM_USER_QUESTIONS, [user_id, user_id]) + # return cursor.fetchall() + +class Answer(content.Content, DeletableContent): + question = models.ForeignKey('Question', related_name='answers') + accepted = models.BooleanField(default=False) + accepted_at = models.DateTimeField(null=True, blank=True) + + objects = AnswerManager() + + class Meta(content.Content.Meta): + db_table = u'answer' + + parse = parse_post_text + parse_and_save = parse_and_save_post + + def get_updated_activity_data(self, created = False): + #todo: simplify this to always return latest revision for the second + #part + if created: + return const.TYPE_ACTIVITY_ANSWER, self + else: + latest_revision = self.get_latest_revision() + return const.TYPE_ACTIVITY_UPDATE_ANSWER, latest_revision + + def apply_edit(self, edited_at=None, edited_by=None, text=None, comment=None, wiki=False): + + if text is None: + text = self.get_latest_revision().text + if edited_at is None: + edited_at = datetime.datetime.now() + if edited_by is None: + raise Exception('edited_by is required') + + self.last_edited_at = edited_at + self.last_edited_by = edited_by + #self.html is denormalized in save() + self.text = text + #todo: bug wiki has no effect here + self.parse_and_save(author = edited_by) + + self.add_revision( + revised_by=edited_by, + revised_at=edited_at, + text=text, + comment=comment + ) + + self.question.last_activity_at = edited_at + self.question.last_activity_by = edited_by + self.question.save() + + def add_revision(self, revised_by=None, revised_at=None, text=None, comment=None): + if None in (revised_by, revised_at, text): + raise Exception('arguments revised_by, revised_at and text are required') + rev_no = self.revisions.all().count() + 1 + if comment in (None, ''): + if rev_no == 1: + comment = const.POST_STATUS['default_version'] + else: + comment = 'No.%s Revision' % rev_no + return AnswerRevision.objects.create( + answer=self, + author=revised_by, + revised_at=revised_at, + text=text, + summary=comment, + revision=rev_no + ) + + def get_origin_post(self): + return self.question + + def get_response_receivers(self, exclude_list = None): + """get list of users interested in this response + update based on their participation in the question + activity + + exclude_list is required and normally should contain + author of the updated so that he/she is not notified of + the response + """ + assert(exclude_list is not None) + receiving_users = set() + receiving_users.update( + self.get_author_list( + include_comments = True + ) + ) + receiving_users.update( + self.question.get_author_list( + include_comments = True + ) + ) + for answer in self.question.answers.all(): + receiving_users.update(answer.get_author_list()) + + receiving_users -= set(exclude_list) + + return list(receiving_users) + + def get_user_vote(self, user): + if user.__class__.__name__ == "AnonymousUser": + return None + + votes = self.votes.filter(user=user) + if votes and votes.count() > 0: + return votes[0] + else: + return None + + def get_question_title(self): + return self.question.title + + def get_absolute_url(self): + return '%s%s#%s' % (reverse('question', args=[self.question.id]), django_urlquote(slugify(self.question.title)), self.id) + + def __unicode__(self): + return self.html + + +class AnswerRevision(ContentRevision): + """A revision of an Answer.""" + answer = models.ForeignKey('Answer', related_name='revisions') + + def get_absolute_url(self): + return reverse('answer_revisions', kwargs={'id':self.answer.id}) + + def get_question_title(self): + return self.answer.question.title + + class Meta(ContentRevision.Meta): + db_table = u'answer_revision' + ordering = ('-revision',) + + def save(self, **kwargs): + """Looks up the next available revision number if not set.""" + if not self.revision: + self.revision = AnswerRevision.objects.filter( + answer=self.answer).values_list('revision', + flat=True)[0] + 1 + super(AnswerRevision, self).save(**kwargs) + +class AnonymousAnswer(AnonymousContent): + question = models.ForeignKey('Question', related_name='anonymous_answers') + + def publish(self,user): + added_at = datetime.datetime.now() + Answer.objects.create_new(question=self.question,wiki=self.wiki, + added_at=added_at,text=self.text, + author=user) + self.delete() diff --git a/askbot/models/base.py b/askbot/models/base.py new file mode 100644 index 00000000..8627b9e4 --- /dev/null +++ b/askbot/models/base.py @@ -0,0 +1,211 @@ +import datetime +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 +#todo: maybe merge askbot.utils.markup and forum.utils.html +from askbot.utils import markup +from askbot.utils.html import sanitize_html +from django.utils import html +import logging +from markdown2 import Markdown + +markdowner = Markdown(html4tags=True) + +#todo: following methods belong to a future common post class +def parse_post_text(post): + """typically post has a field to store raw source text + in comment it is called .comment, in Question and Answer it is + called .text + also there is another field called .html (consistent across models) + so the goal of this function is to render raw text into .html + and extract any metadata given stored in source (currently + this metadata is limited by twitter style @mentions + but there may be more in the future + + function returns a dictionary with the following keys + html + newly_mentioned_users - list of objects + removed_mentions - list of mention objects - for removed ones + """ + + text = post.get_text() + + if post._urlize: + text = html.urlize(text) + + if post._use_markdown: + text = sanitize_html(markdowner.convert(text)) + + #todo, add markdown parser call conditional on + #post.use_markdown flag + post_html = text + mentioned_authors = list() + removed_mentions = list() + if '@' in text: + from askbot.models.user import Activity + + op = post.get_origin_post() + anticipated_authors = op.get_author_list( + include_comments = True, + recursive = True + ) + + extra_name_seeds = markup.extract_mentioned_name_seeds(text) + + extra_authors = set() + for name_seed in extra_name_seeds: + extra_authors.update(User.objects.filter( + username__startswith = name_seed + ) + ) + + #it is important to preserve order here so that authors of post + #get mentioned first + anticipated_authors += list(extra_authors) + + mentioned_authors, post_html = markup.mentionize_text( + text, + anticipated_authors + ) + + #find mentions that were removed and identify any previously + #entered mentions so that we can send alerts on only new ones + if post.pk is not None: + #only look for previous mentions if post was already saved before + prev_mention_qs = Activity.objects.get_mentions( + mentioned_in = post + ) + new_set = set(mentioned_authors) + for prev_mention in prev_mention_qs: + + user = prev_mention.get_mentioned_user() + if user in new_set: + #don't report mention twice + new_set.remove(user) + else: + removed_mentions.append(prev_mention) + mentioned_authors = list(new_set) + + data = { + 'html': post_html, + 'newly_mentioned_users': mentioned_authors, + 'removed_mentions': removed_mentions, + } + return data + +#todo: when models are merged, it would be great to remove author parameter +def parse_and_save_post(post, author = None, **kwargs): + """generic method to use with posts to be used prior to saving + post edit or addition + """ + + assert(author is not None) + + data = post.parse() + + post.html = data['html'] + newly_mentioned_users = set(data['newly_mentioned_users']) - set([author]) + removed_mentions = data['removed_mentions'] + + #a hack allowing to save denormalized .summary field for questions + if hasattr(post, 'summary'): + post.summary = strip_tags(post.html)[:120] + + #delete removed mentions + for rm in removed_mentions: + rm.delete() + + created = post.pk is None + + #this save must precede saving the mention activity + #because generic relation needs primary key of the related object + super(post.__class__, post).save(**kwargs) + + #create new mentions + for u in newly_mentioned_users: + from askbot.models.user import Activity + Activity.objects.create_new_mention( + mentioned_whom = u, + mentioned_in = post, + mentioned_by = author + ) + + #todo: this is handled in signal because models for posts + #are too spread out + from askbot.models import signals + signals.post_updated.send( + post = post, + updated_by = author, + newly_mentioned_users = newly_mentioned_users, + timestamp = post.get_time_of_last_edit(), + created = created, + sender = post.__class__ + ) + + try: + ping_google() + except Exception: + logging.debug('cannot ping google - did you register with them?') + +class UserContent(models.Model): + user = models.ForeignKey(User, related_name='%(class)ss') + + class Meta: + abstract = True + app_label = 'askbot' + + +class MetaContent(models.Model): + """ + Base class for Vote, Comment and FlaggedItem + """ + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + content_object = generic.GenericForeignKey('content_type', 'object_id') + + class Meta: + abstract = True + app_label = 'askbot' + +class DeletableContent(models.Model): + deleted = models.BooleanField(default=False) + deleted_at = models.DateTimeField(null=True, blank=True) + deleted_by = models.ForeignKey(User, null=True, blank=True, related_name='deleted_%(class)ss') + + class Meta: + abstract = True + app_label = 'askbot' + + +class ContentRevision(models.Model): + """ + Base class for QuestionRevision and AnswerRevision + """ + revision = models.PositiveIntegerField() + author = models.ForeignKey(User, related_name='%(class)ss') + revised_at = models.DateTimeField() + summary = models.CharField(max_length=300, blank=True) + text = models.TextField() + + class Meta: + abstract = True + app_label = 'askbot' + + +class AnonymousContent(models.Model): + """ + Base class for AnonymousQuestion and AnonymousAnswer + """ + session_key = models.CharField(max_length=40) #session id for anonymous questions + wiki = models.BooleanField(default=False) + added_at = models.DateTimeField(default=datetime.datetime.now) + ip_addr = models.IPAddressField(max_length=21) #allow high port numbers + author = models.ForeignKey(User,null=True) + text = models.TextField() + summary = models.CharField(max_length=180) + + class Meta: + abstract = True + app_label = 'askbot' diff --git a/askbot/models/content.py b/askbot/models/content.py new file mode 100644 index 00000000..d3be3195 --- /dev/null +++ b/askbot/models/content.py @@ -0,0 +1,245 @@ +import datetime +import logging +from django.contrib.auth.models import User +from django.contrib.contenttypes import generic +from django.contrib.sitemaps import ping_google +from django.db import models +from askbot.models.meta import Comment, Vote, FlaggedItem +from askbot.models.user import EmailFeedSetting + +class Content(models.Model): + """ + Base class for Question and Answer + """ + author = models.ForeignKey(User, related_name='%(class)ss') + added_at = models.DateTimeField(default=datetime.datetime.now) + + wiki = models.BooleanField(default=False) + wikified_at = models.DateTimeField(null=True, blank=True) + + locked = models.BooleanField(default=False) + locked_by = models.ForeignKey(User, null=True, blank=True, related_name='locked_%(class)ss') + locked_at = models.DateTimeField(null=True, blank=True) + + score = models.IntegerField(default=0) + vote_up_count = models.IntegerField(default=0) + vote_down_count = models.IntegerField(default=0) + + comment_count = models.PositiveIntegerField(default=0) + offensive_flag_count = models.SmallIntegerField(default=0) + + last_edited_at = models.DateTimeField(null=True, blank=True) + last_edited_by = models.ForeignKey(User, null=True, blank=True, related_name='last_edited_%(class)ss') + + html = models.TextField(null=True)#html rendition of the latest revision + text = models.TextField(null=True)#denormalized copy of latest revision + comments = generic.GenericRelation(Comment) + votes = generic.GenericRelation(Vote) + flagged_items = generic.GenericRelation(FlaggedItem) + + _use_markdown = True + _urlize = False + + class Meta: + abstract = True + app_label = 'askbot' + + def get_comments(self): + comments = self.comments.all().order_by('id') + return comments + + #todo: maybe remove this wnen post models are unified + def get_text(self): + return self.text + + def add_comment(self, comment=None, user=None, added_at=None): + if added_at is None: + added_at = datetime.datetime.now() + if None in (comment ,user): + raise Exception('arguments comment and user are required') + + #Comment = models.get_model('askbot','Comment')#todo: forum hardcoded + comment = Comment( + content_object=self, + comment=comment, + user=user, + added_at=added_at + ) + comment.parse_and_save(author = user) + self.comment_count = self.comment_count + 1 + self.save() + return comment + + def get_instant_notification_subscribers( + self, + potential_subscribers = None, + mentioned_users = None, + exclude_list = None, + ): + """get list of users who have subscribed to + receive instant notifications for a given post + this method works for questions and answers + + parameter "potential_subscribers" is not used here, + but left for the uniformity of the interface (Comment method does use it) + + comment class has it's own variant which does have quite a bit + of duplicated code at the moment + """ + subscriber_set = set() + + #1) mention subscribers - common to questions and answers + if mentioned_users: + mention_subscribers = EmailFeedSetting.objects.filter( + subscriber__in = mentioned_users, + feed_type = 'm_and_c', + frequency = 'i' + ).values_list( + 'subscriber', + flat=True + ) + subscriber_set.update(mention_subscribers) + + origin_post = self.get_origin_post()#handy to make generic method + + #2) individually selected - make sure that users + #are individual subscribers to this question + selective_subscribers = origin_post.followed_by.all() + if selective_subscribers: + selective_subscribers = EmailFeedSetting.objects.filter( + subscriber__in = selective_subscribers, + feed_type = 'q_sel', + frequency = 'i' + ).values_list( + 'subscriber', + flat=True + ) + for subscriber in selective_subscribers: + if origin_post.passes_tag_filter_for_user(subscriber): + subscriber_set.add(subscriber) + + subscriber_set.update(selective_subscribers) + + #3) whole askbot subscibers + global_subscribers = EmailFeedSetting.objects.filter( + feed_type = 'q_all', + frequency = 'i' + ).values_list( + 'subscriber', + flat=True + ) + #todo: apply tag filters here + subscriber_set.update(global_subscribers) + + #4) question asked by me + question_author = origin_post.author + if EmailFeedSetting.objects.filter( + subscriber = question_author, + frequency = 'i', + feed_type = 'q_ask' + ): + subscriber_set.add(question_author) + + #4) questions answered by me -make sure is that people + #are authors of the answers to this question + #todo: replace this with a query set method + answer_authors = set() + for answer in origin_post.answers.all(): + authors = answer.get_author_list() + answer_authors.update(authors) + + if answer_authors: + answer_authors = EmailFeedSetting.objects.filter( + subscriber__in = answer_authors, + frequency = 'i', + feed_type = 'q_ans', + ).values_list( + 'subscriber', + flat=True + ) + subscriber_set.update(answer_authors) + subscriber_set -= set(exclude_list) + + return list(subscriber_set) + + def passes_tag_filter_for_user(user): + + post_tags = self.get_origin_post().tags.all() + + if user.tag_filter_setting == 'ignored': + ignored_tags = user.tag_selections.filter(reason = 'bad') + if set(post_tags) & set(ignored_tags): + return False + else: + return True + else: + interesting_tags = user.tag_selections.filter(reason = 'good') + if set(post_tags) & set(interesting_tags): + return True + else: + return False + + def get_latest_revision(self): + return self.revisions.all().order_by('-revised_at')[0] + + def get_latest_revision_number(self): + return self.get_latest_revision().revision + + def get_time_of_last_edit(self): + if self.last_edited_at: + return self.last_edited_at + else: + return self.added_at + + def get_author_list( + self, + include_comments = False, + recursive = False, + exclude_list = None): + + #todo: there may be a better way to do these queries + authors = set() + authors.update([r.author for r in self.revisions.all()]) + if include_comments: + authors.update([c.user for c in self.comments.all()]) + if recursive: + if hasattr(self, 'answers'): + for a in self.answers.exclude(deleted = True): + authors.update(a.get_author_list( include_comments = include_comments ) ) + if exclude_list: + authors -= set(exclude_list) + return list(authors) + + def passes_tag_filter_for_user(self, user): + tags = self.get_origin_post().tags.all() + + if self.tag_filter_setting == 'interesting': + #at least some of the tags must be marked interesting + return self.tag_selections.exists(tag__in = tags, reason = 'good') + + elif self.tag_filter_setting == 'ignored': + #at least one tag must be ignored + if self.tag_selections.exists(tag__in = tags, reason = 'bad'): + return False + else: + return True + + else: + raise ValueError( + 'unexpected User.tag_filter_setting %s' \ + % self.tag_filter_setting + ) + + def post_get_last_update_info(self):#todo: rename this subroutine + when = self.added_at + who = self.author + if self.last_edited_at and self.last_edited_at > when: + when = self.last_edited_at + who = self.last_edited_by + comments = self.comments.all() + if len(comments) > 0: + for c in comments: + if c.added_at > when: + when = c.added_at + who = c.user + return when, who diff --git a/askbot/models/meta.py b/askbot/models/meta.py new file mode 100644 index 00000000..00ee60c7 --- /dev/null +++ b/askbot/models/meta.py @@ -0,0 +1,211 @@ +import datetime +from django.db import models +from askbot import const +from askbot.models import base +from askbot.models.user import EmailFeedSetting + +class VoteManager(models.Manager): + def get_up_vote_count_from_user(self, user): + if user is not None: + return self.filter(user=user, vote=1).count() + else: + return 0 + + def get_down_vote_count_from_user(self, user): + if user is not None: + return self.filter(user=user, vote=-1).count() + else: + return 0 + + def get_votes_count_today_from_user(self, user): + if user is not None: + today = datetime.date.today() + return self.filter(user=user, voted_at__range=(today, today + datetime.timedelta(1))).count() + else: + return 0 + + +class Vote(base.MetaContent, base.UserContent): + VOTE_UP = +1 + VOTE_DOWN = -1 + VOTE_CHOICES = ( + (VOTE_UP, u'Up'), + (VOTE_DOWN, u'Down'), + ) + + vote = models.SmallIntegerField(choices=VOTE_CHOICES) + voted_at = models.DateTimeField(default=datetime.datetime.now) + + objects = VoteManager() + + class Meta(base.MetaContent.Meta): + unique_together = ('content_type', 'object_id', 'user') + db_table = u'vote' + + def __unicode__(self): + return '[%s] voted at %s: %s' %(self.user, self.voted_at, self.vote) + + def is_upvote(self): + return self.vote == self.VOTE_UP + + def is_downvote(self): + return self.vote == self.VOTE_DOWN + + def is_opposite(self, vote_type): + assert(vote_type in (self.VOTE_UP, self.VOTE_DOWN)) + return self.vote != vote_type + + +class FlaggedItemManager(models.Manager): + def get_flagged_items_count_today(self, user): + if user is not None: + today = datetime.date.today() + return self.filter(user=user, flagged_at__range=(today, today + datetime.timedelta(1))).count() + else: + return 0 + +class FlaggedItem(base.MetaContent, base.UserContent): + """A flag on a Question or Answer indicating offensive content.""" + flagged_at = models.DateTimeField(default=datetime.datetime.now) + + objects = FlaggedItemManager() + + class Meta(base.MetaContent.Meta): + unique_together = ('content_type', 'object_id', 'user') + db_table = u'flagged_item' + + def __unicode__(self): + return '[%s] flagged at %s' %(self.user, self.flagged_at) + +class Comment(base.MetaContent, base.UserContent): + comment = models.CharField(max_length = const.COMMENT_HARD_MAX_LENGTH) + added_at = models.DateTimeField(default = datetime.datetime.now) + html = models.CharField(max_length = const.COMMENT_HARD_MAX_LENGTH, default='') + + _urlize = True + _use_markdown = False + + class Meta(base.MetaContent.Meta): + ordering = ('-added_at',) + db_table = u'comment' + + #these two are methods + parse = base.parse_post_text + parse_and_save = base.parse_and_save_post + + def get_origin_post(self): + return self.content_object.get_origin_post() + + #todo: maybe remove this wnen post models are unified + def get_text(self): + return self.comment + + def set_text(self, text): + self.comment = text + + def get_updated_activity_data(self, created = False): + if self.content_object.__class__.__name__ == 'Question': + return const.TYPE_ACTIVITY_COMMENT_QUESTION, self + elif self.content_object.__class__.__name__ == 'Answer': + return const.TYPE_ACTIVITY_COMMENT_ANSWER, self + + def get_response_receivers(self, exclude_list = None): + """get list of users who authored comments on a post + and the post itself + """ + assert(exclude_list is not None) + users = set() + users.update( + #get authors of parent object and all associated comments + self.content_object.get_author_list( + include_comments = True, + ) + ) + users -= set(exclude_list) + return list(users) + + def get_instant_notification_subscribers( + self, + potential_subscribers = None, + mentioned_users = None, + exclude_list = None + ): + """get list of users who want instant notifications + about this post + + argument potential_subscribers is required as it saves on db hits + """ + + subscriber_set = set() + + if potential_subscribers: + potential_subscribers = set(potential_subscribers) + else: + potential_subscribers = set() + + if mentioned_users: + potential_subscribers.update(mentioned_users) + + if potential_subscribers: + comment_subscribers = EmailFeedSetting.objects.filter( + subscriber__in = potential_subscribers, + feed_type = 'm_and_c', + frequency = 'i' + ).values_list( + 'subscriber', + flat=True + ) + subscriber_set.update(comment_subscribers) + + origin_post = self.get_origin_post() + selective_subscribers = origin_post.followed_by.all() + if selective_subscribers: + selective_subscribers = EmailFeedSetting.objects.filter( + subscriber__in = selective_subscribers, + feed_type = 'q_sel', + frequency = 'i' + ).values_list( + 'subscriber', + flat=True + ) + for subscriber in selective_subscribers: + if origin_post.passes_tag_filter_for_user(subscriber): + subscriber_set.add(subscriber) + + subscriber_set.update(selective_subscribers) + + global_subscribers = EmailFeedSetting.objects.filter( + feed_type = 'q_all', + frequency = 'i' + ).values_list( + 'subscriber', + flat=True + ) + + subscriber_set.update(global_subscribers) + if exclude_list: + subscriber_set -= set(exclude_list) + + return list(subscriber_set) + + def get_time_of_last_edit(self): + return self.added_at + + def delete(self, **kwargs): + #todo: not very good import in models of other models + #todo: potentially a circular import + from askbot.models.user import Activity + Activity.objects.get_mentions( + mentioned_in = self + ).delete() + super(Comment,self).delete(**kwargs) + + def get_absolute_url(self): + origin_post = self.get_origin_post() + return '%s#comment-%d' % (origin_post.get_absolute_url(), self.id) + + def get_latest_revision_number(self): + return 1 + + def __unicode__(self): + return self.comment diff --git a/askbot/models/question.py b/askbot/models/question.py new file mode 100644 index 00000000..696b747e --- /dev/null +++ b/askbot/models/question.py @@ -0,0 +1,655 @@ +import logging +import datetime +from django.conf import settings +from django.utils.datastructures import SortedDict +from django.db import models +from django.contrib.auth.models import User +from django.utils.http import urlquote as django_urlquote +from django.template.defaultfilters import slugify +from django.core.urlresolvers import reverse +from django.contrib.sitemaps import ping_google +from django.utils.translation import ugettext as _ +from askbot.models.tag import Tag, MarkedTag +from askbot.models import signals +from askbot.models.base import AnonymousContent, DeletableContent, ContentRevision +from askbot.models.base import parse_post_text, parse_and_save_post +from askbot.models import content +from askbot import const +from askbot.utils.lists import LazyList + +#todo: too bad keys are duplicated see const sort methods +QUESTION_ORDER_BY_MAP = { + 'latest': '-added_at', + 'oldest': 'added_at', + 'active': '-last_activity_at', + 'inactive': 'last_activity_at', + 'hottest': '-answer_count', + 'coldest': 'answer_count', + 'mostvoted': '-score', + 'leastvoted': 'score', + 'relevant': None #this is a special case +} + +class QuestionManager(models.Manager): + def create_new(self, title=None,author=None,added_at=None, wiki=False,tagnames=None, text=None): + + question = Question( + title = title, + author = author, + added_at = added_at, + last_activity_at = added_at, + last_activity_by = author, + wiki = wiki, + tagnames = tagnames, + #html field is denormalized in .save() call + text = text, + #summary field is denormalized in .save() call + ) + if question.wiki: + #todo: this is confusing - last_edited_at field + #is used as an indicator whether question has been edited + #in template askbot/skins/default/templates/post_contributor_info.html + #but in principle, post creation should count as edit as well + question.last_edited_by = question.author + question.last_edited_at = added_at + question.wikified_at = added_at + + question.parse_and_save(author = author) + + question.add_revision( + author=author, + text=text, + comment=const.POST_STATUS['default_version'], + revised_at=added_at, + ) + return question + + def run_advanced_search( + self, + request_user = None, + scope_selector = const.DEFAULT_POST_SCOPE,#unanswered/all/favorite (for logged in) + search_query = None, + tag_selector = None, + author_selector = None,#???question or answer author or just contributor + sort_method = const.DEFAULT_POST_SORT_METHOD + ): + """all parameters are guaranteed to be clean + however may not relate to database - in that case + a relvant filter will be silently dropped + """ + + qs = self.filter(deleted=False)#todo - add a possibility to see deleted questions + + #return metadata + meta_data = {} + if tag_selector: + for tag in tag_selector: + qs = qs.filter(tags__name = tag) + + if search_query: + try: + qs = qs.filter( + models.Q(title__search = search_query) \ + | models.Q(text__search = search_query) \ + | models.Q(tagnames__search = search_query) \ + | models.Q(answers__text__search = search_query) + ) + except: + #fallback to dumb title match search + qs = qs.extra( + where=['title like %s'], + params=['%' + search_query + '%'] + ) + + #have to import this at run time, otherwise there + #a circular import dependency... + from askbot.conf import settings as askbot_settings + if scope_selector: + if scope_selector == 'unanswered': + if askbot_settings.UNANSWERED_QUESTION_MEANING == 'NO_ANSWERS': + qs = qs.filter(answer_count=0)#todo: expand for different meanings of this + elif askbot_settings.UNANSWERED_QUESTION_MEANING == 'NO_ACCEPTED_ANSWERS': + qs = qs.filter(answer_accepted=False) + elif askbot_settings.UNANSWERED_QUESTION_MEANING == 'NO_UPVOTED_ANSWERS': + raise NotImplementedError() + else: + raise Exception('UNANSWERED_QUESTION_MEANING setting is wrong') + elif scope_selector == 'favorite': + qs = qs.filter(favorited_by = request_user) + + #user contributed questions & answers + if author_selector: + try: + u = User.objects.get(id=int(author_selector)) + qs = qs.filter( + models.Q(author=u, deleted=False) \ + | models.Q(answers__author=u, answers__deleted=False) + ) + meta_data['author_name'] = u.username + except User.DoesNotExist: + meta_data['author_name'] = None + + #get users tag filters + if request_user and request_user.is_authenticated(): + uid_str = str(request_user.id) + #mark questions tagged with interesting tags + qs = qs.extra( + select = SortedDict([ + ( + 'interesting_score', + 'SELECT COUNT(1) FROM askbot_markedtag, question_tags ' + + 'WHERE askbot_markedtag.user_id = %s ' + + 'AND askbot_markedtag.tag_id = question_tags.tag_id ' + + 'AND askbot_markedtag.reason = \'good\' ' + + 'AND question_tags.question_id = question.id' + ), + ]), + select_params = (uid_str,), + ) + if request_user.hide_ignored_questions: + #exclude ignored tags if the user wants to + ignored_tags = Tag.objects.filter(user_selections__reason='bad', + user_selections__user = request_user) + qs = qs.exclude(tags__in=ignored_tags) + else: + #annotate questions tagged with ignored tags + qs = qs.extra( + select = SortedDict([ + ( + 'ignored_score', + 'SELECT COUNT(1) FROM askbot_markedtag, question_tags ' + + 'WHERE askbot_markedtag.user_id = %s ' + + 'AND askbot_markedtag.tag_id = question_tags.tag_id ' + + 'AND askbot_markedtag.reason = \'bad\' ' + + 'AND question_tags.question_id = question.id' + ) + ]), + select_params = (uid_str, ) + ) + # get the list of interesting and ignored tags (interesting_tag_names, ignored_tag_names) = (None, None) + pt = MarkedTag.objects.filter(user=request_user) + meta_data['interesting_tag_names'] = pt.filter(reason='good').values_list('tag__name', flat=True) + meta_data['ignored_tag_names'] = pt.filter(reason='bad').values_list('tag__name', flat=True) + + qs = qs.select_related(depth=1) + #todo: fix orderby here + orderby = QUESTION_ORDER_BY_MAP[sort_method] + if orderby: + #relevance will be ignored here + qs = qs.order_by(orderby) + qs = qs.distinct() + return qs, meta_data + + #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 + def get_question_and_answer_contributors(self, question_list): + answer_list = [] + question_list = list(question_list)#important for MySQL, b/c it does not support + #the query in return statement below + for q in question_list: + answer_list.extend(list(q.answers.all())) + return User.objects.filter( + models.Q(questions__in=question_list) \ + | models.Q(answers__in=answer_list) + ).distinct().order_by('?') + + def get_author_list(self, **kwargs): + #todo: - this is duplication - answer manager also has this method + #will be gone when models are consolidated + #note that method get_question_and_answer_contributors is similar in function + authors = set() + for question in self: + authors.update(question.get_author_list(**kwargs)) + return list(authors) + + def update_tags(self, question, tagnames, user): + """ + Updates Tag associations for a question to match the given + tagname string. + + Returns ``True`` if tag usage counts were updated as a result, + ``False`` otherwise. + """ + + current_tags = list(question.tags.all()) + current_tagnames = set(t.name for t in current_tags) + updated_tagnames = set(t for t in tagnames.split(' ') if t) + modified_tags = [] + + removed_tags = [t for t in current_tags + if t.name not in updated_tagnames] + if removed_tags: + modified_tags.extend(removed_tags) + question.tags.remove(*removed_tags) + + added_tagnames = updated_tagnames - current_tagnames + if added_tagnames: + added_tags = Tag.objects.get_or_create_multiple(added_tagnames, + user) + modified_tags.extend(added_tags) + question.tags.add(*added_tags) + + if modified_tags: + Tag.objects.update_use_counts(modified_tags) + return True + + return False + + #todo: why not make this into a method of Question class? + # also it is actually strange - why do we need the answer_count + # field if the count depends on who is requesting this? + def update_answer_count(self, question): + """ + Executes an UPDATE query to update denormalised data with the + number of answers the given question has. + """ + + # for some reasons, this Answer class failed to be imported, + # although we have imported all classes from models on top. + from askbot.models.answer import Answer + self.filter(id=question.id).update( + answer_count=Answer.objects.get_answers_from_question(question).filter(deleted=False).count()) + + def update_view_count(self, question): + """ + update counter+1 when user browse question page + """ + self.filter(id=question.id).update(view_count = question.view_count + 1) + + def update_favorite_count(self, question): + """ + update favourite_count for given question + """ + self.filter(id=question.id).update(favourite_count = FavoriteQuestion.objects.filter(question=question).count()) + + def get_similar_questions(self, question): + """ + Get 10 similar questions for given one. + This will search the same tag list for give question(by exactly same string) first. + Questions with the individual tags will be added to list if above questions are not full. + """ + #print datetime.datetime.now() + + manager = self + + def get_data(): + questions = list(manager.filter(tagnames = question.tagnames, deleted=False).all()) + + tags_list = question.tags.all() + for tag in tags_list: + extend_questions = manager.filter(tags__id = tag.id, deleted=False)[:50] + for item in extend_questions: + if item not in questions and len(questions) < 10: + questions.append(item) + + #print datetime.datetime.now() + return questions + + return LazyList(get_data) + +class Question(content.Content, DeletableContent): + title = models.CharField(max_length=300) + tags = models.ManyToManyField('Tag', related_name='questions') + answer_accepted = models.BooleanField(default=False) + closed = models.BooleanField(default=False) + closed_by = models.ForeignKey(User, null=True, blank=True, related_name='closed_questions') + closed_at = models.DateTimeField(null=True, blank=True) + close_reason = models.SmallIntegerField( + choices=const.CLOSE_REASONS, + null=True, + blank=True + ) + followed_by = models.ManyToManyField(User, related_name='followed_questions') + + # Denormalised data + answer_count = models.PositiveIntegerField(default=0) + view_count = models.PositiveIntegerField(default=0) + favourite_count = models.PositiveIntegerField(default=0) + last_activity_at = models.DateTimeField(default=datetime.datetime.now) + last_activity_by = models.ForeignKey(User, related_name='last_active_in_questions') + tagnames = models.CharField(max_length=125) + summary = models.CharField(max_length=180) + + favorited_by = models.ManyToManyField(User, through='FavoriteQuestion', related_name='favorite_questions') + + objects = QuestionManager() + + class Meta(content.Content.Meta): + db_table = u'question' + + parse = parse_post_text + parse_and_save = parse_and_save_post + + def delete(self): + super(Question, self).delete() + try: + ping_google() + except Exception: + logging.debug('problem pinging google did you register you sitemap with google?') + + def get_updated_activity_data(self, created = False): + if created: + return const.TYPE_ACTIVITY_ASK_QUESTION, self + else: + latest_revision = self.get_latest_revision() + return const.TYPE_ACTIVITY_UPDATE_QUESTION, latest_revision + + def get_response_receivers(self, exclude_list = None): + """returns list of users who might be interested + in the question update based on their participation + in the question activity + + exclude_list is mandatory - it normally should have the + author of the update so the he/she is not notified about the update + """ + assert(exclude_list != None) + receiving_users = set() + receiving_users.update( + self.get_author_list( + include_comments = True + ) + ) + #do not include answer commenters here + for a in self.answers.all(): + receiving_users.update(a.get_author_list()) + + receiving_users -= set(exclude_list) + return receiving_users + + def retag(self, retagged_by=None, retagged_at=None, tagnames=None): + if None in (retagged_by, retagged_at, tagnames): + raise Exception('arguments retagged_at, retagged_by and tagnames are required') + # Update the Question itself + self.tagnames = tagnames + self.last_edited_at = retagged_at + self.last_activity_at = retagged_at + self.last_edited_by = retagged_by + self.last_activity_by = retagged_by + + # Update the Question's tag associations + signals.tags_updated = self.objects.update_tags( + self, + tagnames, + retagged_by + ) + + # Create a new revision + latest_revision = self.get_latest_revision() + QuestionRevision.objects.create( + question = self, + title = latest_revision.title, + author = retagged_by, + revised_at = retagged_at, + tagnames = tagnames, + summary = const.POST_STATUS['retagged'], + text = latest_revision.text + ) + # send tags updated singal + signals.tags_updated.send(sender=Question, question=self) + + def get_origin_post(self): + return self + + def apply_edit(self, edited_at=None, edited_by=None, title=None,\ + text=None, comment=None, tags=None, wiki=False): + + latest_revision = self.get_latest_revision() + #a hack to allow partial edits - important for SE loader + if title is None: + title = self.title + if text is None: + text = latest_revision.text + if tags is None: + tags = latest_revision.tagnames + + if edited_by is None: + raise Exception('parameter edited_by is required') + + if edited_at is None: + edited_at = datetime.datetime.now() + + # Update the Question itself + self.title = title + self.last_edited_at = edited_at + self.last_activity_at = edited_at + self.last_edited_by = edited_by + self.last_activity_by = edited_by + self.tagnames = tags + self.text = text + + #wiki is an eternal trap whence there is no exit + if self.wiki == False and wiki == True: + self.wiki = True + + self.parse_and_save(author = edited_by) + + # Update the Question tag associations + if latest_revision.tagnames != tags: + tags_updated = Question.objects.update_tags(self, tags, edited_by) + + # Create a new revision + self.add_revision( + author = edited_by, + text = text, + revised_at = edited_at, + comment = comment, + ) + + def add_revision(self,author=None, text=None, comment=None, revised_at=None): + if None in (author, text, comment): + raise Exception('author, text and comment are required arguments') + rev_no = self.revisions.all().count() + 1 + if comment in (None, ''): + if rev_no == 1: + comment = const.POST_STATUS['default_version'] + else: + comment = 'No.%s Revision' % rev_no + + return QuestionRevision.objects.create( + question = self, + revision = rev_no, + title = self.title, + author = author, + revised_at = revised_at, + tagnames = self.tagnames, + summary = comment, + text = text + ) + + def save(self, **kwargs): + """ + Overridden to manually manage addition of tags when the object + is first saved. + + This is required as we're using ``tagnames`` as the sole means of + adding and editing tags. + """ + initial_addition = (self.pk is None) + + super(Question, self).save(**kwargs) + + if initial_addition: + tags = Tag.objects.get_or_create_multiple( + self.tagname_list(), + self.author + ) + self.tags.add(*tags) + Tag.objects.update_use_counts(tags) + + def tagname_list(self): + """Creates a list of Tag names from the ``tagnames`` attribute.""" + return [name for name in self.tagnames.split(u' ')] + + def tagname_meta_generator(self): + return u','.join([unicode(tag) for tag in self.tagname_list()]) + + def get_absolute_url(self): + return '%s%s' % ( + reverse('question', args=[self.id]), + django_urlquote(slugify(self.title)) + ) + + def has_favorite_by_user(self, user): + if not user.is_authenticated(): + return False + + return FavoriteQuestion.objects.filter(question=self, user=user).count() > 0 + + def get_answer_count_by_user(self, user_id): + from askbot.models.answer import Answer + query_set = Answer.objects.filter(author__id=user_id) + return query_set.filter(question=self).count() + + def get_question_title(self): + if self.closed: + attr = const.POST_STATUS['closed'] + elif self.deleted: + attr = const.POST_STATUS['deleted'] + else: + attr = None + if attr is not None: + return u'%s %s' % (self.title, attr) + else: + return self.title + + def get_revision_url(self): + return reverse('question_revisions', args=[self.id]) + + def get_last_update_info(self): + when, who = self.post_get_last_update_info() + + answers = self.answers.all() + if len(answers) > 0: + for a in answers: + a_when, a_who = a.post_get_last_update_info() + if a_when > when: + when = a_when + who = a_who + + return when, who + + def get_update_summary(self,last_reported_at=None,recipient_email=''): + edited = False + if self.last_edited_at and self.last_edited_at > last_reported_at: + if self.last_edited_by.email != recipient_email: + edited = True + comments = [] + for comment in self.comments.all(): + if comment.added_at > last_reported_at and comment.user.email != recipient_email: + comments.append(comment) + new_answers = [] + answer_comments = [] + modified_answers = [] + commented_answers = [] + import sets + commented_answers = sets.Set([]) + for answer in self.answers.all(): + if (answer.added_at > last_reported_at and answer.author.email != recipient_email): + new_answers.append(answer) + if (answer.last_edited_at + and answer.last_edited_at > last_reported_at + and answer.last_edited_by.email != recipient_email): + modified_answers.append(answer) + for comment in answer.comments.all(): + if comment.added_at > last_reported_at and comment.user.email != recipient_email: + commented_answers.add(answer) + answer_comments.append(comment) + + #create the report + from askbot.conf import settings as askbot_settings + if edited or new_answers or modified_answers or answer_comments: + out = [] + if edited: + out.append(_('%(author)s modified the question') % {'author':self.last_edited_by.username}) + if new_answers: + names = sets.Set(map(lambda x: x.author.username,new_answers)) + people = ', '.join(names) + out.append(_('%(people)s posted %(new_answer_count)s new answers') \ + % {'new_answer_count':len(new_answers),'people':people}) + if comments: + names = sets.Set(map(lambda x: x.user.username,comments)) + people = ', '.join(names) + out.append(_('%(people)s commented the question') % {'people':people}) + if answer_comments: + names = sets.Set(map(lambda x: x.user.username,answer_comments)) + people = ', '.join(names) + if len(commented_answers) > 1: + out.append(_('%(people)s commented answers') % {'people':people}) + else: + out.append(_('%(people)s commented an answer') % {'people':people}) + url = askbot_settings.APP_URL + self.get_absolute_url() + retval = '%s:
\n' % (url,self.title) + out = map(lambda x: '
  • ' + x + '
  • ',out) + retval += '
      ' + '\n'.join(out) + '

    \n' + return retval + else: + return None + + def __unicode__(self): + return self.title + + +class QuestionView(models.Model): + question = models.ForeignKey(Question, related_name='viewed') + who = models.ForeignKey(User, related_name='question_views') + when = models.DateTimeField() + + class Meta: + app_label = 'askbot' + +class FavoriteQuestion(models.Model): + """A favorite Question of a User.""" + question = models.ForeignKey(Question) + user = models.ForeignKey(User, related_name='user_favorite_questions') + added_at = models.DateTimeField(default=datetime.datetime.now) + + class Meta: + app_label = 'askbot' + db_table = u'favorite_question' + def __unicode__(self): + return '[%s] favorited at %s' %(self.user, self.added_at) + +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) + + 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 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): + title = models.CharField(max_length=300) + tagnames = models.CharField(max_length=125) + + def publish(self,user): + added_at = datetime.datetime.now() + Question.objects.create_new( + title=self.title, + author=user, + added_at=added_at, + wiki=self.wiki, + tagnames=self.tagnames, + text=self.text, + ) + self.delete() diff --git a/askbot/models/repute.py b/askbot/models/repute.py new file mode 100644 index 00000000..b7b379a2 --- /dev/null +++ b/askbot/models/repute.py @@ -0,0 +1,131 @@ +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes import generic +from django.contrib.auth.models import User +from django.db import models +from django.utils.translation import ugettext as _ +import datetime +from askbot import const +from django.core.urlresolvers import reverse + +class Badge(models.Model): + """Awarded for notable actions performed on the site by Users.""" + GOLD = 1 + SILVER = 2 + BRONZE = 3 + TYPE_CHOICES = ( + (GOLD, _('gold')), + (SILVER, _('silver')), + (BRONZE, _('bronze')), + ) + CSS_CLASSES = { + GOLD: 'badge1', + SILVER: 'badge2', + BRONZE: 'badge3', + } + DISPLAY_SYMBOL = '●' + + name = models.CharField(max_length=50) + type = models.SmallIntegerField(choices=TYPE_CHOICES) + slug = models.SlugField(max_length=50, blank=True) + description = models.CharField(max_length=300) + multiple = models.BooleanField(default=False) + # Denormalised data + awarded_count = models.PositiveIntegerField(default=0) + + awarded_to = models.ManyToManyField(User, through='Award', related_name='badges') + + class Meta: + app_label = 'askbot' + db_table = u'badge' + ordering = ('name',) + unique_together = ('name', 'type') + + def __unicode__(self): + return u'%s: %s' % (self.get_type_display(), self.name) + + def save(self, **kwargs): + if not self.slug: + self.slug = self.name#slugify(self.name) + super(Badge, self).save(**kwargs) + + def get_absolute_url(self): + return '%s%s/' % (reverse('badge', args=[self.id]), self.slug) + +class AwardManager(models.Manager): + def get_recent_awards(self): + awards = super(AwardManager, self).extra( + select={'badge_id': 'badge.id', 'badge_name':'badge.name', + 'badge_description': 'badge.description', 'badge_type': 'badge.type', + 'user_id': 'auth_user.id', 'user_name': 'auth_user.username' + }, + tables=['award', 'badge', 'auth_user'], + order_by=['-awarded_at'], + where=['auth_user.id=award.user_id AND badge_id=badge.id'], + ).values('badge_id', 'badge_name', 'badge_description', 'badge_type', 'user_id', 'user_name') + return awards + +class Award(models.Model): + """The awarding of a Badge to a User.""" + user = models.ForeignKey(User, related_name='award_user') + badge = models.ForeignKey('Badge', related_name='award_badge') + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + content_object = generic.GenericForeignKey('content_type', 'object_id') + awarded_at = models.DateTimeField(default=datetime.datetime.now) + notified = models.BooleanField(default=False) + + objects = AwardManager() + + def __unicode__(self): + return u'[%s] is awarded a badge [%s] at %s' % (self.user.username, self.badge.name, self.awarded_at) + + class Meta: + app_label = 'askbot' + db_table = u'award' + +class ReputeManager(models.Manager): + def get_reputation_by_upvoted_today(self, user): + """ + For one user in one day, he can only earn rep till certain score (ep. +200) + by upvoted(also subtracted from upvoted canceled). This is because we need + to prohibit gaming system by upvoting/cancel again and again. + """ + if user is None: + return 0 + else: + today = datetime.date.today() + tomorrow = today + datetime.timedelta(1) + rep_types = (1,-8) + sums = self.filter(models.Q(reputation_type__in=rep_types), + user=user, + reputed_at__range=(today, tomorrow), + ).aggregate(models.Sum('positive'), models.Sum('negative')) + if sums: + pos = sums['positive__sum'] + neg = sums['negative__sum'] + if pos is None: + pos = 0 + if neg is None: + neg = 0 + return pos + neg + else: + return 0 + +class Repute(models.Model): + """The reputation histories for user""" + user = models.ForeignKey(User) + positive = models.SmallIntegerField(default=0) + negative = models.SmallIntegerField(default=0) + question = models.ForeignKey('Question') + reputed_at = models.DateTimeField(default=datetime.datetime.now) + reputation_type = models.SmallIntegerField(choices=const.TYPE_REPUTATION) + reputation = models.IntegerField(default=1) + + objects = ReputeManager() + + def __unicode__(self): + return u'[%s]\' reputation changed at %s' % (self.user.username, self.reputed_at) + + class Meta: + app_label = 'askbot' + db_table = u'repute' diff --git a/askbot/models/signals.py b/askbot/models/signals.py new file mode 100644 index 00000000..b4ed0d1b --- /dev/null +++ b/askbot/models/signals.py @@ -0,0 +1,23 @@ +import django.dispatch + +tags_updated = django.dispatch.Signal(providing_args=['question']) + +#todo: this one seems to be unused +edit_question_or_answer = django.dispatch.Signal( + providing_args=['instance', 'modified_by'] + ) +delete_post_or_answer = django.dispatch.Signal( + providing_args=['instance', 'deleted_by'] + ) +mark_offensive = django.dispatch.Signal(providing_args=['instance', 'mark_by']) +user_updated = django.dispatch.Signal(providing_args=['instance', 'updated_by']) +#todo: move this to authentication app +user_logged_in = django.dispatch.Signal(providing_args=['session']) + +post_updated = django.dispatch.Signal( + providing_args=[ + 'post', + 'updated_by', + 'newly_mentioned_users' + ] + ) diff --git a/askbot/models/tag.py b/askbot/models/tag.py new file mode 100644 index 00000000..5b1613b7 --- /dev/null +++ b/askbot/models/tag.py @@ -0,0 +1,90 @@ +from django.db import models +from django.db import connection, transaction +from django.contrib.auth.models import User +from django.utils.translation import ugettext as _ +from askbot.models.base import DeletableContent + + +class TagManager(models.Manager): + UPDATE_USED_COUNTS_QUERY = ( + 'UPDATE tag ' + 'SET used_count = (' + 'SELECT COUNT(*) FROM question_tags ' + 'INNER JOIN question ON question_id=question.id ' + 'WHERE tag_id = tag.id AND question.deleted=False' + ') ' + 'WHERE id IN (%s)') + + def get_valid_tags(self, page_size): + tags = self.all().filter(deleted=False).exclude(used_count=0).order_by("-id")[:page_size] + return tags + + def get_or_create_multiple(self, names, user): + """ + Fetches a list of Tags with the given names, creating any Tags + which don't exist when necesssary. + """ + tags = list(self.filter(name__in=names)) + #Set all these tag visible + for tag in tags: + if tag.deleted: + tag.deleted = False + tag.deleted_by = None + tag.deleted_at = None + tag.save() + + if len(tags) < len(names): + existing_names = set(tag.name for tag in tags) + new_names = [name for name in names if name not in existing_names] + tags.extend([self.create(name=name, created_by=user) + for name in new_names if self.filter(name=name).count() == 0 and len(name.strip()) > 0]) + + return tags + + def update_use_counts(self, tags): + """Updates the given Tags with their current use counts.""" + if not tags: + return + cursor = connection.cursor() + query = self.UPDATE_USED_COUNTS_QUERY % ','.join(['%s'] * len(tags)) + cursor.execute(query, [tag.id for tag in tags]) + transaction.commit_unless_managed() + + def get_tags_by_questions(self, questions): + question_ids = [] + if len(questions) == 0: + return [] + for question in questions: + question_ids.append(question.id) + + question_ids_str = ','.join([str(id) for id in question_ids]) + related_tags = self.extra( + tables=['tag', 'question_tags'], + where=["tag.id = question_tags.tag_id AND question_tags.question_id IN (" + question_ids_str + ")"] + ).distinct() + + return related_tags + +class Tag(DeletableContent): + name = models.CharField(max_length=255, unique=True) + created_by = models.ForeignKey(User, related_name='created_tags') + # Denormalised data + used_count = models.PositiveIntegerField(default=0) + + objects = TagManager() + + class Meta(DeletableContent.Meta): + db_table = u'tag' + ordering = ('-used_count', 'name') + + def __unicode__(self): + return self.name + +class MarkedTag(models.Model): + TAG_MARK_REASONS = (('good',_('interesting')),('bad',_('ignored'))) + tag = models.ForeignKey('Tag', related_name='user_selections') + user = models.ForeignKey(User, related_name='tag_selections') + reason = models.CharField(max_length=16, choices=TAG_MARK_REASONS) + + class Meta: + app_label = 'askbot' diff --git a/askbot/models/user.py b/askbot/models/user.py new file mode 100644 index 00000000..d06c4ed2 --- /dev/null +++ b/askbot/models/user.py @@ -0,0 +1,340 @@ +from hashlib import md5 +import string +from random import Random +import datetime +import logging +from django.db import models +from django.db.backends.dummy.base import IntegrityError +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes import generic +from django.contrib.auth.models import User +from django.utils.translation import ugettext as _ +from askbot import const +from askbot.utils import functions + + +class ResponseAndMentionActivityManager(models.Manager): + def get_query_set(self): + response_types = const.RESPONSE_ACTIVITY_TYPES_FOR_DISPLAY + response_types += (const.TYPE_ACTIVITY_MENTION, ) + return super( + ResponseAndMentionActivityManager, + self + ).get_query_set().filter( + activity_type__in = response_types + ) + +class ActivityManager(models.Manager): + def get_all_origin_posts(self): + #todo: redo this with query sets + origin_posts = set() + for m in self.all(): + post = m.content_object + if post and hasattr(post, 'get_origin_post'): + origin_posts.add(post.get_origin_post()) + else: + logging.debug( + 'method get_origin_post() not implemented for %s' \ + % unicode(post) + ) + return list(origin_posts) + + def create_new_mention( + self, + mentioned_by = None, + mentioned_whom = None, + mentioned_at = None, + mentioned_in = None, + reported = None + ): + + #todo: automate this using python inspect module + kwargs = dict() + + kwargs['activity_type'] = const.TYPE_ACTIVITY_MENTION + + if mentioned_at: + #todo: handle cases with rich lookups here like __lt + kwargs['active_at'] = mentioned_at + + if mentioned_by: + kwargs['user'] = mentioned_by + + if mentioned_in: + if functions.is_iterable(mentioned_in): + raise NotImplementedError('mentioned_in only works for single items') + else: + post_content_type = ContentType.objects.get_for_model(mentioned_in) + kwargs['content_type'] = post_content_type + kwargs['object_id'] = mentioned_in.id + + if reported == True: + kwargs['is_auditted'] = True + else: + kwargs['is_auditted'] = False + + mention_activity = Activity(**kwargs) + mention_activity.save() + + if mentioned_whom: + if functions.is_iterable(mentioned_whom): + raise NotImplementedError('cannot yet mention multiple people at once') + else: + mention_activity.receiving_users.add(mentioned_whom) + + return mention_activity + + def get_mentions( + self, + mentioned_by = None, + mentioned_whom = None, + mentioned_at = None, + mentioned_in = None, + reported = None, + mentioned_at__gt = None, + ): + """extract mention-type activity objects + todo: implement better rich field lookups + """ + + kwargs = dict() + + kwargs['activity_type'] = const.TYPE_ACTIVITY_MENTION + + if mentioned_at: + #todo: handle cases with rich lookups here like __lt + kwargs['active_at'] = mentioned_at + elif mentioned_at__gt: + kwargs['active_at__gt'] = mentioned_at__gt + + if mentioned_by: + kwargs['user'] = mentioned_by + + if mentioned_whom: + if functions.is_iterable(mentioned_whom): + kwargs['receiving_users__in'] = mentioned_whom + else: + kwargs['receiving_users__in'] = (mentioned_whom,) + + if mentioned_in: + if functions.is_iterable(mentioned_in): + it = iter(mentioned_in) + raise NotImplementedError('mentioned_in only works for single items') + else: + post_content_type = ContentType.objects.get_for_model(mentioned_in) + kwargs['content_type'] = post_content_type + kwargs['object_id'] = mentioned_in.id + + if reported == True: + kwargs['is_auditted'] = True + else: + kwargs['is_auditted'] = False + + return self.filter(**kwargs) + + +class Activity(models.Model): + """ + We keep some history data for user activities + """ + user = models.ForeignKey(User) + receiving_users = models.ManyToManyField(User, related_name='received_activity') + activity_type = models.SmallIntegerField(choices = const.TYPE_ACTIVITY) + active_at = models.DateTimeField(default=datetime.datetime.now) + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + content_object = generic.GenericForeignKey('content_type', 'object_id') + is_auditted = models.BooleanField(default=False) + + objects = ActivityManager() + responses_and_mentions = ResponseAndMentionActivityManager() + + def __unicode__(self): + return u'[%s] was active at %s' % (self.user.username, self.active_at) + + class Meta: + app_label = 'askbot' + db_table = u'activity' + + def get_mentioned_user(self): + assert(self.activity_type == const.TYPE_ACTIVITY_MENTION) + user_qs = self.receiving_users.all() + assert(len(user_qs) == 1) + return user_qs[0] + + def get_absolute_url(self): + return self.content_object.get_absolute_url() + +class EmailFeedSetting(models.Model): + DELTA_TABLE = { + 'i':datetime.timedelta(-1),#instant emails are processed separately + 'd':datetime.timedelta(1), + 'w':datetime.timedelta(7), + 'n':datetime.timedelta(-1), + } + FEED_TYPES = ( + ('q_all',_('Entire askbot')), + ('q_ask',_('Questions that I asked')), + ('q_ans',_('Questions that I answered')), + ('q_sel',_('Individually selected questions')), + ('m_and_c',_('Mentions and comment responses')), + ) + UPDATE_FREQUENCY = ( + ('i',_('Instantly')), + ('d',_('Daily')), + ('w',_('Weekly')), + ('n',_('No email')), + ) + + + subscriber = models.ForeignKey(User, related_name='notification_subscriptions') + feed_type = models.CharField(max_length=16,choices=FEED_TYPES) + frequency = models.CharField( + max_length=8, + choices=const.NOTIFICATION_DELIVERY_SCHEDULE_CHOICES, + default='n', + ) + added_at = models.DateTimeField(auto_now_add=True) + reported_at = models.DateTimeField(null=True) + + #functions for rich comparison + #PRECEDENCE = ('i','d','w','n')#the greater ones are first + #def __eq__(self, other): + # return self.id == other.id + +# def __eq__(self, other): +# return self.id != other.id + +# def __gt__(self, other): +# return PRECEDENCE.index(self.frequency) < PRECEDENCE.index(other.frequency) + +# def __lt__(self, other): +# return PRECEDENCE.index(self.frequency) > PRECEDENCE.index(other.frequency) + +# def __gte__(self, other): +# if self.__eq__(other): +# return True +# else: +# return self.__gt__(other) + +# def __lte__(self, other): +# if self.__eq__(other): +# return True +# else: +# return self.__lt__(other) + + def save(self,*args,**kwargs): + type = self.feed_type + subscriber = self.subscriber + similar = self.__class__.objects.filter( + feed_type=type, + subscriber=subscriber + ).exclude(pk=self.id) + if len(similar) > 0: + raise IntegrityError('email feed setting already exists') + super(EmailFeedSetting,self).save(*args,**kwargs) + + def get_previous_report_cutoff_time(self): + now = datetime.datetime.now() + return now - self.DELTA_TABLE[self.frequency] + + def should_send_now(self): + now = datetime.datetime.now() + cutoff_time = self.get_previous_report_cutoff_time() + if self.reported_at == None or self.reported_at <= cutoff_time: + return True + else: + return False + + def mark_reported_now(self): + self.reported_at = datetime.datetime.now() + self.save() + + class Meta: + app_label = 'askbot' + +from askbot.utils.time import one_day_from_now + +class ValidationHashManager(models.Manager): + def _generate_md5_hash(self, user, type, hash_data, seed): + return md5( + "%s%s%s%s" % ( + seed, + "".join(map(str, hash_data)), + user.id, + type + ) + ).hexdigest() + + def create_new(self, user, type, hash_data=[], expiration=None): + seed = ''.join(Random().sample(string.letters+string.digits, 12)) + hash = self._generate_md5_hash(user, type, hash_data, seed) + + obj = ValidationHash(hash_code=hash, seed=seed, user=user, type=type) + + if expiration is not None: + obj.expiration = expiration + + try: + obj.save() + except: + return None + + return obj + + def validate(self, hash, user, type, hash_data=[]): + try: + obj = self.get(hash_code=hash) + except: + return False + + if obj.type != type: + return False + + if obj.user != user: + return False + + valid = (obj.hash_code == self._generate_md5_hash( + obj.user, + type, + hash_data, + obj.seed + ) + ) + + if valid: + if obj.expiration < datetime.datetime.now(): + obj.delete() + return False + else: + obj.delete() + return True + + return False + +class ValidationHash(models.Model): + #todo: was 256 chars - is that important? + #on mysql 255 is max for unique=True + hash_code = models.CharField(max_length=255,unique=True) + seed = models.CharField(max_length=12) + expiration = models.DateTimeField(default=one_day_from_now) + type = models.CharField(max_length=12) + user = models.ForeignKey(User) + + objects = ValidationHashManager() + + class Meta: + unique_together = ('user', 'type') + app_label = 'askbot' + + def __str__(self): + return self.hash_code + +#class AuthKeyUserAssociation(models.Model): +# key = models.CharField(max_length=255,null=False,unique=True) +# provider = models.CharField(max_length=64)#string 'yahoo', 'google', etc. +# user = models.ForeignKey(User, related_name="auth_keys") +# added_at = models.DateTimeField(default=datetime.datetime.now) +# +# class Meta: +# app_label = 'askbot' diff --git a/askbot/search/README b/askbot/search/README new file mode 100644 index 00000000..c15dc221 --- /dev/null +++ b/askbot/search/README @@ -0,0 +1,5 @@ +module dealing with search functions +at this time only question and answer search + +that among other things contains +available full text search implementations diff --git a/askbot/search/__init__.py b/askbot/search/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/search/indexer.py b/askbot/search/indexer.py new file mode 100644 index 00000000..c7c45c59 --- /dev/null +++ b/askbot/search/indexer.py @@ -0,0 +1,9 @@ +from django.conf import settings +from django.db import connection + +def create_fulltext_indexes(): + if settings.DATABASE_ENGINE == 'mysql': + cursor = connection.cursor() + cursor.execute('ALTER TABLE question ADD FULLTEXT (title, text, tagnames)') + cursor.execute('ALTER TABLE answer ADD FULLTEXT (title, text, tagnames)') + diff --git a/askbot/search/sphinx/README b/askbot/search/sphinx/README new file mode 100644 index 00000000..8c008a23 --- /dev/null +++ b/askbot/search/sphinx/README @@ -0,0 +1,4 @@ +This directory contains sample configuration for sphinx search + +Sphinx is a full text search engine for MySQL (only) with full +word stemming in English and Russion (other languages are not supported) diff --git a/askbot/search/sphinx/sphinx.conf b/askbot/search/sphinx/sphinx.conf new file mode 100644 index 00000000..bf4bdc8b --- /dev/null +++ b/askbot/search/sphinx/sphinx.conf @@ -0,0 +1,127 @@ +#if you have many posts, it's best to configure another index for new posts and +#periodically merge the diff index to the main +#this is not important until you get to hundreds of thousands posts + +source src_cnprog +{ + # data source + type = mysql + sql_host = localhost + sql_user = cnprog #replace with your db username + sql_pass = secret #replace with your db password + sql_db = cnprog #replace with your db name + # these two are optional + #sql_port = 3306 + #sql_sock = /var/lib/mysql/mysql.sock + + # pre-query, executed before the main fetch query + sql_query_pre = SET NAMES utf8 + + # main document fetch query - change the table names if you are using a prefix + # this query creates a flat document from each question that includes only latest + # revisions of the question and all of it's answers + sql_query = SELECT q.id as id, q.title AS title, q.tagnames as tags, qr.text AS text, answers_combined.text AS answers \ + FROM question AS q \ + INNER JOIN \ + ( \ + SELECT MAX(id) as id, question_id \ + FROM question_revision \ + GROUP BY question_id \ + ) \ + AS mqr \ + ON q.id=mqr.question_id \ + INNER JOIN question_revision AS qr ON qr.id=mqr.id \ + LEFT JOIN \ + ( \ + SELECT GROUP_CONCAT(answer_current.text SEPARATOR '. ') AS text, \ + question_id \ + FROM \ + ( \ + SELECT a.question_id as question_id, ar.text as text \ + FROM answer AS a \ + INNER JOIN \ + ( \ + SELECT MAX(id) as id, answer_id \ + FROM answer_revision \ + GROUP BY answer_id \ + ) \ + AS mar \ + ON mar.answer_id = a.id \ + INNER JOIN answer_revision AS ar ON ar.id=mar.id \ + WHERE a.deleted=0 \ + ) \ + AS answer_current \ + GROUP BY question_id \ + ) \ + AS answers_combined ON q.id=answers_combined.question_id \ + WHERE q.deleted=0; + + # optional - used by command-line search utility to display document information + sql_query_info = SELECT title, id FROM question WHERE id=$id +} + +index cnprog { + # which document source to index + source = src_cnprog + + # this is path and index file name without extension + # you may need to change this path or create this folder + path = /var/data/sphinx/cnprog_main + + # docinfo (ie. per-document attribute values) storage strategy + docinfo = extern + + # morphology + morphology = stem_en + + # stopwords file + #stopwords = /var/data/sphinx/stopwords.txt + + # minimum word length + min_word_len = 1 + + # uncomment next 2 lines to allow wildcard (*) searches + #min_infix_len = 1 + #enable_star = 1 + + # charset encoding type + charset_type = utf-8 +} + +# indexer settings +indexer +{ + # memory limit (default is 32M) + mem_limit = 64M +} + +# searchd settings +searchd +{ + # IP address on which search daemon will bind and accept + # optional, default is to listen on all addresses, + # ie. address = 0.0.0.0 + address = 127.0.0.1 + + # port on which search daemon will listen + port = 3312 + + # searchd run info is logged here - create or change the folder + log = /var/log/sphinx/searchd.log + + # all the search queries are logged here + query_log = /var/log/sphinx/query.log + + # client read timeout, seconds + read_timeout = 5 + + # maximum amount of children to fork + max_children = 30 + + # a file which will contain searchd process ID + pid_file = /var/log/sphinx/searchd.pid + + # maximum amount of matches this daemon would ever retrieve + # from each index and serve to client + max_matches = 1000 +} diff --git a/askbot/search/state_manager.py b/askbot/search/state_manager.py new file mode 100644 index 00000000..f8643e31 --- /dev/null +++ b/askbot/search/state_manager.py @@ -0,0 +1,156 @@ +#search state manager object +#that lives in the session and takes care of the state +#persistece during the search session +from askbot import const +from askbot.conf import settings as askbot_settings +import logging + +ACTIVE_COMMANDS = ( + 'sort', 'search', 'query', + 'reset_query', 'reset_author', 'reset_tags', + 'tags', 'scope', 'page_size', 'start_over', + 'page' +) + +def some_in(what, where): + for element in what: + if element in where: + return True + return False + +class SearchState(object): + def __init__(self): + self.scope = const.DEFAULT_POST_SCOPE + self.query = None + self.tags = None + self.author = None + self.sort = const.DEFAULT_POST_SORT_METHOD + self.page_size = int(askbot_settings.DEFAULT_QUESTIONS_PAGE_SIZE) + self.page = 1 + self.logged_in = False + logging.debug('new search state initialized') + + def __str__(self): + out = 'scope=%s\n' % self.scope + out += 'query=%s\n' % self.query + if self.tags: + out += 'tags=%s\n' % ','.join(self.tags) + out += 'author=%s\n' % self.author + out += 'sort=%s\n' % self.sort + out += 'page_size=%d\n' % self.page_size + out += 'page=%d\n' % self.page + out += 'logged_in=%s\n' % str(self.logged_in) + return out + + def set_logged_out(self): + if self.scope == 'favorite': + self.scope = None + self.logged_in = False + + def set_logged_in(self): + self.logged_in = True + + def reset(self): + #re-initialize, but keep login state + is_logged_in = self.logged_in + self.__init__() + self.logged_in = is_logged_in + + def update_value(self, key, store): + if key in store: + old_value = getattr(self, key) + new_value = store[key] + if new_value != old_value: + setattr(self, key, new_value) + self.reset_page() + + def relax_stickiness(self, input_dict, view_log): + if view_log.get_previous(1) == 'questions': + if not some_in(ACTIVE_COMMANDS, input_dict): + self.reset() + #todo also relax if 'all' scope was clicked twice + + def update_from_user_input(self, input_dict, unprocessed_input = {}): + #todo: this function will probably not + #fit the case of multiple parameters entered at the same tiem + if 'start_over' in input_dict: + self.reset() + + if 'page' in input_dict: + self.page = input_dict['page'] + #special case - on page flip no other input is accepted + return + + if 'page_size' in input_dict: + self.update_value('page_size', input_dict) + self.reset_page()#todo may be smarter here - start with ~same q + #same as with page - return right away + return + + if 'scope' in input_dict: + if input_dict['scope'] == 'favorite' and self.logged_in == False: + self.reset_scope() + else: + self.update_value('scope', input_dict) + + if 'tags' in input_dict: + if self.tags: + old_tags = self.tags.copy() + self.tags = self.tags.union(input_dict['tags']) + if self.tags != old_tags: + self.reset_page() + else: + self.tags = input_dict['tags'] + + #all resets just return + if 'reset_tags' in input_dict: + if self.tags: + self.tags = None + self.reset_page() + return + + #todo: handle case of deleting tags one-by-one + if 'reset_author' in input_dict: + if self.author: + self.author = None + self.reset_page() + return + + if 'reset_query' in input_dict: + self.reset_query() + return + + self.update_value('author', input_dict) + + if 'query' in input_dict: + self.update_value('query', input_dict) + self.sort = 'relevant' + elif 'search' in unprocessed_input:#a case of use nulling search query by hand + self.reset_query() + return + + if 'sort' in input_dict: + if input_dict['sort'] == 'relevant' and self.query is None: + self.reset_sort() + else: + self.update_value('sort', input_dict) + + #todo: plug - mysql has no relevance sort + if self.sort == 'relevant': + self.reset_sort() + + def reset_page(self): + self.page = 1 + + def reset_query(self): + if self.query: + self.query = None + self.reset_page() + if self.sort == 'relevant': + self.reset_sort() + + def reset_sort(self): + self.sort = const.DEFAULT_POST_SORT_METHOD + + def reset_scope(self): + self.scope = const.DEFAULT_POST_SCOPE diff --git a/askbot/settings.py b/askbot/settings.py new file mode 100644 index 00000000..7d39e7c0 --- /dev/null +++ b/askbot/settings.py @@ -0,0 +1,67 @@ +#todo: this file is currently not in use +import os +from askbot.deps.livesettings import ConfigurationGroup, IntegerValue, config_register + +INSTALLED_APPS = ['askbot'] + +MIDDLEWARE_CLASSES = [ + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'askbot.middleware.anon_user.ConnectToSessionMessagesMiddleware', + 'askbot.middleware.pagesize.QuestionsPageSizeMiddleware', + 'askbot.middleware.cancel.CancelActionMiddleware', + 'django.middleware.transaction.TransactionMiddleware', +] + +TEMPLATE_LOADERS = [ + 'django.template.loaders.filesystem.load_template_source', + 'django.template.loaders.app_directories.load_template_source', + 'askbot.modules.module_templates_loader', + 'askbot.skins.load_template_source', +] + +TEMPLATE_CONTEXT_PROCESSORS = [ + 'django.core.context_processors.request', + 'askbot.context.application_settings', + 'askbot.user_messages.context_processors.user_messages', + 'django.core.context_processors.auth', +] + +TEMPLATE_DIRS = [ + os.path.join(os.path.dirname(__file__),'skins').replace('\\','/'), +] + +def setup_django_settings(settings): + + if (hasattr(settings, 'DEBUG') and getattr(settings, 'DEBUG')): + try: + import debug_toolbar + INSTALLED_APPS.append('debug_toolbar') + MIDDLEWARE_CLASSES.append('debug_toolbar.middleware.DebugToolbarMiddleware') + except: + pass + + + settings.INSTALLED_APPS = set(settings.INSTALLED_APPS) | set(INSTALLED_APPS) + settings.MIDDLEWARE_CLASSES = set(settings.MIDDLEWARE_CLASSES) | set(MIDDLEWARE_CLASSES) + settings.TEMPLATE_LOADERS = set(settings.TEMPLATE_LOADERS) | set(TEMPLATE_LOADERS) + settings.TEMPLATE_CONTEXT_PROCESSORS = set(settings.TEMPLATE_CONTEXT_PROCESSORS) | set(TEMPLATE_CONTEXT_PROCESSORS) + settings.TEMPLATE_DIRS = set(settings.TEMPLATE_DIRS) | set(TEMPLATE_DIRS) + + +class AskbotConfigGroup(ConfigurationGroup): + def __init__(self, key, name, *arg, **kwarg): + super(AskbotConfigGroup, self).__init__(key, name, *arg,**kwarg) + self.item_count = 0 + def new_int_setting(self, key, value, description): + self.item_count += 1 + setting = config_register(IntegerValue( + self, + key, + default=value, + description=description, + ordering=self.item_count + ) + ) + return setting diff --git a/askbot/sitemap.py b/askbot/sitemap.py new file mode 100644 index 00000000..0f8f7451 --- /dev/null +++ b/askbot/sitemap.py @@ -0,0 +1,14 @@ +from django.contrib.sitemaps import Sitemap +from askbot.models import Question + +class QuestionsSitemap(Sitemap): + changefreq = 'daily' + priority = 0.5 + def items(self): + return Question.objects.exclude(deleted=True) + + def lastmod(self, obj): + return obj.last_activity_at + + def location(self, obj): + return obj.get_absolute_url() diff --git a/askbot/skins/README b/askbot/skins/README new file mode 100755 index 00000000..01ef0a9d --- /dev/null +++ b/askbot/skins/README @@ -0,0 +1,22 @@ +this directory contains available skins + +1) default - default skin with templates +2) common - this directory is to media directory common to all or many templates + +to create a new skin just create another directory under skins/ +and start populating it with the directory structure as in +default/templates - templates must be named the same way + +NO NEED TO CREATE ALL TEMPLATES/MEDIA FILES AT ONCE + +templates are resolved in the following way: +* check in skin named as in settings.ASKBOT_DEFAULT_SKIN +* then skin named 'default' + +media is resolved with one extra option +* settings.ASKBOT_DEFAULT_SKIN +* 'default' +* 'common' + +media does not have to be composed of files named the same way as in default skin +whatever media you link to from your templates - will be in operation diff --git a/askbot/skins/__init__.py b/askbot/skins/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/askbot/skins/common/media/README b/askbot/skins/common/media/README new file mode 100755 index 00000000..3376e754 --- /dev/null +++ b/askbot/skins/common/media/README @@ -0,0 +1 @@ +directory for media common to all or many templates diff --git a/askbot/skins/common/media/js/closure/README.rst b/askbot/skins/common/media/js/closure/README.rst new file mode 100644 index 00000000..b7423694 --- /dev/null +++ b/askbot/skins/common/media/js/closure/README.rst @@ -0,0 +1,9 @@ +This directory contains source javascript files +written with Google Closure library + +* to start developing with closure here, run (Unix shell) script + setup-closure.sh (if your environment does not like the script + please take a look what's inside and replicate it for your system) +* please don't commit closure sources to our repo + i.e. add this line to .gitignore + forum/skins/common/media/js/closure/google-closure diff --git a/askbot/skins/common/media/js/closure/setup-closure.sh b/askbot/skins/common/media/js/closure/setup-closure.sh new file mode 100644 index 00000000..a3ebaf75 --- /dev/null +++ b/askbot/skins/common/media/js/closure/setup-closure.sh @@ -0,0 +1,12 @@ +svn checkout http://closure-library.googlecode.com/svn/trunk/ google-closure +mkdir google-closure/tools +mkdir google-closure/tools/compiler +cd google-closure/tools/compiler +wget http://closure-compiler.googlecode.com/files/compiler-latest.zip +unzip compiler-latest.zip +cd ../../.. +mkdir google-closure/tools/soy +cd google-closure/tools/soy +wget http://closure-templates.googlecode.com/files/closure-templates-for-javascript-latest.zip +unzip closure-templates-for-javascript-latest.zip +cd ../../ diff --git a/askbot/skins/default/media/images/blue-up-arrow-h18px.png b/askbot/skins/default/media/images/blue-up-arrow-h18px.png new file mode 100755 index 00000000..e1f29e86 Binary files /dev/null and b/askbot/skins/default/media/images/blue-up-arrow-h18px.png differ diff --git a/askbot/skins/default/media/images/box-arrow.gif b/askbot/skins/default/media/images/box-arrow.gif new file mode 100755 index 00000000..89dcf5b3 Binary files /dev/null and b/askbot/skins/default/media/images/box-arrow.gif differ diff --git a/askbot/skins/default/media/images/bullet_green.gif b/askbot/skins/default/media/images/bullet_green.gif new file mode 100755 index 00000000..fa530910 Binary files /dev/null and b/askbot/skins/default/media/images/bullet_green.gif differ diff --git a/askbot/skins/default/media/images/cc-88x31.png b/askbot/skins/default/media/images/cc-88x31.png new file mode 100755 index 00000000..0f2a0f10 Binary files /dev/null and b/askbot/skins/default/media/images/cc-88x31.png differ diff --git a/askbot/skins/default/media/images/cc-wiki.png b/askbot/skins/default/media/images/cc-wiki.png new file mode 100755 index 00000000..3e680538 Binary files /dev/null and b/askbot/skins/default/media/images/cc-wiki.png differ diff --git a/askbot/skins/default/media/images/close-small-dark.png b/askbot/skins/default/media/images/close-small-dark.png new file mode 100755 index 00000000..280c1fc7 Binary files /dev/null and b/askbot/skins/default/media/images/close-small-dark.png differ diff --git a/askbot/skins/default/media/images/close-small-hover.png b/askbot/skins/default/media/images/close-small-hover.png new file mode 100755 index 00000000..7899aec7 Binary files /dev/null and b/askbot/skins/default/media/images/close-small-hover.png differ diff --git a/askbot/skins/default/media/images/close-small.png b/askbot/skins/default/media/images/close-small.png new file mode 100755 index 00000000..5a99d31f Binary files /dev/null and b/askbot/skins/default/media/images/close-small.png differ diff --git a/askbot/skins/default/media/images/dash.gif b/askbot/skins/default/media/images/dash.gif new file mode 100755 index 00000000..d1ddc507 Binary files /dev/null and b/askbot/skins/default/media/images/dash.gif differ diff --git a/askbot/skins/default/media/images/djangomade124x25_grey.gif b/askbot/skins/default/media/images/djangomade124x25_grey.gif new file mode 100755 index 00000000..d34bb311 Binary files /dev/null and b/askbot/skins/default/media/images/djangomade124x25_grey.gif differ diff --git a/askbot/skins/default/media/images/dot-g.gif b/askbot/skins/default/media/images/dot-g.gif new file mode 100755 index 00000000..5d6bb28e Binary files /dev/null and b/askbot/skins/default/media/images/dot-g.gif differ diff --git a/askbot/skins/default/media/images/dot-list.gif b/askbot/skins/default/media/images/dot-list.gif new file mode 100755 index 00000000..f6a6b865 Binary files /dev/null and b/askbot/skins/default/media/images/dot-list.gif differ diff --git a/askbot/skins/default/media/images/edit.png b/askbot/skins/default/media/images/edit.png new file mode 100755 index 00000000..dcb09be0 Binary files /dev/null and b/askbot/skins/default/media/images/edit.png differ diff --git a/askbot/skins/default/media/images/expander-arrow-hide.gif b/askbot/skins/default/media/images/expander-arrow-hide.gif new file mode 100755 index 00000000..feb6a618 Binary files /dev/null and b/askbot/skins/default/media/images/expander-arrow-hide.gif differ diff --git a/askbot/skins/default/media/images/expander-arrow-show.gif b/askbot/skins/default/media/images/expander-arrow-show.gif new file mode 100755 index 00000000..6825c56e Binary files /dev/null and b/askbot/skins/default/media/images/expander-arrow-show.gif differ diff --git a/askbot/skins/default/media/images/favicon.gif b/askbot/skins/default/media/images/favicon.gif new file mode 100644 index 00000000..f7f9061b Binary files /dev/null and b/askbot/skins/default/media/images/favicon.gif differ diff --git a/askbot/skins/default/media/images/feed-icon-small.png b/askbot/skins/default/media/images/feed-icon-small.png new file mode 100755 index 00000000..b3c949d2 Binary files /dev/null and b/askbot/skins/default/media/images/feed-icon-small.png differ diff --git a/askbot/skins/default/media/images/gray-up-arrow-h18px.png b/askbot/skins/default/media/images/gray-up-arrow-h18px.png new file mode 100755 index 00000000..78767445 Binary files /dev/null and b/askbot/skins/default/media/images/gray-up-arrow-h18px.png differ diff --git a/askbot/skins/default/media/images/grippie.png b/askbot/skins/default/media/images/grippie.png new file mode 100755 index 00000000..6524d416 Binary files /dev/null and b/askbot/skins/default/media/images/grippie.png differ diff --git a/askbot/skins/default/media/images/indicator.gif b/askbot/skins/default/media/images/indicator.gif new file mode 100755 index 00000000..1c72ebb5 Binary files /dev/null and b/askbot/skins/default/media/images/indicator.gif differ diff --git a/askbot/skins/default/media/images/logo.gif b/askbot/skins/default/media/images/logo.gif new file mode 100644 index 00000000..03eb79f4 Binary files /dev/null and b/askbot/skins/default/media/images/logo.gif differ diff --git a/askbot/skins/default/media/images/logo.png b/askbot/skins/default/media/images/logo.png new file mode 100644 index 00000000..10559161 Binary files /dev/null and b/askbot/skins/default/media/images/logo.png differ diff --git a/askbot/skins/default/media/images/logo1.png b/askbot/skins/default/media/images/logo1.png new file mode 100755 index 00000000..d79a6271 Binary files /dev/null and b/askbot/skins/default/media/images/logo1.png differ diff --git a/askbot/skins/default/media/images/logo2.png b/askbot/skins/default/media/images/logo2.png new file mode 100755 index 00000000..bd3cccd9 Binary files /dev/null and b/askbot/skins/default/media/images/logo2.png differ diff --git a/askbot/skins/default/media/images/mail-envelope-empty.png b/askbot/skins/default/media/images/mail-envelope-empty.png new file mode 100644 index 00000000..0fde87dc Binary files /dev/null and b/askbot/skins/default/media/images/mail-envelope-empty.png differ diff --git a/askbot/skins/default/media/images/mail-envelope-full.png b/askbot/skins/default/media/images/mail-envelope-full.png new file mode 100644 index 00000000..2277e919 Binary files /dev/null and b/askbot/skins/default/media/images/mail-envelope-full.png differ diff --git a/askbot/skins/default/media/images/medala.gif b/askbot/skins/default/media/images/medala.gif new file mode 100755 index 00000000..93dd1a39 Binary files /dev/null and b/askbot/skins/default/media/images/medala.gif differ diff --git a/askbot/skins/default/media/images/medala_on.gif b/askbot/skins/default/media/images/medala_on.gif new file mode 100755 index 00000000..a18f9e85 Binary files /dev/null and b/askbot/skins/default/media/images/medala_on.gif differ diff --git a/askbot/skins/default/media/images/new.gif b/askbot/skins/default/media/images/new.gif new file mode 100755 index 00000000..8a220b53 Binary files /dev/null and b/askbot/skins/default/media/images/new.gif differ diff --git a/askbot/skins/default/media/images/nophoto.png b/askbot/skins/default/media/images/nophoto.png new file mode 100755 index 00000000..2daf0ffd Binary files /dev/null and b/askbot/skins/default/media/images/nophoto.png differ diff --git a/askbot/skins/default/media/images/openid.gif b/askbot/skins/default/media/images/openid.gif new file mode 100755 index 00000000..8540e12b Binary files /dev/null and b/askbot/skins/default/media/images/openid.gif differ diff --git a/askbot/skins/default/media/images/openid/aol.gif b/askbot/skins/default/media/images/openid/aol.gif new file mode 100755 index 00000000..decc4f12 Binary files /dev/null and b/askbot/skins/default/media/images/openid/aol.gif differ diff --git a/askbot/skins/default/media/images/openid/blogger.ico b/askbot/skins/default/media/images/openid/blogger.ico new file mode 100755 index 00000000..1b9730b0 Binary files /dev/null and b/askbot/skins/default/media/images/openid/blogger.ico differ diff --git a/askbot/skins/default/media/images/openid/claimid.ico b/askbot/skins/default/media/images/openid/claimid.ico new file mode 100755 index 00000000..2b80f491 Binary files /dev/null and b/askbot/skins/default/media/images/openid/claimid.ico differ diff --git a/askbot/skins/default/media/images/openid/facebook.gif b/askbot/skins/default/media/images/openid/facebook.gif new file mode 100755 index 00000000..b997b358 Binary files /dev/null and b/askbot/skins/default/media/images/openid/facebook.gif differ diff --git a/askbot/skins/default/media/images/openid/flickr.ico b/askbot/skins/default/media/images/openid/flickr.ico new file mode 100755 index 00000000..11f6e07f Binary files /dev/null and b/askbot/skins/default/media/images/openid/flickr.ico differ diff --git a/askbot/skins/default/media/images/openid/google.gif b/askbot/skins/default/media/images/openid/google.gif new file mode 100755 index 00000000..1b6cd07b Binary files /dev/null and b/askbot/skins/default/media/images/openid/google.gif differ diff --git a/askbot/skins/default/media/images/openid/livejournal.ico b/askbot/skins/default/media/images/openid/livejournal.ico new file mode 100755 index 00000000..f3d21ec5 Binary files /dev/null and b/askbot/skins/default/media/images/openid/livejournal.ico differ diff --git a/askbot/skins/default/media/images/openid/myopenid.ico b/askbot/skins/default/media/images/openid/myopenid.ico new file mode 100755 index 00000000..ceb06e6a Binary files /dev/null and b/askbot/skins/default/media/images/openid/myopenid.ico differ diff --git a/askbot/skins/default/media/images/openid/openid-inputicon.gif b/askbot/skins/default/media/images/openid/openid-inputicon.gif new file mode 100755 index 00000000..cde836c8 Binary files /dev/null and b/askbot/skins/default/media/images/openid/openid-inputicon.gif differ diff --git a/askbot/skins/default/media/images/openid/openid.gif b/askbot/skins/default/media/images/openid/openid.gif new file mode 100755 index 00000000..c718b0e6 Binary files /dev/null and b/askbot/skins/default/media/images/openid/openid.gif differ diff --git a/askbot/skins/default/media/images/openid/technorati.ico b/askbot/skins/default/media/images/openid/technorati.ico new file mode 100755 index 00000000..fa1083c1 Binary files /dev/null and b/askbot/skins/default/media/images/openid/technorati.ico differ diff --git a/askbot/skins/default/media/images/openid/twitter.png b/askbot/skins/default/media/images/openid/twitter.png new file mode 100755 index 00000000..9a6552d1 Binary files /dev/null and b/askbot/skins/default/media/images/openid/twitter.png differ diff --git a/askbot/skins/default/media/images/openid/verisign.ico b/askbot/skins/default/media/images/openid/verisign.ico new file mode 100755 index 00000000..3953af93 Binary files /dev/null and b/askbot/skins/default/media/images/openid/verisign.ico differ diff --git a/askbot/skins/default/media/images/openid/vidoop.ico b/askbot/skins/default/media/images/openid/vidoop.ico new file mode 100755 index 00000000..bbd9a0d5 Binary files /dev/null and b/askbot/skins/default/media/images/openid/vidoop.ico differ diff --git a/askbot/skins/default/media/images/openid/wordpress.ico b/askbot/skins/default/media/images/openid/wordpress.ico new file mode 100755 index 00000000..31b7d2c2 Binary files /dev/null and b/askbot/skins/default/media/images/openid/wordpress.ico differ diff --git a/askbot/skins/default/media/images/openid/yahoo.gif b/askbot/skins/default/media/images/openid/yahoo.gif new file mode 100755 index 00000000..0f0eb8ef Binary files /dev/null and b/askbot/skins/default/media/images/openid/yahoo.gif differ diff --git a/askbot/skins/default/media/images/quest-bg.gif b/askbot/skins/default/media/images/quest-bg.gif new file mode 100755 index 00000000..b7540238 Binary files /dev/null and b/askbot/skins/default/media/images/quest-bg.gif differ diff --git a/askbot/skins/default/media/images/vote-accepted-on.png b/askbot/skins/default/media/images/vote-accepted-on.png new file mode 100755 index 00000000..2026f3bc Binary files /dev/null and b/askbot/skins/default/media/images/vote-accepted-on.png differ diff --git a/askbot/skins/default/media/images/vote-accepted.png b/askbot/skins/default/media/images/vote-accepted.png new file mode 100755 index 00000000..ecd18551 Binary files /dev/null and b/askbot/skins/default/media/images/vote-accepted.png differ diff --git a/askbot/skins/default/media/images/vote-arrow-down-on.png b/askbot/skins/default/media/images/vote-arrow-down-on.png new file mode 100755 index 00000000..048dbb44 Binary files /dev/null and b/askbot/skins/default/media/images/vote-arrow-down-on.png differ diff --git a/askbot/skins/default/media/images/vote-arrow-down.png b/askbot/skins/default/media/images/vote-arrow-down.png new file mode 100755 index 00000000..e4fdec0a Binary files /dev/null and b/askbot/skins/default/media/images/vote-arrow-down.png differ diff --git a/askbot/skins/default/media/images/vote-arrow-up-on.png b/askbot/skins/default/media/images/vote-arrow-up-on.png new file mode 100755 index 00000000..56ad0c25 Binary files /dev/null and b/askbot/skins/default/media/images/vote-arrow-up-on.png differ diff --git a/askbot/skins/default/media/images/vote-arrow-up.png b/askbot/skins/default/media/images/vote-arrow-up.png new file mode 100755 index 00000000..6e9a51c7 Binary files /dev/null and b/askbot/skins/default/media/images/vote-arrow-up.png differ diff --git a/askbot/skins/default/media/images/vote-favorite-off.png b/askbot/skins/default/media/images/vote-favorite-off.png new file mode 100755 index 00000000..c1bef074 Binary files /dev/null and b/askbot/skins/default/media/images/vote-favorite-off.png differ diff --git a/askbot/skins/default/media/images/vote-favorite-on.png b/askbot/skins/default/media/images/vote-favorite-on.png new file mode 100755 index 00000000..1f9c14ab Binary files /dev/null and b/askbot/skins/default/media/images/vote-favorite-on.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/aol.gif b/askbot/skins/default/media/jquery-openid/images/aol.gif new file mode 100755 index 00000000..decc4f12 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/aol.gif differ diff --git a/askbot/skins/default/media/jquery-openid/images/blogger-1.png b/askbot/skins/default/media/jquery-openid/images/blogger-1.png new file mode 100755 index 00000000..8b360ea5 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/blogger-1.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/blogger.ico b/askbot/skins/default/media/jquery-openid/images/blogger.ico new file mode 100755 index 00000000..1b9730b0 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/blogger.ico differ diff --git a/askbot/skins/default/media/jquery-openid/images/claimid-0.png b/askbot/skins/default/media/jquery-openid/images/claimid-0.png new file mode 100755 index 00000000..4a0ea1b3 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/claimid-0.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/claimid.ico b/askbot/skins/default/media/jquery-openid/images/claimid.ico new file mode 100755 index 00000000..2b80f491 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/claimid.ico differ diff --git a/askbot/skins/default/media/jquery-openid/images/facebook.gif b/askbot/skins/default/media/jquery-openid/images/facebook.gif new file mode 100755 index 00000000..b997b358 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/facebook.gif differ diff --git a/askbot/skins/default/media/jquery-openid/images/flickr.ico b/askbot/skins/default/media/jquery-openid/images/flickr.ico new file mode 100755 index 00000000..11f6e07f Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/flickr.ico differ diff --git a/askbot/skins/default/media/jquery-openid/images/flickr.png b/askbot/skins/default/media/jquery-openid/images/flickr.png new file mode 100755 index 00000000..142405a6 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/flickr.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/google.gif b/askbot/skins/default/media/jquery-openid/images/google.gif new file mode 100755 index 00000000..1b6cd07b Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/google.gif differ diff --git a/askbot/skins/default/media/jquery-openid/images/livejournal-1.png b/askbot/skins/default/media/jquery-openid/images/livejournal-1.png new file mode 100755 index 00000000..e6436081 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/livejournal-1.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/livejournal.ico b/askbot/skins/default/media/jquery-openid/images/livejournal.ico new file mode 100755 index 00000000..f3d21ec5 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/livejournal.ico differ diff --git a/askbot/skins/default/media/jquery-openid/images/myopenid-2.png b/askbot/skins/default/media/jquery-openid/images/myopenid-2.png new file mode 100755 index 00000000..f64fb8e8 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/myopenid-2.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/myopenid.ico b/askbot/skins/default/media/jquery-openid/images/myopenid.ico new file mode 100755 index 00000000..ceb06e6a Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/myopenid.ico differ diff --git a/askbot/skins/default/media/jquery-openid/images/openid-inputicon.gif b/askbot/skins/default/media/jquery-openid/images/openid-inputicon.gif new file mode 100755 index 00000000..cde836c8 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/openid-inputicon.gif differ diff --git a/askbot/skins/default/media/jquery-openid/images/openid.gif b/askbot/skins/default/media/jquery-openid/images/openid.gif new file mode 100755 index 00000000..c718b0e6 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/openid.gif differ diff --git a/askbot/skins/default/media/jquery-openid/images/openidico.png b/askbot/skins/default/media/jquery-openid/images/openidico.png new file mode 100755 index 00000000..ab622669 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/openidico.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/openidico16.png b/askbot/skins/default/media/jquery-openid/images/openidico16.png new file mode 100755 index 00000000..ad718ac5 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/openidico16.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/technorati-1.png b/askbot/skins/default/media/jquery-openid/images/technorati-1.png new file mode 100755 index 00000000..f7195240 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/technorati-1.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/technorati.ico b/askbot/skins/default/media/jquery-openid/images/technorati.ico new file mode 100755 index 00000000..fa1083c1 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/technorati.ico differ diff --git a/askbot/skins/default/media/jquery-openid/images/verisign-2.png b/askbot/skins/default/media/jquery-openid/images/verisign-2.png new file mode 100755 index 00000000..c1467008 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/verisign-2.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/verisign.ico b/askbot/skins/default/media/jquery-openid/images/verisign.ico new file mode 100755 index 00000000..3953af93 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/verisign.ico differ diff --git a/askbot/skins/default/media/jquery-openid/images/vidoop.ico b/askbot/skins/default/media/jquery-openid/images/vidoop.ico new file mode 100755 index 00000000..bbd9a0d5 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/vidoop.ico differ diff --git a/askbot/skins/default/media/jquery-openid/images/vidoop.png b/askbot/skins/default/media/jquery-openid/images/vidoop.png new file mode 100755 index 00000000..032c9e98 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/vidoop.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/wordpress.ico b/askbot/skins/default/media/jquery-openid/images/wordpress.ico new file mode 100755 index 00000000..31b7d2c2 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/wordpress.ico differ diff --git a/askbot/skins/default/media/jquery-openid/images/wordpress.png b/askbot/skins/default/media/jquery-openid/images/wordpress.png new file mode 100755 index 00000000..ee29f0cf Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/wordpress.png differ diff --git a/askbot/skins/default/media/jquery-openid/images/yahoo.gif b/askbot/skins/default/media/jquery-openid/images/yahoo.gif new file mode 100755 index 00000000..42adbfa5 Binary files /dev/null and b/askbot/skins/default/media/jquery-openid/images/yahoo.gif differ diff --git a/askbot/skins/default/media/jquery-openid/jquery.openid.js b/askbot/skins/default/media/jquery-openid/jquery.openid.js new file mode 100755 index 00000000..eae7b3ea --- /dev/null +++ b/askbot/skins/default/media/jquery-openid/jquery.openid.js @@ -0,0 +1,111 @@ +//jQuery OpenID Plugin 1.1 Copyright 2009 Jarrett Vance http://jvance.com/pages/jQueryOpenIdPlugin.xhtml +$.fn.openid = function() { + var $this = $(this); + + //name input value - needed for name based OpenID + var $usr = $this.find('input[name=openid_username]'); + + //final url input value + var $id = $this.find('input[name=openid_url]'); + + //beginning and end of name OpenID url (name being the middle) + var $front = $this.find('p:has(input[name=openid_username])>span:eq(0)'); + var $end = $this.find('p:has(input[name=openid_username])>span:eq(1)'); + + //needed for special effects only + var $localfs = $this.find('fieldset:has(input[name=username])'); + var $usrfs = $this.find('fieldset:has(input[name=openid_username])'); + var $idfs = $this.find('fieldset:has(input[name=openid_url])'); + + var submitusr = function() { + if ($usr.val().length < 1) { + $usr.focus(); + return false; + } + $id.val($front.text() + $usr.val() + $end.text()); + return true; + }; + + var submitid = function() { + if ($id.val().length < 1) { + $id.focus(); + return false; + } + return true; + + }; + var local = function() { + var $li = $(this); + $('#openid_form .providers td').removeClass('highlight'); + $li.addClass('highlight'); + $usrfs.hide(); + $idfs.hide(); + $localfs.show(); + $this.unbind('submit').submit(submitid); + return false; + }; + + var direct = function() { + var $li = $(this); + $('#openid_form .providers td').removeClass('highlight'); + $li.addClass('highlight'); + $usrfs.fadeOut('slow'); + $localfs.fadeOut('slow'); + $idfs.fadeOut('slow'); + $id.val($this.find("td.highlight span").text()); + setTimeout(function(){$('#bsignin').click();},1000); + return false; + }; + + var openid = function() { + var $li = $(this); + $('#openid_form .providers td').removeClass('highlight'); + $li.addClass('highlight'); + $usrfs.hide(); + $localfs.hide(); + $idfs.show(); + $id.focus(); + $this.unbind('submit').submit(submitid); + return false; + }; + + var username = function() { + var $li = $(this); + $('#openid_form .providers td').removeClass('highlight'); + $li.addClass('highlight'); + $idfs.hide(); + $localfs.hide(); + $usrfs.show(); + $this.find('#enter_your_what').text($li.attr("title")); + $front.text($li.find("span").text().split("username")[0]); + $end.text("").text($li.find("span").text().split("username")[1]); + $id.focus(); + $this.unbind('submit').submit(submitusr); + return false; + }; + + $this.find('td.local').click(local); + $this.find('td.direct').click(direct); + $this.find('td.openid').click(openid); + $this.find('td.username').click(username); + $id.keypress(function(e) { + if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { + return submitid(); + } + }); + $usr.keypress(function(e) { + if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { + return submitusr(); + } + }); + $this.find('td span').hide(); + $this.find('td').css('line-height', 0).css('cursor', 'pointer'); + $usrfs.hide(); + $idfs.hide(); + $localfs.hide(); + $this.find('td:eq(0)').click(); + + return this; +}; +// submitting next=%2F&openid_username=&openid_url=http%3A%2F%2Fyahoo.com%2F +// submitting next=%2F&openid_username=&openid_url=http%3A%2F%2Fyahoo.com%2F diff --git a/askbot/skins/default/media/jquery-openid/openid.css b/askbot/skins/default/media/jquery-openid/openid.css new file mode 100755 index 00000000..307d5624 --- /dev/null +++ b/askbot/skins/default/media/jquery-openid/openid.css @@ -0,0 +1,79 @@ +fieldset { border-style:none; } +img {border-style:none;} + +.logo_box {width:90px;height:40px;background:white;border:1px solid #dddddd;} +.openid_box img {margin-top:6px;} +.aol_box img {margin-top:6px;} +.yahoo_box img {margin-top:13px;} +.google_box img {margin-top:6px;} +.local_login_box img {margin-top:2px;margin-left:-3px;} + +form.openid ul{ margin:0;padding:0;text-align:center; list-style-type:none; display:block;} +form.openid ul li {padding:4px;} +form.openid ul li span {padding:0 1em 0 3px} +form.openid ul li.first_tiny_li {clear:left;} +form.openid fieldset {clear:both;padding:10px 0px 0px 0px;} +form.openid div+fieldset {display:none} +input[name=openid_username] {width:8em} +input[name=openid_identifier] {width:18em} +form.openid ul li.highlight { -moz-border-radius:4px; -webkit-border-radius:4px; background-color: #FD6} +form.openid fieldset div { + -moz-border-radius:4px; + -webkit-border-radius:4px; + background: #DCDCDC; + padding:10px; + float:left; +} +form.openid p {margin-bottom:4px;} +form.openid fieldset div p {padding:0px;margin:0px;} +form.openid fieldset div p.login {padding:0px;margin:0 0 10px 0;} +form.openid label { + display:inline-block; + font-weight:normal; + width:6em; + text-align:right; +} +#local_login_fs div { + padding-bottom:4px; +} +#local_login_buttons { + text-align:center; + line-height:1.8em; + margin-top:3px; +} +/*form.openid input[type='submit'] {margin-left:1em;}*/ +#openid_username {background:#ffffa0;} +#openid_url {background:#ffffa0;} + +.openid_logo{color:#F7931E;padding:6px 0px 8px 28px; +background: url(images/openidico.png) no-repeat; +} + +#openid_login {float:left; width:30%; margin:2em 1em; text-align:center} +#openid_login div{margin-top:0.5em} + +form.openid ul.errorlist { + border: none; + list-style-position:inside; + list-style-type: disc; + margin-bottom:5px; +} +form.openid ul.errorlist li { + text-align: left; + margin: 5px; + float: none; + color:blue; +} +ul.providers { + clear:left; + float:left; +} +#openid_small_providers li { + margin-top:4px; +} +#openid_small_providers li.facebook { + margin-top:0px; +} +ul.providers { + display: block; +} diff --git a/askbot/skins/default/media/js/com.cnprog.admin.js b/askbot/skins/default/media/js/com.cnprog.admin.js new file mode 100644 index 00000000..39dff48c --- /dev/null +++ b/askbot/skins/default/media/js/com.cnprog.admin.js @@ -0,0 +1,13 @@ +$(document).ready( function(){ + var options = { + success: function(a,b){$('.admin #action_status').html($.i18n._('changes saved'));}, + dataType:'json', + timeout:5000, + url: scriptUrl + $.i18n._('moderate-user/') + viewUserID + '/' + }; + var form = $('.admin #moderate_user_form').ajaxForm(options); + var box = $('.admin input#id_is_approved').click(function(){ + $('.admin #action_status').html($.i18n._('sending data...')); + form.ajaxSubmit(options); + }); +}); diff --git a/askbot/skins/default/media/js/com.cnprog.editor.js b/askbot/skins/default/media/js/com.cnprog.editor.js new file mode 100644 index 00000000..18cc5166 --- /dev/null +++ b/askbot/skins/default/media/js/com.cnprog.editor.js @@ -0,0 +1,68 @@ +/* + jQuery TextAreaResizer plugin + Created on 17th January 2008 by Ryan O'Dell + Version 1.0.4 +*/(function($){var textarea,staticOffset;var iLastMousePos=0;var iMin=32;var grip;$.fn.TextAreaResizer=function(){return this.each(function(){textarea=$(this).addClass('processed'),staticOffset=null;$(this).wrap('
    ').parent().append($('
    ').bind("mousedown",{el:this},startDrag));var grippie=$('div.grippie',$(this).parent())[0];grippie.style.marginRight=(grippie.offsetWidth-$(this)[0].offsetWidth)+'px'})};function startDrag(e){textarea=$(e.data.el);textarea.blur();iLastMousePos=mousePosition(e).y;staticOffset=textarea.height()-iLastMousePos;textarea.css('opacity',0.25);$(document).mousemove(performDrag).mouseup(endDrag);return false}function performDrag(e){var iThisMousePos=mousePosition(e).y;var iMousePos=staticOffset+iThisMousePos;if(iLastMousePos>=(iThisMousePos)){iMousePos-=5}iLastMousePos=iThisMousePos;iMousePos=Math.max(iMin,iMousePos);textarea.height(iMousePos+'px');if(iMousePos1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i1){v=words.slice(0,words.length-1).join(options.multipleSeparator)+options.multipleSeparator+v;}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&¤tValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value){return[""];}var words=value.split(options.multipleSeparator);var result=[];$.each(words,function(i,value){if($.trim(value))result[i]=$.trim(value);});return result;}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$.Autocompleter.Selection(input,previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else +$input.val("");}});}if(wasVisible)$.Autocompleter.Selection(input,input.value.length,input.value.length);};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"$1");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else +if(data[q]){return data[q];}else +if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("
    ").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("
      ").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.Autocompleter.Selection=function(field,start,end){if(field.createTextRange){var selRange=field.createTextRange();selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}else if(field.setSelectionRange){field.setSelectionRange(start,end);}else{if(field.selectionStart){field.selectionStart=start;field.selectionEnd=end;}}field.focus();};})(jQuery); +/* + * TypeWatch 2.0 - Original by Denny Ferrassoli / Refactored by Charles Christolini + * Copyright(c) 2007 Denny Ferrassoli - DennyDotNet.com + * Coprright(c) 2008 Charles Christolini - BinaryPie.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +*/(function(jQuery){jQuery.fn.typeWatch=function(o){var options=jQuery.extend({wait:750,callback:function(){},highlight:true,captureLength:2},o);function checkElement(timer,override){var elTxt=jQuery(timer.el).val();if((elTxt.length>options.captureLength&&elTxt.toUpperCase()!=timer.text)||(override&&elTxt.length>options.captureLength)){timer.text=elTxt.toUpperCase();timer.cb(elTxt)}};function watchElement(elem){if(elem.type.toUpperCase()=="TEXT"||elem.nodeName.toUpperCase()=="TEXTAREA"){var timer={timer:null,text:jQuery(elem).val().toUpperCase(),cb:options.callback,el:elem,wait:options.wait};if(options.highlight){jQuery(elem).focus(function(){this.select()})}var startWatch=function(evt){var timerWait=timer.wait;var overrideBool=false;if(evt.keyCode==13&&this.type.toUpperCase()=="TEXT"){timerWait=1;overrideBool=true}var timerCallbackFx=function(){checkElement(timer,overrideBool)};clearTimeout(timer.timer);timer.timer=setTimeout(timerCallbackFx,timerWait)};jQuery(elem).keydown(startWatch)}};return this.each(function(index){watchElement(this)})}})(jQuery); +/* +Ajax upload +*/jQuery.extend({createUploadIframe:function(d,b){var a="jUploadFrame"+d;if(window.ActiveXObject){var c=document.createElement('