psat-server-web 0.5.0__tar.gz → 0.5.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of psat-server-web might be problematic. Click here for more details.

Files changed (474) hide show
  1. {psat_server_web-0.5.0/psat_server_web.egg-info → psat_server_web-0.5.2}/PKG-INFO +1 -1
  2. psat_server_web-0.5.2/psat_server_web/__version__.py +1 -0
  3. psat_server_web-0.5.2/psat_server_web/atlas/accounts/migrations/0002_groupprofile_api_write_access.py +18 -0
  4. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/accounts/models.py +5 -1
  5. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlasapi/authentication.py +7 -2
  6. psat_server_web-0.5.2/psat_server_web/atlas/atlasapi/permissions.py +45 -0
  7. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlasapi/serializers.py +1 -1
  8. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlasapi/views.py +16 -15
  9. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/generate_mod_wsgi_apachectl.sh +0 -2
  10. psat_server_web-0.5.2/psat_server_web/atlas/tests/atlasapi/test_permissions.py +343 -0
  11. {psat_server_web-0.5.0 → psat_server_web-0.5.2/psat_server_web.egg-info}/PKG-INFO +1 -1
  12. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web.egg-info/SOURCES.txt +1 -0
  13. psat_server_web-0.5.0/psat_server_web/__version__.py +0 -1
  14. psat_server_web-0.5.0/psat_server_web/atlas/atlasapi/permissions.py +0 -12
  15. psat_server_web-0.5.0/psat_server_web/atlas/tests/atlasapi/test_permissions.py +0 -30
  16. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/LICENSE +0 -0
  17. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/MANIFEST.in +0 -0
  18. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/README.md +0 -0
  19. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/.DS_Store +0 -0
  20. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/__init__.py +0 -0
  21. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/.DS_Store +0 -0
  22. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/__init__.py +0 -0
  23. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/accounts/admin.py +0 -0
  24. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/accounts/apps.py +0 -0
  25. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/accounts/migrations/0001_initial.py +0 -0
  26. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/accounts/migrations/__init__.py +0 -0
  27. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/accounts/signals.py +0 -0
  28. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/__init__.py +0 -0
  29. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/apiutils.py +0 -0
  30. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/commonqueries.py +0 -0
  31. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/dbviews.py +0 -0
  32. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/django-default.log +0 -0
  33. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/document.sh +0 -0
  34. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/formchoices.py +0 -0
  35. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/helpers.py +0 -0
  36. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/insert_gravity_event.sql +0 -0
  37. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/lightcurvequeries.py +0 -0
  38. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/models.py +0 -0
  39. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/settings.py +0 -0
  40. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/sqlpaginator.py +0 -0
  41. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/urls.py +0 -0
  42. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/view_celestial.py +0 -0
  43. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/views.py +0 -0
  44. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/wsgi.atlas.conf +0 -0
  45. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/wsgi.py +0 -0
  46. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlas/wsgi_apache_example.conf +0 -0
  47. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlasapi/apps.py +0 -0
  48. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/atlasapi/urls.py +0 -0
  49. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/cow_backup.txt +0 -0
  50. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/django-default.log +0 -0
  51. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/generate_mod_wsgi_apachectl_test.sh +0 -0
  52. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/manage.py +0 -0
  53. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/media/images/README.txt +0 -0
  54. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/css/aladin.css +0 -0
  55. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/css/celestial.css +0 -0
  56. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/css/fontawesome.css +0 -0
  57. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/css/main.css +0 -0
  58. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/css/main_bootstrap.css +0 -0
  59. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/images/atlas_logo.png +0 -0
  60. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/images/image_not_available.jpeg +0 -0
  61. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/aladin.js +0 -0
  62. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/bootstrap_utils.js +0 -0
  63. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/celestial.js +0 -0
  64. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/d3.geo.projection.js +0 -0
  65. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/d3.geo.projection.min.js +0 -0
  66. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/d3.geo.zoom.js +0 -0
  67. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/d3.min.js +0 -0
  68. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/data/__init__.py +0 -0
  69. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/data/constellations.bounds.json +0 -0
  70. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/data/constellations.json +0 -0
  71. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/data/constellations.lines.json +0 -0
  72. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/data/dsos.bright.json +0 -0
  73. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/data/lg.json +0 -0
  74. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/data/mw.json +0 -0
  75. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/data/planets.json +0 -0
  76. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/celestial/data/stars.6.json +0 -0
  77. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/colourplot.js +0 -0
  78. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/excanvas.js +0 -0
  79. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery-1.7.2.js +0 -0
  80. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.axislabels.js +0 -0
  81. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.crosshair.js +0 -0
  82. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.errorbars.js +0 -0
  83. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.fillbetween.js +0 -0
  84. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.image.js +0 -0
  85. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.js +0 -0
  86. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.navigate.js +0 -0
  87. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.pie.js +0 -0
  88. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.resize.js +0 -0
  89. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.selection.js +0 -0
  90. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.stack.js +0 -0
  91. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.symbol.js +0 -0
  92. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/flot/jquery.flot.threshold.js +0 -0
  93. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/followup_selectall.js +0 -0
  94. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/heatmap.js +0 -0
  95. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/lightcurve.js +0 -0
  96. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/lightcurveplotly.js +0 -0
  97. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/mjdcalc.js +0 -0
  98. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/plotly/plotly-latest.kws.js +0 -0
  99. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/recurrenceplot.js +0 -0
  100. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/js/recurrenceplotplotly.js +0 -0
  101. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.eot +0 -0
  102. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.svg +0 -0
  103. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.ttf +0 -0
  104. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.woff +0 -0
  105. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.woff2 +0 -0
  106. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.eot +0 -0
  107. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.svg +0 -0
  108. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.ttf +0 -0
  109. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.woff +0 -0
  110. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.woff2 +0 -0
  111. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.eot +0 -0
  112. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.svg +0 -0
  113. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.ttf +0 -0
  114. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.woff +0 -0
  115. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.woff2 +0 -0
  116. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/sql/create_web_views.sql +0 -0
  117. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/.DS_Store +0 -0
  118. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/400.html +0 -0
  119. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/403.html +0 -0
  120. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/404.html +0 -0
  121. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/500.html +0 -0
  122. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/atelfasttrackobject.txt +0 -0
  123. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/atelsdiscovery.txt +0 -0
  124. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/atelsfast.txt +0 -0
  125. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/candidate.html +0 -0
  126. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/candidate_plotly.html +0 -0
  127. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/candidate_plotly_test.html +0 -0
  128. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/crossmatch_external.html +0 -0
  129. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/error.html +0 -0
  130. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/followup.html +0 -0
  131. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/followup.txt +0 -0
  132. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/followup2.html +0 -0
  133. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/followup_bs.html +0 -0
  134. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/followup_bypass_django_tables.html +0 -0
  135. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/followup_quickview.html +0 -0
  136. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/followup_quickview_bs.html +0 -0
  137. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/followup_subset.txt +0 -0
  138. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/gcn.txt +0 -0
  139. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/gcn_latex.txt +0 -0
  140. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/heatmap.html +0 -0
  141. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/heatmap_test.html +0 -0
  142. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/index.html +0 -0
  143. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/index_bs.html +0 -0
  144. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/index_bs_celestial.html +0 -0
  145. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/index_bs_celestial_experiment.html +0 -0
  146. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/iobserve.txt +0 -0
  147. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/lightcurve.txt +0 -0
  148. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/lightcurveddc.txt +0 -0
  149. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/lightcurveforced.txt +0 -0
  150. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/lightcurvestackedforced.txt +0 -0
  151. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/pesstorecurrences.txt +0 -0
  152. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/pesstorecurrencesddc.txt +0 -0
  153. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/pesstosummary.txt +0 -0
  154. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/search_results.html +0 -0
  155. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/search_results_plotly.html +0 -0
  156. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/sne.json +0 -0
  157. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/summary.csv +0 -0
  158. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/userdefinedlists.html +0 -0
  159. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/userdefinedlists_bs.html +0 -0
  160. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/atlas/visibility.txt +0 -0
  161. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/base.html +0 -0
  162. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/base_bootstrap.html +0 -0
  163. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/base_bootstrap_login.html +0 -0
  164. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/bootstrap4_django_tables2_atlas.html +0 -0
  165. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/invalid_login.html +0 -0
  166. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/loggedin.html +0 -0
  167. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/login.html +0 -0
  168. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/templates/logout.html +0 -0
  169. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/test.py +0 -0
  170. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/tests/__init__.py +0 -0
  171. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/tests/atlasapi/__init__.py +0 -0
  172. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/tests/atlasapi/test_authentication.py +0 -0
  173. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/atlas/tests/atlasapi/test_failure.py +0 -0
  174. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/common/__init__.py +0 -0
  175. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/common/psat_api_client.py +0 -0
  176. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/config/wsgi.conf.template +0 -0
  177. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/__init__.py +0 -0
  178. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/createUsers.py +0 -0
  179. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/generate_mod_wsgi_apachectl.sh +0 -0
  180. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/manage.py +0 -0
  181. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/media/images/README.txt +0 -0
  182. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/__init__.py +0 -0
  183. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/admin.py.old +0 -0
  184. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/catalogueviews.py +0 -0
  185. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/commonqueries.py +0 -0
  186. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/dbviews.py +0 -0
  187. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/formchoices.py +0 -0
  188. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/helpers.py +0 -0
  189. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/img_scale.py +0 -0
  190. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/lightcurvequeries.py +0 -0
  191. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/models.py +0 -0
  192. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/settings.py +0 -0
  193. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/urls.py +0 -0
  194. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/views.py +0 -0
  195. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/wsgi.py +0 -0
  196. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdb/wsgi_apache_example.conf +0 -0
  197. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdbapi/apps.py +0 -0
  198. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdbapi/permissions.py +0 -0
  199. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdbapi/query_auth.py +0 -0
  200. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdbapi/serializers.py +0 -0
  201. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdbapi/urls.py +0 -0
  202. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/psdbapi/views.py +0 -0
  203. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/css/aladin.css +0 -0
  204. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/css/celestial.css +0 -0
  205. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/css/fontawesome.css +0 -0
  206. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/css/main.css +0 -0
  207. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/css/main_bootstrap.css +0 -0
  208. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/1-star-hover.jpg +0 -0
  209. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/1-star.jpg +0 -0
  210. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/2-star-hover.jpg +0 -0
  211. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/2-star.jpg +0 -0
  212. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/3-star-hover.jpg +0 -0
  213. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/3-star.jpg +0 -0
  214. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/aladin.gif +0 -0
  215. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/cfaIcon.jpg +0 -0
  216. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/cfaIconHover.jpg +0 -0
  217. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/confirmed-sne-hover.jpg +0 -0
  218. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/confirmed-sne.jpg +0 -0
  219. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/detection_example.jpg +0 -0
  220. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/down.jpeg +0 -0
  221. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/down.jpg +0 -0
  222. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/image_not_available.jpeg +0 -0
  223. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/jhuIcon.jpg +0 -0
  224. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/jhuIconHover.jpg +0 -0
  225. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/minus.jpg +0 -0
  226. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/ncuIcon.jpg +0 -0
  227. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/ncuIconHover.jpg +0 -0
  228. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/non_detection_example.jpg +0 -0
  229. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/others-hover.jpg +0 -0
  230. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/others.jpg +0 -0
  231. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs-logo-hover.jpg +0 -0
  232. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs-logo.jpg +0 -0
  233. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs1_logo.jpg +0 -0
  234. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs1_o3_logo.jpg +0 -0
  235. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs2_logo.jpg +0 -0
  236. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs2_o3_logo.jpg +0 -0
  237. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs_logo.jpg +0 -0
  238. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs_logo_o4.jpg +0 -0
  239. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs_logo_original.jpg +0 -0
  240. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs_logo_yse.jpg +0 -0
  241. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/panstarrs_logo_yse_stack.jpg +0 -0
  242. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/pittsIcon.jpg +0 -0
  243. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/pittsIconHover.jpg +0 -0
  244. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/plus.jpg +0 -0
  245. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/ps1Icon.jpg +0 -0
  246. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/ps1IconHover.jpg +0 -0
  247. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/ps1sc.gif +0 -0
  248. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/qub-logo-hover.jpg +0 -0
  249. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/qub-logo.jpg +0 -0
  250. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/qubIcon.jpg +0 -0
  251. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/qubIconHover.jpg +0 -0
  252. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/sdss.gif +0 -0
  253. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/table-background.jpg +0 -0
  254. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/table-bottom-left.jpg +0 -0
  255. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/table-bottom-right.jpg +0 -0
  256. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/table-row.jpg +0 -0
  257. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/table-top-left.jpg +0 -0
  258. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/table-top-right.jpg +0 -0
  259. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/uhifaIcon.jpg +0 -0
  260. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/uhifaIconHover.jpg +0 -0
  261. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/up.jpeg +0 -0
  262. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/up.jpg +0 -0
  263. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/variable-stars-hover.jpg +0 -0
  264. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/images/variable-stars.jpg +0 -0
  265. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/aladin.js +0 -0
  266. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/celestial.js +0 -0
  267. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/d3.geo.projection.js +0 -0
  268. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/d3.geo.projection.min.js +0 -0
  269. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/d3.geo.zoom.js +0 -0
  270. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/d3.min.js +0 -0
  271. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/data/__init__.py +0 -0
  272. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/data/constellations.bounds.json +0 -0
  273. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/data/constellations.json +0 -0
  274. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/data/constellations.lines.json +0 -0
  275. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/data/dsos.bright.json +0 -0
  276. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/data/lg.json +0 -0
  277. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/data/mw.json +0 -0
  278. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/data/planets.json +0 -0
  279. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/celestial/data/stars.6.json +0 -0
  280. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/colourplot.js +0 -0
  281. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/excanvas.js +0 -0
  282. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery-1.7.2.js +0 -0
  283. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.axislabels.js +0 -0
  284. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.crosshair.js +0 -0
  285. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.errorbars.js +0 -0
  286. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.fillbetween.js +0 -0
  287. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.image.js +0 -0
  288. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.js +0 -0
  289. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.navigate.js +0 -0
  290. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.pie.js +0 -0
  291. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.resize.js +0 -0
  292. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.selection.js +0 -0
  293. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.stack.js +0 -0
  294. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.symbol.js +0 -0
  295. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/flot/jquery.flot.threshold.js +0 -0
  296. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/followup_selectall.js +0 -0
  297. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/lightcurve.js +0 -0
  298. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/lightcurveplotly.js +0 -0
  299. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/mjdcalc.js +0 -0
  300. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/plotly/plotly-latest.kws.js +0 -0
  301. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/recurrenceplot.js +0 -0
  302. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/js/recurrenceplotplotly.js +0 -0
  303. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.eot +0 -0
  304. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.svg +0 -0
  305. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.ttf +0 -0
  306. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.woff +0 -0
  307. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.woff2 +0 -0
  308. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.eot +0 -0
  309. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.svg +0 -0
  310. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.ttf +0 -0
  311. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.woff +0 -0
  312. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.woff2 +0 -0
  313. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.eot +0 -0
  314. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.svg +0 -0
  315. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.ttf +0 -0
  316. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.woff +0 -0
  317. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.woff2 +0 -0
  318. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/sql/create_web_cat_views.sql +0 -0
  319. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/sql/create_web_user_grants.sql +0 -0
  320. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/sql/create_web_views.sql +0 -0
  321. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/sql/create_web_views_fgss.sql +0 -0
  322. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/400.html +0 -0
  323. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/403.html +0 -0
  324. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/404.html +0 -0
  325. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/500.html +0 -0
  326. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/admin/base_site.html +0 -0
  327. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/base.html +0 -0
  328. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/base_bootstrap.html +0 -0
  329. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/base_bootstrap_login.html +0 -0
  330. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/base_new.html +0 -0
  331. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/bootstrap4_django_tables2_atlas.html +0 -0
  332. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/invalid_login.html +0 -0
  333. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/loggedin.html +0 -0
  334. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/login.html +0 -0
  335. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/logout.html +0 -0
  336. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/atelsdiscovery.txt +0 -0
  337. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/candidate.html +0 -0
  338. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/candidate_plotly.html +0 -0
  339. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/candidate_quickview.html +0 -0
  340. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/candidateflot.html +0 -0
  341. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/candidates.html +0 -0
  342. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/colourdata.txt +0 -0
  343. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/crossmatch_cfa_with_ipp.html +0 -0
  344. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/crossmatch_external.html +0 -0
  345. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/dss2.html +0 -0
  346. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/error.html +0 -0
  347. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/fasttrackastronote.txt +0 -0
  348. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/filter.html +0 -0
  349. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/followup.html +0 -0
  350. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/followup.txt +0 -0
  351. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/followup_bs.html +0 -0
  352. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/followup_bs_old.html +0 -0
  353. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/followup_quickview.html +0 -0
  354. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/followup_quickview_bs.html +0 -0
  355. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/followup_quickview_bs_old.html +0 -0
  356. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/gcn.txt +0 -0
  357. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/gcn_latex.txt +0 -0
  358. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/index.html +0 -0
  359. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/index_bs_celestial.html +0 -0
  360. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/index_public.html +0 -0
  361. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/lightcurve.txt +0 -0
  362. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/lightcurveforced.txt +0 -0
  363. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/lightcurves.html +0 -0
  364. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/obscat.txt +0 -0
  365. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/obsmediawiki.txt +0 -0
  366. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/public.html +0 -0
  367. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/public_textonly.txt +0 -0
  368. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/reports.html +0 -0
  369. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/search_results.html +0 -0
  370. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/search_results_plotly.html +0 -0
  371. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/sne.json +0 -0
  372. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/userdefinedlists.html +0 -0
  373. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/ps1/templates/psdb/userdefinedlists_bs.html +0 -0
  374. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_detections.sql +0 -0
  375. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_detectionsddc.sql +0 -0
  376. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_detectionsnnc.sql +0 -0
  377. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_diff_detections.sql +0 -0
  378. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_diff_logs.sql +0 -0
  379. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_diff_moments.sql +0 -0
  380. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_diff_objects.sql +0 -0
  381. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_diff_subcell_logs.sql +0 -0
  382. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_diff_subcells.sql +0 -0
  383. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_forced_photometry.sql +0 -0
  384. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_heatmaps.sql +0 -0
  385. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_metadata.sql +0 -0
  386. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_metadataddc.sql +0 -0
  387. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_objects.sql +0 -0
  388. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/atlas_stacked_forced_photometry.sql +0 -0
  389. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/convert_backend_storage_to_innodb.sql +0 -0
  390. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/create_atlas_flattened_view.sql +0 -0
  391. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/create_photpipe_views.sql +0 -0
  392. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/create_schema.sql +0 -0
  393. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/create_user_grants.sql +0 -0
  394. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/create_user_grants_generic.sql +0 -0
  395. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/create_user_grants_root.sql +0 -0
  396. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/delete_transients.sql +0 -0
  397. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/generateATLASSchemaAndCPPClasses.py +0 -0
  398. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/get_table_columns_for_avro.py +0 -0
  399. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/get_table_columns_for_avro.sql +0 -0
  400. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/mjdnow.sql +0 -0
  401. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/refresh_django_views.py +0 -0
  402. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/setup_database.py +0 -0
  403. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/setup_database_utils.py +0 -0
  404. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/sherlock_classifications.sql +0 -0
  405. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/sherlock_crossmatches.sql +0 -0
  406. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/sherlock_triggers_atlas.sql +0 -0
  407. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/sherlock_triggers_ps1.sql +0 -0
  408. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cat_gaia_dr1.sql +0 -0
  409. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cat_gaia_dr2.sql +0 -0
  410. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cat_gaia_dr2_cassandra.cql +0 -0
  411. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cat_kepler_k2.sql +0 -0
  412. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cat_kepler_k2_pixels.sql +0 -0
  413. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cat_ps1_medium_deep_ref.sql +0 -0
  414. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cat_ps1_ubercal_stars.sql +0 -0
  415. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cat_satellites.sql +0 -0
  416. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_catalogue_tables.sql +0 -0
  417. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cfa_detections.sql +0 -0
  418. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cfa_to_ipp_lookup.sql +0 -0
  419. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_classification_flags.sql +0 -0
  420. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_classification_history.sql +0 -0
  421. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cmf_metadata.sql +0 -0
  422. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cross_matches.sql +0 -0
  423. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_cross_matches_external.sql +0 -0
  424. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_detection_lists.sql +0 -0
  425. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_detection_lists_atlas.sql +0 -0
  426. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_followup_photometry.sql +0 -0
  427. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_followup_telescope_instruments.sql +0 -0
  428. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_followup_telescopes.sql +0 -0
  429. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_forced_photometry.sql +0 -0
  430. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_function_lunation.sql +0 -0
  431. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_function_mjdlunation.sql +0 -0
  432. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_gravity_alerts.sql +0 -0
  433. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_gravity_event_annotations.sql +0 -0
  434. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_gravity_events.sql +0 -0
  435. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_guide_star_cat.sql +0 -0
  436. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_image_groups.sql +0 -0
  437. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_images.sql +0 -0
  438. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_ipp_to_cfa_lookup.sql +0 -0
  439. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_latest_object_stats.sql +0 -0
  440. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_object_comments.sql +0 -0
  441. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_object_group_definitions.sql +0 -0
  442. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_object_group_definitions_atlas.sql +0 -0
  443. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_object_groups.sql +0 -0
  444. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_parameter_definitions.sql +0 -0
  445. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_photpipe_detections.sql +0 -0
  446. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_postage_stamp_images.sql +0 -0
  447. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_postage_stamp_requests.sql +0 -0
  448. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_postage_stamp_status_codes.sql +0 -0
  449. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_processing_status.sql +0 -0
  450. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_search_parameters.sql +0 -0
  451. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_tns_requests.sql +0 -0
  452. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_tphot_detections.sql +0 -0
  453. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_transient_objects.sql +0 -0
  454. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_transient_reobservations.sql +0 -0
  455. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_vra_rank.sql +0 -0
  456. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_vra_scores.sql +0 -0
  457. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_vra_todo.sql +0 -0
  458. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_zoo_requests.sql +0 -0
  459. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/tcs_zooniverse_scores.sql +0 -0
  460. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/types_gaia_dr2_cassandra.txt +0 -0
  461. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/update_database_types_to_tns_types_atlas.sql +0 -0
  462. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/update_database_types_to_tns_types_panstarrs.sql +0 -0
  463. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/update_tcs_gravity_alerts_001.sql +0 -0
  464. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/update_tcs_gravity_event_annotations_001.sql +0 -0
  465. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/update_tcs_latest_object_stats_001.sql +0 -0
  466. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/update_tcs_vra_rank_20240814.sql +0 -0
  467. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/update_tcs_vra_scores_20240814.sql +0 -0
  468. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web/schema/vra_triggers_atlas.sql +0 -0
  469. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web.egg-info/dependency_links.txt +0 -0
  470. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web.egg-info/not-zip-safe +0 -0
  471. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web.egg-info/requires.txt +0 -0
  472. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/psat_server_web.egg-info/top_level.txt +0 -0
  473. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/setup.cfg +0 -0
  474. {psat_server_web-0.5.0 → psat_server_web-0.5.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: psat-server-web
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: Pan-STARRS and ATLAS web interface.
5
5
  Home-page: https://github.com/genghisken/psat-server-web
6
6
  Author: genghisken
@@ -0,0 +1 @@
1
+ __version__ = '0.5.2'
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.1 on 2024-12-04 12:00
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('accounts', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='groupprofile',
15
+ name='api_write_access',
16
+ field=models.BooleanField(default=False, help_text='Does the group have write access to the API?'),
17
+ ),
18
+ ]
@@ -17,10 +17,14 @@ class GroupProfile(models.Model):
17
17
  on_delete=models.CASCADE,
