Donmai

Favorite groups

Posted under Bugs & Features

So, Danbooru introduced a major feature with the latest release. Now every user has a number of his own pools named Favorite Groups, accessible through account page or subnavbar in post listing. It's essentially an enhancement of favorites, except more organized and not influencing any post metrics. The basic features are listed in issue #2416, but I feel that forum would be a better place for further discussion and suggestions.

Searching by name throws an error when the group is inexistent, e.g. favgroup:inexistent throws

error
ActiveRecord::RecordNotFound exception raised

    Couldn't find FavoriteGroup with 'id'=0
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activerecord-4.1.8/lib/active_record/relation/finder_methods.rb:320:in `raise_record_not_found_exception!'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activerecord-4.1.8/lib/active_record/relation/finder_methods.rb:429:in `find_one'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activerecord-4.1.8/lib/active_record/relation/finder_methods.rb:413:in `find_with_ids'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activerecord-4.1.8/lib/active_record/relation/finder_methods.rb:68:in `find'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activerecord-4.1.8/lib/active_record/querying.rb:3:in `find'
    /var/www/danbooru2/releases/20150628205941/app/logical/post_query_builder.rb:317:in `build'
    /var/www/danbooru2/releases/20150628205941/app/models/post.rb:1444:in `tag_match'
    /var/www/danbooru2/releases/20150628205941/app/logical/post_sets/post.rb:97:in `posts'
    /var/www/danbooru2/releases/20150628205941/app/controllers/posts_controller.rb:19:in `index'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/abstract_controller/base.rb:189:in `process_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_controller/metal/rendering.rb:10:in `process_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/abstract_controller/callbacks.rb:20:in `block in process_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:113:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:113:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:215:in `block in halting_and_conditional'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:149:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:149:in `block in halting_and_conditional'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:149:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:149:in `block in halting_and_conditional'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:229:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:229:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:229:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:229:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:166:in `block in halting'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:86:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:86:in `run_callbacks'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/abstract_controller/callbacks.rb:19:in `process_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_controller/metal/rescue.rb:29:in `process_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/notifications.rb:159:in `block in instrument'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/notifications.rb:159:in `instrument'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activerecord-4.1.8/lib/active_record/railties/controller_runtime.rb:18:in `process_action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/abstract_controller/base.rb:136:in `process'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionview-4.1.8/lib/action_view/rendering.rb:30:in `process'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_controller/metal.rb:196:in `dispatch'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_controller/metal.rb:232:in `block in action'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/routing/route_set.rb:82:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/routing/route_set.rb:82:in `dispatch'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/routing/route_set.rb:50:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/journey/router.rb:73:in `block in call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/journey/router.rb:59:in `each'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/journey/router.rb:59:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/routing/route_set.rb:678:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/rack/agent_hooks.rb:26:in `traced_call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:55:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/rack/browser_monitoring.rb:23:in `traced_call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:55:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/etag.rb:23:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/conditionalget.rb:25:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/head.rb:11:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/middleware/params_parser.rb:27:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/middleware/flash.rb:254:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:225:in `context'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:220:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/middleware/cookies.rb:560:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activerecord-4.1.8/lib/active_record/query_cache.rb:36:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activerecord-4.1.8/lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/callbacks.rb:82:in `run_callbacks'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/middleware/callbacks.rb:27:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/railties-4.1.8/lib/rails/rack/logger.rb:38:in `call_app'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/railties-4.1.8/lib/rails/rack/logger.rb:20:in `block in call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/tagged_logging.rb:68:in `block in tagged'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/tagged_logging.rb:26:in `tagged'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/tagged_logging.rb:68:in `tagged'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/railties-4.1.8/lib/rails/rack/logger.rb:20:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/actionpack-4.1.8/lib/action_dispatch/middleware/request_id.rb:21:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/methodoverride.rb:21:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/runtime.rb:17:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/activesupport-4.1.8/lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/sendfile.rb:112:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/railties-4.1.8/lib/rails/engine.rb:514:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/railties-4.1.8/lib/rails/application.rb:144:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/commonlogger.rb:33:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/chunked.rb:43:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/rack-1.5.2/lib/rack/content_length.rb:14:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/newrelic_rpm-3.9.6.257/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57:in `call'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/unicorn-4.8.2/lib/unicorn/http_server.rb:572:in `process_client'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/gctools-0.2.3/lib/gctools/oobgc/unicorn_middleware.rb:13:in `process_client'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/unicorn-4.8.2/lib/unicorn/http_server.rb:666:in `worker_loop'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/unicorn-4.8.2/lib/unicorn/http_server.rb:521:in `spawn_missing_workers'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/unicorn-4.8.2/lib/unicorn/http_server.rb:140:in `start'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/gems/unicorn-4.8.2/bin/unicorn:126:in `<top (required)>'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/bin/unicorn:23:in `load'
    /var/www/danbooru2/shared/bundle/ruby/2.1.0/bin/unicorn:23:in `<main>'

Also searching by name appears to be user specific, and only works for your own groups. e.g. favgroup:comics works for me, anyone else must use favgroup:15. If you also have a favgroup names "comics", you get your own comics favgroup, otherwise it behaves as an inexistent group for you and throws the error as above.

