Repository: oppia/oppia

Issue:
Update docstrings in the python backend code.
The aim of this issue is to ensure that every backend file is properly documented. The docstrings serve as guidance to developers to help them understand what a class or a method is doing, so they must be written accurately.

Some useful tips:

- Please follow our [style guide](https://github.com/oppia/oppia/wiki/Coding-style-guide#general) and also the [Google Python style guide](https://google.github.io/styleguide/pyguide.html?showone=Comments#Comments) when writing the docstrings. Make sure to follow the patterns established there as closely as possible, including spacing, capitalization and punctuation.

- Make sure that the docstrings for every function include Args, Returns, Raises etc. as and when applicable. If there are no args, then you can omit writing Args. Likewise for Returns, Raises etc. as well.

- If a docstring is not present in the code, or the existing one is too vague for you to understand what's going on just by looking at it, then it should be rewritten to be more clear. You'll often need to read the code as well, and do a grep to find out specific method used in several files and in many other situations.

- Every argument name under Args and under Returns or Raises should have a data type mentioned along with it. Make separate efforts to analyze their data types as this might be a bit tricky sometimes and there are many chances of getting mistaken. You can, for example, try to run the method/function while temporarily adding `raise(type(X))` or `logging.info(type(X))` to get the information you need.

- Leave one line before each of Args, Returns and Raises. Indent any continuation lines by 4 spaces. See existing docstrings for examples.

- If you feel that some files are absent from the list or some parts of the codebase are unclear or incorrectly factored, please feel free to bring this up!

**Running tests on a specific file**
- Go to the directory where the file is present (say-- if the file is in core directory, perform `cd core` to reach to the directory).
- Execute `pylint --disable=all --enable=missing-docstring <filename>` to perform linter checks on the file.
(**Note:** If you face any problem while running the above command, please comment out [this line](https://github.com/oppia/oppia/blob/develop/.pylintrc#L11) in .pylintrc locally and uncomment it when pushing your changes).
- Add docstrings for the lines where you find 'Missing docstrings'.

Here is the list of files that are required to be updated.
**Note:** Once this issue is complete, we will turn on missing-docstring checks in Oppia's Python linter. Also, take care that some of the test methods/classes have to be excluded from the test files as they don't require docstrings in detail.

Docstrings for test methods (`test_*` type) and test classes (`*Tests` type) don't need docstrings and hence, can be excluded while adding docstrings to the test files. Please add `no-docstring-rgx=test_[a-z_]*|[a-zA-Z]*Tests|Test[a-zA-Z]*` regex in `.pylintrc` file under `[Basic]` section.

**Needs to be done (based on code snapshot at 1 Dec 2018):**
- [x] core.jobs_test @vibhor98 
C:497, 4: Missing method docstring (missing-docstring)
C:791, 8: Missing function docstring (missing-docstring)
- [x] core.jobs @YashJipkate 
C:103, 4: Missing method docstring (missing-docstring)
C:122, 8: Missing function docstring (missing-docstring)
C:486, 4: Missing method docstring (missing-docstring)
C:490, 4: Missing method docstring (missing-docstring)
C:494, 4: Missing method docstring (missing-docstring)
C:498, 4: Missing method docstring (missing-docstring)
C:502, 4: Missing method docstring (missing-docstring)
C:506, 4: Missing method docstring (missing-docstring)
C:510, 4: Missing method docstring (missing-docstring)
C:514, 4: Missing method docstring (missing-docstring)
C:1239, 8: Missing function docstring (missing-docstring)
C:1291, 8: Missing function docstring (missing-docstring)
C:1471, 8: Missing function docstring (missing-docstring)
- [x] core.controllers.skill_editor_test @vibhor98 
C: 52, 4: Missing method docstring (missing-docstring)
C: 60, 4: Missing method docstring (missing-docstring)
C: 66, 4: Missing method docstring (missing-docstring)
C: 71, 4: Missing method docstring (missing-docstring)
C: 74, 4: Missing method docstring (missing-docstring)
- [x] core.controllers.creator_dashboard_test @vibhor98 
C:124, 4: Missing method docstring (missing-docstring)
- [x] core.controllers.editor_test @vibhor98 
C:183, 8: Missing function docstring (missing-docstring)
C:195, 8: Missing function docstring (missing-docstring)
C:1776, 4: Missing method docstring (missing-docstring)
C:1784, 4: Missing method docstring (missing-docstring)
- [x] core.controllers.reader_test @vibhor98 
C:492, 4: Missing method docstring (missing-docstring)
C:495, 4: Missing method docstring (missing-docstring)
C:525, 4: Missing method docstring (missing-docstring)
C:528, 4: Missing method docstring (missing-docstring)
C:532, 4: Missing method docstring (missing-docstring)
- [x] core.controllers.resources_test @vibhor98 
C: 31, 4: Missing method docstring (missing-docstring)
- [x] core.controllers.topics_and_skills_dashboard_test @vibhor98 
C: 50, 4: Missing method docstring (missing-docstring)
- [x] core.controllers.creator_dashboard @vibhor98 
C:168, 8: Missing function docstring (missing-docstring)
C:174, 8: Missing function docstring (missing-docstring)
- [x] core.controllers.base_test @vibhor98 
C:352, 0: Missing class docstring (missing-docstring)
C:354, 4: Missing method docstring (missing-docstring)
C:360, 4: Missing method docstring (missing-docstring)
C:529, 4: Missing class docstring (missing-docstring)
- [x] core.controllers.admin @vibhor98 
C:198, 4: Missing method docstring (missing-docstring)
C:209, 4: Missing method docstring (missing-docstring)
- [x] core.controllers.feedback_test @vibhor98 
C:396, 4: Missing method docstring (missing-docstring)
C:405, 4: Missing method docstring (missing-docstring)
- [x] core.platform.users.gae_current_user_services @vibhor98 
C: 70, 4: Missing class docstring (missing-docstring)
- [x] core.platform.search.gae_search_services @vibhor98 
C:100, 0: Missing function docstring (missing-docstring)
C:120, 0: Missing function docstring (missing-docstring)
C:307, 0: Missing function docstring (missing-docstring)
C:340, 0: Missing function docstring (missing-docstring)
- [x] core.storage.base_model.gae_models_test @YashJipkate 
C:124, 0: Missing class docstring (missing-docstring)
C:128, 0: Missing class docstring (missing-docstring)
C:138, 0: Missing class docstring (missing-docstring)
- [x] core.storage.base_model.gae_models @YashJipkate 
C:423, 4: Missing method docstring (missing-docstring)
C:431, 4: Missing method docstring (missing-docstring)
- [x] core.storage.user.gae_models @YashJipkate 
C:178, 4: Missing method docstring (missing-docstring)
C:408, 4: Missing method docstring (missing-docstring)
C:488, 4: Missing method docstring (missing-docstring)
- [x] core.tests.test_utils @YashJipkate 
C:558, 4: Missing method docstring (missing-docstring)
- [x] core.tests.performance_tests.base @YashJipkate 
C: 47, 4: Missing method docstring (missing-docstring)
C: 52, 4: Missing method docstring (missing-docstring)
C: 55, 4: Missing method docstring (missing-docstring)
C: 58, 4: Missing method docstring (missing-docstring)
C: 63, 4: Missing method docstring (missing-docstring)
C: 68, 4: Missing method docstring (missing-docstring)
C: 80, 4: Missing method docstring (missing-docstring)
C: 92, 4: Missing method docstring (missing-docstring)
C:114, 4: Missing method docstring (missing-docstring)
C:121, 4: Missing method docstring (missing-docstring)
C:128, 4: Missing method docstring (missing-docstring)
C:135, 4: Missing method docstring (missing-docstring)
- [x] core.tests.performance_framework.perf_services @YashJipkate 
C:208, 4: Missing method docstring (missing-docstring)
C:213, 4: Missing method docstring (missing-docstring)
C:273, 4: Missing method docstring (missing-docstring)
C:278, 4: Missing method docstring (missing-docstring)
C:281, 4: Missing method docstring (missing-docstring)
C:296, 4: Missing method docstring (missing-docstring)
C:308, 4: Missing method docstring (missing-docstring)
C:319, 4: Missing method docstring (missing-docstring)
C:328, 4: Missing method docstring (missing-docstring)
C:336, 4: Missing method docstring (missing-docstring)
C:345, 4: Missing method docstring (missing-docstring)
C:357, 4: Missing method docstring (missing-docstring)
C:360, 4: Missing method docstring (missing-docstring)
C:364, 4: Missing method docstring (missing-docstring)
C:368, 4: Missing method docstring (missing-docstring)
C:372, 4: Missing method docstring (missing-docstring)
- [x] core.tests.performance_framework.perf_domain @YashJipkate 
C:175, 4: Missing method docstring (missing-docstring)
C:274, 4: Missing method docstring (missing-docstring)
- [x] core.domain.summary_services @YashJipkate 
C:495, 4: Missing function docstring (missing-docstring)
- [x] core.domain.email_jobs_one_off_test @YashJipkate 
C: 46, 8: Missing function docstring (missing-docstring)
- [x] core.domain.visualization_registry @YashJipkate 
C: 34, 4: Missing method docstring (missing-docstring)
- [x] core.domain.feedback_jobs_continuous @vddesai1871 
C: 91, 8: Missing function docstring (missing-docstring)
C:105, 8: Missing function docstring (missing-docstring)
C:119, 8: Missing function docstring (missing-docstring)
- [x] core.domain.rte_component_registry_test @vibhor98 
C: 59, 4: Missing method docstring (missing-docstring)
- [x] core.domain.exp_services_test @dev-ritik 
C: 50, 0: Missing function docstring (missing-docstring)
C:197, 4: Missing method docstring (missing-docstring)
C:2463, 8: Missing function docstring (missing-docstring)
C:2689, 4: Missing method docstring (missing-docstring)
- [x] core.domain.interaction_registry @vibhor98 
C: 41, 4: Missing method docstring (missing-docstring)
- [x] core.domain.user_jobs_continuous_test @vibhor98 
C: 92, 4: Missing method docstring (missing-docstring)
C:106, 4: Missing method docstring (missing-docstring)
C:111, 4: Missing method docstring (missing-docstring)
C:118, 4: Missing method docstring (missing-docstring)
C:662, 4: Missing method docstring (missing-docstring)
C:687, 4: Missing method docstring (missing-docstring)
C:695, 4: Missing method docstring (missing-docstring)
- [x] core.domain.calculation_registry @vibhor98 
C: 31, 4: Missing method docstring (missing-docstring)
- [x] core.domain.classifier_services_test @vibhor98 
C: 47, 4: Missing method docstring (missing-docstring)
- [x] core.domain.exp_domain_test @vibhor98 
C:4258, 8: Missing function docstring (missing-docstring)
- [x] core.domain.activity_services_test @vibhor98 
C: 36, 4: Missing method docstring (missing-docstring)
C: 40, 4: Missing method docstring (missing-docstring)
C: 44, 4: Missing method docstring (missing-docstring)
- [x] core.domain.feedback_services_test @vibhor98 
C:133, 4: Missing method docstring (missing-docstring)
C:142, 4: Missing method docstring (missing-docstring)
C:236, 8: Missing function docstring (missing-docstring)
- [x] core.domain.stats_domain_test @vibhor98 
C: 29, 4: Missing method docstring (missing-docstring)
- [x] core.domain.story_services @vibhor98 
C:655, 4: Missing function docstring (missing-docstring)
- [x] core.domain.collection_services_test @vibhor98 
C: 41, 0: Missing function docstring (missing-docstring)
C:134, 4: Missing method docstring (missing-docstring)
C:137, 4: Missing method docstring (missing-docstring)
C:336, 4: Missing method docstring (missing-docstring)
C:1344, 8: Missing function docstring (missing-docstring)
C:1510, 4: Missing method docstring (missing-docstring)
- [x] core.domain.user_jobs_one_off_test @vibhor98 
C:739, 4: Missing method docstring (missing-docstring)
C:742, 4: Missing method docstring (missing-docstring)
- [x] core.domain.subscription_services_test @vibhor98 
C: 63, 4: Missing method docstring (missing-docstring)
C: 70, 4: Missing method docstring (missing-docstring)
C: 77, 4: Missing method docstring (missing-docstring)
C:363, 4: Missing method docstring (missing-docstring)
C:370, 4: Missing method docstring (missing-docstring)
- [x] core.domain.obj_services @vibhor98 
C: 33, 4: Missing method docstring (missing-docstring)
- [x] core.domain.stats_jobs_continuous_test @vibhor98 
C: 68, 4: Missing method docstring (missing-docstring)
C: 73, 4: Missing method docstring (missing-docstring)
- [x] core.domain.user_jobs_continuous @vibhor98 
C:389, 8: Missing function docstring (missing-docstring)
C:415, 8: Missing function docstring (missing-docstring)
- [x] core.domain.feedback_jobs_continuous_test @vibhor98 
C: 60, 4: Missing method docstring (missing-docstring)
C: 65, 4: Missing method docstring (missing-docstring)
C: 73, 4: Missing method docstring (missing-docstring)
C:438, 4: Missing method docstring (missing-docstring)
C:443, 4: Missing method docstring (missing-docstring)
- [x] core.domain.email_manager_test @vibhor98 
C:537, 8: Missing function docstring (missing-docstring)
C:584, 8: Missing function docstring (missing-docstring)
C:629, 8: Missing function docstring (missing-docstring)
C:845, 8: Missing function docstring (missing-docstring)
C:865, 8: Missing function docstring (missing-docstring)
C:916, 8: Missing function docstring (missing-docstring)
- [x] core.domain.story_services_test @vibhor98 
C:426, 4: Missing method docstring (missing-docstring)
C:430, 4: Missing method docstring (missing-docstring)
- [x] core.domain.stats_services_test @vibhor98 
C:1571, 4: Missing method docstring (missing-docstring)
C:1576, 4: Missing method docstring (missing-docstring)
C:1583, 4: Missing method docstring (missing-docstring)
C:1591, 4: Missing method docstring (missing-docstring)
C:1601, 4: Missing method docstring (missing-docstring)
C:1605, 4: Missing method docstring (missing-docstring)
C:1615, 4: Missing method docstring (missing-docstring)
C:1626, 4: Missing method docstring (missing-docstring)
C:1895, 4: Missing method docstring (missing-docstring)
C:1899, 4: Missing method docstring (missing-docstring)
C:1904, 4: Missing method docstring (missing-docstring)
C:1911, 4: Missing method docstring (missing-docstring)
C:1920, 4: Missing method docstring (missing-docstring)
- [x] core.domain.user_services_test @vibhor98 
C:946, 8: Missing class docstring (missing-docstring)
C:954,12: Missing method docstring (missing-docstring)
C:961,12: Missing method docstring (missing-docstring)
- [x] core.domain.rating_services @vibhor98 
C: 59, 4: Missing function docstring (missing-docstring)
- [x] core.domain.email_manager @vibhor98 
C:267, 4: Missing function docstring (missing-docstring)
C:314, 4: Missing function docstring (missing-docstring)
- [x] core.domain.classifier_domain_test @vibhor98 
C: 29, 4: Missing method docstring (missing-docstring)
C:165, 4: Missing method docstring (missing-docstring)
- [x] core.domain.learner_playlist_services_test @vibhor98 
C: 81, 4: Missing method docstring (missing-docstring)
C: 89, 4: Missing method docstring (missing-docstring)
- [x] core.domain.learner_progress_services_test @vibhor98 
C: 90, 4: Missing method docstring (missing-docstring)
C: 99, 4: Missing method docstring (missing-docstring)
C:108, 4: Missing method docstring (missing-docstring)
C:116, 4: Missing method docstring (missing-docstring)
C:129, 4: Missing method docstring (missing-docstring)
C:145, 4: Missing method docstring (missing-docstring)

Extensions
- [x] extensions.objects.models.objects @vibhor98 
C:513, 8: Missing function docstring (missing-docstring)
C:520, 8: Missing function docstring (missing-docstring)
- [x] extensions.objects.models.objects_test @vibhor98 
C:441, 4: Missing method docstring (missing-docstring)
- [x] extensions.interactions.base @vibhor98 
C:188, 4: Missing method docstring (missing-docstring)
- [x] extensions.interactions.base_test @vibhor98 
C: 84, 4: Missing method docstring (missing-docstring)
C:107, 4: Missing method docstring (missing-docstring)
C:112, 4: Missing method docstring (missing-docstring)
C:137, 4: Missing method docstring (missing-docstring)
C:183, 8: Missing function docstring (missing-docstring)
- [x] extensions.answer_summarizers.models_test @vibhor98 
C: 40, 4: Missing method docstring (missing-docstring)

Scripts
- [x] scripts.pre_push_hook @vibhor98 
C:216, 0: Missing function docstring (missing-docstring)
C:225, 0: Missing function docstring (missing-docstring)
C:232, 0: Missing function docstring (missing-docstring)
C:247, 0: Missing function docstring (missing-docstring)
- [x] scripts.pre_commit_linter @vibhor98 
W:1668, 4: Unreachable code (unreachable)
- [x] scripts.install_third_party @vibhor98 
C:336, 0: Missing function docstring (missing-docstring)
- [x] scripts.docstrings_checker_test @vibhor98 
C: 23, 0: Missing class docstring (missing-docstring)
- [x] scripts.deploy @vibhor98 
C:200, 0: Missing function docstring (missing-docstring)
- [x] scripts.update_feconf @vibhor98 
C: 69, 0: Missing function docstring (missing-docstring)

 - [ ] Enable the check for mandatory args and returns once all docstrings are completed @apb7

**Completed:**
- [x] oppia.feconf @rahulnitdgp
- [x] oppia.scripts.build (@hoangviet1993 #5580)
 - [X] oppia.core.domain.acl_decorators: Check and correct the return types @apb7
 - [x] core.controllers.base @apb7 
Add docstrings for methods at line no.- 134, 537
- [x] core.controllers.cron @WickedBrat 
Add docstrings for class at line no.- 109  
- [x] core.controllers.collection_editor @vibhor98
Add docstrings for classes at line no.- 165, 201
- [x] core.controllers.learner_dashboard @hundredrab 
Add docstrings for class at line no.- 121
Add docstrings for methods at line no.- 33, 124
- [x] core.controllers.pages @Vishnu-M 
Add docstrings for method at line no.- 28
- [x] core.domain.acl_decorators @vibhor98
- [x] core.domain.classifier_domain @apb7
Add docstrings for methods at line no.- 45, 173
- [x] core.domain.collection_domain @vibhor98
Add docstrings for methods at line no.-
Add docstrings for class at line no.- 32
- [x] core.domain.config_domain @vibhor98
- [x] core.domain.email_manager @vibhor98
Add docstrings for methods at line no.- 37, 928, 939
- [x] core.domain.email_subscription_services @Kunalgarg2100 
- [X] core.domain.feedback_jobs_continuous @netajik #5680
Add docstrings for method at line no.- 21
- [x] oppia.core.controllers.translator @netajik 
- [x] core.domain.feedback_jobs_continuous @apb7 
- [x] core.domain.fs_domain @vibhor98
- [x] core.domain.param_domain @jervis446 
Add docstrings for method at line no.- 146
- [x] core.domain.stats_domain @vibhor98
- [x] core.domain.stats_jobs_continuous @vibhor98
- [x] core.domain.stats_jobs_one_off @abhimanyuthakre
- [x] core.domain.user_jobs_continuous @GanitGenius 
- [x] core.domain.user_jobs_one_off @GanitGenius 
- [x] core.domain.user_query_services @proishan11 
- [x] core.domain.user_services @proishan11 
- [x] core.domain.value_generators_domain @vasutomar 
- [x] core.jobs @GanitGenius 
Add docstrings for classes at line no.- 518, 581, 613, 643, 846, 934
- [x] core.tests.test_util_jobs @vibhor98
- [x] core.platform.models @joydeep1701
- [x] core.platform.email.gae_email_services @square-1111 
- [x] core.storage.collection.gae_models @vibhor98
- [x] core.storage.email.gae_models @vibhor98
- [x] core.storage.exploration.gae_models @vibhor98
- [x] core.storage.feedback.gae_models @vibhor98
- [x] core.storage.file.gae_models @vibhor98
- [X] core.storage.job.gae_models @divyadeep1 
- [x] core.tests.test_utils @apb7 
- [x] oppia.export.cloud_datastore_admin @mahjong 
- [x] oppia.extensions.interactions.base @vibhor98 
- [x] oppia.extensions.actions.base @vibhor98
- [x] oppia.extensions.answer_summarizers.models @vibhor98
- [x] oppia.extensions.issues.base @vibhor98
- [x] oppia.core.domain.skill_domain @vibhor98
- [x] oppia.extensions.objects.models.objects @vibhor98
- [x] oppia.extensions.visualizations.models @vibhor98 
- [x] oppia.scripts.pylint_extensions @tonadev 
- [x] oppia.scripts.cut_release_branch @tonadev 
- [x] oppia.scripts.docstrings_checker @lilithxxx 
- [x] oppia.scripts.prepare_automatic_backups @import-keshav 
- [x] oppia.scripts.pre_commit_linter @import-keshav 
- [x] oppia.scripts.pre_push_hook @import-keshav 
- [x] oppia.main @abeerunscore96
- [x] oppia.core.domain.acl_decorators @dchen97 
- [x] oppia.core.domain.stats_jobs_one_off @vibhor98 - #5734
- [x] Add module docstrings to- `TextInput`, `Continue`, `PencilCodeEditor`, `MusicNotesInput`, `NumericInput`, `CodeRepl`, `MultipleChoiceInput`, `InteractiveMap`, `GraphInput`, `LogicProof`, `FractionInput`, `SetInput`, `ImageClickInput`, `ItemSelectionInput`, `MathExpressionInput`, `EndExploration`. @vibhor98 #5734
- [x] oppia.scripts.build @import-keshav  -- #5808
- [x] oppia.core.domain.acl_decorators @dchen97 #5803
- [x] oppia.extensions.objects.models.objects @rafalk342
- [x] oppia.schema_utils @vibhor98  #5849
- [x] oppia.core.domain.fs_services @vibhor98  #5849
- [x] oppia.core.storage.question.gae_models @vibhor98  #5849
- [x] oppia.scripts.docstrings_checker @import-keshav 
- [x] oppia.scripts.common @import-keshav 
- [x] oppia.jinja_utils @vibhor98 


Discussion:
Hi @yashLadha @apb7 these are the set of files that need addition of docstrings. You can follow the guidelines and tackle files one by one. Remember we need to work together collaboratively so I will be keeping track of you time to time. Please share if you encounter any type of problem in the future.
Hello! I'm new here and would like to start working on this.
Hi @hundredrab -- sounds good, thanks! Would you mind following the instructions [here](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up) to get started? Once you've done that, feel free to pick a file on this issue and tell us what it is, and we'll update the thread accordingly. Thanks!
@seanlip sure. I'd like to work on `core.controllers.learner_dashboard` thanks
Thanks -- let us know when you have finished the instructions I mentioned above, and we can assign you then.
@seanlip I am new here and have read the instructions.Can I work on `core.controllers.pages`? 
  
Hi @Vishnu-M. Sounds Good! Please follow  the instructions first [here](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up) and sign the CLA to get started.
Once you are done, you can pick any file of your choice.  
Hey @vibhor98! I'd like to work on `core.controllers.base`. Also, [line 537](https://github.com/oppia/oppia/blob/develop/core/controllers/base.py#L537) does not exactly point to a method (It points to `digester.digest`). Can you please point out which method was being referred there?  
Thanks!
@apb7  Sure assigned you. You can run the pylint test on specific file given as in the instructions. 
  
Hi @apb7 , I guess that's just a typos 
```
************* Module oppia.core.controllers.base
C:134, 4: Missing method docstring (missing-docstring)
C:543, 4: Missing method docstring (missing-docstring)
C:547, 4: Missing method docstring (missing-docstring)
```
you can may prefer this^
  
Thanks, @vibhor98 and @DubeySandeep!
@vibhor98  I'd like to work on core.domain.email_subscription_services
Hey @Kunalgarg2100 Have you followed the instructions given [here](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up)  and signed the CLA? Please tell me when you are ready. I'll assign it to you.
Yes, I have signed.

On Mon, Jan 8, 2018 at 7:31 PM, Vibhor Agarwal <notifications@github.com>
wrote:

> Hey @Kunalgarg2100 <https://github.com/kunalgarg2100> Have you followed
> the instructions given here
> <https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up>
> and signed the CLA? Please tell me when you are ready. I'll assign it to
> you.
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-355973931>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AWOsVTpNcguf-7wbFLPD63I8SOnGjlbEks5tIh-8gaJpZM4RUxhe>
> .
>

Great @Kunalgarg2100. Welcome to Oppia! 😄  You can go ahead as I have assigned it to you.
Hey @vibhor98! If i am not wrong , `core.domain.collection_domain` is already Update docstrings and there is no class in line no:- 32.
Hello @jervis446! Instead of going by the mentioned line numbers, run:
`pylint --disable=all --enable=missing-docstring <path/to/file>`   
Thanks!
OK thanks @apb7 
Hi , @vibhor98 I'd like to work on  `core.domain.param_domain`
Hello @jervis446! I have assigned it to you. Thanks! 
Hello, @apb7 I new but have signed the CLA I would like to work on core.domain.stats_domain 
@NickeL74, assigned you that!
Hi @vibhor98 I was thinking to work on "core.domain.acl_decorators". But unfortunately, 
I'm getting some errors while executing the pylint command given above. Can you please help.

![error](https://user-images.githubusercontent.com/22103406/35197616-ca7b4aa2-ff07-11e7-97cf-aad646bd0815.png)


 
Hey @Nix07! Please put another `-` before `disable` (`pylint --disable=all --enable=missing-docstring <path/to/file>`) and see if that works!   
Thanks!
Give me a moment please!
Nope, it is still not working!

![12](https://user-images.githubusercontent.com/22103406/35197721-8f139bca-ff09-11e7-91dd-2cb9d62ec29b.png)

Hi @Nix07 , Is your local branch up  to date? Because these checks have been recently added and linter may not be able to find docstyle.
Yeah, it's up-to-date.  
@Nix07: Can you please do a `pylint --version` once? Also, remove these [lines](https://github.com/oppia/oppia/blob/develop/.pylintrc#L8:L11) from .pylintrc and then try once more!  
Thanks!
Can you also check you `.pylintrc` file? It contains plugin for
extensions.docstyle. May be it's not installed properly or there is any
version difference.

On Mon, Jan 22, 2018 at 12:25 AM, Nikhil Prakash <notifications@github.com>
wrote:

> Yeah, it's up-to-date.
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-359271106>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AZZHvEfmjYSslQyAXPuTeVRWv6Gydml_ks5tM4gdgaJpZM4RUxhe>
> .
>

Thanks @apb7 Got the output, after removing those lines!
And Thanks @vibhor98 for your time...
@vibhor98: ~~I think the current pylint version  1.7.1 does not support `pylint.extensions.docstyle` which was used in PR #4572. It only has support for `pylint.extensions.docparams`. Please confirm your Pylint version once @vibhor98 so that we can look into this.~~ 
I tried this locally by using the exact version 1.7.1 and it works. The problem would have been with @Nix07's pylint version (1.5.2)
Thanks again @vibhor98! Sorry for troubling you :) 
@apb7 my pylint version is -- 1.8.1. So this is the issue.

On Mon, Jan 22, 2018 at 12:47 AM, Apurv Bajaj <notifications@github.com>
wrote:

> @vibhor98 <https://github.com/vibhor98>: The current pylint version 1.7.1
> does not support pylint.extensions.docstyle which was used in PR #4572
> <https://github.com/oppia/oppia/pull/4572>. It only has support for
> pylint.extensions.docparams. Please confirm your Pylint version once
> @vibhor98 <https://github.com/vibhor98> so that we can look after this.
> Thanks!
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-359272676>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AZZHvHpf7U2XifP-vdseCGJhVGNhZMBtks5tM41lgaJpZM4RUxhe>
> .
>

Hi,
Can I have core.platform.models and core.platform.email.gae_email_services ?
Regards,
Chirag Vashist
Sure go ahead @SerChirag . Assigned it to you.
Hi, @vibhor98 , I am unable to understand how I have to start because their lots of file and I confused with them, please suggest me because I am new to the opensource organization.
Hey there @Sunil16202! Please check out this [page](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up) to get started!  
Thanks!
@apb7 @vibhor98 Just to confirm @Sunil16202 has already signed the CLA. I think he needs help in getting started with this issue!
Sir I am unable to understand what's things we have to do by docstrings,
Since it is for documenting function, class etc. It is basically comment
for other developer.

Thanks
Sunill

On Jan 26, 2018 4:07 PM, "Shubha Gupta" <notifications@github.com> wrote:

> @apb7 <https://github.com/apb7> @vibhor98 <https://github.com/vibhor98>
> Just to confirm @Sunil16202 <https://github.com/sunil16202> has already
> signed the CLA. I think he needs help in getting started with this issue!
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-360744834>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AWR_t_HoeD6Yn15yUCflBo0SM5bD8BdEks5tOardgaJpZM4RUxhe>
> .
>

Thanks, @shubha1593!
@sunil1602: We need to document _what_ each function/method does which
includes writing its arguments, returns and raises.
To start with, follow these steps:
1. Pick up any file which hasn't been documented yet.
2. Run `pylint --disable=all --enable=missing-docstrings <path/to/file>`
and see which functions/methods need documentation.(Please ensure that your
Pylint version is 1.7.1. You can check this by `pylint --version`)
3. Before documenting, you may need to look at the already documented files
in order to see what the right way to do this, is.
You can find all this information as comments in the thread. Go through
them once!
Thanks!

On Jan 26, 2018 4:40 PM, "Sunil Gupta" <notifications@github.com> wrote:

> Sir I am unable to understand what's things we have to do by docstrings,
> Since it is for documenting function, class etc. It is basically comment
> for other developer.
>
> Thanks
> Sunill
>
> On Jan 26, 2018 4:07 PM, "Shubha Gupta" <notifications@github.com> wrote:
>
> > @apb7 <https://github.com/apb7> @vibhor98 <https://github.com/vibhor98>
> > Just to confirm @Sunil16202 <https://github.com/sunil16202> has already
> > signed the CLA. I think he needs help in getting started with this issue!
> >
> > —
> > You are receiving this because you were mentioned.
> > Reply to this email directly, view it on GitHub
> > <https://github.com/oppia/oppia/issues/4374#issuecomment-360744834>, or
> mute
> > the thread
> > <https://github.com/notifications/unsubscribe-auth/AWR_t_
> HoeD6Yn15yUCflBo0SM5bD8BdEks5tOardgaJpZM4RUxhe>
> > .
> >
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-360755864>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AXrQuZXj3QNt88AHNu2t2op4E-3T6Dtqks5tObKMgaJpZM4RUxhe>
> .
>

Thanks

On Jan 26, 2018 5:05 PM, "Apurv Bajaj" <notifications@github.com> wrote:

Thanks, @shubha1593!
@sunil1602: We need to document _what_ each function/method does which
includes writing its arguments, returns and raises.
To start with, follow these steps:
1. Pick up any file which hasn't been documented yet.
2. Run `pylint --disable=all --enable=missing-docstrings <path/to/file>`
and see which functions/methods need documentation.(Please ensure that your
Pylint version is 1.7.1. You can check this by `pylint --version`)
3. Before documenting, you may need to look at the already documented files
in order to see what the right way to do this, is.
You can find all this information as comments in the thread. Go through
them once!
Thanks!


On Jan 26, 2018 4:40 PM, "Sunil Gupta" <notifications@github.com> wrote:

> Sir I am unable to understand what's things we have to do by docstrings,
> Since it is for documenting function, class etc. It is basically comment
> for other developer.
>
> Thanks
> Sunill
>
> On Jan 26, 2018 4:07 PM, "Shubha Gupta" <notifications@github.com> wrote:
>
> > @apb7 <https://github.com/apb7> @vibhor98 <https://github.com/vibhor98>
> > Just to confirm @Sunil16202 <https://github.com/sunil16202> has already

> > signed the CLA. I think he needs help in getting started with this
issue!
> >
> > —
> > You are receiving this because you were mentioned.
> > Reply to this email directly, view it on GitHub
> > <https://github.com/oppia/oppia/issues/4374#issuecomment-360744834>, or
> mute
> > the thread
> > <https://github.com/notifications/unsubscribe-auth/AWR_t_
> HoeD6Yn15yUCflBo0SM5bD8BdEks5tOardgaJpZM4RUxhe>
> > .

> >
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-360755864>, or
mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/
AXrQuZXj3QNt88AHNu2t2op4E-3T6Dtqks5tObKMgaJpZM4RUxhe>
> .

>

—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<https://github.com/oppia/oppia/issues/4374#issuecomment-360762909>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/AWR_t6hM94aEAh0U4rbulD-rIQW_QP6kks5tObh5gaJpZM4RUxhe>
.

I have pylint version 1.8, is there any problem?
Hello @Sunil16202! Please prefer using pylint 1.7.1 although I don't think 1.8 will cause any problem with docstring checking. Thanks!
I run code with Pylint 1.8, its ok.
How I can know that which type of class or function, what's things do.
@Sunil16202: Please follow the instructions given above in the issue thread! Thanks!
@seanlip. I'd like to work on core.domain.feedback_jobs_continuous.
Thanks
Sure! @Sunil16202 , Go ahead. Assigned you.
@Sunil16202 , What about `core.domain.stats_jobs_continuous` ? It's also assigned to you. 
@vibhor98 I am still working on it, it has huge lines of code approx 700 line. So, it is a little bit of difficult to understand entire code, is there any other way to do that.
@Sunil16202 , It's fine then. You can analyze only specific function for which docstrings have to be added and not the whole code. But yes, little understanding of the functions that is called by the concerned function is needed.
When I run "pylint --disable=all --enable=missing-docstring", it gives me Your code has been rated at 9.66/10. It is fine or it should give 10.

The rating should be 10. Please see to this!  Thanks!
How I can handle this, Since I am using pylint 1.8

On Jan 31, 2018 1:53 PM, "Apurv Bajaj" <notifications@github.com> wrote:

> The rating should be 10. Please see to this! Thanks!
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-361857874>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AWR_t40VlCUBiTIZ49fKLQBTmlfovA73ks5tQCLsgaJpZM4RUxhe>
> .
>

Sorry, I am unable to understand the _exact_ problem you are facing. Make sure _all_ methods/functions/classes which spring up during pylint check are documented. Only then will you get a rating of 10.  
I'm again quoting the procedure to be followed:  
>To start with, follow these steps: 
>1. Pick up any file which hasn't been documented yet. 
>2. Run `pylint --disable=all --enable=missing-docstrings <path/to/file>` and see which functions/methods need documentation.(Please ensure that your Pylint version is 1.7.1. You can check this by `pylint --version`) 
>3. Before documenting, you may need to look at the already documented files in order to see what the right way to do this, is. 
>You can find all this information as comments in the thread. Go through them once.  

Please go through the already documented files once again!  
Thanks!
Hi @Sunil16202, go through the @apb7's comment and if you aren't able to run pylint then please follow this :

(`C: lineNumber`)
You'll have to write doc-string on the following line numbers:
- If you're working for feedback_jobs_continuous, then follow this:
```
************* Module oppia.core.domain.feedback_jobs_continuous
C:  1, 0: Missing module docstring (missing-docstring)
C: 30, 0: Missing class docstring (missing-docstring)
C: 42, 4: Missing method docstring (missing-docstring)
C: 47, 4: Missing method docstring (missing-docstring)
C: 51, 4: Missing method docstring (missing-docstring)
C: 68, 8: Missing function docstring (missing-docstring)
C: 82, 8: Missing function docstring (missing-docstring)
C: 96, 8: Missing function docstring (missing-docstring)
C:195, 4: Missing method docstring (missing-docstring)
C:199, 4: Missing method docstring (missing-docstring)

Global evaluation
-----------------
Your code has been rated at 8.61/10
```
- otherwise, follow this:
```
************* Module oppia.core.domain.stats_jobs_continuous
C: 55, 0: Missing class docstring (missing-docstring)
C: 66, 4: Missing method docstring (missing-docstring)
C: 72, 4: Missing method docstring (missing-docstring)
C: 76, 4: Missing method docstring (missing-docstring)
C: 95, 8: Missing function docstring (missing-docstring)
C:109, 8: Missing function docstring (missing-docstring)
C:231, 4: Missing method docstring (missing-docstring)
C:235, 4: Missing method docstring (missing-docstring)
C:512, 4: Missing method docstring (missing-docstring)
C:516, 4: Missing method docstring (missing-docstring)
C:525, 4: Missing method docstring (missing-docstring)
C:549, 4: Missing method docstring (missing-docstring)
C:698, 0: Missing class docstring (missing-docstring)
C:711, 4: Missing method docstring (missing-docstring)
C:715, 4: Missing method docstring (missing-docstring)
C:719, 4: Missing method docstring (missing-docstring

Global evaluation
-----------------
Your code has been rated at 9.32/10
```
Do let us know for which part you're working so that we can de-assign you from the other parts.
Thanks!
Thanks, I understood, what's a thing I was doing wrong.
I am working on stats_jobs_continuous.
@shubha1593 Can I start working on core.jobs?
Hi @anookeen , Have you signed the CLA first? If not, please check out this [page](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up) to get started and then, you can move ahead.
Yes @vibhor98  I have signed up the CLA.
Great! @anookeen , I've assigned you. You can go ahead! :)
Thanks :) @vibhor98 
Hi guys, I am new here and to open source as well. I would like to work on this. So, what should I start with?

Hello @harsha444! Thanks for your interest. Would mind going through the instructions [here](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up) and sign the CLA as stated? Once you're done, follow these steps for this issue:  
>1. Pick up any file which hasn't been documented yet.
>2. Run `pylint --disable=all --enable=missing-docstrings <path/to/file>`
and see which functions/methods need documentation.(Please ensure that your
>Pylint version is 1.7.1. You can check this by `pylint --version`)
>3. Before documenting, you may need to look at the already documented files
in order to see what the right way to do this, is.
You can find all this information as comments in the thread. Go through
them once!

Thanks! 
I have done that previously. Doing it once is enough right? @apb7 
The task was assigned by @vibhor to me

On 8 February 2018 at 16:26, Sri Harsha <notifications@github.com> wrote:

> I have done that previously. Doing it once is enough right? @apb7
> <https://github.com/apb7>
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-364166535>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/ATVkTGKpBqGF8l6XAO9ZlZeIEtEZWB-Yks5tSyBOgaJpZM4RUxhe>
> .
>

Yes, @harsha444. I've updated the comment. Please see it once :) 
Sure, thanks.! @apb7 
I completed  core.domain.stats_jobs_continuous, how can I push it?
 @sunil16202 use this command
git push origin your-branch-name
I got an error.
![screenshot from 2018-02-10 16-44-22](https://user-images.githubusercontent.com/23363511/36061557-e64fdc82-0e81-11e8-88f8-57d3f9e69082.png)


try git push -u origin develop @Sunil16202 
Have you set the origin ? @sunil
Hello @Sunil16202! Please use `git push origin your-branch-name` and not your forked repo URL.  
Thanks!
no, how can I set @anookeen 
git remote add origin path/to/your/repo/on/github
@sunil use this command
git remote add origin path/to/your/repo/on/github
what is branch name for  core.domain.stats_jobs_continuous, I have to push it.
Use the command " git branch" to see the name of branch.

On 11 Feb 2018 9:50 am, "Sunil Gupta" <notifications@github.com> wrote:

what is branch name for core.domain.stats_jobs_continuous, I have to push
it.

—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<https://github.com/oppia/oppia/issues/4374#issuecomment-364721412>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/ATVkTF0dJ3E97kAquqbjWzaNcP33BSEZks5tTnGdgaJpZM4RUxhe>
.

I got, 
* develop

@sunil kindly make another branch and commit changes to that branch.  Push
that to the origin afterwards. You don't have to change the develop.

On 11 Feb 2018 9:54 am, "Sunil Gupta" <notifications@github.com> wrote:

> I got,
>
>    - develop
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-364721571>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/ATVkTKpdGS8ihSK7nl8UUWxsjxSaJCekks5tTnJogaJpZM4RUxhe>
> .
>

but, I ran code git push origin develop,
It shows me Everything up-to-date

![capture](https://user-images.githubusercontent.com/23363511/36069897-ebc7ba78-0f16-11e8-82c7-6006bf49f751.PNG)

@Sunil was this task of docstrings assigned to you?

On 11 Feb 2018 10:03 am, "Sunil Gupta" <notifications@github.com> wrote:

> [image: capture]
> <https://user-images.githubusercontent.com/23363511/36069897-ebc7ba78-0f16-11e8-82c7-6006bf49f751.PNG>
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-364721989>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/ATVkTFw5aS06VdldqPAlZ7hib6W0SHaoks5tTnSKgaJpZM4RUxhe>
> .
>

Yes, This task was assigned to me.
core.domain.stats_jobs_continuous @Sunil16202
@anookeen  I create new branch as local then I used git push origin local.
![sunil](https://user-images.githubusercontent.com/23363511/36069976-46537ea4-0f18-11e8-992a-6d548620b754.png)

@sunil is your git now updated?

On 11 Feb 2018 10:13 am, "Sunil Gupta" <notifications@github.com> wrote:

> I create new branch as local then I used git push origin local.
> [image: sunil]
> <https://user-images.githubusercontent.com/23363511/36069976-46537ea4-0f18-11e8-992a-6d548620b754.png>
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-364722445>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/ATVkTAr6ddlDm3sDWDvVBRFiCd58oapxks5tTncLgaJpZM4RUxhe>
> .
>

yes, it shows me this
Branch local set up to track remote branch local from origin.
Everything up-to-date
@anookeen 

Okay @sunil this seems fine to me.

On 11 Feb 2018 10:29 am, "Sunil Gupta" <notifications@github.com> wrote:

> yes, it shows me this
> Branch local set up to track remote branch local from origin.
> Everything up-to-date
> @anookeen <https://github.com/anookeen>
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-364723019>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/ATVkTPsrHuJnMEgB7Alsja1_kXPiWCHCks5tTnrTgaJpZM4RUxhe>
> .
>

but, on Oppia GitHub site, this task has not checked.
 core.domain.stats_jobs_continuous @Sunil16202
@anookeen 
Have you created the pull request? If not create one. It will be reviewed
by the mentors and they'll merge that into oppia. Then it will appear
checked @sunil

On 11 Feb 2018 10:33 am, "Sunil Gupta" <notifications@github.com> wrote:

> but, on Oppia GitHub site, this task has not checked.
> core.domain.stats_jobs_continuous @Sunil16202
> <https://github.com/sunil16202>
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-364723170>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/ATVkTEeVB99NQGdo8UxoO50ewSKZcGUNks5tTnvCgaJpZM4RUxhe>
> .
>

I ran code
git pull origin local
Is it fine.

On Feb 11, 2018 11:15 AM, "Anoosha keen" <notifications@github.com> wrote:

> Have you created the pull request? If not create one. It will be reviewed
> by the mentors and they'll merge that into oppia. Then it will appear
> checked @sunil
>
> On 11 Feb 2018 10:33 am, "Sunil Gupta" <notifications@github.com> wrote:
>
> > but, on Oppia GitHub site, this task has not checked.
> > core.domain.stats_jobs_continuous @Sunil16202
> > <https://github.com/sunil16202>
> >
> > —
> > You are receiving this because you were mentioned.
> > Reply to this email directly, view it on GitHub
> > <https://github.com/oppia/oppia/issues/4374#issuecomment-364723170>, or
> mute
> > the thread
> > <https://github.com/notifications/unsubscribe-auth/
> ATVkTEeVB99NQGdo8UxoO50ewSKZcGUNks5tTnvCgaJpZM4RUxhe>
> > .
> >
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-364723784>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AWR_t3IZ1zCFDMtFTtN63uixnmiVJivcks5tTn6BgaJpZM4RUxhe>
> .
>

You need not to pull from origin rather you should pull from the  oppia's
github to make your local branch insync with oppia develop.

On 11 Feb 2018 10:54 am, "Sunil Gupta" <notifications@github.com> wrote:

> I ran code
> git pull origin local
> Is it fine.
>
> On Feb 11, 2018 11:15 AM, "Anoosha keen" <notifications@github.com> wrote:
>
> > Have you created the pull request? If not create one. It will be reviewed
> > by the mentors and they'll merge that into oppia. Then it will appear
> > checked @sunil
> >
> > On 11 Feb 2018 10:33 am, "Sunil Gupta" <notifications@github.com> wrote:
> >
> > > but, on Oppia GitHub site, this task has not checked.
> > > core.domain.stats_jobs_continuous @Sunil16202
> > > <https://github.com/sunil16202>
> > >
> > > —
> > > You are receiving this because you were mentioned.
> > > Reply to this email directly, view it on GitHub
> > > <https://github.com/oppia/oppia/issues/4374#issuecomment-364723170>,
> or
> > mute
> > > the thread
> > > <https://github.com/notifications/unsubscribe-auth/
> > ATVkTEeVB99NQGdo8UxoO50ewSKZcGUNks5tTnvCgaJpZM4RUxhe>
> > > .
> > >
> >
> > —
> > You are receiving this because you were mentioned.
> > Reply to this email directly, view it on GitHub
> > <https://github.com/oppia/oppia/issues/4374#issuecomment-364723784>, or
> mute
> > the thread
> > <https://github.com/notifications/unsubscribe-auth/AWR_
> t3IZ1zCFDMtFTtN63uixnmiVJivcks5tTn6BgaJpZM4RUxhe>
> > .
> >
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-364724323>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/ATVkTCrBsFyEk_DVwYCPfrwIgFVNnUqLks5tToB-gaJpZM4RUxhe>
> .
>

@Sunil16202 Please take a look at [this](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#instructions-for-making-a-code-change). This should help!
Hi! I have completed the setup of Oppia and have signed the CLA. I'd like to start working on one of the files now. 
Hey @divyadeep1 , Feel free to select any of the remaining files and let us know so that I can assign you the same.
@vibhor98 Before selecting a file, there's an issue that I need some help with. When I run `pylint --disable=all --enable=missing-docstring <filename>`, I get an import error saying "No module named docstyle". How should I fix this?
Hey, @divyadeep1! Please ensure that your pylint version is >=1.7.1. You can check it by `pylint --version`.  
Thanks!
Hey @apb7, it was a version problem indeed. Thanks a lot! So I checked almost all the files using pylint, but it doesn't show me missing-docstring on any of them. It shows a score of 10/10 with no information on missing docstrings. Am I doing something wrong?
Hi, @divyadeep1! Please select any of the remaining files and let us know it first. Then, as stated in the thread, use:  
`
pylint --disable=all --enable=missing-docstring <path/to/file>
`
Also, please ensure the version is >= 1.7.1.  
Thanks!
@divyadeep1: This is the output which I get:  
```
************* Module oppia.core.domain.acl_decorators
C: 31, 4: Missing function docstring (missing-docstring)
C: 41, 4: Missing function docstring (missing-docstring)
C: 61, 4: Missing function docstring (missing-docstring)
C: 80, 4: Missing function docstring (missing-docstring)
C:101, 4: Missing function docstring (missing-docstring)
C:120, 4: Missing function docstring (missing-docstring)
C:142, 4: Missing function docstring (missing-docstring)
C:159, 4: Missing function docstring (missing-docstring)
C:176, 4: Missing function docstring (missing-docstring)
C:193, 4: Missing function docstring (missing-docstring)
C:226, 4: Missing function docstring (missing-docstring)
C:242, 4: Missing function docstring (missing-docstring)
C:259, 4: Missing function docstring (missing-docstring)
C:278, 4: Missing function docstring (missing-docstring)
C:297, 4: Missing function docstring (missing-docstring)
C:323, 4: Missing function docstring (missing-docstring)
C:338, 4: Missing function docstring (missing-docstring)
C:352, 4: Missing function docstring (missing-docstring)
C:366, 4: Missing function docstring (missing-docstring)
C:389, 4: Missing function docstring (missing-docstring)
C:412, 4: Missing function docstring (missing-docstring)
C:428, 4: Missing function docstring (missing-docstring)
C:449, 4: Missing function docstring (missing-docstring)
C:469, 4: Missing function docstring (missing-docstring)
C:491, 4: Missing function docstring (missing-docstring)
C:512, 4: Missing function docstring (missing-docstring)
C:527, 4: Missing function docstring (missing-docstring)

-----------------------------------
Your code has been rated at 8.98/10
```  
Can you please try running it from the oppia directory? (You can use this list as a reference though.) 
@apb7: I'm using this command from the oppia directory: `pylint --disable=all --enable=mising-docstring core/domain/acl_decorators.py` but still it's showing me the same output as before.
Hi @divyadeep1 This file has already one [PR](https://github.com/oppia/oppia/pull/4604/files). Can you choose some other one? It was not updated. But now I have updated it.
Hey @vibhor98, how about core.storage.job.gae_models then?
@divyadeep1 , you can take it. Shall I assign you?
@vibhor98 Yes, please do. The problem is here as well though.
![screenshot from 2018-02-16 21-30-11](https://user-images.githubusercontent.com/19911687/36316561-a7f1e906-1360-11e8-9c46-dc8cede2203f.png)

@divyadeep1: Please change `mising` to `missing`. If this does not works, please post the output of `pylint --version` here.   
Thanks!

@divyadeep1: Please change `mising` to `missing`. If this does not work, please post the output of `pylint --version` here.   
Thanks!

@apb7 It did work. I feel so silly. Thank you so much!

@divyadeep1 , I've assigned you. Please, go ahead!
Working on it, Thanks @vibhor98 
@divyadeep1: No problem, happy to help :)
Hey, @WickedBrat! Please use this to check the line numbers in case of any ambiguity:  
`pylint --disable=all --enable=missing-docstring <path/to/file>` 
Thanks!
@WickedBrat: I've updated the line numbers in the issue thread. Do you plan to work on this?
@WickedBrat: Sure, go ahead -- I've assigned you! 
what should be the head branch, when I have to push  "core.domain.stats_jobs_continuous".
Head branch should be Oppia's develop branch. You can push from your branch
to this branch. Thanks!

On Tue, Feb 27, 2018 at 10:00 AM, Sunil Gupta <notifications@github.com>
wrote:

> what should be the head branch, when I have to push
> "core.domain.stats_jobs_continuous".
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-368743922>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AZZHvFRjNsQwQ0_KleF507U2RxKWPtpEks5tY4TggaJpZM4RUxhe>
> .
>

I did it and it shows me " These branches can be automatically merged"
It means you have previously commited to the Oppia's develop branch with
your same branch. Then, your commit merges with your previous commits. Try
to push with new branch of yours and this problem can be removed.

On Tue, Feb 27, 2018 at 10:15 AM, Sunil Gupta <notifications@github.com>
wrote:

> I did it and it shows me " These branches can be automatically merged"
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-368746081>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AZZHvHMPDrvdMrp3cMnKD8-j0QLo1ip3ks5tY4iHgaJpZM4RUxhe>
> .
>

I submitted the core.domain.feedback_jobs_continuous file but, it is not checked. How can I check this file?
What do you mean by 'it is not checked' ? Are you talking about Travis
tests?

On Tue, Mar 6, 2018 at 11:50 PM, Sunil Gupta <notifications@github.com>
wrote:

> I submitted the core.domain.feedback_jobs_continuous file but, it is not
> checked. How can I check this file?
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-370877649>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AZZHvPuFKjmiBAQ0-_OEvIGJSeqyqjgLks5tbtNogaJpZM4RUxhe>
> .
>

I completed  core.domain.stats_jobs_continuous @Sunil16202, but this is not checked. So, how can I know this work is done by me.
If it is merged, then you can check it. :)

On Wed, Mar 7, 2018 at 12:04 AM, Sunil Gupta <notifications@github.com>
wrote:

> I completed core.domain.stats_jobs_continuous @Sunil16202
> <https://github.com/sunil16202>, but this is not checked. So, how can I
> know this work is done by me.
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/oppia/oppia/issues/4374#issuecomment-370882025>, or mute
> the thread
> <https://github.com/notifications/unsubscribe-auth/AZZHvJ_QgY34ryhmC_K0UEK9bJuGlWJfks5tbtaYgaJpZM4RUxhe>
> .
>

When it will be merged because I want to know that work is completely correct or I should change something on it.
Hi, i would like to work on:
 - core.jobs
 - core.domain.user_jobs_continuous
 - core.domain.user_jobs_one_off

For the core.jobs, line numbers for methods are not aligned.

Hi @GanitGenius, assigned you! 
Hey @vibhor98, could you please check out the line numbers for methods in core.jobs? 
Hi @Sunil16202, might want to check the 5th point [here](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#instructions-for-making-a-code-change), that should answer your question!
Hi @GanitGenius , there is need to update class docstrings only. Here are the line nos.-
```C:518, 0: Missing class docstring (missing-docstring)
C:581, 0: Missing class docstring (missing-docstring)
C:613, 0: Missing class docstring (missing-docstring)
C:643, 0: Missing class docstring (missing-docstring)
C:846, 0: Missing class docstring (missing-docstring)
C:934, 0: Missing class docstring (missing-docstring)
```
Hope this helps!
Hi! Can I work on core.domain.user_query_services and core.domain.user_services. I have gone through the instructions and signed the CLA.
Thanks :smile: 
Sure, @proishan11! I've assigned you. Welcome to Oppia :) 
Working on it. Thanks, @apb7 .
Hi! I am new here and want to work on `core.platform.email.gae_email_services`. I have read the instructions.
Thanks
@square-1111 : Sure, go ahead -- I've assigned you :)
Hi @vibhor98 , I am new here and would like to start contributing, i would like to work on `core.domain.value_generators_domain`  , can you assign me this?
I've already read the instructions and signed the CLA
Thanks! 
Hi @vasutomar , Welcome to Oppia! 😄 Sure, I've assigned you. Please go ahead!
Hi @GanitGenius , Are you working on the assigned files for updating the docstrings? Thanks!
@vibhor98 yes i will do it soon, need some more time.
@apb7 & @vibhor98, Can you please check why we are getting missing docstrings  on line one for [scripts/custom_lint_checks.py](https://github.com/oppia/oppia/blob/develop/scripts/custom_lint_checks.py) file?
@DubeySandeep, It's because each python file must have module docstrings too which is missing in this file. 
I'd like to work on oppia.scripts.custom_lint_checks ! Thanks!

Hi @Panda2498 -- thanks! Assigned you :)
Assigned `oppia.core.domain.acl_decorators` to @sumayaSalihs.
Hi @bugtester7, have you signed the CLA? if no then would you mind following these [wiki](https://github.com/oppia/oppia/wiki/Contributing-code-to-Oppia#setting-things-up) instructions to get started? :)
Hi! @diveshuttam. Welcome to Oppia! Please could you follow the instructions <a href="https://goo.gl/forms/AttNH80OV0">here</a> to get started ? You'll need to do this before we can accept your PR. Thanks!
Getting error while using pylint on your codebase.
any suggestion for other tool for test.
i would like to work on oppia.scripts.build
Hi @import-keshav , I am currently working on `oppia.scripts.build`  via PR #5580 and have filled out all docstring. Would you mind taking up a different file?
EDIT: oppia.scripts.build is completed. 
ok no problem @hoangviet1993 , i can work on other file  :+1 
Please assign me an issue.
Assigned oppia.feconf to @rahulnitdgp. Thanks!

Resolving patch:
diff --git a/core/domain/acl_decorators.py b/core/domain/acl_decorators.py
--- a/core/domain/acl_decorators.py
+++ b/core/domain/acl_decorators.py
@@ -34,10 +34,26 @@
 
 
 def open_access(handler):
-    """Decorator to give access to everyone."""
+    """Decorator to give access to everyone.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that can
+            also give access to everyone.
+    """
 
     def test_can_access(self, *args, **kwargs):
-        """Gives access to everyone."""
+        """Gives access to everyone.
+
+        Args:
+            *args: *. Arguments.
+            **kwargs: *. Keyword arguments.
+
+        Returns:
+            *. The return value of the decorated function.
+        """
         return handler(self, *args, **kwargs)
     test_can_access.__wrapped__ = True
 
@@ -45,7 +61,15 @@ def test_can_access(self, *args, **kwargs):
 
 
 def can_play_exploration(handler):
-    """Decorator to check whether user can play given exploration."""
+    """Decorator to check whether user can play given exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now can check
+            if users can play a given exploration.
+    """
 
     def test_can_play(self, exploration_id, **kwargs):
         """Checks if the user can play the exploration.
@@ -77,7 +101,15 @@ def test_can_play(self, exploration_id, **kwargs):
 
 
 def can_view_skill(handler):
-    """Decorator to check whether user can play a given skill."""
+    """Decorator to check whether user can play a given skill.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that can also
+            check if the user can play a given skill.
+    """
 
     def test_can_play(self, skill_id, **kwargs):
         """Checks if the user can play the skill.
@@ -88,6 +120,9 @@ def test_can_play(self, skill_id, **kwargs):
 
         Returns:
             bool. Whether the user can play the given skill.
+
+        Raises:
+            PageNotFoundException: The page is not found.
         """
         # This is a temporary check, since a decorator is required for every
         # method. Once skill publishing is done, whether given skill is
@@ -104,7 +139,15 @@ def test_can_play(self, skill_id, **kwargs):
 
 
 def can_play_collection(handler):
-    """Decorator to check whether user can play given collection."""
+    """Decorator to check whether user can play given collection.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that can also
+            check if a user can play a given collection.
+    """
 
     def test_can_play(self, collection_id, **kwargs):
         """Checks if the user can play the collection.
@@ -135,6 +178,14 @@ def test_can_play(self, collection_id, **kwargs):
 def can_download_exploration(handler):
     """Decorator to check whether user can download given exploration.
     If a user is authorized to play given exploration, they can download it.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that can also check
+            if the user has permission to download a given
+            exploration.
     """
 
     def test_can_download(self, exploration_id, **kwargs):
@@ -168,6 +219,13 @@ def test_can_download(self, exploration_id, **kwargs):
 def can_view_exploration_stats(handler):
     """Decorator to check whether user can view exploration stats.
     If a user is authorized to play given exploration, they can view its stats.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that checks if the user
+            has permission to view exploration stats.
     """
 
     def test_can_view_stats(self, exploration_id, **kwargs):
@@ -199,7 +257,15 @@ def test_can_view_stats(self, exploration_id, **kwargs):
 
 
 def can_edit_collection(handler):
-    """Decorator to check whether the user can edit collection."""
+    """Decorator to check whether the user can edit collection.
+
+    Args:
+        handler: The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that checks if
+            the user has permission to edit a given collection.
+    """
 
     def test_can_edit(self, collection_id, **kwargs):
         """Checks if the user is logged in and can edit the collection.
@@ -235,7 +301,16 @@ def test_can_edit(self, collection_id, **kwargs):
 
 
 def can_manage_email_dashboard(handler):
-    """Decorator to check whether user can access email dashboard."""
+    """Decorator to check whether user can access email dashboard.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now checks
+            if the user has permission to access the email
+            dashboard.
+    """
 
     def test_can_manage_emails(self, **kwargs):
         """Checks if the user is logged in and can access email dashboard.
@@ -265,10 +340,19 @@ def test_can_manage_emails(self, **kwargs):
 
 
 def can_access_moderator_page(handler):
-    """Decorator to check whether user can access moderator page."""
+    """Decorator to check whether user can access moderator page.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now checks
+            if the user has permission to access the moderator
+            page.
+    """
 
     def test_can_access_moderator_page(self, **kwargs):
-        """Checks if the user is logged in and can access moderater page.
+        """Checks if the user is logged in and can access moderator page.
 
         Args:
             **kwargs: *. Keyword arguments.
@@ -295,7 +379,15 @@ def test_can_access_moderator_page(self, **kwargs):
 
 
 def can_send_moderator_emails(handler):
-    """Decorator to check whether user can send moderator emails."""
+    """Decorator to check whether user can send moderator emails.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            the user has permission to send moderator emails.
+    """
 
     def test_can_send_moderator_emails(self, **kwargs):
         """Checks if the user is logged in and can send moderator emails.
@@ -325,10 +417,18 @@ def test_can_send_moderator_emails(self, **kwargs):
 
 
 def can_manage_own_profile(handler):
-    """Decorator to check whether user can manage his profile."""
+    """Decorator to check whether user can manage their profile.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if the user has permission to manage their profile.
+    """
 
     def test_can_manage_profile(self, **kwargs):
-        """Checks if the user is logged in and can manage his profile.
+        """Checks if the user is logged in and can manage their profile.
 
         Args:
             **kwargs: *. Keyword arguments.
@@ -355,7 +455,15 @@ def test_can_manage_profile(self, **kwargs):
 
 
 def can_access_admin_page(handler):
-    """Decorator that checks if the current user is a super admin."""
+    """Decorator that checks if the current user is a super admin.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            the user is a super admin.
+    """
 
     def test_super_admin(self, **kwargs):
         """Checks if the user is logged in and is a super admin.
@@ -384,7 +492,15 @@ def test_super_admin(self, **kwargs):
 
 
 def can_upload_exploration(handler):
-    """Decorator that checks if the current user can upload exploration."""
+    """Decorator that checks if the current user can upload exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            a user has permission to upload an exploration.
+    """
 
     def test_can_upload(self, **kwargs):
         """Checks if the user can upload exploration.
@@ -413,7 +529,15 @@ def test_can_upload(self, **kwargs):
 
 
 def can_create_exploration(handler):
-    """Decorator to check whether the user can create an exploration."""
+    """Decorator to check whether the user can create an exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if a user has permission to create an exploration.
+    """
 
     def test_can_create(self, **kwargs):
         """Checks if the user can create an exploration.
@@ -443,7 +567,15 @@ def test_can_create(self, **kwargs):
 
 
 def can_create_collection(handler):
-    """Decorator to check whether the user can create a collection."""
+    """Decorator to check whether the user can create a collection.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if a user has permission to create a collection.
+    """
 
     def test_can_create(self, **kwargs):
         """Checks if the user can create a collection.
@@ -473,7 +605,15 @@ def test_can_create(self, **kwargs):
 
 
 def can_access_creator_dashboard(handler):
-    """Decorator to check whether the user can access creator dashboard page."""
+    """Decorator to check whether the user can access creator dashboard page.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if a
+            user has permission to access the creator dashboard page.
+    """
 
     def test_can_access(self, **kwargs):
         """Checks if the user can access the creator dashboard page.
@@ -504,6 +644,13 @@ def test_can_access(self, **kwargs):
 
 def can_create_feedback_thread(handler):
     """Decorator to check whether the user can create a feedback thread.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            a user has permission to create a feedback thread.
     """
 
     def test_can_access(self, exploration_id, **kwargs):
@@ -539,7 +686,15 @@ def test_can_access(self, exploration_id, **kwargs):
 
 
 def can_view_feedback_thread(handler):
-    """Decorator to check whether the user can view a feedback thread."""
+    """Decorator to check whether the user can view a feedback thread.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            a user has permission to view a feedback thread.
+    """
 
     def test_can_access(self, thread_id, **kwargs):
         """Checks if the user can view a feedback thread.
@@ -580,6 +735,14 @@ def test_can_access(self, thread_id, **kwargs):
 
 def can_comment_on_feedback_thread(handler):
     """Decorator to check whether the user can comment on feedback thread.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            the user has permission to comment on a given feedback
+            thread.
     """
 
     def test_can_access(self, thread_id, **kwargs):
@@ -628,6 +791,13 @@ def test_can_access(self, thread_id, **kwargs):
 def can_rate_exploration(handler):
     """Decorator to check whether the user can give rating to given
     exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if the user has permission to rate a given exploration.
     """
 
     def test_can_rate(self, exploration_id, **kwargs):
@@ -656,7 +826,15 @@ def test_can_rate(self, exploration_id, **kwargs):
 
 
 def can_flag_exploration(handler):
-    """Decorator to check whether user can flag given exploration."""
+    """Decorator to check whether user can flag given exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            a user can flag a given exploration.
+    """
 
     def test_can_flag(self, exploration_id, **kwargs):
         """Checks if the user can flag the exploration.
@@ -683,7 +861,15 @@ def test_can_flag(self, exploration_id, **kwargs):
 
 
 def can_subscribe_to_users(handler):
-    """Decorator to check whether user can subscribe/unsubscribe a creator."""
+    """Decorator to check whether user can subscribe/unsubscribe a creator.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            a user has permission to subscribe/unsubscribe a creator.
+    """
 
     def test_can_subscribe(self, **kwargs):
         """Checks if the user can subscribe/unsubscribe a creator.
@@ -709,7 +895,15 @@ def test_can_subscribe(self, **kwargs):
 
 
 def can_edit_exploration(handler):
-    """Decorator to check whether the user can edit given exploration."""
+    """Decorator to check whether the user can edit given exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            a user has permission to edit a given exploration.
+    """
 
     def test_can_edit(self, exploration_id, *args, **kwargs):
         """Checks if the user can edit the exploration.
@@ -748,7 +942,15 @@ def test_can_edit(self, exploration_id, *args, **kwargs):
 
 
 def can_translate_exploration(handler):
-    """Decorator to check whether the user can translate given exploration."""
+    """Decorator to check whether the user can translate given exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if a
+            user has permission to translate a given exploration.
+    """
 
     def test_can_translate(self, exploration_id, **kwargs):
         """Checks if the user can translate the exploration.
@@ -786,7 +988,16 @@ def test_can_translate(self, exploration_id, **kwargs):
 
 
 def can_delete_exploration(handler):
-    """Decorator to check whether user can delete exploration."""
+    """Decorator to check whether user can delete exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that checks if
+            a user has permission to delete a given
+            exploration.
+    """
 
     def test_can_delete(self, exploration_id, **kwargs):
         """Checks if the user can delete the exploration.
@@ -799,6 +1010,7 @@ def test_can_delete(self, exploration_id, **kwargs):
             *. The return value of the decorated function.
 
         Raises:
+            NotLoggedInException: The user is not logged in.
             UnauthorizedUserException: The user does not have
                 permissions to delete an exploration.
         """
@@ -823,6 +1035,14 @@ def test_can_delete(self, exploration_id, **kwargs):
 def can_suggest_changes_to_exploration(handler):
     """Decorator to check whether a user can make suggestions to an
     exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            a user has permission to make suggestions to an
+            exploration.
     """
 
     def test_can_suggest(self, exploration_id, **kwargs):
@@ -851,7 +1071,15 @@ def test_can_suggest(self, exploration_id, **kwargs):
 
 
 def can_suggest_changes(handler):
-    """Decorator to check whether a user can make suggestions."""
+    """Decorator to check whether a user can make suggestions.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if the user has permission to make suggestions.
+    """
 
     def test_can_suggest(self, **kwargs):
         """Checks if the user can make suggestions to an exploration.
@@ -877,7 +1105,16 @@ def test_can_suggest(self, **kwargs):
 
 
 def can_publish_exploration(handler):
-    """Decorator to check whether user can publish exploration."""
+    """Decorator to check whether user can publish exploration.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also
+            checks if the user has permission to publish an
+            exploration.
+    """
 
     def test_can_publish(self, exploration_id, *args, **kwargs):
         """Checks if the user can publish the exploration.
@@ -891,6 +1128,7 @@ def test_can_publish(self, exploration_id, *args, **kwargs):
             *. The return value of the decorated function.
 
         Raises:
+            PageNotFoundException: The page is not found.
             UnauthorizedUserException: The user does not have
                 credentials to publish an exploration.
         """
@@ -912,7 +1150,15 @@ def test_can_publish(self, exploration_id, *args, **kwargs):
 
 
 def can_publish_collection(handler):
-    """Decorator to check whether user can publish collection."""
+    """Decorator to check whether user can publish collection.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if a user has permission to publish a collection.
+    """
 
     def test_can_publish_collection(self, collection_id, **kwargs):
         """Checks if the user can publish the collection.
@@ -925,6 +1171,7 @@ def test_can_publish_collection(self, collection_id, **kwargs):
             *. The return value of the decorated function.
 
         Raises:
+            PageNotFoundException: The page is not found.
             UnauthorizedUserException: The user does not have
                 credentials to publish a collection.
         """
@@ -945,7 +1192,16 @@ def test_can_publish_collection(self, collection_id, **kwargs):
 
 
 def can_unpublish_collection(handler):
-    """Decorator to check whether user can unpublish collection."""
+    """Decorator to check whether user can unpublish a given
+    collection.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that also checks if
+            the user has permission to unpublish a collection.
+    """
 
     def test_can_unpublish_collection(self, collection_id, **kwargs):
         """Checks if the user can unpublish the collection.
@@ -958,6 +1214,7 @@ def test_can_unpublish_collection(self, collection_id, **kwargs):
             *. The return value of the decorated function.
 
         Raises:
+            PageNotFoundException: The page is not found.
             UnauthorizedUserException: The user does not have
                 credentials to unpublish a collection.
         """
@@ -980,6 +1237,15 @@ def test_can_unpublish_collection(self, collection_id, **kwargs):
 def can_modify_exploration_roles(handler):
     """Decorators to check whether user can manage rights related to an
     exploration.
+
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            the user has permission to manage rights related to an
+            exploration.
     """
 
     def test_can_modify(self, exploration_id, **kwargs):
@@ -1014,6 +1280,14 @@ def test_can_modify(self, exploration_id, **kwargs):
 def can_perform_cron_tasks(handler):
     """Decorator to ensure that the handler is being called by cron or by a
     superadmin of the application.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also ensures that
+            the handler can only be executed if it is called by cron or by
+            a superadmin of the application.
     """
 
     def test_can_perform(self, **kwargs):
@@ -1042,7 +1316,15 @@ def test_can_perform(self, **kwargs):
 
 
 def can_access_learner_dashboard(handler):
-    """Decorator to check access to learner dashboard."""
+    """Decorator to check access to learner dashboard.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            one can access the learner dashboard.
+    """
 
     def test_can_access(self, **kwargs):
         """Checks if the user can access the learner dashboard.
@@ -1068,6 +1350,14 @@ def test_can_access(self, **kwargs):
 def can_manage_question_skill_status(handler):
     """Decorator to check whether the user can publish a question and link it
     to a skill.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if the
+            given user has permission to publish a question and link it
+            to a skill.
     """
 
     def test_can_manage_question_skill_status(self, **kwargs):
@@ -1103,6 +1393,14 @@ def require_user_id_else_redirect_to_homepage(handler):
     """Decorator that checks if a user_id is associated to the current
     session. If not, the user is redirected to the main page.
     Note that the user may not yet have registered.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if a given user_id is associated with the current
+            session.
     """
 
     def test_login(self, **kwargs):
@@ -1126,6 +1424,7 @@ def test_login(self, **kwargs):
 
 def can_edit_topic(handler):
     """Decorator to check whether the user can edit given topic."""
+
     def test_can_edit(self, topic_id, **kwargs):
         """Checks whether the user can edit a given topic.
 
@@ -1160,7 +1459,16 @@ def test_can_edit(self, topic_id, **kwargs):
 
 
 def can_edit_question(handler):
-    """Decorator to check whether the user can edit given question."""
+    """Decorator to check whether the user can edit given question.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            whether the user has permission to edit a given question.
+    """
+
     def test_can_edit(self, question_id, **kwargs):
         """Checks whether the user can edit the given question.
 
@@ -1199,7 +1507,15 @@ def test_can_edit(self, question_id, **kwargs):
 
 
 def can_view_question_editor(handler):
-    """Decorator to check whether the user can view any question editor."""
+    """Decorator to check whether the user can view any question editor.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if the user has permission to view any question editor.
+    """
 
     def test_can_view_question_editor(self, question_id, **kwargs):
         """Checks whether the user can view the question editor.
@@ -1240,7 +1556,15 @@ def test_can_view_question_editor(self, question_id, **kwargs):
 
 
 def can_delete_question(handler):
-    """Decorator to check whether the user can delete a question."""
+    """Decorator to check whether the user can delete a question.
+
+    Args:
+        handler. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if the user has permission to delete a question.
+    """
 
     def test_can_delete_question(self, question_id, **kwargs):
         """Checks whether the user can delete a given question.
@@ -1275,8 +1599,17 @@ def test_can_delete_question(self, question_id, **kwargs):
 
 
 def can_edit_subtopic_page(handler):
-    """Decorator to check whether the user can edit a subtopic page of a topic.
+    """Decorator to check whether the user can edit a subtopic page of a
+    topic.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            the user has permission to edit a subtopic page of a topic.
     """
+
     def test_can_edit(self, topic_id, **kwargs):
         """Checks whether the user can edit the subtopic page
         of a given topic.
@@ -1309,7 +1642,16 @@ def test_can_edit(self, topic_id, **kwargs):
 
 
 def can_add_new_story_to_topic(handler):
-    """Decorator to check whether the user can add a story to a given topic."""
+    """Decorator to check whether the user can add a story to a given topic.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if the user has permission to add a story to a given topic.
+    """
+
     def test_can_add_story(self, topic_id, **kwargs):
         """Checks whether the user can add a story to
         a given topic.
@@ -1347,7 +1689,15 @@ def test_can_add_story(self, topic_id, **kwargs):
 def can_edit_story(handler):
     """Decorator to check whether the user can edit a story belonging to a given
     topic.
+
+    Args:
+        handler. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            a user has permission to edit a story for a given topic.
     """
+
     def test_can_edit_story(self, topic_id, **kwargs):
         """Checks whether the user can edit a story belonging to
         a given topic.
@@ -1386,6 +1736,13 @@ def test_can_edit_story(self, topic_id, **kwargs):
 def can_edit_skill(handler):
     """Decorator to check whether the user can edit a skill, which can be
     independent or belong to a topic.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            the user has permission to edit a skill.
     """
     def can_user_edit_skill(user, skill_rights):
         """Checks whether the user can edit the given skill.
@@ -1411,6 +1768,22 @@ def can_user_edit_skill(user, skill_rights):
         return False
 
     def test_can_edit_skill(self, skill_id, **kwargs):
+        """ Test to see if user can edit a given skill by checking if
+        logged in and using can_user_edit_skill.
+
+        Args:
+            skill_id: str. The skill ID.
+            **kwargs: *. Keyword arguments.
+
+        Returns:
+            *. The return value of the decorated function.
+
+        Raises:
+            NotLoggedInException: The user is not logged in.
+            PageNotFoundException: The given page cannot be found.
+            UnauthorizedUserException: The user does not have the
+                credentials to edit the given skill.
+        """
         if not self.user_id:
             raise base.UserFacingExceptions.NotLoggedInException
 
@@ -1430,7 +1803,15 @@ def test_can_edit_skill(self, skill_id, **kwargs):
 
 def can_delete_skill(handler):
     """Decorator to check whether the user can delete a skill.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            if the user can delete a skill.
     """
+
     def test_can_delete_skill(self, **kwargs):
         """Checks whether the user can delete a skill.
 
@@ -1462,6 +1843,13 @@ def test_can_delete_skill(self, **kwargs):
 def can_create_skill(handler):
     """Decorator to check whether the user can create a skill, which can be
     independent or added to a topic.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks if
+            the user has permission to create a skill.
     """
     def test_can_create_skill(self, **kwargs):
         """Checks whether the user can create a skill, which can be
@@ -1493,6 +1881,16 @@ def test_can_create_skill(self, **kwargs):
 
 
 def can_publish_skill(handler):
+    """Decorator to check whether the user can publish a skill.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also
+            checks whether the user has permission to publish
+            a skill.
+    """
 
     def can_user_publish_skill(user, skill_rights):
         """Checks whether the user can publish the given skill.
@@ -1516,6 +1914,22 @@ def can_user_publish_skill(user, skill_rights):
         return False
 
     def test_can_publish_skill(self, skill_id, **kwargs):
+        """Tests whether the user can publish a given skill by checking
+        if the user is logged in and using can_user_publish_skill.
+
+        Args:
+            skill_id: str. The skill ID.
+            **kwargs: *. Keyword arguments.
+
+        Returns:
+            *. The return value of the desired function.
+
+        Raises:
+            NotLoggedInException: The user is not logged in.
+            PageNotFoundException: The given page cannot be found.
+            UnauthorizedUserException: The given user does not have
+                credentials to publish the given skill.
+        """
         if not self.user_id:
             raise base.UserFacingExceptions.NotLoggedInException
 
@@ -1534,10 +1948,20 @@ def test_can_publish_skill(self, skill_id, **kwargs):
 
 
 def can_delete_story(handler):
-    """Decorator to check whether the user can delete a story in a given topic.
+    """Decorator to check whether the user can delete a story in a given
+    topic.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also checks
+            whether the user has permission to delete a story in a
+            given topic.
     """
+
     def test_can_delete_story(self, topic_id, **kwargs):
-        """Checks whether the user can delet a story in
+        """Checks whether the user can delete a story in
         a given topic.
 
         Args:
@@ -1571,7 +1995,15 @@ def test_can_delete_story(self, topic_id, **kwargs):
 
 
 def can_delete_topic(handler):
-    """Decorator to check whether the user can delete a topic."""
+    """Decorator to check whether the user can delete a topic.
+
+    Args:
+        handler. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now also
+            checks if the user can delete a given topic.
+    """
 
     def test_can_delete_topic(self, topic_id, **kwargs):
         """Checks whether the user can delete a given topic.
@@ -1605,7 +2037,15 @@ def test_can_delete_topic(self, topic_id, **kwargs):
 
 
 def can_create_topic(handler):
-    """Decorator to check whether the user can create a topic."""
+    """Decorator to check whether the user can create a topic.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that also checks
+            if the user can create a topic.
+    """
 
     def test_can_create_topic(self, **kwargs):
         """Checks whether the user can create a topic.
@@ -1640,6 +2080,13 @@ def test_can_create_topic(self, **kwargs):
 def can_access_topics_and_skills_dashboard(handler):
     """Decorator to check whether the user can access the topics and skills
     dashboard.
+
+    Args:
+        handler. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that also checks if
+            the user can access the topics and skills dashboard.
     """
 
     def test_can_access_topics_and_skills_dashboard(self, **kwargs):
@@ -1677,7 +2124,15 @@ def test_can_access_topics_and_skills_dashboard(self, **kwargs):
 
 
 def can_view_any_topic_editor(handler):
-    """Decorator to check whether the user can view any topic editor."""
+    """Decorator to check whether the user can view any topic editor.
+
+    Args:
+        handler: function. The newly decorated function.
+
+    Returns:
+        function. The newly decorated function that also checks
+            if the user can view any topic editor.
+    """
 
     def test_can_view_any_topic_editor(self, **kwargs):
         """Checks whether the user can view any topic editor.
@@ -1712,7 +2167,15 @@ def test_can_view_any_topic_editor(self, **kwargs):
 
 
 def can_manage_rights_for_topic(handler):
-    """Decorator to check whether the user can manage a topic's rights."""
+    """Decorator to check whether the user can manage a topic's rights.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that also checks
+            if the user can manage a given topic's rights.
+    """
 
     def test_can_manage_topic_rights(self, topic_id, **kwargs):
         """Checks whether the user can manage a topic's rights.
@@ -1748,7 +2211,15 @@ def test_can_manage_topic_rights(self, topic_id, **kwargs):
 
 
 def can_change_topic_publication_status(handler):
-    """Decorator to check whether the user can publish or unpublish a topic."""
+    """Decorator to check whether the user can publish or unpublish a topic.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now checks
+            if the user can publish or unpublish a topic.
+    """
 
     def test_can_change_topic_publication_status(self, **kwargs):
         """Checks whether the user can can publish or unpublish a topic.
@@ -1783,7 +2254,15 @@ def test_can_change_topic_publication_status(self, **kwargs):
 
 
 def can_access_topic_viewer_page(handler):
-    """Decorator to check whether user can access topic viewer page."""
+    """Decorator to check whether user can access topic viewer page.
+
+    Args:
+        handler: function. The function to be decorated.
+
+    Returns:
+        function. The newly decorated function that now checks
+            if the user can access the given topic viewer page.
+    """
 
     def test_can_access(self, topic_name, **kwargs):
         """Checks if the user can access topic viewer page.
@@ -1793,7 +2272,10 @@ def test_can_access(self, topic_name, **kwargs):
             **kwargs: *. Keyword arguments.
 
         Returns:
-            bool. Whether the user can access topic viewer page.
+            *. The return value of the decorated function.
+
+        Raises:
+            PageNotFoundException: The given page cannot be found.
         """
         topic = topic_services.get_topic_by_name(topic_name)
 
@@ -1832,6 +2314,19 @@ def get_decorator_for_accepting_suggestion(decorator):
             accept/reject suggestions for that entity.
     """
     def generate_decorator_for_handler(handler):
+        """Function that generates a decorator for a given handler.
+
+        Args:
+            handler: function. The function to be decorated.
+
+        Returns:
+            function. The newly decorated function that has common
+                checks and permissions specified by passed in
+                decorator.
+
+        Raises:
+            NotLoggedInException: The user is not logged in.
+        """
         def test_can_accept_suggestion(
                 self, target_id, suggestion_id, **kwargs):
             if not self.user_id:


Test patch: