erikvw/django-collect-offline

View on GitHub
django_collect_offline/views/sync_report_client_view.py

Summary

Maintainability
A
45 mins
Test Coverage
import requests

from datetime import datetime
from django.apps import apps as django_apps
from django.urls import reverse
from django.views.generic.base import TemplateView
from edc_dashboard.view_mixins import EdcViewMixin
from django_collect_offline_files.models import ImportedTransactionFileHistory
from requests.exceptions import ConnectionError, HTTPError

from ..admin import django_collect_offline_admin
from ..offline_view_mixin import OfflineViewMixin
from ..models import Client


class SyncReportClientView(EdcViewMixin, OfflineViewMixin, TemplateView):

    template_name = "django_collect_offline/sync_report_client.html"

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        app_config = django_apps.get_app_config("edc_map")  # FIXME: ?
        context.update(
            django_collect_offline_admin=django_collect_offline_admin,
            project_name=context.get("project_name") + ": " + self.role.title(),
            base_template_name=app_config.base_template_name,
        )
        return context

    def get(self, request, *args, **kwargs):
        report = Report()
        context = self.get_context_data(**kwargs)
        context.update({"report_data": report.report_data})
        if request.is_ajax():
            action = request.GET.get("action")
            # response_data = {}
            if action == "receive":
                # TODO: see TransactionExporterViewMixin
                raise TypeError()
        #                 response_data = dict(
        #                     confirm=True, hostname=sync_confirm.confirm_code)
        #                 return HttpResponse(
        # json.dumps(response_data), content_type='application/')
        return self.render_to_response(context)


class Report:
    """ Displays number of pending transactions in the client and number of
    times the machine have synced.
    """

    imported_history_model = ImportedTransactionFileHistory

    def __init__(self):
        self.report_data = []
        for client in Client.objects.all():
            try:
                self.history_model.objects.get(
                    hostname=client.hostname, confirmed_date=datetime.today().date()
                )  # ????
                received = True
            except self.history_model.DoesNotExist:
                received = False
            try:
                url = (
                    "http://"
                    + client.hostname
                    + reverse("django_collect_offline:transaction-count")
                )
                r = requests.get(url, timeout=3)
                data = r.json()
                connected = True
            except (ConnectionError, Exception):
                pending = -1
                connected = False
            except HTTPError:
                pending = -1
                connected = True
            else:
                pending = data.get("outgoingtransaction_count")
                pending_files_no = data.get("pending_files_no")
            data = {
                "device": client.hostname,
                "sync_times": self.synced_files(client.hostname),
                "pending": pending,
                "connected": connected,
                "received": received,
                "pending_files_no": pending_files_no,
                "comment": client.comment,
            }
            self.report_data.append(data)

    def synced_files(self, hostname):
        producer = f"{hostname}-default"
        return [
            p
            for p in self.imported_history_model.objects.filter(
                producer=producer, created__date=datetime.today().date()
            ).order_by("-created")
        ]