Would it be worthwhile looking into using namespace-like behavior for this, allowing prepending with the user's name for disambiguation and accessing others' groups by name? e.g. favgroup:r0d3n7z:Test_favgroup v.s. say, favgroup:Type-kun:Test_favgroup [ this and this respectively ]

(Edit: appending...)
Also, currently if you search favgroup:15 there is absolutely no information whatsoever available about what the group is supposed to be about. By way of comparison, for pools, if you search a pool, say pool:1760, the pool information is accessible by the large "Pool" link next to "Posts", in the same place as the "Wiki" link for accessing wiki information for single-tag searches like tokyo_big_sight. I would suggest that similar to pools, we might want to display the group name, and have a "view group" link that takes you to the favgroup page.

Updated

Huh, also your "Comics" favgroup currently shows 0 posts at the listing despite having a post inside. Did you add a post at creation time or later?

Also, for information, already fixed bugs:

  • group owner is not shown on Show Page;
  • group listing has weird pagination
  • navigation in pool bar ot working for other users' favgroups

As for feature requests, I'm sure users would appreciate a more convenient way of adding a post to a favgroup. Favoriting currently takes a single keypress, but for adding to favgroup you should either add favgroup:id tag to post or add post id to favgroup.

Also, should posts from these groups be shown on profile page like uploads, favorites and subscriptions?

Updated

r0d3n7z said:

Searching by name throws an error when the group is inexistent, e.g. favgroup:inexistent throws

Fixed for next version

r0d3n7z said:

Also searching by name appears to be user specific, and only works for your own groups. e.g. favgroup:comics works for me, anyone else must use favgroup:15. If you also have a favgroup names "comics", you get your own comics favgroup, otherwise it behaves as an inexistent group for you and throws the error as above.

This is because two favgroups owned by different users can have the same name so that's ambiguous. Whereas two favgroups owned by the same user must have different names.

r0d3n7z said:

Would it be worthwhile looking into using namespace-like behavior for this, allowing prepending with the user's name for disambiguation and accessing others' groups by name? e.g. favgroup:r0d3n7z:Test_favgroup v.s. say, favgroup:Type-kun:Test_favgroup [ this and this respectively ]

I thought about this but that's still ambiguous in a different way. favgroup:r0d3n7z:Test_favgroup might refer to your favgroup named "Test_favgroup" or it might refer to a favgroup named "r0d3n7z:Test_favgroup" owned by the user doing this search.

r0d3n7z said:

(Edit: appending...)
Also, currently if you search favgroup:15 there is absolutely no information whatsoever available about what the group is supposed to be about. By way of comparison, for pools, if you search a pool, say pool:1760, the pool information is accessible by the large "Pool" link next to "Posts", in the same place as the "Wiki" link for accessing wiki information for single-tag searches like tokyo_big_sight. I would suggest that similar to pools, we might want to display the group name, and have a "view group" link that takes you to the favgroup page.

Fixed

Type-kun said:

Huh, also your "Comics" favgroup currently shows 0 posts at the listing despite having a post inside. Did you add a post at creation time or later?

It seems to happen when you use the favgroup: metatag to add/remove posts. I changed it to simply recalculate post count on any update so it should be fixed.

CodeKyuubi said:

I'm still a bit lost, other than for organizational purposes, what's the use of favorite groups?

It's for personally organizing posts. Doesn't matter specifically how you organize them, that's up to you. Can be for posts you intend to translate, the absolute best out of your favorites, some subjective concept that can't be tagged, comics you plan to read, whatever.

Toks said:
Fixed ... Fixed

Thanks as usual for the prompt fixes.

-

Toks said:
This is because two favgroups owned by different users can have the same name so that's ambiguous. Whereas two favgroups owned by the same user must have different names.

I thought about this but that's still ambiguous in a different way. favgroup:r0d3n7z:Test_favgroup might refer to your favgroup named "Test_favgroup" or it might refer to a favgroup named "r0d3n7z:Test_favgroup" owned by the user doing this search.

Sorry for not being clear about it, I *was* aware of the first issue being by design due to name ambiguity, hence my namespace suggestion... too bad that idea doesn't work out, though.

-

Type-kun said:
As for feature requests, I'm sure users would appreciate a more convenient way of adding a post to a favgroup. Favoriting currently takes a single keypress, but for adding to favgroup you should either add favgroup:id tag to post or add post id to favgroup.

Since each user can have multiple favgroups, it can't be a single keypress, but we could do two keypresses:

  • I don't think 'g' is currently bound as a hotkey. We could bind 'g' to pop up a numbered list of your favgroups
  • Either click the desired group name, or we could additionally bind 1 thru 0 for the groups (since users can have up to 10 favgroups at plat+)
  • similar to "add artist commentary" popup; esc to abort

-

Currently, fav:<username>, and favgroup:id / favgroup:name metatags work for adding to favorites / favgroups, either from the post edit box, or as a tag script.
However, the negation doesn't work, i.e. -fav:<username>, and -favgroup:id / -favgroup:name will not remove posts from your favorites list or your favgroup.
I would love for the negation to work, which will be an excellent way to quickly migrate posts from plain-old-favs to favgroups (e.g. tag script -fav:r0d3n7z favgroup:comics).

