Add API for downloading Usage CSV report
This commit is contained in:
parent
b4a98859e0
commit
ca064a7617
|
@ -18,8 +18,11 @@ from rest_auth.views import PasswordChangeView, PasswordResetView, PasswordReset
|
||||||
from rest_auth.registration.views import RegisterView
|
from rest_auth.registration.views import RegisterView
|
||||||
from fuzzywuzzy import fuzz, process
|
from fuzzywuzzy import fuzz, process
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
from dateutil import relativedelta
|
||||||
import icalendar
|
import icalendar
|
||||||
import datetime, time
|
import datetime, time
|
||||||
|
import io
|
||||||
|
import csv
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
|
@ -937,6 +940,44 @@ class VettingViewSet(Base, List):
|
||||||
return queryset.order_by('-current_start_date')
|
return queryset.order_by('-current_start_date')
|
||||||
|
|
||||||
|
|
||||||
|
class UsageViewSet(Base):
|
||||||
|
permission_classes = [AllowMetadata | IsAdmin]
|
||||||
|
|
||||||
|
# TODO: add filtering by device
|
||||||
|
@action(detail=False, methods=['get'])
|
||||||
|
def csv(self, request):
|
||||||
|
usages = models.Usage.objects.order_by('id')
|
||||||
|
month = self.request.query_params.get('month', None)
|
||||||
|
|
||||||
|
if month:
|
||||||
|
try:
|
||||||
|
dt = datetime.datetime.strptime(month, '%Y-%m')
|
||||||
|
dt = utils.TIMEZONE_CALGARY.localize(dt)
|
||||||
|
except ValueError:
|
||||||
|
raise exceptions.ValidationError(dict(month='Should be YYYY-MM.'))
|
||||||
|
|
||||||
|
usages = usages.filter(
|
||||||
|
started_at__gte=dt,
|
||||||
|
started_at__lt=dt + relativedelta.relativedelta(months=1),
|
||||||
|
)
|
||||||
|
|
||||||
|
response = HttpResponse(
|
||||||
|
content_type='text/csv',
|
||||||
|
)
|
||||||
|
response['Content-Disposition'] = 'attachment; filename="usage-{}.csv"'.format(month or 'all')
|
||||||
|
|
||||||
|
fieldnames = ['id', 'user__username', 'device', 'started_at', 'finished_at', 'num_seconds']
|
||||||
|
writer = csv.DictWriter(response, fieldnames=fieldnames)
|
||||||
|
|
||||||
|
writer.writeheader()
|
||||||
|
for u in usages.values(*fieldnames):
|
||||||
|
u['started_at'] = u['started_at'].astimezone(utils.TIMEZONE_CALGARY)
|
||||||
|
u['finished_at'] = u['finished_at'].astimezone(utils.TIMEZONE_CALGARY)
|
||||||
|
writer.writerow(u)
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
class RegistrationView(RegisterView):
|
class RegistrationView(RegisterView):
|
||||||
serializer_class = serializers.MyRegisterSerializer
|
serializer_class = serializers.MyRegisterSerializer
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ router.register(r'door', views.DoorViewSet, basename='door')
|
||||||
router.register(r'lockout', views.LockoutViewSet, basename='lockout')
|
router.register(r'lockout', views.LockoutViewSet, basename='lockout')
|
||||||
router.register(r'cards', views.CardViewSet, basename='card')
|
router.register(r'cards', views.CardViewSet, basename='card')
|
||||||
router.register(r'stats', views.StatsViewSet, basename='stats')
|
router.register(r'stats', views.StatsViewSet, basename='stats')
|
||||||
|
router.register(r'usage', views.UsageViewSet, basename='usage')
|
||||||
router.register(r'search', views.SearchViewSet, basename='search')
|
router.register(r'search', views.SearchViewSet, basename='search')
|
||||||
router.register(r'members', views.MemberViewSet, basename='members')
|
router.register(r'members', views.MemberViewSet, basename='members')
|
||||||
router.register(r'courses', views.CourseViewSet, basename='course')
|
router.register(r'courses', views.CourseViewSet, basename='course')
|
||||||
|
|
Loading…
Reference in New Issue
Block a user