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
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
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
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
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
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
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
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
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
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
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
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