Quantcast
Channel: Discourse Meta - Latest topics
Viewing all 60642 articles
Browse latest View live

Losing lines of text when using space bar to scroll

$
0
0

Alexander wrote:

When using the space bar to scroll down by a page-height, the top bar covers up the first few lines of text at the top of the page. This effectively breaks the ability to read a thread and use the space bar to scroll through it.

Posts: 6

Participants: 3

Read full topic


How are you dealing with discourse template customizations?

$
0
0

Alexandre Angelim wrote:

Continuing the discussion from Injecting Templates into Templates through plugins - introducing HAQL:

Until @lightyear proposal is incorporated into discourse we're bound to replace whole template files in our plugins. How are you organizing this? I'm developing a new plugin for each feature I need, but just now I got to a point where I need to override the same template in different plugins. More precisely, I have to override a template that's already been overridden by a third party plugin.

Are you doing in-house plugins per feature or organizing them in modules inside a big Site Customizations plugin?

Posts: 1

Participants: 1

Read full topic

Pre-moderating messages

$
0
0

Neil wrote:

How do I set up pre-moderation of messages?

Just in way of explanation, the forum that I would like to be using discourse for will be discussing issues which have privacy implications and therefore we are wanting to pre-moderate messages.

Posts: 4

Participants: 4

Read full topic

Internal Error 500 when trying to save post (no update was done)

$
0
0

German Viscuso wrote:

Hi.

A user reported this error on our instance running on 0.9.8.7 when trying to post an answer "Unknown error saving post, try again. Error: 500 Internal Server Error". I know it's not the latest version (we can't upgrade right now) but the instance have been working perfectly. The only thing that changed is that we have a few rules triggering for repeated posts (detected as spam).
I checked discourse log file and get the following error:

production_errors.log