18
18
  related_name='profile'
19
19
  )
20
+ api_write_access = models.BooleanField(
21
+ default=False,
22
+ help_text='Does the group have write access to the API?'
23
+ )
20
24
  token_expiration_time = models.DurationField(
21
25
  help_text='in days, default 1 day (24*60*60 seconds)',
22
26
  default=timedelta(days=1)
23
- )
27
+ )
24
28
  description = models.TextField(
25
29
  blank=True,
26
30
  help_text='What is the group for?'
@@ -1,4 +1,5 @@
1
1
  from re import match
2
+ import logging
2
3
 
3
4
  from django.conf import settings
4
5
  from django.utils.timezone import now
@@ -6,6 +7,8 @@ from rest_framework.authtoken.models import Token
6
7
  from rest_framework.authentication import TokenAuthentication
7
8
  from rest_framework.exceptions import AuthenticationFailed
8
9
 
10
+ logger = logging.getLogger(__name__)
11
+
9
12
  class ExpiringTokenAuthentication(TokenAuthentication):
10
13
  """
11
14
  Token authentication using the ExpiringToken model, which has an expiry
@@ -23,8 +26,9 @@ class ExpiringTokenAuthentication(TokenAuthentication):
23
26
  try:
24
27
  group_profile = user.groups.first().profile
25
28
  except AttributeError:
26
- # TODO: Log this error?
27
- raise AuthenticationFailed('Could not authenticate: Group has no profile. Please contact administrator.')
29
+ msg = 'Could not authenticate: Group has no profile. Please contact administrator.'
30
+ logger.error(msg)
31
+ raise AuthenticationFailed(msg)
28
32
  token_expiration_time = group_profile.token_expiration_time.total_seconds()
29
33
  else:
30
34
  # Otherwise use the default expiration time
@@ -33,6 +37,7 @@ class ExpiringTokenAuthentication(TokenAuthentication):
33
37
  # Calculate the token's age and compare it to the expiration setting
34
38
  token_age = (now() - token.created).total_seconds()
35
39
  if token_age > token_expiration_time:
40
+ logger.warning(f'User {user} attempted to use an expired token.')
36
41
  raise AuthenticationFailed('Token has expired.')
37
42
 
38
43
  return user, token
@@ -0,0 +1,45 @@
1
+ import logging
2
+
3
+ from rest_framework.permissions import BasePermission, SAFE_METHODS
4
+
5
+
6
+ logger = logging.getLogger(__name__)
7
+
8
+ class HasReadAccess(BasePermission):
9
+ def has_permission(self, request, view):
10
+ # Allow all safe methods (GET, OPTIONS, HEAD)
11
+ if request.method in SAFE_METHODS:
12
+ return True
13
+
14
+ # Allow POST if the user is authenticated
15
+ return (request.user
16
+ and request.user.is_authenticated)
17
+
18
+
19
+ class HasWriteAccess(BasePermission):
20
+ def has_permission(self, request, view):
21
+ # Allow all safe methods (GET, OPTIONS, HEAD)
22
+ if request.method in SAFE_METHODS:
23
+ return True
24
+
25
+ write_fl = False
26
+ user = request.user
27
+ # Retrieve the user's group and get the api write access flag from the
28
+ # group profile
29
+ if user.groups.exists():
30
+ try:
31
+ group_profile = user.groups.first().profile
32
+ write_fl = group_profile.api_write_access
33
+ except AttributeError:
34
+ # If the group has no profile, then there's something wrong with
35
+ # the database. This should be fixed by an administrator, but
36
+ # we don't need to block the user from accessing the API.
37
+ msg = 'Could not authorise based on group: Group has no profile.'
38
+ logger.error(msg)
39
+ write_fl = False
40
+
41
+ # Only allow POST to write endpoints if the user is authenticated and is
42
+ # either in a writeable group or is a staff member
43
+ return (request.user
44
+ and request.user.is_authenticated
45
+ and (write_fl or request.user.is_staff))
@@ -145,7 +145,7 @@ class VRAScoresSerializer(serializers.Serializer):
145
145
  pgal = serializers.FloatField(required=False, default=None)
146
146
  pfast = serializers.FloatField(required=False, default=None)
147
147
  # 2024-08-14 KWS Added 3 new values to the form for Rank.
148
- rank = serializers.FloatField(required=True)
148
+ rank = serializers.FloatField(required=False, default=None)
149
149
  rank_alt1 = serializers.FloatField(required=False, default=None)
150
150
  rank_alt2 = serializers.FloatField(required=False, default=None)
151
151
  debug = serializers.BooleanField(required=False, default=False)
@@ -28,7 +28,7 @@ from .serializers import (
28
28
  ObjectDetectionListSerializer,
29
29
  )
30
30
  from .authentication import QueryAuthentication, ExpiringTokenAuthentication
31
- from .permissions import IsApprovedUser
31
+ from .permissions import HasReadAccess, HasWriteAccess
32
32
 
33
33
  def retcode(message):
34
34
  if 'error' in message: return status.HTTP_400_BAD_REQUEST
@@ -68,7 +68,7 @@ class ObtainExpiringAuthToken(ObtainAuthToken):
68
68
 
69
69
  class ConeView(APIView):
70
70
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
71
- permission_classes = [IsAuthenticated&IsApprovedUser]
71
+ permission_classes = [IsAuthenticated&HasReadAccess]
72
72
 
73
73
  def get(self, request):
74
74
  serializer = ConeSerializer(data=request.GET, context={'request': request})
@@ -87,7 +87,7 @@ class ConeView(APIView):
87
87
 
88
88
  class ObjectsView(APIView):
89
89
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
90
- permission_classes = [IsAuthenticated&IsApprovedUser]
90
+ permission_classes = [IsAuthenticated&HasReadAccess]
91
91
 
92
92
  def get(self, request):
93
93
  serializer = ObjectsSerializer(data=request.GET, context={'request': request})
@@ -106,7 +106,7 @@ class ObjectsView(APIView):
106
106
 
107
107
  class ObjectListView(APIView):
108
108
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
109
- permission_classes = [IsAuthenticated&IsApprovedUser]
109
+ permission_classes = [IsAuthenticated&HasReadAccess]
110
110
 
111
111
  def get(self, request):
112
112
  serializer = ObjectListSerializer(data=request.GET, context={'request': request})
@@ -125,7 +125,7 @@ class ObjectListView(APIView):
125
125
 
126
126
  class VRAScoresView(APIView):
127
127
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
128
- permission_classes = [IsAuthenticated&IsApprovedUser]
128
+ permission_classes = [IsAuthenticated&HasWriteAccess]
129
129
 
130
130
  def get(self, request):
131
131
  return Response({"Error": "GET is not implemented for this service."})
@@ -142,7 +142,7 @@ class VRAScoresView(APIView):
142
142
 
143
143
  class VRAScoresListView(APIView):
144
144
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
145
- permission_classes = [IsAuthenticated&IsApprovedUser]
145
+ permission_classes = [IsAuthenticated&HasReadAccess]
146
146
 
147
147
  def get(self, request):
148
148
  serializer = VRAScoresListSerializer(data=request.GET, context={'request': request})
@@ -162,7 +162,7 @@ class VRAScoresListView(APIView):
162
162
  # appropriate to the circumstances. E.g. if object is not found generate a 404, etc.
163
163
  class VRATodoView(APIView):
164
164
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
165
- permission_classes = [IsAuthenticated&IsApprovedUser]
165
+ permission_classes = [IsAuthenticated&HasWriteAccess]
166
166
 
167
167
  def get(self, request):
168
168
  return Response({"Error": "GET is not implemented for this service."})
@@ -179,7 +179,7 @@ class VRATodoView(APIView):
179
179
  # 2024-05-07 KWS Added VRATodoListView.
180
180
  class VRATodoListView(APIView):
181
181
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
182
- permission_classes = [IsAuthenticated&IsApprovedUser]
182
+ permission_classes = [IsAuthenticated&HasReadAccess]
183
183
 
184
184
  def get(self, request):
185
185
  serializer = VRATodoListSerializer(data=request.GET, context={'request': request})
@@ -197,7 +197,7 @@ class VRATodoListView(APIView):
197
197
 
198
198
  class TcsObjectGroupsView(APIView):
199
199
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
200
- permission_classes = [IsAuthenticated&IsApprovedUser]
200
+ permission_classes = [IsAuthenticated&HasWriteAccess]
201
201
 
202
202
  def get(self, request):
203
203
  return Response({"Error": "GET is not implemented for this service."})
@@ -213,7 +213,7 @@ class TcsObjectGroupsView(APIView):
213
213
 
214
214
  class TcsObjectGroupsListView(APIView):
215
215
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
216
- permission_classes = [IsAuthenticated&IsApprovedUser]
216
+ permission_classes = [IsAuthenticated&HasReadAccess]
217
217
 
218
218
  def get(self, request):
219
219
  serializer = TcsObjectGroupsListSerializer(data=request.GET, context={'request': request})
@@ -232,7 +232,8 @@ class TcsObjectGroupsListView(APIView):
232
232
 
233
233
  class TcsObjectGroupsDeleteView(APIView):
234
234
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
235
- permission_classes = [IsAuthenticated&IsApprovedUser]
235
+ # TODO: Change this to HasDeleteAccess?
236
+ permission_classes = [IsAuthenticated&HasWriteAccess]
236
237
 
237
238
  def get(self, request):
238
239
  return Response({"Error": "GET is not implemented for this service."})
@@ -255,7 +256,7 @@ class TcsObjectGroupsDeleteView(APIView):
255
256
  # appropriate to the circumstances. E.g. if object is not found generate a 404, etc.
256
257
  class VRARankView(APIView):
257
258
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
258
- permission_classes = [IsAuthenticated&IsApprovedUser]
259
+ permission_classes = [IsAuthenticated&HasWriteAccess]
259
260
 
260
261
  def get(self, request):
261
262
  return Response({"Error": "GET is not implemented for this service."})
@@ -272,7 +273,7 @@ class VRARankView(APIView):
272
273
  # 2024-05-22 KWS Added VRARankListView.
273
274
  class VRARankListView(APIView):
274
275
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
275
- permission_classes = [IsAuthenticated&IsApprovedUser]
276
+ permission_classes = [IsAuthenticated&HasReadAccess]
276
277
 
277
278
  def get(self, request):
278
279
  serializer = VRARankListSerializer(data=request.GET, context={'request': request})
@@ -292,7 +293,7 @@ class VRARankListView(APIView):
292
293
  # 2024-09-24 KWS Added ExternalCrossmatchesListView.
293
294
  class ExternalCrossmatchesListView(APIView):
294
295
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
295
- permission_classes = [IsAuthenticated&IsApprovedUser]
296
+ permission_classes = [IsAuthenticated&HasReadAccess]
296
297
 
297
298
  def get(self, request):
298
299
  serializer = ExternalCrossmatchesListSerializer(data=request.GET, context={'request': request})
@@ -312,7 +313,7 @@ class ExternalCrossmatchesListView(APIView):
312
313
  # 2024-09-24 KWS Added ExternalCrossmatchesListView.
313
314
  class ObjectDetectionListView(APIView):
314
315
  authentication_classes = [ExpiringTokenAuthentication, QueryAuthentication]
315
- permission_classes = [IsAuthenticated&IsApprovedUser]
316
+ permission_classes = [IsAuthenticated&HasWriteAccess]
316
317
 
317
318
  def get(self, request):
318
319
  serializer = ObjectDetectionListSerializer(data=request.GET, context={'request': request})
@@ -35,8 +35,6 @@
35
35
  # export DJANGO_PANSTARRS_BASE_URL=''
36
36
  # export API_TOKEN_EXPIRY=''
37
37
 
38
- export API_TOKEN_EXPIRY='1000000000'
39
-
40
38
  if [ -f ~/.config/django/django_env_$CONDA_DEFAULT_ENV ]; then chmod 600 ~/.config/django/django_env_$CONDA_DEFAULT_ENV; source ~/.config/django/django_env_$CONDA_DEFAULT_ENV; fi
41
39
 
42
40
  export APACHEPATH="/tmp/atlas"
@@ -0,0 +1,343 @@
1
+ from django.test import TestCase
2
+ from django.contrib.auth.models import User, Group
3
+ from django.utils.timezone import timedelta
4
+ from rest_framework import status
5
+ from rest_framework.test import APIClient
6
+ from rest_framework.authtoken.models import Token
7
+
8
+ from accounts.models import GroupProfile
9
+
10
+ class TestPermissionsSetup(TestCase):
11
+ def setUp(self) -> None:
12
+ self.client = APIClient()
13
+ self.user = User.objects.create_user(username='testuser', password='testpassword')
14
+ self.token = Token.objects.create(user=self.user)
15
+ self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
16
+
17
+ # Create groups
18
+ self.read_group = Group.objects.create(name="Read Only")
19
+ GroupProfile.objects.create(
20
+ api_write_access=False,
21
+ group=self.read_group,
22
+ token_expiration_time=timedelta(days=365)
23
+ )
24
+ self.write_group = Group.objects.create(name="Write Access")
25
+ GroupProfile.objects.create(
26
+ api_write_access=True,
27
+ group=self.write_group,
28
+ token_expiration_time=timedelta(days=365)
29
+ )
30
+ # No GroupProfile for self.no_profile_group
31
+ self.no_profile_group = Group.objects.create(name="No Profile")
32
+
33
+
34
+ class TestUserWritePermissions(TestPermissionsSetup):
35
+ endpoint = "/api/vrascores/"
36
+
37
+ def test_user_permissions_no_group(self):
38
+ """Test whether permissions successfully allow or deny access to the API
39
+ for a user with no group_profile.
40
+
41
+ Expected behaviour:
42
+ - User can access the GET endpoint
43
+ - User cannot access the POST endpoint
44
+ """
45
+ # Can always use the get endpoint
46
+ response = self.client.get(self.endpoint)
47
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
48
+ # Can't use the post endpoint
49
+ response = self.client.post(self.endpoint)
50
+ self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
51
+
52
+ def test_user_permissions_read_group(self):
53
+ """Test whether permissions successfully allow or deny access to the API
54
+ for a user with read-only permissions on their group_profile.
55
+
56
+ Expected behaviour:
57
+ - User can access the GET endpoint
58
+ - User cannot access the POST endpoint
59
+ """
60
+ self.user.groups.add(self.read_group)
61
+ self.user.save()
62
+
63
+ # Can always use the get endpoint
64
+ response = self.client.get(self.endpoint)
65
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
66
+ # Can't use the post endpoint
67
+ response = self.client.post(self.endpoint)
68
+ self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
69
+
70
+ def test_user_permissions_write_group(self):
71
+ """Test whether permissions successfully allow or deny access to the API
72
+ for a user with write permissions on their group_profile.
73
+
74
+ Expected behaviour:
75
+ - User can access the GET endpoint
76
+ - User can access the POST endpoint
77
+ """
78
+ self.user.groups.add(self.write_group)
79
+ self.user.save()
80
+
81
+ # Can always use the get endpoint
82
+ response = self.client.get(self.endpoint)
83
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
84
+
85
+ response = self.client.post(self.endpoint)
86
+ # This will now fail with a 400 because we're permitted but we've not
87
+ # provided the payload
88
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
89
+
90
+ def test_user_permissions_no_group_profile(self):
91
+ """Test whether permissions successfully allow or deny access to the API
92
+ for a user with a group which does not have a group_profile.
93
+
94
+ Expected behaviour:
95
+ - User can access the GET endpoint
96
+ - User cannot access the POST endpoint
97
+ - No critical failure should occur
98
+ """
99
+ # Can always use the get endpoint
100
+ response = self.client.get(self.endpoint)
101
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
102
+ # Can't use the post endpoint
103
+ response = self.client.post(self.endpoint)
104
+ self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
105
+
106
+
107
+ class TestStaffWritePermissions(TestPermissionsSetup):
108
+ endpoint = "/api/vrascores/"
109
+
110
+ def setUp(self):
111
+ super().setUp()
112
+ self.user.is_staff = True
113
+ self.user.save()
114
+
115
+ def test_staff_permissions_no_group(self):
116
+ """Test whether permissions successfully allow or deny access to the API
117
+ for a staff user with no group_profile.
118
+
119
+ Expected behaviour:
120
+ - User can access the GET endpoint
121
+ - User can access the POST endpoint
122
+ """
123
+ # Can always use the get endpoint
124
+ response = self.client.get(self.endpoint)
125
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
126
+ # Can use the post endpoint as we're staff. Again this is a 400 because
127
+ # we've not provided the payload, but does show we have permission
128
+ response = self.client.post(self.endpoint)
129
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
130
+
131
+
132
+ def test_staff_permissions_read_group(self):
133
+ """Test whether permissions successfully allow or deny access to the API
134
+ for a user with read-only permissions on their group_profile.
135
+
136
+ Expected behaviour:
137
+ - User can access the GET endpoint
138
+ - User can access the POST endpoint
139
+ """
140
+ self.user.groups.add(self.read_group)
141
+ self.user.save()
142
+
143
+ # Can always use the get endpoint
144
+ response = self.client.get(self.endpoint)
145
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
146
+ # Can use the post endpoint as we're staff. Again this is a 400 because
147
+ # we've not provided the payload, but does show we have permission
148
+ response = self.client.post(self.endpoint)
149
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
150
+
151
+ def test_staff_permissions_write_group(self):
152
+ """Test whether permissions successfully allow or deny access to the API
153
+ for a user with write permissions on their group_profile.
154
+
155
+ Expected behaviour:
156
+ - User can access the GET endpoint
157
+ - User can access the POST endpoint
158
+ """
159
+ self.user.groups.add(self.write_group)
160
+ self.user.save()
161
+
162
+ # Can always use the get endpoint
163
+ response = self.client.get(self.endpoint)
164
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
165
+
166
+ response = self.client.post(self.endpoint)
167
+ # This will now fail with a 400 because we're permitted but we've not
168
+ # provided the payload
169
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
170
+
171
+ def test_staff_permissions_no_group_profile(self):
172
+ """Test whether permissions successfully allow or deny access to the API
173
+ for a user with a group which does not have a group_profile.
174
+
175
+ Expected behaviour:
176
+ - User can access the GET endpoint
177
+ - User can access the POST endpoint
178
+ - No critical failure should occur
179
+ """
180
+ # Can always use the get endpoint
181
+ response = self.client.get(self.endpoint)
182
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
183
+ # Can use the post endpoint as we're staff. Again this is a 400 because
184
+ # we've not provided the payload, but does show we have permission
185
+ response = self.client.post(self.endpoint)
186
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
187
+
188
+
189
+ class TestUserReadPermissions(TestPermissionsSetup):
190
+ # Read only endpoint
191
+ endpoint = "/api/vrascoreslist/"
192
+
193
+ def setUp(self):
194
+ super().setUp()
195
+
196
+ def test_user_permissions_no_group(self):
197
+ """Test whether permissions successfully allow or deny access to the API
198
+ for a user with no group_profile.
199
+
200
+ Expected behaviour:
201
+ - User can access the GET endpoint
202
+ - User can access the POST endpoint
203
+ """
204
+ # Can always use the get endpoint
205
+ response = self.client.get(self.endpoint)
206
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
207
+ # Can use the post endpoint
208
+ response = self.client.post(self.endpoint)
209
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
210
+
211
+ def test_user_permissions_read_group(self):
212
+ """Test whether permissions successfully allow or deny access to the API
213
+ for a user with read-only permissions on their group_profile.
214
+
215
+ Expected behaviour:
216
+ - User can access the GET endpoint
217
+ - User can access the POST endpoint
218
+ """
219
+ self.user.groups.add(self.read_group)
220
+ self.user.save()
221
+
222
+ # Can always use the get endpoint
223
+ response = self.client.get(self.endpoint)
224
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
225
+ # Can use the post endpoint
226
+ response = self.client.post(self.endpoint)
227
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
228
+
229
+ def test_user_permissions_write_group(self):
230
+ """Test whether permissions successfully allow or deny access to the API
231
+ for a user with write permissions on their group_profile.
232
+
233
+ Expected behaviour:
234
+ - User can access the GET endpoint
235
+ - User can access the POST endpoint
236
+ """
237
+ self.user.groups.add(self.write_group)
238
+ self.user.save()
239
+
240
+ # Can always use the get endpoint
241
+ response = self.client.get(self.endpoint)
242
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
243
+
244
+ # Can use the post endpoint
245
+ response = self.client.post(self.endpoint)
246
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
247
+
248
+ def test_user_permissions_no_group_profile(self):
249
+ """Test whether permissions successfully allow or deny access to the API
250
+ for a user with a group which does not have a group_profile.
251
+
252
+ Expected behaviour:
253
+ - User can access the GET endpoint
254
+ - User can access the POST endpoint
255
+ - No critical failure should occur
256
+
257
+ TODO: capture log output to check that an error is logged?
258
+ """
259
+ # Can always use the get endpoint
260
+ response = self.client.get(self.endpoint)
261
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
262
+ # Can use the post endpoint
263
+ response = self.client.post(self.endpoint)
264
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
265
+
266
+
267
+ class TestStaffReadPermissions(TestPermissionsSetup):
268
+ endpoint = "/api/vrascoreslist/"
269
+
270
+ def setUp(self):
271
+ super().setUp()
272
+ self.user.is_staff = True
273
+ self.user.save()
274
+
275
+ def test_staff_permissions_no_group(self):
276
+ """Test whether permissions successfully allow or deny access to the API
277
+ for a staff user with no group_profile.
278
+
279
+ Expected behaviour:
280
+ - User can access the GET endpoint
281
+ - User can access the POST endpoint
282
+ """
283
+ # Can always use the get endpoint
284
+ response = self.client.get(self.endpoint)
285
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
286
+ # Can use the post endpoint as we're staff
287
+ response = self.client.post(self.endpoint)
288
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
289
+
290
+
291
+ def test_staff_permissions_read_group(self):
292
+ """Test whether permissions successfully allow or deny access to the API
293
+ for a user with read-only permissions on their group_profile.
294
+
295
+ Expected behaviour:
296
+ - User can access the GET endpoint
297
+ - User can access the POST endpoint
298
+ """
299
+ self.user.groups.add(self.read_group)
300
+ self.user.save()
301
+
302
+ # Can always use the get endpoint
303
+ response = self.client.get(self.endpoint)
304
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
305
+ # Can use the post endpoint
306
+ response = self.client.post(self.endpoint)
307
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
308
+
309
+ def test_staff_permissions_write_group(self):
310
+ """Test whether permissions successfully allow or deny access to the API
311
+ for a user with write permissions on their group_profile.
312
+
313
+ Expected behaviour:
314
+ - User can access the GET endpoint
315
+ - User can access the POST endpoint
316
+ """
317
+ self.user.groups.add(self.write_group)
318
+ self.user.save()
319
+
320
+ # Can always use the get endpoint
321
+ response = self.client.get(self.endpoint)
322
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
323
+
324
+ # Can use the post endpoint
325
+ response = self.client.post(self.endpoint)
326
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
327
+
328
+ def test_staff_permissions_no_group_profile(self):
329
+ """Test whether permissions successfully allow or deny access to the API
330
+ for a user with a group which does not have a group_profile.
331
+
332
+ Expected behaviour:
333
+ - User can access the GET endpoint
334
+ - User can access the POST endpoint
335
+ - No critical failure should occur
336
+ """
337
+ # Can always use the get endpoint
338
+ response = self.client.get(self.endpoint)
339
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
340
+ # Can use the post endpoint
341
+ response = self.client.post(self.endpoint)
342
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
343
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: psat-server-web
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: Pan-STARRS and ATLAS web interface.
5
5
  Home-page: https://github.com/genghisken/psat-server-web
6
6
  Author: genghisken
@@ -25,6 +25,7 @@ psat_server_web/atlas/accounts/apps.py
25
25
  psat_server_web/atlas/accounts/models.py
26
26
  psat_server_web/atlas/accounts/signals.py
27
27
  psat_server_web/atlas/accounts/migrations/0001_initial.py
28
+ psat_server_web/atlas/accounts/migrations/0002_groupprofile_api_write_access.py
28
29
  psat_server_web/atlas/accounts/migrations/__init__.py
29
30
  psat_server_web/atlas/atlas/__init__.py
30
31
  psat_server_web/atlas/atlas/apiutils.py
@@ -1 +0,0 @@
1
- __version__ = '0.5.0'
@@ -1,12 +0,0 @@
1
- from rest_framework.permissions import BasePermission, SAFE_METHODS
2
-
3
- class IsApprovedUser(BasePermission):
4
- def has_permission(self, request, view):
5
- # Allow all safe methods (GET, OPTIONS, HEAD)
6
- if request.method in SAFE_METHODS:
7
- return True
8
-
9
- # Only allow POST if the user is authenticated, active, and staff
10
- return (request.user
11
- and request.user.is_authenticated
12
- and request.user.is_staff)