Пример #1
0
    def patch(self):
        tenant = request.args.get("tenant")

        data = request.get_json()

        update_fields = {}

        valid_keys = ['userId', 'reportName', 'reportBody']

        for key, value in data.items():
            if key in valid_keys:
                update_fields[camel_to_snake(key)] = value

        if not update_fields:
            return {
                "message":
                f"the update fields is empty. valid keys are {valid_keys}"
            }, Status.HTTP_400_BAD_REQUEST

        report_model = ReportTemplateModel(tenant)

        update_result = report_model.update_one(
            filter_cond={'report_type': 'default'},
            update_fields=update_fields)

        if update_result.modified_count > 0 or update_result.matched_count > 0:
            return create_response(
                "default reporting template updated successfully"
            ), Status.HTTP_202_ACCEPTED

        return create_response("could not update default template",
                               success=False), Status.HTTP_404_NOT_FOUND
Пример #2
0
    def post(self):
        tenant = request.args.get("tenant")

        data = request.get_json()
        user_id = data['userId']
        report_name = data['reportName']
        report_body = data['reportBody']

        report_model = ReportTemplateModel(tenant)

        count = report_model.find({"report_type": "default"}).count()

        if count > 0:
            return create_response("A default template already exist",
                                   success=False), Status.HTTP_400_BAD_REQUEST

        report_model.insert({
            "user_id": user_id,
            "report_date": datetime.now(),
            "report_type": "default",
            "report_name": report_name,
            "report_body": report_body
        })

        return create_response("Default Report Template Saved Successfully"
                               ), Status.HTTP_201_CREATED
Пример #3
0
    def get(self):
        tenant = request.args.get("tenant")
        user_id = request.args.get("userId")

        report_model = ReportTemplateModel(tenant)

        report = list(
            report_model.filter_by(user_id=user_id).exec({
                "_id": 1,
                "user_id": 1,
                "report_date": {
                    '$dateToString': {
                        'format': '%Y-%m-%dT%H:%M:%S%z',
                        'date': '$time',
                        'timezone': 'Africa/Kampala'
                    },
                },
                "report_type": 1,
                "report_name": 1,
                "report_body": 1
            }))

        if report:
            return create_response("reports successfully fetched",
                                   data={"reports":
                                         report}), Status.HTTP_200_OK

        return create_response("report(s) not found",
                               success=False), Status.HTTP_404_NOT_FOUND
Пример #4
0
    def delete(self, report_name):
        tenant = request.args.get("tenant")

        report_model = ReportTemplateModel(tenant)

        delete_result = report_model.delete_one({"report_name": report_name})

        if delete_result.deleted_count > 0:
            return create_response(
                f"monthly report {report_name} deleted successfully"
            ), Status.HTTP_200_OK

        return create_response("report not found",
                               success=False), Status.HTTP_404_NOT_FOUND
Пример #5
0
    def get(self):
        tenant = request.args.get('tenant')

        ms_model = SiteModel(tenant)

        sites = ms_model.get_all_sites()

        return create_response("monitoring site data successfully fetched",
                               data=sites), Status.HTTP_200_OK
Пример #6
0
    def post(self):
        tenant = request.args.get("tenant", "").lower()
        download_type = request.args.get('downloadType')
        json_data = request.get_json()
        sites = json_data["sites"]
        start_date = json_data["startDate"]
        end_date = json_data["endDate"]
        frequency = json_data["frequency"]
        pollutants = json_data["pollutants"]
        from_bigquery = json_data.get("fromBigQuery")

        if from_bigquery:
            data = EventsModel.from_bigquery(tenant, sites, start_date,
                                             end_date, frequency, pollutants)

            if download_type == 'csv':
                return excel.make_response_from_records(
                    data, 'csv', file_name=f'airquality-{frequency}-data')

            return create_response("air-quality data download successful",
                                   data=data), Status.HTTP_200_OK

        events_model = EventsModel(tenant)
        data = approximate_coordinates(
            events_model.get_downloadable_events(sites, start_date, end_date,
                                                 frequency, pollutants))

        if download_type == 'json':
            return create_response("air-quality data download successful",
                                   data=data), Status.HTTP_200_OK

        if download_type == 'csv':
            return excel.make_response_from_records(
                data, 'csv', file_name=f'airquality-{frequency}-data')

        return create_response(f'unknown data format {download_type}',
                               success=False), Status.HTTP_400_BAD_REQUEST
Пример #7
0
    def post(self):
        tenant = request.args.get('tenant')
        json_data = request.get_json()
        pollutant = json_data["pollutant"]
        start_date = json_data["startDate"]
        end_date = json_data["endDate"]
        sites = json_data.get("sites", None)

        events_model = EventsModel(tenant)
        site_model = SiteModel(tenant)
        sites = site_model.get_sites(sites)
        data = events_model.get_averages_by_pollutant(start_date, end_date,
                                                      pollutant)

        values = []
        labels = []
        background_colors = []

        for v in data:

            if not v.get("site_id"):
                continue

            site = list(
                filter(lambda s: s.get("site_id") == v.get("site_id"), sites))

            if not site:
                continue

            site = site[0]
            values.append(v.get('value'))
            labels.append(
                site.get('name') or site.get('description')
                or site.get('generated_name'))
            background_colors.append(
                set_pm25_category_background(v.get('value')))

        return create_response("daily averages successfully fetched",
                               data={
                                   "average_values": values,
                                   "labels": labels,
                                   "background_colors": background_colors
                               }), Status.HTTP_200_OK