hash>
  <date type="dateTime">2014-04-11T05:42:19+00:00</date>
  <guid>9105397e-89cc-4558-a6a9-9d862ec2d1a3</guid>
  <user-id type="integer">25</user-id>
  <parameters>{"raw":"Sorry for inconvenient.\nWe are going to solve this problem.\nPlease wait until we upgrade the Unity SDK.\nNew SDK has the following benefits.\n\nSupports the WebPlayer\nSupports the Code Stripping\nAsync callback are called from the UI thread, so developers can access Unity objects from callbacks\n\nFollowing is workaround.\n\n1. Implements TheadUtils to execute the Action on main thread.\n2. Create an empty GameObject and attach the TheadUtils script component to it.\n3. Sets the downloaded image to the Plane using the TreadUtils.\n\n    public class TheadUtils : MonoBehaviour {\n\n\tprivate readonly static ReaderWriterLockSlim requestQueueLock;\n\tprivate readonly static Queue\u003CAction\u003E requestQueue;\n\n\tstatic TheadUtils () {\n\t\trequestQueueLock = new ReaderWriterLockSlim ();\n\t\trequestQueue = new Queue\u003CAction\u003E ();\n\t}\n\tvoid Awake ()\n\t{\n\t\tStartCoroutine (RunLoop());\n\t}\n\tpublic static void RunOnMainThread(Action action)\n\t{\n\t\tif (TheadUtils.requestQueueLock.IsWriteLockHeld)\n\t\t{\n\t\t\tTheadUtils.requestQueue.Enqueue(action);\n\t\t\treturn;\n\t\t}\n\t\tTheadUtils.requestQueueLock.EnterWriteLock();\n\t\ttry\n\t\t{\n\t\t\tTheadUtils.requestQueue.Enqueue(action);\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tTheadUtils.requestQueueLock.ExitWriteLock();\n\t\t}\n\t}\n\tpublic static IEnumerator RunLoop()\n\t{\n\t\twhile (true)\n\t\t{\n\t\t\tTheadUtils.requestQueueLock.EnterUpgradeableReadLock();\n\t\t\ttry\n\t\t\t{\n\t\t\t\tint count = TheadUtils.requestQueue.Count;\n\t\t\t\tif (count \u003E 0)\n\t\t\t\t{\n\t\t\t\t\tTheadUtils.requestQueueLock.EnterWriteLock();\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\twhile (count \u003E 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tTheadUtils.requestQueue.Dequeue()();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch (Exception ignore)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDebug.Log(ignore.Message);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcount--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfinally\n\t\t\t\t\t{\n\t\t\t\t\t\tTheadUtils.requestQueueLock.ExitWriteLock();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tTheadUtils.requestQueueLock.ExitUpgradeableReadLock();\n\t\t\t}\n\t\t\tyield return null;\n\t\t}\n\t}\n}\n\n\n    obj.DownloadBody(file\n\t, (KiiObject obj2, Stream s, Exception e) =\u003E {\n\t\tif (e != null)\n\t\t{\n\t\t\tstring message = \"Failed to download the body \" + e.ToString();\n\t\t\tDebug.Log(message);\n\t\t\treturn;\n\t\t}\n\t\tTheadUtils.RunOnMainThread(()=\u003E{\n\t\t\tTexture2D tex = new Texture2D(512, 512);\n\t\t\ts.Seek(0, SeekOrigin.Begin);\n\t\t\ttex.LoadImage(((MemoryStream)s).ToArray());\n\t\t\ttex.Apply();\n\t\t\tGameObject.Find(\"Plane\").renderer.material.mainTexture  = tex;\n\t\t\ts.Close();\n\t\t});\n\t}\n\t, (KiiObject obj3, long doneByte, long totalByte) =\u003E {\n\t\tstring message = String.Format(\"{0} / {1}\", doneByte, totalByte);\n\t\tDebug.Log(message);\n\t}\n);\n\n\n","topic_id":"511","reply_to_post_number":"","category":"16","archetype":"regular","auto_close_time":"","action":"create","controller":"posts"}</parameters>
  <action>create</action>
  <controller>posts</controller>
  <backtrace>[RAILS_ROOT]/lib/pretty_text.rb:149:in `block in markdown'
[RAILS_ROOT]/lib/pretty_text.rb:270:in `block in protect'
[RAILS_ROOT]/lib/pretty_text.rb:268:in `synchronize'
[RAILS_ROOT]/lib/pretty_text.rb:268:in `protect'
[RAILS_ROOT]/lib/pretty_text.rb:130:in `markdown'
[RAILS_ROOT]/lib/pretty_text.rb:169:in `cook'
[RAILS_ROOT]/app/models/post_analyzer.rb:12:in `cook'
[RAILS_ROOT]/app/models/post_analyzer.rb:113:in `cooked_document'
[RAILS_ROOT]/app/models/post_analyzer.rb:58:in `raw_mentions'
[RAILS_ROOT]/app/models/post.rb:128:in `block (2 levels) in &lt;class:Post&gt;'
[RAILS_ROOT]/lib/validators/post_validator.rb:38:in `max_mention_validator'
[RAILS_ROOT]/lib/validators/post_validator.rb:9:in `validate'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/callbacks.rb:283:in `_callback_before_39'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/callbacks.rb:467:in `_run__635069948175110462__validate__callbacks'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/callbacks.rb:80:in `run_callbacks'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activemodel-4.0.3/lib/active_model/validations.rb:373:in `run_validations!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activemodel-4.0.3/lib/active_model/validations/callbacks.rb:106:in `block in run_validations!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/callbacks.rb:373:in `_run__635069948175110462__validation__callbacks'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/callbacks.rb:80:in `run_callbacks'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activemodel-4.0.3/lib/active_model/validations/callbacks.rb:106:in `run_validations!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activemodel-4.0.3/lib/active_model/validations.rb:314:in `valid?'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/validations.rb:70:in `valid?'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/validations.rb:77:in `perform_validations'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/validations.rb:51:in `save'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/attribute_methods/dirty.rb:32:in `save'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/transactions.rb:270:in `block (2 levels) in save'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/transactions.rb:326:in `block in with_transaction_returning_status'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:200:in `transaction'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/transactions.rb:209:in `transaction'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/transactions.rb:323:in `with_transaction_returning_status'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/transactions.rb:270:in `block in save'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/transactions.rb:281:in `rollback_active_record_state!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/transactions.rb:269:in `save'
[RAILS_ROOT]/lib/post_creator.rb:215:in `save_post'
[RAILS_ROOT]/lib/post_creator.rb:60:in `block in create'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `block in transaction'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:210:in `within_new_transaction'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `transaction'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/transactions.rb:209:in `transaction'
[RAILS_ROOT]/lib/post_creator.rb:56:in `create'
[RAILS_ROOT]/app/controllers/posts_controller.rb:36:in `block in create'
[RAILS_ROOT]/lib/distributed_memoizer.rb:28:in `memoize'
[RAILS_ROOT]/app/controllers/posts_controller.rb:34:in `create'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/abstract_controller/base.rb:189:in `process_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_controller/metal/rendering.rb:10:in `process_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/abstract_controller/callbacks.rb:18:in `block in process_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/callbacks.rb:493:in `_run__342236020274452941__process_action__callbacks'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/callbacks.rb:80:in `run_callbacks'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/abstract_controller/callbacks.rb:17:in `process_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_controller/metal/rescue.rb:29:in `process_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/notifications.rb:159:in `block in instrument'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/notifications.rb:159:in `instrument'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/railties/controller_runtime.rb:18:in `process_action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/abstract_controller/base.rb:136:in `process'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/abstract_controller/rendering.rb:44:in `process'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-mini-profiler-0.9.0/lib/mini_profiler/profiling_methods.rb:108:in `block in profile_method'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_controller/metal.rb:195:in `dispatch'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_controller/metal.rb:231:in `block in action'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/routing/route_set.rb:80:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/routing/route_set.rb:48:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/journey/router.rb:71:in `block in call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/journey/router.rb:59:in `each'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/journey/router.rb:59:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/routing/route_set.rb:680:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-protection-1.5.2/lib/rack/protection/frame_options.rb:31:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:186:in `call!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:164:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:186:in `call!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:164:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:186:in `call!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:164:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:186:in `call!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:164:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:186:in `call!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/strategy.rb:164:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/omniauth-1.2.1/lib/omniauth/builder.rb:59:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/etag.rb:23:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/conditionalget.rb:35:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/head.rb:11:in `call'
[RAILS_ROOT]/lib/middleware/anonymous_cache.rb:104:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/params_parser.rb:27:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/flash.rb:241:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:225:in `context'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:220:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/cookies.rb:486:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/message_bus-0.9.4/lib/message_bus/rack/middleware.rb:55:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/query_cache.rb:36:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/callbacks.rb:373:in `_run__1417918782866733705__call__callbacks'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/callbacks.rb:80:in `run_callbacks'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/callbacks.rb:27:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-4.0.3/lib/rails/rack/logger.rb:38:in `call_app'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-4.0.3/lib/rails/rack/logger.rb:20:in `block in call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/tagged_logging.rb:67:in `block in tagged'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/tagged_logging.rb:25:in `tagged'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/tagged_logging.rb:67:in `tagged'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-4.0.3/lib/rails/rack/logger.rb:20:in `call'
[RAILS_ROOT]/config/initializers/quiet_logger.rb:10:in `call_with_quiet_assets'
[RAILS_ROOT]/config/initializers/silence_logger.rb:19:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/request_id.rb:21:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/methodoverride.rb:21:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/runtime.rb:17:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/sendfile.rb:112:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-mini-profiler-0.9.0/lib/mini_profiler/profiler.rb:298:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-4.0.3/lib/rails/engine.rb:511:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-4.0.3/lib/rails/application.rb:97:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-4.0.3/lib/rails/railtie/configurable.rb:30:in `method_missing'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:138:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb:65:in `block in call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb:50:in `each'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb:50:in `call'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/connection.rb:82:in `block in pre_process'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/connection.rb:80:in `catch'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/connection.rb:80:in `pre_process'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/connection.rb:55:in `process'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/connection.rb:41:in `receive_data'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run_machine'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/backends/base.rb:73:in `start'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/server.rb:162:in `start'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/controllers/controller.rb:87:in `start'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/runner.rb:200:in `run_command'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/lib/thin/runner.rb:156:in `run!'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/gems/thin-1.6.1/bin/thin:6:in `&lt;top (required)&gt;'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/bin/thin:23:in `load'
[RAILS_ROOT]/vendor/bundle/ruby/2.0.0/bin/thin:23:in `&lt;main&gt;'</backtrace>
  <message>Script Timed Out</message>
  <url>http://community.kii.com/posts</url>
  <exception-class>PrettyText::JavaScriptError</exception-class>
</hash>

production.log

Started GET "/latest.json" for 124.33.163.178 at 2014-04-11 05:42:05 +0000
Processing by ListController#latest as JSON
Completed 200 OK in 250ms (Views: 0.3ms | ActiveRecord: 46.0ms)
Started GET "/latest.json?no_definitions=true&page=1" for 124.33.163.178 at 2014-04-11 05:42:06 +0000
Processing by ListController#latest as JSON
  Parameters: {"no_definitions"=>"true", "page"=>"1"}
Completed 200 OK in 205ms (Views: 0.3ms | ActiveRecord: 94.2ms)
Started POST "/posts" for 124.33.163.178 at 2014-04-11 05:42:13 +0000
Processing by PostsController#create as */*
  Parameters: {"raw"=>"Sorry for inconvenient.\nWe are going to solve this problem.\nPlease wait until we upgrade the Unity SDK.\nNew SDK has the following benefits.\n\nSupports the WebPlayer\nSupports the Code Stripping\nAsync callback are called from the UI thread, so developers can access Unity objects from callbacks\n\nFollowing is workaround.\n\n1. Implements TheadUtils to execute the Action on main thread.\n2. Create an empty GameObject and attach the TheadUtils script component to it.\n3. Sets the downloaded image to the Plane using the TreadUtils.\n\n    public class TheadUtils : MonoBehaviour {\n\n\tprivate readonly static ReaderWriterLockSlim requestQueueLock;\n\tprivate readonly static Queue<Action> requestQueue;\n\n\tstatic TheadUtils () {\n\t\trequestQueueLock = new ReaderWriterLockSlim ();\n\t\trequestQueue = new Queue<Action> ();\n\t}\n\tvoid Awake ()\n\t{\n\t\tStartCoroutine (RunLoop());\n\t}\n\tpublic static void RunOnMainThread(Action action)\n\t{\n\t\tif (TheadUtils.requestQueueLock.IsWriteLockHeld)\n\t\t{\n\t\t\tTheadUtils.requestQueue.Enqueue(action);\n\t\t\treturn;\n\t\t}\n\t\tTheadUtils.requestQueueLock.EnterWriteLock();\n\t\ttry\n\t\t{\n\t\t\tTheadUtils.requestQueue.Enqueue(action);\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tTheadUtils.requestQueueLock.ExitWriteLock();\n\t\t}\n\t}\n\tpublic static IEnumerator RunLoop()\n\t{\n\t\twhile (true)\n\t\t{\n\t\t\tTheadUtils.requestQueueLock.EnterUpgradeableReadLock();\n\t\t\ttry\n\t\t\t{\n\t\t\t\tint count = TheadUtils.requestQueue.Count;\n\t\t\t\tif (count > 0)\n\t\t\t\t{\n\t\t\t\t\tTheadUtils.requestQueueLock.EnterWriteLock();\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\twhile (count > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tTheadUtils.requestQueue.Dequeue()();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch (Exception ignore)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDebug.Log(ignore.Message);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcount--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfinally\n\t\t\t\t\t{\n\t\t\t\t\t\tTheadUtils.requestQueueLock.ExitWriteLock();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tTheadUtils.requestQueueLock.ExitUpgradeableReadLock();\n\t\t\t}\n\t\t\tyield return null;\n\t\t}\n\t}\n}\n\n\n    obj.DownloadBody(file\n\t, (KiiObject obj2, Stream s, Exception e) => {\n\t\tif (e != null)\n\t\t{\n\t\t\tstring message = \"Failed to download the body \" + e.ToString();\n\t\t\tDebug.Log(message);\n\t\t\treturn;\n\t\t}\n\t\tTheadUtils.RunOnMainThread(()=>{\n\t\t\tTexture2D tex = new Texture2D(512, 512);\n\t\t\ts.Seek(0, SeekOrigin.Begin);\n\t\t\ttex.LoadImage(((MemoryStream)s).ToArray());\n\t\t\ttex.Apply();\n\t\t\tGameObject.Find(\"Plane\").renderer.material.mainTexture  = tex;\n\t\t\ts.Close();\n\t\t});\n\t}\n\t, (KiiObject obj3, long doneByte, long totalByte) => {\n\t\tstring message = String.Format(\"{0} / {1}\", doneByte, totalByte);\n\t\tDebug.Log(message);\n\t}\n);\n\n\n", "topic_id"=>"511", "reply_to_post_number"=>"", "category"=>"16", "archetype"=>"regular", "auto_close_time"=>""}
Completed 500 Internal Server Error in 5115ms

PrettyText::JavaScriptError (Script Timed Out):
  lib/pretty_text.rb:149:in `block in markdown'
  lib/pretty_text.rb:270:in `block in protect'
  lib/pretty_text.rb:268:in `synchronize'
  lib/pretty_text.rb:268:in `protect'
  lib/pretty_text.rb:130:in `markdown'
  lib/pretty_text.rb:169:in `cook'
  app/models/post_analyzer.rb:12:in `cook'
  app/models/post_analyzer.rb:113:in `cooked_document'
  app/models/post_analyzer.rb:58:in `raw_mentions'
  app/models/post.rb:128:in `block (2 levels) in <class:Post>'
  lib/validators/post_validator.rb:38:in `max_mention_validator'
  lib/validators/post_validator.rb:9:in `validate'
  lib/post_creator.rb:215:in `save_post'
  lib/post_creator.rb:60:in `block in create'
  lib/post_creator.rb:56:in `create'
  app/controllers/posts_controller.rb:36:in `block in create'
  lib/distributed_memoizer.rb:28:in `memoize'
  app/controllers/posts_controller.rb:34:in `create'
  lib/middleware/anonymous_cache.rb:104:in `call'
  config/initializers/quiet_logger.rb:10:in `call_with_quiet_assets'
  config/initializers/silence_logger.rb:19:in `call'


