view_project_samples.html:
- check or user perms for add/edit links
- don't display 'None' for None values

api_views.py,
serializers.py:
- refactored Project model's get_user_projects -> get_projects_user_can_view

decorators.py:
- new decorator require_project_or_site_modify_permission

forms.py:
- don't use the object permission names directly, use the model methods
- SampleEditForm: limit site list to sites user has modify perms for

models.py:
- refactored: get_user_projects() -> get_projects_user_can_view()
- refactored: get_user_sites_by_project() -> get_sites_user_can_view()
- refactored: get_user_sites_add_perms_by_project() -> get_sites_user_can_add()
- add SiteManager method get_sites_user_can_modify()
- override Site methods has_add_permission(), has_modify_permission()

views.py:
- don't use the object permission names directly, use the model methods
- in view_samples(), add 'site__id' to nested samples structure...also added values_list for user_add_sites & user_modify_sites
- in edit_sample(), check for user site modify perms, and add request arg to new SampleEditForm so form can check user perms