psat-server-web 0.6.7__tar.gz → 0.6.9__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 (519) hide show
  1. {psat_server_web-0.6.7/psat_server_web.egg-info → psat_server_web-0.6.9}/PKG-INFO +3 -1
  2. psat_server_web-0.6.9/psat_server_web/__version__.py +1 -0
  3. psat_server_web-0.6.9/psat_server_web/atlas/accounts/forms.py +115 -0
  4. psat_server_web-0.6.9/psat_server_web/atlas/accounts/migrations/0005_userprofile_image_userprofile_image_b64.py +24 -0
  5. psat_server_web-0.6.9/psat_server_web/atlas/accounts/migrations/0006_alter_userprofile_image.py +20 -0
  6. psat_server_web-0.6.9/psat_server_web/atlas/accounts/models.py +121 -0
  7. psat_server_web-0.6.9/psat_server_web/atlas/accounts/urls.py +32 -0
  8. psat_server_web-0.6.9/psat_server_web/atlas/accounts/utils.py +42 -0
  9. psat_server_web-0.6.9/psat_server_web/atlas/accounts/views.py +303 -0
  10. psat_server_web-0.6.9/psat_server_web/atlas/atlas/django-default.log +986 -0
  11. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/settings.py +18 -0
  12. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/urls.py +8 -12
  13. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/views.py +5 -156
  14. psat_server_web-0.6.9/psat_server_web/atlas/media/profile_pics/Ken_at_ATLAS_HKO2.jpg +0 -0
  15. psat_server_web-0.6.9/psat_server_web/atlas/media/profile_pics/fbloggs/KenATLASTiny.jpg +0 -0
  16. psat_server_web-0.6.9/psat_server_web/atlas/media/profile_pics/holygrail_monster_tiny.jpg +0 -0
  17. psat_server_web-0.6.9/psat_server_web/atlas/media/profile_pics/holygrail_monster_tiny_bt9TavV.jpg +0 -0
  18. psat_server_web-0.6.9/psat_server_web/atlas/media/profile_pics/ken.smith/holygrail_monster_tiny.jpg +0 -0
  19. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/css/main_bootstrap.css +10 -1
  20. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/candidate_plotly.html +1 -1
  21. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/followup_quickview_bs.html +2 -2
  22. psat_server_web-0.6.9/psat_server_web/atlas/templates/base_bootstrap.html +340 -0
  23. psat_server_web-0.6.9/psat_server_web/atlas/templates/change_profile_image.html +30 -0
  24. psat_server_web-0.6.9/psat_server_web/atlas/templates/create_user.html +179 -0
  25. psat_server_web-0.6.9/psat_server_web/atlas/tests/accounts/test-image.jpg +0 -0
  26. psat_server_web-0.6.9/psat_server_web/atlas/tests/accounts/test_create_user.py +189 -0
  27. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/commonqueries.py +10 -9
  28. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/lightcurvequeries.py +2 -2
  29. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/views.py +27 -3
  30. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/base_bootstrap.html +3 -0
  31. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/candidate_plotly.html +77 -5
  32. {psat_server_web-0.6.7 → psat_server_web-0.6.9/psat_server_web.egg-info}/PKG-INFO +3 -1
  33. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web.egg-info/SOURCES.txt +14 -0
  34. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web.egg-info/requires.txt +2 -0
  35. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/setup.py +4 -0
  36. psat_server_web-0.6.7/psat_server_web/__version__.py +0 -1
  37. psat_server_web-0.6.7/psat_server_web/atlas/accounts/models.py +0 -66
  38. psat_server_web-0.6.7/psat_server_web/atlas/accounts/utils.py +0 -14
  39. psat_server_web-0.6.7/psat_server_web/atlas/atlas/django-default.log +0 -409
  40. psat_server_web-0.6.7/psat_server_web/atlas/templates/base_bootstrap.html +0 -274
  41. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/LICENSE +0 -0
  42. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/MANIFEST.in +0 -0
  43. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/README.md +0 -0
  44. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/.DS_Store +0 -0
  45. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/__init__.py +0 -0
  46. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/.DS_Store +0 -0
  47. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/__init__.py +0 -0
  48. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/accounts/admin.py +0 -0
  49. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/accounts/apps.py +0 -0
  50. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/accounts/migrations/0001_initial.py +0 -0
  51. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/accounts/migrations/0002_groupprofile_api_write_access.py +0 -0
  52. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/accounts/migrations/0003_globalpermissions.py +0 -0
  53. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/accounts/migrations/0004_userprofile.py +0 -0
  54. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/accounts/migrations/__init__.py +0 -0
  55. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/accounts/permissions.py +0 -0
  56. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/accounts/signals.py +0 -0
  57. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/__init__.py +0 -0
  58. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/apiutils.py +0 -0
  59. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/commonqueries.py +0 -0
  60. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/dbviews.py +0 -0
  61. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/document.sh +0 -0
  62. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/formchoices.py +0 -0
  63. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/helpers.py +0 -0
  64. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/insert_gravity_event.sql +0 -0
  65. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/lightcurvequeries.py +0 -0
  66. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/migrations/__init__.py +0 -0
  67. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/models.py +0 -0
  68. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/sqlpaginator.py +0 -0
  69. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/view_celestial.py +0 -0
  70. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/wsgi.atlas.conf +0 -0
  71. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/wsgi.py +0 -0
  72. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlas/wsgi_apache_example.conf +0 -0
  73. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlasapi/apps.py +0 -0
  74. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlasapi/authentication.py +0 -0
  75. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlasapi/permissions.py +0 -0
  76. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlasapi/serializers.py +0 -0
  77. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlasapi/throttling.py +0 -0
  78. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlasapi/urls.py +0 -0
  79. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/atlasapi/views.py +0 -0
  80. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/cow_backup.txt +0 -0
  81. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/django-default.log +0 -0
  82. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/generate_mod_wsgi_apachectl.sh +0 -0
  83. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/generate_mod_wsgi_apachectl_test.sh +0 -0
  84. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/manage.py +0 -0
  85. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/media/images/README.txt +0 -0
  86. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/css/aladin.css +0 -0
  87. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/css/brands.css +0 -0
  88. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/css/celestial.css +0 -0
  89. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/css/fontawesome.css +0 -0
  90. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/css/main.css +0 -0
  91. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/css/solid.css +0 -0
  92. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/images/atlas_logo.png +0 -0
  93. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/images/image_not_available.jpeg +0 -0
  94. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/aladin.js +0 -0
  95. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/bootstrap_utils.js +0 -0
  96. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/celestial.js +0 -0
  97. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/d3.geo.projection.js +0 -0
  98. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/d3.geo.projection.min.js +0 -0
  99. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/d3.geo.zoom.js +0 -0
  100. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/d3.min.js +0 -0
  101. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/data/__init__.py +0 -0
  102. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/data/constellations.bounds.json +0 -0
  103. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/data/constellations.json +0 -0
  104. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/data/constellations.lines.json +0 -0
  105. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/data/dsos.bright.json +0 -0
  106. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/data/lg.json +0 -0
  107. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/data/mw.json +0 -0
  108. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/data/planets.json +0 -0
  109. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/celestial/data/stars.6.json +0 -0
  110. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/colourplot.js +0 -0
  111. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/excanvas.js +0 -0
  112. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery-1.7.2.js +0 -0
  113. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.axislabels.js +0 -0
  114. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.crosshair.js +0 -0
  115. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.errorbars.js +0 -0
  116. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.fillbetween.js +0 -0
  117. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.image.js +0 -0
  118. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.js +0 -0
  119. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.navigate.js +0 -0
  120. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.pie.js +0 -0
  121. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.resize.js +0 -0
  122. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.selection.js +0 -0
  123. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.stack.js +0 -0
  124. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.symbol.js +0 -0
  125. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/flot/jquery.flot.threshold.js +0 -0
  126. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/followup_selectall.js +0 -0
  127. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/heatmap.js +0 -0
  128. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/lightcurve.js +0 -0
  129. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/lightcurveplotly.js +0 -0
  130. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/mjdcalc.js +0 -0
  131. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/plotly/plotly-latest.kws.js +0 -0
  132. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/recurrenceplot.js +0 -0
  133. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/js/recurrenceplotplotly.js +0 -0
  134. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.eot +0 -0
  135. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.svg +0 -0
  136. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.ttf +0 -0
  137. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.woff +0 -0
  138. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.woff2 +0 -0
  139. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.eot +0 -0
  140. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.svg +0 -0
  141. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.ttf +0 -0
  142. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.woff +0 -0
  143. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.woff2 +0 -0
  144. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.eot +0 -0
  145. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.svg +0 -0
  146. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.ttf +0 -0
  147. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.woff +0 -0
  148. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.woff2 +0 -0
  149. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-v4compatibility.ttf +0 -0
  150. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/site_media/webfonts/fa-v4compatibility.woff2 +0 -0
  151. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/sql/create_web_views.sql +0 -0
  152. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/tcs_detection_lists.sql +0 -0
  153. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/.DS_Store +0 -0
  154. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/400.html +0 -0
  155. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/403.html +0 -0
  156. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/404.html +0 -0
  157. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/500.html +0 -0
  158. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/atelfasttrackobject.txt +0 -0
  159. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/atelsdiscovery.txt +0 -0
  160. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/atelsfast.txt +0 -0
  161. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/candidate.html +0 -0
  162. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/candidate_plotly_test.html +0 -0
  163. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/crossmatch_external.html +0 -0
  164. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/error.html +0 -0
  165. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/followup.html +0 -0
  166. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/followup.txt +0 -0
  167. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/followup2.html +0 -0
  168. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/followup_bs.html +0 -0
  169. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/followup_bypass_django_tables.html +0 -0
  170. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/followup_quickview.html +0 -0
  171. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/followup_subset.txt +0 -0
  172. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/gcn.txt +0 -0
  173. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/gcn_latex.txt +0 -0
  174. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/heatmap.html +0 -0
  175. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/heatmap_test.html +0 -0
  176. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/index.html +0 -0
  177. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/index_bs.html +0 -0
  178. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/index_bs_celestial.html +0 -0
  179. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/index_bs_celestial_experiment.html +0 -0
  180. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/iobserve.txt +0 -0
  181. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/lightcurve.txt +0 -0
  182. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/lightcurveddc.txt +0 -0
  183. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/lightcurveforced.txt +0 -0
  184. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/lightcurvestackedforced.txt +0 -0
  185. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/permissions_alert.html +0 -0
  186. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/pesstorecurrences.txt +0 -0
  187. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/pesstorecurrencesddc.txt +0 -0
  188. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/pesstosummary.txt +0 -0
  189. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/search_results.html +0 -0
  190. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/search_results_plotly.html +0 -0
  191. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/sne.json +0 -0
  192. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/summary.csv +0 -0
  193. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/userdefinedlists.html +0 -0
  194. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/userdefinedlists_bs.html +0 -0
  195. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/atlas/visibility.txt +0 -0
  196. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/base.html +0 -0
  197. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/base_bootstrap_login.html +0 -0
  198. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/bootstrap4_django_tables2_atlas.html +0 -0
  199. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/change_password.html +0 -0
  200. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/django_registration/activation_complete.html +0 -0
  201. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/django_registration/activation_email_body.txt +0 -0
  202. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/django_registration/activation_email_subject.txt +0 -0
  203. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/django_registration/activation_form.html +0 -0
  204. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/django_registration/registration_closed.html +0 -0
  205. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/django_registration/registration_complete.html +0 -0
  206. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/django_registration/registration_form.html +0 -0
  207. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/invalid_login.html +0 -0
  208. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/loggedin.html +0 -0
  209. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/login.html +0 -0
  210. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/logout.html +0 -0
  211. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/password_change_done.html +0 -0
  212. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/privacy_policy.html +0 -0
  213. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/templates/register.html +0 -0
  214. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/test.py +0 -0
  215. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/tests/__init__.py +0 -0
  216. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/tests/accounts/__init__.py +0 -0
  217. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/tests/accounts/test_permissions.py +0 -0
  218. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/tests/atlasapi/__init__.py +0 -0
  219. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/tests/atlasapi/test_authentication.py +0 -0
  220. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/tests/atlasapi/test_failure.py +0 -0
  221. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/tests/atlasapi/test_permissions.py +0 -0
  222. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/atlas/tests/atlasapi/test_throttling.py +0 -0
  223. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/common/__init__.py +0 -0
  224. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/common/psat_api_client.py +0 -0
  225. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/config/wsgi.conf.template +0 -0
  226. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/__init__.py +0 -0
  227. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/createUsers.py +0 -0
  228. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/generate_mod_wsgi_apachectl.sh +0 -0
  229. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/manage.py +0 -0
  230. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/media/images/README.txt +0 -0
  231. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/__init__.py +0 -0
  232. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/admin.py.old +0 -0
  233. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/catalogueviews.py +0 -0
  234. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/dbviews.py +0 -0
  235. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/formchoices.py +0 -0
  236. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/helpers.py +0 -0
  237. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/img_scale.py +0 -0
  238. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/models.py +0 -0
  239. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/settings.py +0 -0
  240. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/urls.py +0 -0
  241. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/wsgi.py +0 -0
  242. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdb/wsgi_apache_example.conf +0 -0
  243. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdbapi/apps.py +0 -0
  244. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdbapi/permissions.py +0 -0
  245. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdbapi/query_auth.py +0 -0
  246. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdbapi/serializers.py +0 -0
  247. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdbapi/urls.py +0 -0
  248. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/psdbapi/views.py +0 -0
  249. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/css/aladin.css +0 -0
  250. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/css/celestial.css +0 -0
  251. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/css/fontawesome.css +0 -0
  252. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/css/main.css +0 -0
  253. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/css/main_bootstrap.css +0 -0
  254. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/1-star-hover.jpg +0 -0
  255. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/1-star.jpg +0 -0
  256. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/2-star-hover.jpg +0 -0
  257. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/2-star.jpg +0 -0
  258. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/3-star-hover.jpg +0 -0
  259. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/3-star.jpg +0 -0
  260. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/aladin.gif +0 -0
  261. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/cfaIcon.jpg +0 -0
  262. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/cfaIconHover.jpg +0 -0
  263. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/confirmed-sne-hover.jpg +0 -0
  264. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/confirmed-sne.jpg +0 -0
  265. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/detection_example.jpg +0 -0
  266. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/down.jpeg +0 -0
  267. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/down.jpg +0 -0
  268. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/image_not_available.jpeg +0 -0
  269. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/jhuIcon.jpg +0 -0
  270. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/jhuIconHover.jpg +0 -0
  271. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/minus.jpg +0 -0
  272. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/ncuIcon.jpg +0 -0
  273. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/ncuIconHover.jpg +0 -0
  274. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/non_detection_example.jpg +0 -0
  275. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/others-hover.jpg +0 -0
  276. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/others.jpg +0 -0
  277. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs-logo-hover.jpg +0 -0
  278. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs-logo.jpg +0 -0
  279. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs1_logo.jpg +0 -0
  280. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs1_o3_logo.jpg +0 -0
  281. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs2_logo.jpg +0 -0
  282. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs2_o3_logo.jpg +0 -0
  283. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs_logo.jpg +0 -0
  284. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs_logo_o4.jpg +0 -0
  285. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs_logo_original.jpg +0 -0
  286. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs_logo_yse.jpg +0 -0
  287. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/panstarrs_logo_yse_stack.jpg +0 -0
  288. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/pittsIcon.jpg +0 -0
  289. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/pittsIconHover.jpg +0 -0
  290. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/plus.jpg +0 -0
  291. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/ps1Icon.jpg +0 -0
  292. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/ps1IconHover.jpg +0 -0
  293. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/ps1sc.gif +0 -0
  294. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/qub-logo-hover.jpg +0 -0
  295. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/qub-logo.jpg +0 -0
  296. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/qubIcon.jpg +0 -0
  297. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/qubIconHover.jpg +0 -0
  298. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/sdss.gif +0 -0
  299. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/table-background.jpg +0 -0
  300. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/table-bottom-left.jpg +0 -0
  301. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/table-bottom-right.jpg +0 -0
  302. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/table-row.jpg +0 -0
  303. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/table-top-left.jpg +0 -0
  304. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/table-top-right.jpg +0 -0
  305. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/uhifaIcon.jpg +0 -0
  306. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/uhifaIconHover.jpg +0 -0
  307. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/up.jpeg +0 -0
  308. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/up.jpg +0 -0
  309. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/variable-stars-hover.jpg +0 -0
  310. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/images/variable-stars.jpg +0 -0
  311. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/aladin.js +0 -0
  312. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/celestial.js +0 -0
  313. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/d3.geo.projection.js +0 -0
  314. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/d3.geo.projection.min.js +0 -0
  315. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/d3.geo.zoom.js +0 -0
  316. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/d3.min.js +0 -0
  317. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/data/__init__.py +0 -0
  318. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/data/constellations.bounds.json +0 -0
  319. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/data/constellations.json +0 -0
  320. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/data/constellations.lines.json +0 -0
  321. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/data/dsos.bright.json +0 -0
  322. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/data/lg.json +0 -0
  323. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/data/mw.json +0 -0
  324. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/data/planets.json +0 -0
  325. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/celestial/data/stars.6.json +0 -0
  326. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/colourplot.js +0 -0
  327. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/excanvas.js +0 -0
  328. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery-1.7.2.js +0 -0
  329. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.axislabels.js +0 -0
  330. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.crosshair.js +0 -0
  331. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.errorbars.js +0 -0
  332. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.fillbetween.js +0 -0
  333. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.image.js +0 -0
  334. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.js +0 -0
  335. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.navigate.js +0 -0
  336. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.pie.js +0 -0
  337. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.resize.js +0 -0
  338. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.selection.js +0 -0
  339. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.stack.js +0 -0
  340. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.symbol.js +0 -0
  341. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/flot/jquery.flot.threshold.js +0 -0
  342. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/followup_selectall.js +0 -0
  343. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/lightcurve.js +0 -0
  344. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/lightcurveplotly.js +0 -0
  345. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/mjdcalc.js +0 -0
  346. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/plotly/plotly-latest.kws.js +0 -0
  347. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/recurrenceplot.js +0 -0
  348. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/js/recurrenceplotplotly.js +0 -0
  349. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.eot +0 -0
  350. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.svg +0 -0
  351. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.ttf +0 -0
  352. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.woff +0 -0
  353. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.woff2 +0 -0
  354. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.eot +0 -0
  355. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.svg +0 -0
  356. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.ttf +0 -0
  357. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.woff +0 -0
  358. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.woff2 +0 -0
  359. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.eot +0 -0
  360. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.svg +0 -0
  361. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.ttf +0 -0
  362. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.woff +0 -0
  363. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.woff2 +0 -0
  364. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/sql/create_web_cat_views.sql +0 -0
  365. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/sql/create_web_user_grants.sql +0 -0
  366. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/sql/create_web_views.sql +0 -0
  367. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/sql/create_web_views_fgss.sql +0 -0
  368. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/400.html +0 -0
  369. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/403.html +0 -0
  370. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/404.html +0 -0
  371. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/500.html +0 -0
  372. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/admin/base_site.html +0 -0
  373. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/base.html +0 -0
  374. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/base_bootstrap_login.html +0 -0
  375. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/base_new.html +0 -0
  376. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/bootstrap4_django_tables2_atlas.html +0 -0
  377. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/invalid_login.html +0 -0
  378. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/loggedin.html +0 -0
  379. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/login.html +0 -0
  380. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/logout.html +0 -0
  381. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/atelsdiscovery.txt +0 -0
  382. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/candidate.html +0 -0
  383. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/candidate_quickview.html +0 -0
  384. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/candidateflot.html +0 -0
  385. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/candidates.html +0 -0
  386. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/colourdata.txt +0 -0
  387. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/crossmatch_cfa_with_ipp.html +0 -0
  388. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/crossmatch_external.html +0 -0
  389. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/dss2.html +0 -0
  390. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/error.html +0 -0
  391. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/fasttrackastronote.txt +0 -0
  392. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/filter.html +0 -0
  393. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/followup.html +0 -0
  394. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/followup.txt +0 -0
  395. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/followup_bs.html +0 -0
  396. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/followup_bs_old.html +0 -0
  397. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/followup_quickview.html +0 -0
  398. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/followup_quickview_bs.html +0 -0
  399. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/followup_quickview_bs_old.html +0 -0
  400. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/gcn.txt +0 -0
  401. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/gcn_latex.txt +0 -0
  402. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/index.html +0 -0
  403. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/index_bs_celestial.html +0 -0
  404. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/index_public.html +0 -0
  405. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/lightcurve.txt +0 -0
  406. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/lightcurveforced.txt +0 -0
  407. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/lightcurves.html +0 -0
  408. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/obscat.txt +0 -0
  409. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/obsmediawiki.txt +0 -0
  410. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/public.html +0 -0
  411. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/public_textonly.txt +0 -0
  412. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/reports.html +0 -0
  413. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/search_results.html +0 -0
  414. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/search_results_plotly.html +0 -0
  415. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/sne.json +0 -0
  416. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/userdefinedlists.html +0 -0
  417. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/ps1/templates/psdb/userdefinedlists_bs.html +0 -0
  418. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_detections.sql +0 -0
  419. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_detectionsddc.sql +0 -0
  420. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_detectionsnnc.sql +0 -0
  421. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_diff_detections.sql +0 -0
  422. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_diff_logs.sql +0 -0
  423. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_diff_moments.sql +0 -0
  424. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_diff_objects.sql +0 -0
  425. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_diff_subcell_logs.sql +0 -0
  426. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_diff_subcells.sql +0 -0
  427. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_forced_photometry.sql +0 -0
  428. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_heatmaps.sql +0 -0
  429. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_metadata.sql +0 -0
  430. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_metadataddc.sql +0 -0
  431. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_objects.sql +0 -0
  432. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/atlas_stacked_forced_photometry.sql +0 -0
  433. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/convert_backend_storage_to_innodb.sql +0 -0
  434. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/create_atlas_flattened_view.sql +0 -0
  435. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/create_photpipe_views.sql +0 -0
  436. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/create_schema.sql +0 -0
  437. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/create_user_grants.sql +0 -0
  438. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/create_user_grants_generic.sql +0 -0
  439. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/create_user_grants_root.sql +0 -0
  440. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/delete_transients.sql +0 -0
  441. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/generateATLASSchemaAndCPPClasses.py +0 -0
  442. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/get_table_columns_for_avro.py +0 -0
  443. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/get_table_columns_for_avro.sql +0 -0
  444. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/mjdnow.sql +0 -0
  445. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/refresh_django_views.py +0 -0
  446. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/setup_database.py +0 -0
  447. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/setup_database_utils.py +0 -0
  448. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/sherlock_classifications.sql +0 -0
  449. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/sherlock_crossmatches.sql +0 -0
  450. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/sherlock_triggers_atlas.sql +0 -0
  451. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/sherlock_triggers_ps1.sql +0 -0
  452. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cat_gaia_dr1.sql +0 -0
  453. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cat_gaia_dr2.sql +0 -0
  454. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cat_gaia_dr2_cassandra.cql +0 -0
  455. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cat_kepler_k2.sql +0 -0
  456. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cat_kepler_k2_pixels.sql +0 -0
  457. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cat_ps1_medium_deep_ref.sql +0 -0
  458. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cat_ps1_ubercal_stars.sql +0 -0
  459. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cat_satellites.sql +0 -0
  460. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_catalogue_tables.sql +0 -0
  461. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cfa_detections.sql +0 -0
  462. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cfa_to_ipp_lookup.sql +0 -0
  463. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_classification_flags.sql +0 -0
  464. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_classification_history.sql +0 -0
  465. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cmf_metadata.sql +0 -0
  466. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cross_matches.sql +0 -0
  467. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_cross_matches_external.sql +0 -0
  468. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_detection_lists.sql +0 -0
  469. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_detection_lists_atlas.sql +0 -0
  470. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_followup_photometry.sql +0 -0
  471. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_followup_telescope_instruments.sql +0 -0
  472. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_followup_telescopes.sql +0 -0
  473. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_forced_photometry.sql +0 -0
  474. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_function_lunation.sql +0 -0
  475. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_function_mjdlunation.sql +0 -0
  476. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_gravity_alerts.sql +0 -0
  477. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_gravity_event_annotations.sql +0 -0
  478. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_gravity_events.sql +0 -0
  479. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_guide_star_cat.sql +0 -0
  480. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_image_groups.sql +0 -0
  481. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_images.sql +0 -0
  482. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_ipp_to_cfa_lookup.sql +0 -0
  483. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_latest_object_stats.sql +0 -0
  484. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_object_comments.sql +0 -0
  485. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_object_group_definitions.sql +0 -0
  486. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_object_group_definitions_atlas.sql +0 -0
  487. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_object_groups.sql +0 -0
  488. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_parameter_definitions.sql +0 -0
  489. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_photpipe_detections.sql +0 -0
  490. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_postage_stamp_images.sql +0 -0
  491. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_postage_stamp_requests.sql +0 -0
  492. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_postage_stamp_status_codes.sql +0 -0
  493. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_processing_status.sql +0 -0
  494. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_search_parameters.sql +0 -0
  495. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_tns_requests.sql +0 -0
  496. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_tphot_detections.sql +0 -0
  497. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_transient_objects.sql +0 -0
  498. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_transient_reobservations.sql +0 -0
  499. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_vra_rank.sql +0 -0
  500. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_vra_scores.sql +0 -0
  501. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_vra_todo.sql +0 -0
  502. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_zoo_requests.sql +0 -0
  503. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/tcs_zooniverse_scores.sql +0 -0
  504. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/types_gaia_dr2_cassandra.txt +0 -0
  505. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_database_types_to_tns_types_atlas.sql +0 -0
  506. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_database_types_to_tns_types_panstarrs.sql +0 -0
  507. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_tcs_forced_photometry_20250630.sql +0 -0
  508. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_tcs_gravity_alerts_001.sql +0 -0
  509. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_tcs_gravity_event_annotations_001.sql +0 -0
  510. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_tcs_latest_object_stats_001.sql +0 -0
  511. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_tcs_vra_rank_20240814.sql +0 -0
  512. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_tcs_vra_rank_20250130.sql +0 -0
  513. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_tcs_vra_scores_20240814.sql +0 -0
  514. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/update_tcs_vra_scores_20250130.sql +0 -0
  515. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web/schema/vra_triggers_atlas.sql +0 -0
  516. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web.egg-info/dependency_links.txt +0 -0
  517. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web.egg-info/not-zip-safe +0 -0
  518. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/psat_server_web.egg-info/top_level.txt +0 -0
  519. {psat_server_web-0.6.7 → psat_server_web-0.6.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: psat-server-web
3
- Version: 0.6.7
3
+ Version: 0.6.9
4
4
  Summary: Pan-STARRS and ATLAS web interface.
5
5
  Home-page: https://github.com/genghisken/psat-server-web
6
6
  Author: genghisken
@@ -28,6 +28,8 @@ Requires-Dist: gkutils>=0.3.10
28
28
  Requires-Dist: requests
29
29
  Requires-Dist: lasair
30
30
  Requires-Dist: dustmaps
31
+ Requires-Dist: django-debug-toolbar
32
+ Requires-Dist: pillow
31
33
 
32
34
  # psat-server-web
33
35
  Python 3 web interface for the Pan-STARRS and ATLAS surveys.
@@ -0,0 +1 @@
1
+ __version__ = '0.6.9'
@@ -0,0 +1,115 @@
1
+ """
2
+ Forms for user account management.
3
+ """
4
+ from django import forms
5
+ from django.contrib.auth.models import User, Group
6
+ from django.core.exceptions import ValidationError
7
+
8
+
9
+ class CreateUserForm(forms.Form):
10
+ """
11
+ Form for creating new users with profile settings.
12
+ Only accessible by admin users.
13
+ """
14
+ # User basic information
15
+ username = forms.CharField(
16
+ max_length=150,
17
+ widget=forms.TextInput(attrs={
18
+ 'class': 'form-control',
19
+ 'placeholder': 'Enter username'
20
+ }),
21
+ help_text='Required. Letters, digits and @/./+/-/_ only.'
22
+ )
23
+
24
+ email = forms.EmailField(
25
+ widget=forms.EmailInput(attrs={
26
+ 'class': 'form-control',
27
+ 'placeholder': 'Enter email address'
28
+ }),
29
+ help_text='Required. Valid email address.'
30
+ )
31
+
32
+ first_name = forms.CharField(
33
+ max_length=30,
34
+ widget=forms.TextInput(attrs={
35
+ 'class': 'form-control',
36
+ 'placeholder': 'Enter first name'
37
+ }),
38
+ help_text='Required. First name of the user.'
39
+ )
40
+
41
+ last_name = forms.CharField(
42
+ max_length=150,
43
+ widget=forms.TextInput(attrs={
44
+ 'class': 'form-control',
45
+ 'placeholder': 'Enter last name'
46
+ }),
47
+ help_text='Required. Last name of the user.'
48
+ )
49
+
50
+ image = forms.ImageField(
51
+ required=False,
52
+ widget=forms.ClearableFileInput(attrs={
53
+ 'class': 'form-control-file'
54
+ }),
55
+ help_text='Optional. Upload a profile image (.gif, .png, .jpg).'
56
+ )
57
+
58
+ # Group selection for token expiration and write access
59
+ group = forms.ModelChoiceField(
60
+ queryset=Group.objects.all(),
61
+ empty_label="Select a group",
62
+ widget=forms.Select(attrs={
63
+ 'class': 'form-control'
64
+ }),
65
+ help_text=(
66
+ 'Select group to determine API token expiration time and '
67
+ 'write access permissions.'
68
+ )
69
+ )
70
+
71
+ has_write_access = forms.BooleanField(
72
+ required=False,
73
+ label='Can edit observations',
74
+ widget=forms.CheckboxInput(),
75
+ help_text='Grant the user permission to edit observations.'
76
+ )
77
+
78
+ def __init__(self, *args, **kwargs):
79
+ super().__init__(*args, **kwargs)
80
+ for field_name, field in self.fields.items():
81
+ auto_id = self.auto_id % field_name
82
+ id_for_error = f"{auto_id}_errorlist"
83
+ id_for_help = f"{auto_id}_helptext"
84
+ field.widget.attrs.update(
85
+ {
86
+ "aria-describedby": f"{id_for_error} {id_for_help}",
87
+ }
88
+ )
89
+
90
+ def clean_username(self):
91
+ """Validate that username is unique."""
92
+ username = self.cleaned_data['username']
93
+ if User.objects.filter(username=username).exists():
94
+ raise ValidationError('A user with this username already exists.')
95
+ return username
96
+
97
+ def clean_email(self):
98
+ """Validate that email is unique."""
99
+ email = self.cleaned_data['email']
100
+ if User.objects.filter(email=email).exists():
101
+ raise ValidationError('A user with this email already exists.')
102
+ return email
103
+
104
+
105
+ class ChangeProfileImageForm(forms.Form):
106
+ """
107
+ Form for changing the user's profile image.
108
+ """
109
+ image = forms.ImageField(
110
+ required=False,
111
+ widget=forms.ClearableFileInput(attrs={
112
+ 'class': 'form-control-file'
113
+ }),
114
+ help_text='Optional. Upload a new profile image (.gif, .png, .jpg).'
115
+ )
@@ -0,0 +1,24 @@
1
+ # Generated by Django 5.2.1 on 2025-08-08 22:55
2
+
3
+ import django.core.validators
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('accounts', '0004_userprofile'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name='userprofile',
16
+ name='image',
17
+ field=models.ImageField(blank=True, help_text='Optional. Upload a profile image (.gif, .png, .jpg).', null=True, upload_to='profile_pics/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['gif', 'jpeg', 'jpg', 'png'])]),
18
+ ),
19
+ migrations.AddField(
20
+ model_name='userprofile',
21
+ name='image_b64',
22
+ field=models.TextField(blank=True, null=True),
23
+ ),
24
+ ]
@@ -0,0 +1,20 @@
1
+ # Generated by Django 5.2.1 on 2025-08-27 11:30
2
+
3
+ import accounts.models
4
+ import django.core.validators
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ('accounts', '0005_userprofile_image_userprofile_image_b64'),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.AlterField(
16
+ model_name='userprofile',
17
+ name='image',
18
+ field=models.ImageField(blank=True, help_text='Optional. Upload a profile image (.gif, .png, .jpg).', null=True, upload_to=accounts.models.user_directory_path, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['gif', 'jpeg', 'jpg', 'png'])]),
19
+ ),
20
+ ]
@@ -0,0 +1,121 @@
1
+
2
+ from PIL import Image
3
+ from django.utils.timezone import timedelta
4
+ from django.contrib.auth.models import Group
5
+ from django.db import models
6
+ from django.core.validators import FileExtensionValidator
7
+ from django.conf import settings
8
+ import io
9
+ import os
10
+ import re
11
+
12
+ from .utils import bytes2string
13
+
14
+
15
+ def user_directory_path(instance, filename):
16
+ # file will be uploaded to MEDIA_ROOT/profile_pics/<username>/<filename>
17
+ # Securely extract the base filename and validate it
18
+ base_filename = os.path.basename(filename)
19
+ # Allow only alphanumerics, underscores, hyphens, and dots in filenames
20
+ if not re.fullmatch(r'[\w.\-]+', base_filename):
21
+ raise ValueError("Invalid profile image filename.")
22
+ return f'profile_pics/{instance.user.username}/{base_filename}'
23
+
24
+
25
+ class UserProfile(models.Model):
26
+ """UserProfile.
27
+
28
+ Extension of the User model to store additional information, such as token
29
+ expiration time and avatar image.
30
+ """
31
+
32
+ if settings.DEBUG:
33
+ staticRoot = settings.STATICFILES_DIRS[0]
34
+ else:
35
+ staticRoot = settings.STATIC_ROOT
36
+
37
+ id = models.AutoField(primary_key=True)
38
+ user = models.OneToOneField(
39
+ 'auth.User',
40
+ on_delete=models.CASCADE,
41
+ related_name='profile'
42
+ )
43
+ password_unuseable_fl = models.BooleanField(
44
+ default=False,
45
+ help_text='If true, password requires changing before login'
46
+ )
47
+
48
+ image = models.ImageField(
49
+ upload_to=user_directory_path,
50
+ validators=[FileExtensionValidator(
51
+ allowed_extensions=['gif', 'jpeg', 'jpg', 'png']
52
+ )],
53
+ blank=True,
54
+ null=True,
55
+ help_text='Optional. Upload a profile image (.gif, .png, .jpg).'
56
+ )
57
+ image_b64 = models.TextField(
58
+ blank=True,
59
+ null=True,
60
+ )
61
+
62
+ def __str__(self):
63
+ return f'{self.user.username} Profile'
64
+
65
+ def save(self, *args, **kwargs):
66
+ super(UserProfile, self).save(*args, **kwargs)
67
+ if self.image:
68
+ img = Image.open(self.image.path)
69
+ if img.height > 300 or img.width > 300:
70
+ output_size = (300, 300)
71
+ img.thumbnail(output_size)
72
+ img.save(self.image.path)
73
+ imgByteArr = io.BytesIO()
74
+ img.save(imgByteArr, format=img.format)
75
+ self.image_b64 = bytes2string(imgByteArr.getvalue())
76
+ super(UserProfile, self).save(*args, **kwargs)
77
+
78
+ class Meta:
79
+ """Meta.
80
+ """
81
+ app_label = 'accounts'
82
+ managed = True
83
+ verbose_name = 'User Profile'
84
+ verbose_name_plural = 'User Profiles'
85
+ db_table = 'auth_user_profile'
86
+
87
+
88
+ class GroupProfile(models.Model):
89
+ """GroupProfile.
90
+
91
+ Extension of the Group model to store additional information, such as token
92
+ expiration time.
93
+ """
94
+ id = models.AutoField(primary_key=True)
95
+ group = models.OneToOneField(
96
+ Group,
97
+ on_delete=models.CASCADE,
98
+ related_name='profile'
99
+ )
100
+ api_write_access = models.BooleanField(
101
+ default=False,
102
+ help_text='Does the group have write access to the API?'
103
+ )
104
+ token_expiration_time = models.DurationField(
105
+ help_text='in days, default 1 day (24*60*60 seconds)',
106
+ default=timedelta(days=1)
107
+ )
108
+ description = models.TextField(
109
+ blank=True,
110
+ help_text='What is the group for?'
111
+ )
112
+
113
+ class Meta:
114
+ """Meta.
115
+ """
116
+ app_label = 'accounts'
117
+ managed = True
118
+ verbose_name = 'Group Profile'
119
+ verbose_name_plural = 'Group Profiles'
120
+ db_table = 'auth_group_profile'
121
+
@@ -0,0 +1,32 @@
1
+ from django.urls import include, path, re_path
2
+ from django.contrib.auth import views as auth_views
3
+
4
+ from accounts import views
5
+
6
+ urlpatterns = [
7
+ re_path(r'^login/', views.loginView, name="login"),
8
+ re_path(r'^register/', views.register_user, name="register"),
9
+ re_path(r'^logout/', views.logoutView, name="logout"),
10
+ re_path(r'^auth/', views.authView, name="auth"),
11
+ re_path(r'^loggedin/', views.loggedin, name="loggedin"),
12
+ re_path(r'^invalid/', views.invalidLogin, name="invalid"),
13
+ re_path(
14
+ r'^change_password/$',
15
+ views.AtlasPasswordChangeView.as_view(),
16
+ name="change_password"
17
+ ),
18
+ re_path(
19
+ r'^password_change_done/$',
20
+ auth_views.PasswordChangeDoneView.as_view(
21
+ template_name="password_change_done.html"
22
+ ),
23
+ name="password_change_done"
24
+ ),
25
+ re_path(r'^create_user/$', views.create_user, name="create_user"),
26
+ re_path(
27
+ r'^change_profile_image/$',
28
+ views.change_profile_image,
29
+ name="change_profile_image"
30
+ ),
31
+ path("", include("django_registration.backends.activation.urls")),
32
+ ]
@@ -0,0 +1,42 @@
1
+ import logging
2
+ import base64
3
+
4
+ logger = logging.getLogger(__name__)
5
+
6
+
7
+ def needs_to_change_password(user):
8
+ """
9
+ Custom test to check if the user is logged in and has a specific attribute.
10
+ """
11
+ try:
12
+ logger.debug(
13
+ f"Checking if user {user.username} needs to change password."
14
+ )
15
+ logger.debug(f"User profile: {user.profile}")
16
+ return user.profile.password_unuseable_fl
17
+ except AttributeError:
18
+ return False
19
+
20
+
21
+ def bytes2string(bytes):
22
+ """*convert byte to string and return*
23
+
24
+ **Key Arguments:**
25
+
26
+ - `bytes` -- the byte string to convert
27
+ """
28
+ base64_bytes = base64.b64encode(bytes)
29
+ str = base64_bytes.decode('utf-8')
30
+ return str
31
+
32
+
33
+ def string2bytes(str):
34
+ """*convert string to bytes and return*
35
+
36
+ **Key Arguments:**
37
+
38
+ - `str` -- the str string to convert to string
39
+ """
40
+ base64_bytes = str.encode('utf-8')
41
+ bytes = base64.decodebytes(base64_bytes)
42
+ return bytes
@@ -0,0 +1,303 @@
1
+ from django.shortcuts import render, redirect
2
+ from django.contrib.auth import views as auth_views
3
+ from django.contrib import auth, messages
4
+ from django import forms
5
+ from django.contrib.auth.forms import UserCreationForm, PasswordChangeForm
6
+ from django.contrib.auth.models import Group, Permission
7
+ from django.contrib.auth.decorators import login_required, user_passes_test
8
+ import logging
9
+
10
+ from accounts.models import UserProfile
11
+ from accounts.utils import needs_to_change_password
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class LoginForm(forms.Form):
17
+ """LoginForm.
18
+ """
19
+
20
+ username = forms.CharField(
21
+ required=False,
22
+ widget=forms.TextInput(
23
+ attrs={'size': '50', 'class': 'form-control'}
24
+ )
25
+ )
26
+ password = forms.CharField(
27
+ required=False,
28
+ widget=forms.PasswordInput(
29
+ attrs={'size': '50', 'class': 'form-control'}
30
+ )
31
+ )
32
+
33
+
34
+ def loginView(request):
35
+ """login.
36
+
37
+ Args:
38
+ request:
39
+ """
40
+ auth.logout(request)
41
+ form = LoginForm()
42
+ return render(request, 'login.html', {'form': form})
43
+
44
+
45
+ def authView(request):
46
+ """authView.
47
+
48
+ Args:
49
+ request:
50
+ """
51
+ # Although we picked up the "next" parameter via GET in our template,
52
+ # we submitted it via POST.
53
+ next = request.POST.get('next', '')
54
+
55
+ username = request.POST.get('username', '')
56
+ password = request.POST.get('password', '')
57
+ user = auth.authenticate(username=username, password=password)
58
+
59
+ if user is not None:
60
+ # Expire the login session after 1 day.
61
+ # 2017-11-28 KWS Changed expiry to 30 days.
62
+ # 1 day expiry too irritating.
63
+ request.session.set_expiry(30 * 86400)
64
+ auth.login(request, user)
65
+ try:
66
+ if user.profile.password_unuseable_fl:
67
+ return redirect('change_password')
68
+ except AttributeError:
69
+ logger.warning(f'User {user} has no profile.')
70
+
71
+ if next == '':
72
+ return redirect('home')
73
+ else:
74
+ return redirect(next)
75
+
76
+ else:
77
+ return redirect('invalid')
78
+
79
+
80
+ def loggedin(request):
81
+ """loggedin.
82
+
83
+ Args:
84
+ request:
85
+ """
86
+ return render(request, 'loggedin.html',
87
+ {'full_name': request.user.username})
88
+
89
+
90
+ def invalidLogin(request):
91
+ """invalidLogin.
92
+
93
+ Args:
94
+ request:
95
+ """
96
+ return render(request, 'invalid_login.html')
97
+
98
+
99
+ def logoutView(request):
100
+ """logout.
101
+
102
+ Args:
103
+ request:
104
+ """
105
+ auth.logout(request)
106
+ return render(request, 'logout.html')
107
+
108
+
109
+ def register_user(request):
110
+ if request.method == 'POST':
111
+ form = UserCreationForm(request.POST)
112
+ if form.is_valid():
113
+ form.save()
114
+ return redirect('login')
115
+ else:
116
+ form = UserCreationForm()
117
+ return render(request, 'register.html', {'form': form})
118
+
119
+
120
+ class AtlasPasswordChangeForm(PasswordChangeForm):
121
+ """AtlasPasswordChangeForm.
122
+ """
123
+ error_messages = {
124
+ **PasswordChangeForm.error_messages,
125
+ 'password_old_same_new': (
126
+ "The new password cannot be the same as the old password."
127
+ ),
128
+ 'old_password_incorrect': "The old password is not correct.",
129
+ }
130
+
131
+ def clean_new_password1(self):
132
+ """
133
+ Further checking on old password to ensure it is not the same as the
134
+ new password.
135
+ """
136
+ new_password1 = self.cleaned_data['new_password1']
137
+ try:
138
+ old_password = self.cleaned_data['old_password']
139
+ except KeyError:
140
+ # This is a new password change form, so we don't have an old
141
+ # password to check against.
142
+ raise forms.ValidationError(
143
+ self.error_messages['old_password_incorrect'],
144
+ code='old_password_incorrect',
145
+ )
146
+
147
+ if old_password == new_password1:
148
+ raise forms.ValidationError(
149
+ self.error_messages['password_old_same_new'],
150
+ code='password_old_same_new',
151
+ )
152
+ return new_password1
153
+
154
+
155
+ class AtlasPasswordChangeView(auth_views.PasswordChangeView):
156
+ """AtlasPasswordChangeView.
157
+ """
158
+ form_class = AtlasPasswordChangeForm
159
+ template_name = 'change_password.html'
160
+
161
+ def form_valid(self, form):
162
+ # Unset the password_unuseable flag in the user profile
163
+ try:
164
+ form.user.profile.password_unuseable_fl = False
165
+ form.user.profile.save()
166
+ except AttributeError:
167
+ logger.warning(f'User {form.user} has no profile.')
168
+
169
+ return super().form_valid(form)
170
+
171
+ def get_context_data(self, **kwargs):
172
+ context_data = super().get_context_data(**kwargs)
173
+ try:
174
+ context_data['password_unuseable_fl'] = (
175
+ self.request.user.profile.password_unuseable_fl
176
+ )
177
+ except AttributeError:
178
+ logger.warning(f'User {self.request.user} has no profile.')
179
+ context_data['password_unuseable_fl'] = False
180
+ return context_data
181
+
182
+
183
+ @login_required
184
+ @user_passes_test(lambda u: u.is_staff, login_url='invalid')
185
+ def create_user(request):
186
+ """
187
+ Create a new user with profile settings.
188
+ Only accessible by admin users.
189
+ """
190
+ from accounts.forms import CreateUserForm
191
+ from accounts.models import UserProfile, GroupProfile
192
+ from django.contrib.auth.models import User
193
+ from django.contrib import messages
194
+
195
+ if request.method == 'POST':
196
+ form = CreateUserForm(request.POST, request.FILES)
197
+ if form.is_valid():
198
+ try:
199
+ # Create the user
200
+ user = User.objects.create_user(
201
+ username=form.cleaned_data['username'],
202
+ email=form.cleaned_data['email'],
203
+ first_name=form.cleaned_data['first_name'],
204
+ last_name=form.cleaned_data['last_name'],
205
+ password='atlas'
206
+ )
207
+
208
+ user.save()
209
+
210
+ if form.cleaned_data.get('has_write_access'):
211
+ # Grant write access if the checkbox is checked
212
+ permission = Permission.objects.get(
213
+ codename='has_write_access'
214
+ )
215
+ user.user_permissions.add(
216
+ permission
217
+ )
218
+
219
+ # Add user to selected group
220
+ group = form.cleaned_data['group']
221
+ user.groups.add(group)
222
+
223
+ # Create or update user profile
224
+ profile, created = UserProfile.objects.get_or_create(user=user)
225
+ # Temp password must be changed by user
226
+ profile.password_unuseable_fl = True
227
+ profile.save()
228
+ image = form.cleaned_data.get('image')
229
+ if image:
230
+ profile.image = image
231
+ profile.save()
232
+
233
+ messages.success(
234
+ request,
235
+ f'User {user.username} created successfully!'
236
+ )
237
+
238
+ # Clear form for next user creation
239
+ form = CreateUserForm()
240
+
241
+ except Exception as e:
242
+ messages.error(request, f'Error creating user: {str(e)}')
243
+
244
+ else:
245
+ form = CreateUserForm()
246
+
247
+ # Get group information for display
248
+ groups_info = []
249
+ for group in Group.objects.all():
250
+ try:
251
+ group_profile = GroupProfile.objects.get(group=group)
252
+ groups_info.append({
253
+ 'group': group,
254
+ 'token_expiration': group_profile.token_expiration_time,
255
+ 'api_write_access': group_profile.api_write_access,
256
+ 'description': group_profile.description
257
+ })
258
+ except GroupProfile.DoesNotExist:
259
+ groups_info.append({
260
+ 'group': group,
261
+ 'token_expiration': 'Not set',
262
+ 'api_write_access': False,
263
+ 'description': 'No profile configured'
264
+ })
265
+
266
+ context = {
267
+ 'form': form,
268
+ 'groups_info': groups_info,
269
+ 'title': 'Create New User'
270
+ }
271
+
272
+ return render(request, 'create_user.html', context)
273
+
274
+
275
+ @user_passes_test(
276
+ lambda u: not needs_to_change_password(u),
277
+ login_url='change_password'
278
+ )
279
+ @login_required
280
+ def change_profile_image(request):
281
+ """Change the user's profile image.
282
+
283
+ Args:
284
+ request: The HTTP request object.
285
+ """
286
+ from accounts.forms import ChangeProfileImageForm
287
+
288
+ if request.method == 'POST':
289
+ form = ChangeProfileImageForm(request.POST, request.FILES)
290
+ if form.is_valid():
291
+ profile, created = UserProfile.objects.get_or_create(
292
+ user=request.user
293
+ )
294
+ image = form.cleaned_data.get('image')
295
+ if image:
296
+ profile.image = image
297
+ profile.save()
298
+ messages.success(request, 'Profile image updated successfully!')
299
+ return redirect('home')
300
+ else:
301
+ form = ChangeProfileImageForm()
302
+
303
+ return render(request, 'change_profile_image.html', {'form': form})