Started GET "/t/build-a-whatsapp-clone-in-a-day/502/wordpress.json?best=20&min_trust_level=0&min_score=0&min_replies=0&bypass_trust_level_score=0" for 127.0.0.1 at 2014-04-11 05:42:21 +0000
Processing by TopicsController#wordpress as JSON
  Parameters: {"best"=>"20", "min_trust_level"=>"0", "min_score"=>"0", "min_replies"=>"0", "bypass_trust_level_score"=>"0", "slug"=>"build-a-whatsapp-clone-in-a-day", "topic_id"=>"502"}
Completed 200 OK in 91ms (Views: 0.2ms | ActiveRecord: 9.2ms)

Do you guys have a clue of what the problem could be by taking a look at the logs above?
Thx a lot for your help.

Posts: 2

Participants: 2

Read full topic

Show what action was taken and by who for Flags

$
0
0

cpradio wrote:

Okay, another thing I am not seeing, or haven't figured out how to see it, is to tell who performed an action on a flag (if any was taken).

Example: UserA flags UserB's post as inappropriate, ModA sees the flag, and hides the post.

How do I as an Admin/Mod tell that ModA took action against UserB's post?

Posts: 2

Participants: 2

Read full topic

Best practices for organizing forum?

$
0
0

Daniel Lopez wrote:

