{"action":"created","comment":{"url":"https://api.github.com/repos/translate/pootle/pulls/comments/25760404","id":25760404,"diff_hunk":"@@ -0,0 +1,96 @@\n+.. _virtual_folders:\n+\n+Virtual Folders\n+===============\n+\n+.. versionadded:: 2.7\n+\n+Virtual folders provide a way to group translations based on any criteria,\n+including a file across all the languages in a project, or files on specific\n+locations. Virtual folders have priority, so they can be used to allow\n+translators to focus on the most important work.\n+\n+\n+.. _virtual_folders#attributes:\n+\n+Virtual folders attributes\n+-----------------------------------\n+\n+Virtual folders have several attributes:\n+\n+- A mandatory lowercase name,\n+- A mandatory location,\n+- An optional priority,\n+- An optional browsability flag,\n+- An optional description,\n+- An optional filtering rule.\n+\n+Each virtual folder must have a unique combination of name and location. This\n+means that there can exist two different virtual folders with the same name if\n+they have different locations.\n+\n+The priority defaults to ``1`` and accepts any value greater than ``0``,\n+including numbers with decimals, like ``0.75``.\n+\n+By default virtual folders cannot be browsed: they won't be displayed, but\n+they are still used for sorting.\n+\n+Also the virtual folders can have a description which might be useful to tell\n+the translators which is the grouping criteria or provide additional\n+instructions. This might be handy when using the virtual folders as goals.\n+\n+The filtering rule specifies which translation units are included within a\n+virtual folder. Currently it consists of a list of file paths relative to the\n+virtual folder location.\n+\n+\n+.. _virtual_folders#apply:\n+\n+Adding and updating virtual folders\n+-----------------------------------\n+\n+To add or modify the properties of virtual folders use the\n+:ref:`add_vfolders <commands#add-virtual-folders>` management command.\n+\n+This command imports a JSON file holding a list of virtual folders, and the\n+files included on each virtual folder along with all their attributes. Check\n+the specs for the :ref:`JSON format <virtual_folders#json-format>` in order to\n+know how to craft a JSON file that fits your needs.\n+\n+\n+.. _virtual_folders#translate:\n+\n+Translating virtual folders\n+---------------------------\n+\n+If a virtual folder applies in the current location, then clicking on the links\n+on the overview page will provide the units in priority order when translating\n+in the editor. The priority sorting on the translation editor is calculated\n+taking into account all the applicable virtual folders in the current location,\n+including the not browsable ones.\n+\n+\n+.. _virtual_folders#json-format:\n+\n+Format for the JSON file\n+------------------------\n+\n+The JSON file used to import virtual folders consists of a list of virtual\n+folder definitions with the following fields:\n+\n+- A mandatory lowercase **name** for the virtual folder,\n+- A mandatory **location** in Pootle for the virtual folder that can use\n+  placeholders for language (``{LANG}``) and project (``{PROJ}``),\n+- An optional float **priority** for the virtual folder, being 1 the default\n+  priority and accepting only values greater than 0, where higher numbers means\n+  higher priority,\n+- An optional ``true`` or ``false`` indicating if the virtual folder is\n+  **browsable** (defaults to ``false``),\n+- An optional **description** that can include newlines (that must be escaped),","path":"docs/features/virtual_folders.rst","position":89,"original_position":89,"commit_id":"5e6d829ae0a27bd2672569835fe1e72332f34a21","original_commit_id":"5e6d829ae0a27bd2672569835fe1e72332f34a21","user":{"login":"unho","id":939880,"avatar_url":"https://avatars.githubusercontent.com/u/939880?v=3","gravatar_id":"","url":"https://api.github.com/users/unho","html_url":"https://github.com/unho","followers_url":"https://api.github.com/users/unho/followers","following_url":"https://api.github.com/users/unho/following{/other_user}","gists_url":"https://api.github.com/users/unho/gists{/gist_id}","starred_url":"https://api.github.com/users/unho/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unho/subscriptions","organizations_url":"https://api.github.com/users/unho/orgs","repos_url":"https://api.github.com/users/unho/repos","events_url":"https://api.github.com/users/unho/events{/privacy}","received_events_url":"https://api.github.com/users/unho/received_events","type":"User","site_admin":false},"body":"Changed.","created_at":"2015-03-04T09:08:49Z","updated_at":"2015-03-04T09:08:49Z","html_url":"https://github.com/translate/pootle/pull/3600#discussion_r25760404","pull_request_url":"https://api.github.com/repos/translate/pootle/pulls/3600","_links":{"self":{"href":"https://api.github.com/repos/translate/pootle/pulls/comments/25760404"},"html":{"href":"https://github.com/translate/pootle/pull/3600#discussion_r25760404"},"pull_request":{"href":"https://api.github.com/repos/translate/pootle/pulls/3600"}}},"pull_request":{"url":"https://api.github.com/repos/translate/pootle/pulls/3600","id":29810240,"html_url":"https://github.com/translate/pootle/pull/3600","diff_url":"https://github.com/translate/pootle/pull/3600.diff","patch_url":"https://github.com/translate/pootle/pull/3600.patch","issue_url":"https://api.github.com/repos/translate/pootle/issues/3600","number":3600,"state":"open","locked":false,"title":"Initial virtual folders","user":{"login":"unho","id":939880,"avatar_url":"https://avatars.githubusercontent.com/u/939880?v=3","gravatar_id":"","url":"https://api.github.com/users/unho","html_url":"https://github.com/unho","followers_url":"https://api.github.com/users/unho/followers","following_url":"https://api.github.com/users/unho/following{/other_user}","gists_url":"https://api.github.com/users/unho/gists{/gist_id}","starred_url":"https://api.github.com/users/unho/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unho/subscriptions","organizations_url":"https://api.github.com/users/unho/orgs","repos_url":"https://api.github.com/users/unho/repos","events_url":"https://api.github.com/users/unho/events{/privacy}","received_events_url":"https://api.github.com/users/unho/received_events","type":"User","site_admin":false},"body":"Ready to review.\r\n\r\nThis is meant to somehow recover our old goals functionality, but using the new vfolders.\r\n\r\nThis provides a management command to create and update virtual folders, adds the ability to sort the units by (vfolder) priority on the editor, and injects the priority sorting into the translate URLs in the translation project overview.\r\n\r\nThings that differ from specs:\r\n\r\n- We don't use any filtering rules. Instead we provide lists of filenames relative to vfolder location.","created_at":"2015-02-23T13:58:52Z","updated_at":"2015-03-04T09:08:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e754374395366afe4bb9e64ff28b2302c503cdd0","assignee":{"login":"unho","id":939880,"avatar_url":"https://avatars.githubusercontent.com/u/939880?v=3","gravatar_id":"","url":"https://api.github.com/users/unho","html_url":"https://github.com/unho","followers_url":"https://api.github.com/users/unho/followers","following_url":"https://api.github.com/users/unho/following{/other_user}","gists_url":"https://api.github.com/users/unho/gists{/gist_id}","starred_url":"https://api.github.com/users/unho/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unho/subscriptions","organizations_url":"https://api.github.com/users/unho/orgs","repos_url":"https://api.github.com/users/unho/repos","events_url":"https://api.github.com/users/unho/events{/privacy}","received_events_url":"https://api.github.com/users/unho/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/translate/pootle/pulls/3600/commits","review_comments_url":"https://api.github.com/repos/translate/pootle/pulls/3600/comments","review_comment_url":"https://api.github.com/repos/translate/pootle/pulls/comments{/number}","comments_url":"https://api.github.com/repos/translate/pootle/issues/3600/comments","statuses_url":"https://api.github.com/repos/translate/pootle/statuses/5e6d829ae0a27bd2672569835fe1e72332f34a21","head":{"label":"unho:recovering-goals","ref":"recovering-goals","sha":"5e6d829ae0a27bd2672569835fe1e72332f34a21","user":{"login":"unho","id":939880,"avatar_url":"https://avatars.githubusercontent.com/u/939880?v=3","gravatar_id":"","url":"https://api.github.com/users/unho","html_url":"https://github.com/unho","followers_url":"https://api.github.com/users/unho/followers","following_url":"https://api.github.com/users/unho/following{/other_user}","gists_url":"https://api.github.com/users/unho/gists{/gist_id}","starred_url":"https://api.github.com/users/unho/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unho/subscriptions","organizations_url":"https://api.github.com/users/unho/orgs","repos_url":"https://api.github.com/users/unho/repos","events_url":"https://api.github.com/users/unho/events{/privacy}","received_events_url":"https://api.github.com/users/unho/received_events","type":"User","site_admin":false},"repo":{"id":8295531,"name":"pootle","full_name":"unho/pootle","owner":{"login":"unho","id":939880,"avatar_url":"https://avatars.githubusercontent.com/u/939880?v=3","gravatar_id":"","url":"https://api.github.com/users/unho","html_url":"https://github.com/unho","followers_url":"https://api.github.com/users/unho/followers","following_url":"https://api.github.com/users/unho/following{/other_user}","gists_url":"https://api.github.com/users/unho/gists{/gist_id}","starred_url":"https://api.github.com/users/unho/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unho/subscriptions","organizations_url":"https://api.github.com/users/unho/orgs","repos_url":"https://api.github.com/users/unho/repos","events_url":"https://api.github.com/users/unho/events{/privacy}","received_events_url":"https://api.github.com/users/unho/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/unho/pootle","description":"Online translation tool","fork":true,"url":"https://api.github.com/repos/unho/pootle","forks_url":"https://api.github.com/repos/unho/pootle/forks","keys_url":"https://api.github.com/repos/unho/pootle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/unho/pootle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/unho/pootle/teams","hooks_url":"https://api.github.com/repos/unho/pootle/hooks","issue_events_url":"https://api.github.com/repos/unho/pootle/issues/events{/number}","events_url":"https://api.github.com/repos/unho/pootle/events","assignees_url":"https://api.github.com/repos/unho/pootle/assignees{/user}","branches_url":"https://api.github.com/repos/unho/pootle/branches{/branch}","tags_url":"https://api.github.com/repos/unho/pootle/tags","blobs_url":"https://api.github.com/repos/unho/pootle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/unho/pootle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/unho/pootle/git/refs{/sha}","trees_url":"https://api.github.com/repos/unho/pootle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/unho/pootle/statuses/{sha}","languages_url":"https://api.github.com/repos/unho/pootle/languages","stargazers_url":"https://api.github.com/repos/unho/pootle/stargazers","contributors_url":"https://api.github.com/repos/unho/pootle/contributors","subscribers_url":"https://api.github.com/repos/unho/pootle/subscribers","subscription_url":"https://api.github.com/repos/unho/pootle/subscription","commits_url":"https://api.github.com/repos/unho/pootle/commits{/sha}","git_commits_url":"https://api.github.com/repos/unho/pootle/git/commits{/sha}","comments_url":"https://api.github.com/repos/unho/pootle/comments{/number}","issue_comment_url":"https://api.github.com/repos/unho/pootle/issues/comments{/number}","contents_url":"https://api.github.com/repos/unho/pootle/contents/{+path}","compare_url":"https://api.github.com/repos/unho/pootle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/unho/pootle/merges","archive_url":"https://api.github.com/repos/unho/pootle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/unho/pootle/downloads","issues_url":"https://api.github.com/repos/unho/pootle/issues{/number}","pulls_url":"https://api.github.com/repos/unho/pootle/pulls{/number}","milestones_url":"https://api.github.com/repos/unho/pootle/milestones{/number}","notifications_url":"https://api.github.com/repos/unho/pootle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/unho/pootle/labels{/name}","releases_url":"https://api.github.com/repos/unho/pootle/releases{/id}","created_at":"2013-02-19T17:34:16Z","updated_at":"2015-02-26T10:21:19Z","pushed_at":"2015-03-03T19:55:56Z","git_url":"git://github.com/unho/pootle.git","ssh_url":"git@github.com:unho/pootle.git","clone_url":"https://github.com/unho/pootle.git","svn_url":"https://github.com/unho/pootle","homepage":"http://pootle.translatehouse.org","size":65520,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"translate:master","ref":"master","sha":"fcf46ec52e0a3a2439fd47117e912fb7c5a50482","user":{"login":"translate","id":1538178,"avatar_url":"https://avatars.githubusercontent.com/u/1538178?v=3","gravatar_id":"","url":"https://api.github.com/users/translate","html_url":"https://github.com/translate","followers_url":"https://api.github.com/users/translate/followers","following_url":"https://api.github.com/users/translate/following{/other_user}","gists_url":"https://api.github.com/users/translate/gists{/gist_id}","starred_url":"https://api.github.com/users/translate/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/translate/subscriptions","organizations_url":"https://api.github.com/users/translate/orgs","repos_url":"https://api.github.com/users/translate/repos","events_url":"https://api.github.com/users/translate/events{/privacy}","received_events_url":"https://api.github.com/users/translate/received_events","type":"Organization","site_admin":false},"repo":{"id":3769702,"name":"pootle","full_name":"translate/pootle","owner":{"login":"translate","id":1538178,"avatar_url":"https://avatars.githubusercontent.com/u/1538178?v=3","gravatar_id":"","url":"https://api.github.com/users/translate","html_url":"https://github.com/translate","followers_url":"https://api.github.com/users/translate/followers","following_url":"https://api.github.com/users/translate/following{/other_user}","gists_url":"https://api.github.com/users/translate/gists{/gist_id}","starred_url":"https://api.github.com/users/translate/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/translate/subscriptions","organizations_url":"https://api.github.com/users/translate/orgs","repos_url":"https://api.github.com/users/translate/repos","events_url":"https://api.github.com/users/translate/events{/privacy}","received_events_url":"https://api.github.com/users/translate/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/translate/pootle","description":"Online translation tool","fork":false,"url":"https://api.github.com/repos/translate/pootle","forks_url":"https://api.github.com/repos/translate/pootle/forks","keys_url":"https://api.github.com/repos/translate/pootle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/translate/pootle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/translate/pootle/teams","hooks_url":"https://api.github.com/repos/translate/pootle/hooks","issue_events_url":"https://api.github.com/repos/translate/pootle/issues/events{/number}","events_url":"https://api.github.com/repos/translate/pootle/events","assignees_url":"https://api.github.com/repos/translate/pootle/assignees{/user}","branches_url":"https://api.github.com/repos/translate/pootle/branches{/branch}","tags_url":"https://api.github.com/repos/translate/pootle/tags","blobs_url":"https://api.github.com/repos/translate/pootle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/translate/pootle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/translate/pootle/git/refs{/sha}","trees_url":"https://api.github.com/repos/translate/pootle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/translate/pootle/statuses/{sha}","languages_url":"https://api.github.com/repos/translate/pootle/languages","stargazers_url":"https://api.github.com/repos/translate/pootle/stargazers","contributors_url":"https://api.github.com/repos/translate/pootle/contributors","subscribers_url":"https://api.github.com/repos/translate/pootle/subscribers","subscription_url":"https://api.github.com/repos/translate/pootle/subscription","commits_url":"https://api.github.com/repos/translate/pootle/commits{/sha}","git_commits_url":"https://api.github.com/repos/translate/pootle/git/commits{/sha}","comments_url":"https://api.github.com/repos/translate/pootle/comments{/number}","issue_comment_url":"https://api.github.com/repos/translate/pootle/issues/comments{/number}","contents_url":"https://api.github.com/repos/translate/pootle/contents/{+path}","compare_url":"https://api.github.com/repos/translate/pootle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/translate/pootle/merges","archive_url":"https://api.github.com/repos/translate/pootle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/translate/pootle/downloads","issues_url":"https://api.github.com/repos/translate/pootle/issues{/number}","pulls_url":"https://api.github.com/repos/translate/pootle/pulls{/number}","milestones_url":"https://api.github.com/repos/translate/pootle/milestones{/number}","notifications_url":"https://api.github.com/repos/translate/pootle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/translate/pootle/labels{/name}","releases_url":"https://api.github.com/repos/translate/pootle/releases{/id}","created_at":"2012-03-19T23:06:03Z","updated_at":"2015-03-03T13:44:45Z","pushed_at":"2015-03-03T13:44:45Z","git_url":"git://github.com/translate/pootle.git","ssh_url":"git@github.com:translate/pootle.git","clone_url":"https://github.com/translate/pootle.git","svn_url":"https://github.com/translate/pootle","homepage":"http://pootle.translatehouse.org","size":70460,"stargazers_count":390,"watchers_count":390,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":127,"mirror_url":null,"open_issues_count":440,"forks":127,"open_issues":440,"watchers":390,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/translate/pootle/pulls/3600"},"html":{"href":"https://github.com/translate/pootle/pull/3600"},"issue":{"href":"https://api.github.com/repos/translate/pootle/issues/3600"},"comments":{"href":"https://api.github.com/repos/translate/pootle/issues/3600/comments"},"review_comments":{"href":"https://api.github.com/repos/translate/pootle/pulls/3600/comments"},"review_comment":{"href":"https://api.github.com/repos/translate/pootle/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/translate/pootle/pulls/3600/commits"},"statuses":{"href":"https://api.github.com/repos/translate/pootle/statuses/5e6d829ae0a27bd2672569835fe1e72332f34a21"}}}}