Пример #8
0
    def post(self):
        tenant = request.args.get("tenant")

        data = request.get_json()
        user_id = data['userId']
        report_name = data['reportName']
        report_body = data['reportBody']

        report_model = ReportTemplateModel(tenant)

        report_model.insert({
            "user_id": user_id,
            "report_date": datetime.now(),
            "report_name": report_name,
            "report_body": report_body
        })

        return create_response(
            "Monthly Report Saved Successfully"), Status.HTTP_201_CREATED
Пример #9
0
    def post(self):
        tenant = request.args.get('tenant')

        json_data = request.get_json()
        sites = json_data["sites"]
        start_date = json_data["startDate"]
        end_date = json_data["endDate"]
        frequency = json_data["frequency"]
        pollutant = json_data["pollutant"]
        chart_type = json_data["chartType"]

        events_model = EventsModel(tenant)
        data = events_model.get_d3_chart_events(sites, start_date, end_date,
                                                pollutant, frequency)

        if chart_type.lower() == 'pie':
            data = d3_generate_pie_chart_data(data, pollutant)

        return create_response("successfully retrieved d3 chart data",
                               data=data), Status.HTTP_200_OK
Пример #10
0
    def post(self):
        tenant = request.args.get('tenant')

        json_data = request.get_json()
        pollutant = json_data["pollutant"]
        standard = json_data["standard"]
        start_date = json_data["startDate"]
        end_date = json_data["endDate"]
        sites = json_data.get("sites", None)

        exc_model = ExceedanceModel(tenant)
        data = exc_model.get_exceedances(start_date,
                                         end_date,
                                         pollutant,
                                         standard,
                                         sites=sites)

        return create_response(
            "exceedance data successfully fetched",
            data=data,
        ), Status.HTTP_200_OK
Пример #11
0
    def get(self):
        tenant = request.args.get("tenant")
        report_model = ReportTemplateModel(tenant)

        default_template = list(
            report_model.filter_by(report_type="default").exec({
                "_id": 1,
                "user_id": 1,
                "report_date": {
                    '$dateToString': {
                        'format': '%Y-%m-%dT%H:%M:%S%z',
                        'date': '$time',
                        'timezone': 'Africa/Kampala'
                    },
                },
                "report_type": 1,
                "report_name": 1,
                "report_body": 1
            }))

        report = default_template[0] if default_template else {}

        return create_response("default report successfully fetched",
                               data={'report': report}), Status.HTTP_200_OK
Пример #12
0
    def post(self):
        tenant = request.args.get('tenant')

        json_data = request.get_json()
        sites = json_data["sites"]
        start_date = json_data["startDate"]
        end_date = json_data["endDate"]
        frequency = json_data["frequency"]
        pollutant = json_data["pollutant"]
        chart_type = json_data["chartType"]

        colors = ['#7F7F7F', '#E377C2', '#17BECF', '#BCBD22', '#3f51b5']

        events_model = EventsModel(tenant)
        data = events_model.get_chart_events(sites, start_date, end_date,
                                             pollutant, frequency)

        chart_datasets = []
        chart_labels = []

        for record in data:

            site = record.get("site", {})

            site_name = f"{site.get('name') or site.get('description') or site.get('generated_name')}"

            dataset = {}

            sorted_values = sorted(record.get('values', []),
                                   key=lambda item: item.get('time'))
            if chart_type.lower() == 'pie':
                category_count = generate_pie_chart_data(records=sorted_values,
                                                         key='value',
                                                         pollutant=pollutant)

                try:
                    labels, values = zip(*category_count.items())
                except ValueError:
                    values = []
                    labels = []
                background_colors = [
                    PM_COLOR_CATEGORY.get(label, '#808080') for label in labels
                ]
                color = background_colors

                dataset.update({
                    'data': values,
                    'label': f'{site_name} {pollutant}',
                    'backgroundColor': color,
                    'fill': False
                })

            else:
                try:
                    values, labels = zip(*[(data.get('value'),
                                            data.get('time'))
                                           for data in sorted_values])
                except ValueError:
                    values = []
                    labels = []

                color = colors.pop()

                dataset.update({
                    'data': values,
                    'label': f'{site_name} {pollutant}',
                    'borderColor': color,
                    'backgroundColor': color,
                    'fill': False
                })

            if not chart_labels:
                chart_labels = labels

            chart_datasets.append(dataset)

        return create_response("successfully retrieved chart data",
                               data={
                                   "labels": chart_labels,
                                   "datasets": chart_datasets
                               }), Status.HTTP_200_OK