Not sure if this is the right category. I have been reading some threads related to categorization (http://meta.discourse.org/t/forum-categories-as-social-isolation-not-as-information-organization/649/26) and I was wondering if somebody with more experience could provide advice on how to organize our forum.

We plan on moving our Q&A site http://answers.bitnami.com to a Discourse forum. We do not know which categories to create. We were thinking of having one per application that we support (wordpress, drupal, redmine, etc.) but many of the questions are generic or related to running a virtual machine or cloud image, not related to an app in particular. We currently support 70+ apps and are concerned of what will happen if we grow to thousands of apps. Any thoughts? Is there a "best practices" guide somewhere or well-organized forums that we could look for ideas? Thanks!

Posts: 3

Participants: 3

Read full topic

Should we disable the like button for closed topics?

$
0
0

Alexandre Angelim wrote:

I've just noticed the like button isn't available if the topic is closed. What's the motivation for that?
Myself, for instance, would like to show appreciation if a given post helped me, regardless of its status.

Posts: 5

Participants: 3

Read full topic

Never downloading from certain domains


Highlight top contributors?

$
0
0

Craig Oda wrote:

Continuing the discussion from Trust Level 3 Requirements Final?:

is there a way to highlight top users with a graphic, badge or other type of recognition? I would like to reward people for positive behavior by giving them fame. If this doesn't exist, is there a way to show people at the top trust level and give them fame? Thanks for any pointers.

See the example below in the site I'm trying to copy. The main criteria for the top contributor is the number of likes by week.

Posts: 2

Participants: 2

Read full topic

Best practices for forum moderators

$
0
0

Alexandre Angelim wrote:

Continuing the discussion from Best practices for organizing forum?:

On multiple occasions I've seen @codinghorror change the title of a topic. For instance, he does that when the original title was related to something that was solved or based in incorrect assumptions, but was repurposed during its course in a manner that would still help others. This is brilliant! My initial thought was just to close the topic, but I can see how that would be a mistake after experiencing this.

Are there other best practices you could share to people like me, just starting in the forum scene?

Posts: 3

Participants: 2

Read full topic

System sends a notification to the user when images are pooled from scheduled jobs

$
0
0

Alexandre Angelim wrote:

I couldn't replicate this at try.discourse but on my install I got a notification when the image was imported. The notification is sent by "system" which is a user I wouldn't like people to know exists.

Can I disable this notification?

Posts: 8

Participants: 3

Read full topic

Better recognition for image URLs

$
0
0

Alexandre Angelim wrote:

Most of Rails applications append a query string on image URLs to manage versioning. I don't know if this is common practice for other frameworks, but I've stumbled upon many sites using this approach.

When pasting(in the composer) an image url with a query string, discourse doesn't seem to recognize it and leaves a link, instead. Can we parse the url taking that into account or is there another caveat I'm not considering?

Posts: 7

Participants: 4

Read full topic

New tab setting not respected in expanded blog posts

$
0
0

Kane York wrote:

Reproduction steps:

  • Enable external links in new tab
  • Go here
  • Click Show Full Post
  • Click the second link
  • Balk that the page was replaced and you have to do a full load of Discourse again

Posts: 1

Participants: 1

Read full topic

Injecting Templates into Templates through plugins - introducing HAQL

$
0
0

Benjamin Kampmann wrote:

As already mentioned in the case-study about archetypes, the proposal for a plugin architecture and the tagger plugin, I have been investigating how plugins could extend templates without having to rely on on('didInsertElement) and the necessity to overwrite the whole plugin. Which turned out to be simpler than I expected.

Of course, you don't want to inject any template-code into the raw-handlebars-string. That would require some ugly sed-regexp-change-and-replace-magic. On the other end of the only have the rendered DOM-objects, where we have easy queries and ways to inject elements in a very nice fashion. Unfortunately DOM-manipulations are slow but even worth this injection works follow on-top (aka) after the handlebars/emberjs rendering magic and can easily interfere with that especially if that contains state-changing-{#if ..}-statements and {#each} loops. A pain to try to stick up-to-date with those.

If only there was an intermediate state in which we have a Javascript-objects-based representation of the template which we could manipulate before it gets compiled into a function. Turns out there is!

Handlebars, as it turns out, does compile templates in these three steps:

  1. use Handlebars.parse to generate an Abstract-Syntax-Tree of the template
  2. create the encapsulated environment and put the AST-object into it
  3. compile all of that with performance optimisation into a callable Javascript function.

And right there, between step 1 and 2, we have our Objects parsed from the template string into a query-able Object-tree. YAY. So I've made a little experiment in which we are overwriting the the default Handlebars.parse function and encapsulate it and passes its output through a list of injectors, that got previously registered. They then can manipulate that AST object, inject it's own parsed-template at very precise positions or even replace any given template data.

Unfortunately the AST-API isn't very pretty nor super-handy or made for traversing. So I've build a tiny query-language on top called Handlebars AST Query Language (HAQL) in order to make my hardest position case – inject the "tags"-rendering-snippet after the H1 of the topic, which is rendered within two {#if}-blocks – easily read- and writeable. This is what it looks like:

var patcher = Ember.TemplatePatcher;
patcher.addGeneralPatcher("061dd3942f735486fbc91b5c7dfcf7a6", function(ast, hash, str){
    opts = {"shift": 1};
    Ember.TemplatePatcher.insertAt(ast, "if if if-else if[2]",
        '{{#if model.tags}}' +
          '<div class="tagger-tags-view">' +
            '<span>tagged:</span>' +
            '{{#each model.tags}}' +
                '<a href="/tag/{{unbound this}}" class="tagger-tag">{{this}}</a>' +
            '{{/each}}' +
          '</div>' +
        '{{/if}}', opts);
});

The way this works is as follows: Ember.TemplatePatcher is a new object you can register said injector at. I have currently only the "GeneralPatcher" implemented but later I'd like to also have a few more common patterns directly at the finger tips. The first parameter you pass to the registration is an md5 hash of the template, the second is a function that will be called with the AST, the Hash and the original string. If that returns a new object, it is assumed to be an AST to be used instead (which allows to create a new AST-object encapsulating the existing template in total for e.g. inside a {#if topic.articleArchetyp}...{#else}{/if})

The reason why this uses a hash had first an id-constrain-reason, as we from within handlebars don't know about the path or any other ID of the template and needed a way to id them for lookup – md5 is already part of our UI-toolchain, so, easy choice. But on second thought I actually like the idea a lot because as this is a rather sensitive part of the system the author should be really sure that this is the template at a certain version. With the md5 in place, you would have to add another hash for each update but that also ensure you are compatible on something where API/ABI-Versioning doesn't exist.

Coming back to the actual UI. As said, the injection isn't at an easy position and the AST does build a tree internally, so we need to traverse that tree to find the right position. Therefore insertAt doesn't only take a number as its second parameter but also a optionally a HAQL-query string – if if if-else if[2] in this case. It means: "go into the first if, then again the first if, then the first else and then the position after the second if". And with the optional "shift" parameter I can tell it mess around that position (as – unfortunately – the tree isn't building for non-mustache-objects) making it move by another piece after the h1.

At this position it then parses the given string (with Handlebars.parse, so it could potentially also be having injections) and adds the statements behind that position and that way become part of the official to-be-compiled template that is then rendered later including all features, the context and everything (as you can see in the example code). Adding features – like rendering tags under a topic title – with just a function call and no previously to-be-defined and potentially performance-heavy hooks in core-templates.


As said adding replace and maybe wrap-in-if are other very likely APIs to be added here. The only other changes this requires in core is another, additional hook-point for plugins. As their JS-assets are currently only included after the templates have been rendered, injection isn't possible. But with just an additional "injectTemplates"-hook that is rendering through the asset pipeline right before the templates are rendered, this would be totally fine. Which is what I am currently doing, it is just not looking up any plugin-assets yet.

Any feedback? Suggestions? Thoughts?

Posts: 3

Participants: 2

Read full topic

Tagger: tags for topics

$
0
0

Benjamin Kampmann wrote:

Hey there,

I'm pleased to announce the first tagging-plugin for discourse, called Tagger. I consider it now stable enough for more a wider usage, it however still is a little quirky on mobile if you aren't running on master from last night. So, the first officially supported version is probably going to be 0.9.9.1 of discourse.

It looks something like this:

Tags can be added with the composer:

Or through the inline editor:

Important: Tags are and can only be added to topics.


From the Readme:

Discourse Tagger Plugin

A simple Plugin to allow users to attach labels (so called "tags") to their topics.

Details

This Plugins assumes tags are "moderated", meaning that only staff and users of the trust levels "leader" and "elder" are allowed to add new tags. Normal user can only pick from the list of pre-existing tags.

Attention: renders weird in mobile view with discourse <= 0.9.9 . Please upgrade to master.

Installation

Just two easy steps. From your main discourse do:

    cd plugins
    git clone https://github.com/werweisswas/discourse-plugin-tagger.git   # clone the repo here
    cd ..
    export RAILS_ENV=production                 # set to productions
    rake tagger:install:migrations              # copy migrations
    rake db:migrate SCOPE=tagger                # run migrations
    rake assets:precompile                      # precompile assets

As usual, bug reports please on github, feedback and questions are welcome here and over IRC (I'm lightyear).

Enjoy!

Posts: 11

Participants: 6

Read full topic


Create moderator reply with any text

$
0
0

Kane York wrote:

Live use-case: http://discourse.codinghorror.com/t/via-quote/612/1

There is no method to insert a moderator post into a topic (a moderator post is one colored by the CSS selector of .moderator .topic-body), other than hacks such as "Close, Reopen, edit one of the posts, delete the other".

Proposed UI

Add a button to the topic wrench menu:

The button should open the composer with a flag set somewhere to make the post a 'moderator' post, the server should validate that you're allowed to do that, and set the flag on the post.

Next steps

After that, it would be nice if you could move the post up in the topic. But perhaps a different approach is needed for that, more like what you see on Stack Exchange.

Posts: 2

Participants: 2

Read full topic

How to disable invites without enabling "must approve users" (when using external SSO)?

$
0
0

Yuri wrote:

My situation:

I've set up my instance of discourse to use SSO with my own external site for authentication purposes. This is working as expected and I have no issues with it. Getting it set up was easy. Great work! stuck_out_tongue

My goal with using SSO is to always have the users of my discourse forum (1) create their discourse user accounts via SSO'ing via my external site and (2) only use SSO to log on. I also want my external site to be the only place where users can change their email and user name, so I have also set "sso_overrides_email" to true, "sso_overrides_username" to true, and "email_editable" to false. This is all working as expected.

My issue:

The whole notion of invites in discourse (at least as they are currently implemented) doesn't play nicely with discourse as I have set it up. As an admin, moderator, or user with a trust level greater than two, a user can send invites out to any email address. When the link in these invites is used, a user account is then auto-generated for that email on my discourse instance, but this is bad since no corresponding user with that email address is guaranteed to be already created on my external site (that is used SSO).

Solutions?

There are most likely multiple solutions for this, but what would likely be easiest to implement (and totally A-OK for my needs) would be a simple "Disable Invites" checkbox in the admin User settings.

Thoughts?

Thanks!

One last note:

I read on semi-related thread that one could disable invites by enabling "must_approve_users", but that doesn't work in my case for two reasons. (1) When "must_approve_users" is enabled, if a user tries to login via sso for the first time, they are just dropped back on the discourse page and are not logged in. They is no notification that they just had their account created and an admin now must activate there account. (2) For our situation, we don't want to have to activate each and every user. Anyone with an account on our external site should be allowed to have an account on our discourse instance.

Posts: 2

Participants: 2

Read full topic

Pinned topic not appearing to be pinned

$
0
0

Patrick Klug wrote:

It seems that the following topic is pinned but doesn't behave as such:

Some tips for players who struggle in level 2

I see that a lot of players have trouble getting started in level2. Here are some tips (if you like a challenge then maybe don't read them): Medium games work best if you have a team of 3, so your aim should be to get to 2 additional workers. any more is overkill for medium games. Staff members are expensive in GDT. When you hire someone the effectiveness of your entire team drops for a while. Be aware of this effect! Be very careful what publishing contracts you take. Publishers often su...

It doesn't even show on the front page.

Posts: 32

Participants: 5

Read full topic

Clearing a pin vs. un-pinning as Admin

$
0
0

happycollision wrote:

I love the way pinning works in Discourse, but there is a bit of confusing UX regarding pinning, un-pinning, and clearing a pin as an administrator.

If you "Clear pin" (just like a normal user) as an administrator (or whoever can pin topics), there is no way to see the global version of what is pinned and not pinned without signing out.

So these two sets of actions yield the same result:

  • Clear Pin, Pin Topic
  • Un-Pin Topic, Pin Topic

Unfortunately that result affects other users. Possibly without intent to do so.

Scenario:

  1. Admin pins a "super important" topic
  2. User reads topic and presses the Clear Pin button
  3. Time passes and Admin gets sick of seeing the pinned topic as well, clears it.
  4. Time passes and Admin sees a "super important" topic. Thinks "Oh. That should have been pinned." Not realizing that it is actually still globally pinned, pins it. Again.
  5. User sees "super important" topic pinned again, even though there was no actual reason for a re-pinning since the topic has not actually been altered. Clears it again.
  6. Rinse. Repeat.

I have tested this behavior and it actually works out just like this. There is no difference, as an administrator (or whatever), between a topic where I have clicked "Clear Pin" vs. a topic where I have clicked "Un-Pin Topic". The admin menu button for pinning even changes from "Un-Pin Topic" to "Pin Topic" when I "Clear Pin".

Posts: 5

Participants: 2

Read full topic

I'm afraid I un-pinned "Welcome to meta.discourse.org"

$
0
0

KajMagnus wrote:

Hi,

There was a Clear Pin button at the end of the topic "Welcome to meta.discourse.org" ( https://meta.discourse.org/t/welcome-to-meta-discourse-org/1 ) and I was wondering "What kind of access denied message will they show when I click it?"

So I clicked it. But apparently this really did un-pin the topic "Welcome to meta.discourse.org". At least that topic is no longer listed at the top of meta.discourse.org. That wasn't my intention, sorry about that — but perhaps a bug has been found?

Best regards, KajMagnus

Posts: 7

Participants: 4

Read full topic

Viewing all 60642 articles
Browse latest View live




Latest Images