psat-server-web 0.5.0__tar.gz → 0.5.1__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.
- {psat_server_web-0.5.0/psat_server_web.egg-info → psat_server_web-0.5.1}/PKG-INFO +1 -1
- psat_server_web-0.5.1/psat_server_web/__version__.py +1 -0
- psat_server_web-0.5.1/psat_server_web/atlas/accounts/migrations/0002_groupprofile_api_write_access.py +18 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/accounts/models.py +5 -1
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlasapi/authentication.py +7 -2
- psat_server_web-0.5.1/psat_server_web/atlas/atlasapi/permissions.py +45 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlasapi/views.py +16 -15
- psat_server_web-0.5.1/psat_server_web/atlas/tests/atlasapi/test_permissions.py +343 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1/psat_server_web.egg-info}/PKG-INFO +1 -1
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web.egg-info/SOURCES.txt +1 -0
- psat_server_web-0.5.0/psat_server_web/__version__.py +0 -1
- psat_server_web-0.5.0/psat_server_web/atlas/atlasapi/permissions.py +0 -12
- psat_server_web-0.5.0/psat_server_web/atlas/tests/atlasapi/test_permissions.py +0 -30
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/LICENSE +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/MANIFEST.in +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/README.md +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/.DS_Store +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/.DS_Store +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/accounts/admin.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/accounts/apps.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/accounts/migrations/0001_initial.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/accounts/migrations/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/accounts/signals.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/apiutils.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/commonqueries.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/dbviews.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/django-default.log +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/document.sh +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/formchoices.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/helpers.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/insert_gravity_event.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/lightcurvequeries.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/models.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/settings.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/sqlpaginator.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/urls.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/view_celestial.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/views.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/wsgi.atlas.conf +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/wsgi.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlas/wsgi_apache_example.conf +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlasapi/apps.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlasapi/serializers.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlasapi/urls.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/cow_backup.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/django-default.log +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/generate_mod_wsgi_apachectl.sh +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/generate_mod_wsgi_apachectl_test.sh +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/manage.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/media/images/README.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/css/aladin.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/css/celestial.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/css/fontawesome.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/css/main.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/css/main_bootstrap.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/images/atlas_logo.png +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/images/image_not_available.jpeg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/aladin.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/bootstrap_utils.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/celestial.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/d3.geo.projection.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/d3.geo.projection.min.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/d3.geo.zoom.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/d3.min.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/data/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/data/constellations.bounds.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/data/constellations.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/data/constellations.lines.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/data/dsos.bright.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/data/lg.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/data/mw.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/data/planets.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/celestial/data/stars.6.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/colourplot.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/excanvas.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery-1.7.2.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.axislabels.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.crosshair.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.errorbars.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.fillbetween.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.image.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.navigate.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.pie.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.resize.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.selection.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.stack.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.symbol.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/flot/jquery.flot.threshold.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/followup_selectall.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/heatmap.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/lightcurve.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/lightcurveplotly.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/mjdcalc.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/plotly/plotly-latest.kws.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/recurrenceplot.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/js/recurrenceplotplotly.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.eot +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.svg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.ttf +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.woff +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-brands-400.woff2 +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.eot +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.svg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.ttf +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.woff +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-regular-400.woff2 +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.eot +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.svg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.ttf +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.woff +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/site_media/webfonts/fa-solid-900.woff2 +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/sql/create_web_views.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/.DS_Store +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/400.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/403.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/404.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/500.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/atelfasttrackobject.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/atelsdiscovery.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/atelsfast.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/candidate.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/candidate_plotly.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/candidate_plotly_test.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/crossmatch_external.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/error.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/followup.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/followup.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/followup2.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/followup_bs.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/followup_bypass_django_tables.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/followup_quickview.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/followup_quickview_bs.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/followup_subset.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/gcn.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/gcn_latex.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/heatmap.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/heatmap_test.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/index.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/index_bs.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/index_bs_celestial.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/index_bs_celestial_experiment.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/iobserve.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/lightcurve.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/lightcurveddc.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/lightcurveforced.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/lightcurvestackedforced.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/pesstorecurrences.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/pesstorecurrencesddc.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/pesstosummary.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/search_results.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/search_results_plotly.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/sne.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/summary.csv +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/userdefinedlists.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/userdefinedlists_bs.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/atlas/visibility.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/base.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/base_bootstrap.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/base_bootstrap_login.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/bootstrap4_django_tables2_atlas.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/invalid_login.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/loggedin.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/login.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/templates/logout.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/test.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/tests/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/tests/atlasapi/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/tests/atlasapi/test_authentication.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/tests/atlasapi/test_failure.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/common/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/common/psat_api_client.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/config/wsgi.conf.template +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/createUsers.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/generate_mod_wsgi_apachectl.sh +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/manage.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/media/images/README.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/admin.py.old +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/catalogueviews.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/commonqueries.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/dbviews.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/formchoices.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/helpers.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/img_scale.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/lightcurvequeries.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/models.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/settings.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/urls.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/views.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/wsgi.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdb/wsgi_apache_example.conf +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdbapi/apps.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdbapi/permissions.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdbapi/query_auth.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdbapi/serializers.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdbapi/urls.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/psdbapi/views.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/css/aladin.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/css/celestial.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/css/fontawesome.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/css/main.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/css/main_bootstrap.css +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/1-star-hover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/1-star.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/2-star-hover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/2-star.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/3-star-hover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/3-star.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/aladin.gif +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/cfaIcon.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/cfaIconHover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/confirmed-sne-hover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/confirmed-sne.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/detection_example.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/down.jpeg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/down.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/image_not_available.jpeg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/jhuIcon.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/jhuIconHover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/minus.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/ncuIcon.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/ncuIconHover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/non_detection_example.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/others-hover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/others.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs-logo-hover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs-logo.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs1_logo.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs1_o3_logo.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs2_logo.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs2_o3_logo.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs_logo.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs_logo_o4.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs_logo_original.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs_logo_yse.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/panstarrs_logo_yse_stack.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/pittsIcon.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/pittsIconHover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/plus.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/ps1Icon.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/ps1IconHover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/ps1sc.gif +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/qub-logo-hover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/qub-logo.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/qubIcon.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/qubIconHover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/sdss.gif +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/table-background.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/table-bottom-left.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/table-bottom-right.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/table-row.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/table-top-left.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/table-top-right.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/uhifaIcon.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/uhifaIconHover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/up.jpeg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/up.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/variable-stars-hover.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/images/variable-stars.jpg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/aladin.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/celestial.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/d3.geo.projection.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/d3.geo.projection.min.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/d3.geo.zoom.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/d3.min.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/data/__init__.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/data/constellations.bounds.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/data/constellations.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/data/constellations.lines.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/data/dsos.bright.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/data/lg.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/data/mw.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/data/planets.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/celestial/data/stars.6.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/colourplot.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/excanvas.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery-1.7.2.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.axislabels.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.crosshair.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.errorbars.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.fillbetween.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.image.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.navigate.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.pie.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.resize.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.selection.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.stack.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.symbol.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/flot/jquery.flot.threshold.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/followup_selectall.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/lightcurve.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/lightcurveplotly.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/mjdcalc.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/plotly/plotly-latest.kws.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/recurrenceplot.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/js/recurrenceplotplotly.js +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.eot +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.svg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.ttf +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.woff +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-brands-400.woff2 +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.eot +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.svg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.ttf +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.woff +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-regular-400.woff2 +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.eot +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.svg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.ttf +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.woff +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/site_media/webfonts/fa-solid-900.woff2 +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/sql/create_web_cat_views.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/sql/create_web_user_grants.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/sql/create_web_views.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/sql/create_web_views_fgss.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/400.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/403.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/404.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/500.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/admin/base_site.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/base.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/base_bootstrap.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/base_bootstrap_login.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/base_new.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/bootstrap4_django_tables2_atlas.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/invalid_login.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/loggedin.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/login.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/logout.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/atelsdiscovery.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/candidate.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/candidate_plotly.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/candidate_quickview.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/candidateflot.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/candidates.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/colourdata.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/crossmatch_cfa_with_ipp.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/crossmatch_external.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/dss2.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/error.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/fasttrackastronote.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/filter.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/followup.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/followup.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/followup_bs.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/followup_bs_old.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/followup_quickview.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/followup_quickview_bs.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/followup_quickview_bs_old.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/gcn.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/gcn_latex.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/index.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/index_bs_celestial.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/index_public.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/lightcurve.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/lightcurveforced.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/lightcurves.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/obscat.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/obsmediawiki.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/public.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/public_textonly.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/reports.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/search_results.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/search_results_plotly.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/sne.json +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/userdefinedlists.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/ps1/templates/psdb/userdefinedlists_bs.html +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_detections.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_detectionsddc.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_detectionsnnc.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_diff_detections.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_diff_logs.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_diff_moments.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_diff_objects.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_diff_subcell_logs.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_diff_subcells.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_forced_photometry.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_heatmaps.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_metadata.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_metadataddc.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_objects.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/atlas_stacked_forced_photometry.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/convert_backend_storage_to_innodb.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/create_atlas_flattened_view.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/create_photpipe_views.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/create_schema.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/create_user_grants.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/create_user_grants_generic.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/create_user_grants_root.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/delete_transients.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/generateATLASSchemaAndCPPClasses.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/get_table_columns_for_avro.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/get_table_columns_for_avro.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/mjdnow.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/refresh_django_views.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/setup_database.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/setup_database_utils.py +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/sherlock_classifications.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/sherlock_crossmatches.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/sherlock_triggers_atlas.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/sherlock_triggers_ps1.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cat_gaia_dr1.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cat_gaia_dr2.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cat_gaia_dr2_cassandra.cql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cat_kepler_k2.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cat_kepler_k2_pixels.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cat_ps1_medium_deep_ref.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cat_ps1_ubercal_stars.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cat_satellites.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_catalogue_tables.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cfa_detections.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cfa_to_ipp_lookup.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_classification_flags.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_classification_history.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cmf_metadata.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cross_matches.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_cross_matches_external.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_detection_lists.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_detection_lists_atlas.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_followup_photometry.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_followup_telescope_instruments.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_followup_telescopes.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_forced_photometry.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_function_lunation.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_function_mjdlunation.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_gravity_alerts.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_gravity_event_annotations.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_gravity_events.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_guide_star_cat.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_image_groups.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_images.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_ipp_to_cfa_lookup.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_latest_object_stats.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_object_comments.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_object_group_definitions.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_object_group_definitions_atlas.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_object_groups.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_parameter_definitions.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_photpipe_detections.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_postage_stamp_images.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_postage_stamp_requests.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_postage_stamp_status_codes.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_processing_status.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_search_parameters.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_tns_requests.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_tphot_detections.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_transient_objects.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_transient_reobservations.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_vra_rank.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_vra_scores.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_vra_todo.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_zoo_requests.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/tcs_zooniverse_scores.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/types_gaia_dr2_cassandra.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/update_database_types_to_tns_types_atlas.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/update_database_types_to_tns_types_panstarrs.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/update_tcs_gravity_alerts_001.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/update_tcs_gravity_event_annotations_001.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/update_tcs_latest_object_stats_001.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/update_tcs_vra_rank_20240814.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/update_tcs_vra_scores_20240814.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/schema/vra_triggers_atlas.sql +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web.egg-info/dependency_links.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web.egg-info/not-zip-safe +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web.egg-info/requires.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web.egg-info/top_level.txt +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/setup.cfg +0 -0
- {psat_server_web-0.5.0 → psat_server_web-0.5.1}/setup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '0.5.1'
|
|
@@ -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?'
|
{psat_server_web-0.5.0 → psat_server_web-0.5.1}/psat_server_web/atlas/atlasapi/authentication.py
RENAMED
|
@@ -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
|
-
|
|
27
|
-
|
|
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))
|
|
@@ -28,7 +28,7 @@ from .serializers import (
|
|
|
28
28
|
ObjectDetectionListSerializer,
|
|
29
29
|
)
|
|
30
30
|
from .authentication import QueryAuthentication, ExpiringTokenAuthentication
|
|
31
|
-
from .permissions import
|
|
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&
|
|
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&
|
|
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&
|
|
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&
|
|
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&
|
|
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&
|
|
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&
|
|
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&
|
|
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&
|
|
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
|
-
|
|
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&
|
|
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&
|
|
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&
|
|
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&
|
|
316
|
+
permission_classes = [IsAuthenticated&HasWriteAccess]
|
|
316
317
|
|
|
317
318
|
def get(self, request):
|
|
318
319
|
serializer = ObjectDetectionListSerializer(data=request.GET, context={'request': request})
|
|
@@ -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
|
+
|
|
@@ -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)
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# Write test to check if user has permission to view the page
|
|
2
|
-
|
|
3
|
-
from django.test import TestCase
|
|
4
|
-
from django.urls import reverse
|
|
5
|
-
from rest_framework import status
|
|
6
|
-
from rest_framework.test import APIClient
|
|
7
|
-
from rest_framework.authtoken.models import Token
|
|
8
|
-
from django.contrib.auth.models import User
|
|
9
|
-
|
|
10
|
-
class TestPermissionsAuthenticated(TestCase):
|
|
11
|
-
def setUp(self):
|
|
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
|
-
def test_permissions(self):
|
|
18
|
-
endpoint = "/api/vrascores/"
|
|
19
|
-
response = self.client.get(endpoint)
|
|
20
|
-
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
21
|
-
|
|
22
|
-
response = self.client.post(endpoint)
|
|
23
|
-
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
|
24
|
-
|
|
25
|
-
self.user.is_staff = True
|
|
26
|
-
self.user.save()
|
|
27
|
-
|
|
28
|
-
response = self.client.post(endpoint)
|
|
29
|
-
# This will now fail with a 400 because we've not provided the payload
|
|
30
|
-
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|