Also, if we don't bind a hotkey for favgroup, this would be the next best thing, since users can still quickly add to faves using 'f', and then sort the posts fairly painlessly later. We'd have to write some help/cheatsheet documentation about it, though.

-

Do favgroups fundamentally behave like pools in the backend? If so, porting the "Order" functionality from pools would be very much appreciated too.

r0d3n7z said:

Sorry for not being clear about it, I *was* aware of the first issue being by design due to name ambiguity, hence my namespace suggestion... too bad that idea doesn't work out, though.

I knew but wanted to clarify the ambiguity issue for anyone that wasn't aware of it since I realized I forgot to mention it in issue #2416.

r0d3n7z said:

Currently, fav:<username>, and favgroup:id / favgroup:name metatags work for adding to favorites / favgroups, either from the post edit box, or as a tag script.
However, the negation doesn't work, i.e. -fav:<username>, and -favgroup:id / -favgroup:name will not remove posts from your favorites list or your favgroup.
I would love for the negation to work, which will be an excellent way to quickly migrate posts from plain-old-favs to favgroups (e.g. tag script -fav:r0d3n7z favgroup:comics).

Also, if we don't bind a hotkey for favgroup, this would be the next best thing, since users can still quickly add to faves using 'f', and then sort the posts fairly painlessly later. We'd have to write some help/cheatsheet documentation about it, though.

The negated favgroup ones already work when editing a post's tags. But it looks like there was a bug where the tag script code was treating them as regular negated tags so fixed, and I added -fav: too

r0d3n7z said:

Do favgroups fundamentally behave like pools in the backend? If so, porting the "Order" functionality from pools would be very much appreciated too.

They're not exactly like pools. A lot of functions were copied straight from the pool code but there are also differences - such as when pools are saved they update the posts that were added/removed, but favgroups don't touch the post.

There's no difference that would prevent the order page from working so I added it, although the code copy-pasting is starting to get real now.

r0d3n7z said:

Since each user can have multiple favgroups, it can't be a single keypress, but we could do two keypresses:

  • I don't think 'g' is currently bound as a hotkey. We could bind 'g' to pop up a numbered list of your favgroups
  • Either click the desired group name, or we could additionally bind 1 thru 0 for the groups (since users can have up to 10 favgroups at plat+)
  • similar to "add artist commentary" popup; esc to abort

I added this.

Note that if you have exactly 1 favgroup it will add immediately to that one instead of asking.

Changes went live today.

Toks said:
I added this.
Note that if you have exactly 1 favgroup it will add immediately to that one instead of asking.

Clicking the desired group / using the hotkeys 1~0 doesn't close the window -- it probably should, to make it two keypresses to add to favgroup and close the window automatically when done, rather than requiring a third click/keypress (esc) to manually close it. Don't remove (esc) though, it's still needed for abort (e.g. hit 'g' by accident)

-

Also, in the 'order' page for favgroups, the 'save' button does indeed save the group order, but doesn't trigger the display of the yellow message bar with the 'Favorite group updated' message. Switching to the 'show' page afterward triggers the message to display. This is inconsistent with how it currently works for pools, where the confirmation message displays once the 'save' button is pressed.

Updated

r0d3n7z said:

Changes went live today.

Clicking the desired group / using the hotkeys 1~0 doesn't close the window -- it probably should, to make it two keypresses to add to favgroup and close the window automatically when done, rather than requiring a third click/keypress (esc) to manually close it. Don't remove (esc) though, it's still needed for abort (e.g. hit 'g' by accident)

-

Also, in the 'order' page for favgroups, the 'save' button does indeed save the group order, but doesn't trigger the display of the yellow message bar with the 'Favorite group updated' message. Switching to the 'show' page afterward triggers the message to display. This is inconsistent with how it currently works for pools, where the confirmation message displays once the 'save' button is pressed.

fixed

I want to give my opinion regarding smartphone browsing.
Since we cannot use the keyboard shortcut, it would be nice if "Add to favgroup" shortcut can also be accessible with button on the left side of the post (like Add notes/Favorite/Download/etc. button).

r0d3n7z said:
Currently, fav:<username>, and favgroup:id / favgroup:name metatags work for adding to favorites / favgroups, either from the post edit box, or as a tag script.
However, the negation doesn't work, i.e. -fav:<username>, and -favgroup:id / -favgroup:name will not remove posts from your favorites list or your favgroup.
I would love for the negation to work, which will be an excellent way to quickly migrate posts from plain-old-favs to favgroups (e.g. tag script -fav:r0d3n7z favgroup:comics).

Toks said:

The negated favgroup ones already work when editing a post's tags. But it looks like there was a bug where the tag script code was treating them as regular negated tags so fixed, and I added -fav: too

I've confirmed that the above functionality works, however, the -favgroup:id does not work when searching through the posts, although favgroup:id does.

This functionality would be useful when searching through posts to add to a favorite group, so that I don't open a post only to find out that I've already added it to my favorite group.

1