diff --git a/db/api/views.py b/db/api/views.py index 4d7ac20..b9cb7b8 100644 --- a/db/api/views.py +++ b/db/api/views.py @@ -49,11 +49,20 @@ class TransmitterView(viewsets.ReadOnlyModelViewSet): # pylint: disable=R0901 class TleView(viewsets.ReadOnlyModelViewSet): # pylint: disable=R0901 """SatNOGS DB Tle API view class""" - renderer_classes = [JSONRenderer] + renderer_classes = [JSONRenderer, BrowsableAPIRenderer] queryset = LatestTle.objects.all() serializer_class = serializers.TleSerializer filterset_class = filters.TleViewFilter + def get_queryset(self): + """ + This view should return a list of all the purchases + for the currently authenticated user. + """ + if self.request.user.has_perm('base.access_all_tles'): + return LatestTle.all_latest_tles.all() + return self.queryset + class TelemetryView( # pylint: disable=R0901 mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, diff --git a/db/base/migrations/0023_add_tle_model_permission.py b/db/base/migrations/0023_add_tle_model_permission.py new file mode 100644 index 0000000..69d47e0 --- /dev/null +++ b/db/base/migrations/0023_add_tle_model_permission.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.14 on 2020-08-05 04:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0022_add_tle_model'), + ] + + operations = [ + migrations.AlterModelOptions( + name='tle', + options={'ordering': ['-updated'], 'permissions': [('access_all_tles', 'Access all TLEs')]}, + ), + ] diff --git a/db/base/models.py b/db/base/models.py index 2ab7460..867d421 100644 --- a/db/base/models.py +++ b/db/base/models.py @@ -528,6 +528,7 @@ class Tle(models.Model): models.Index(fields=['-updated']), models.Index(fields=['tle1', 'tle2', 'tle_source', 'satellite']) ] + permissions = [('access_all_tles', 'Access all TLEs')] def __str__(self): return '{:d} - {:s}'.format(self.id, self.tle0) @@ -548,13 +549,28 @@ class LatestTleManager(models.Manager): # pylint: disable=R0903 """ subquery = Tle.objects.filter(satellite=OuterRef('satellite')).order_by('-updated') return super(LatestTleManager, - self).get_queryset().filter(updated=Subquery(subquery.values('updated')[:1])) + self).get_queryset().filter(pk=Subquery(subquery.values('pk')[:1])) + + +class LatestDistributableTleManager(models.Manager): # pylint: disable=R0903 + """Django Manager for latest Tle objects""" + def get_queryset(self): + """Returns query of latest Tle + + :returns: the latest Tle for each Satellite + """ + subquery = Tle.objects.filter(tle_source__in=settings.TLE_SOURCES_REDISTRIBUTABLE + ).filter(satellite=OuterRef('satellite') + ).order_by('-updated') + return super(LatestDistributableTleManager, + self).get_queryset().filter(pk=Subquery(subquery.values('pk')[:1])) class LatestTle(Tle): """LatestTle is the latest entry of a Satellite Tle objects """ - objects = LatestTleManager() + objects = LatestDistributableTleManager() + all_latest_tles = LatestTleManager() class Meta: proxy = True