From 0d319eb724ef25fa74ad8db6996a8038110b9a3e Mon Sep 17 00:00:00 2001 From: stepan323446 Date: Fri, 28 Nov 2025 11:43:30 +0100 Subject: [PATCH] Added requirements --- project/settings/base.py | 5 ++++- requirements.txt | 15 +++++++++++++++ weather/utils.py | 26 ++++++++++++++++++++++++-- weather/views.py | 13 ++++++++++--- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/project/settings/base.py b/project/settings/base.py index d337904..365591e 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -159,4 +159,7 @@ MEDIA_ROOT = os.path.join(BASE_DIR, 'media') DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' TELEGRAM_BOT_TOKEN = os.environ['TELEGRAM_BOT_TOKEN'] -TELEGRAM_CHAT_ID = os.environ['TELEGRAM_CHAT_ID'] \ No newline at end of file +TELEGRAM_CHAT_ID = os.environ['TELEGRAM_CHAT_ID'] + +WEATHER_LATITUDE = os.environ['WEATHER_LATITUDE'] +WEATHER_LONGITUDE = os.environ['WEATHER_LONGITUDE'] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 81fd029..3449829 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,16 +1,31 @@ asgiref==3.11.0 attrs==25.4.0 +certifi==2025.11.12 +charset-normalizer==3.4.4 Django==5.2.8 +django-cors-headers==4.9.0 django-filter==25.2 django-rest-framework==0.1.0 djangorestframework==3.16.1 drf-spectacular==0.29.0 +flatbuffers==25.9.23 +h11==0.16.0 +idna==3.11 inflection==0.5.1 +jh2==5.0.10 jsonschema==4.25.1 jsonschema-specifications==2025.9.1 +niquests==3.15.2 +openmeteo_requests==1.7.4 +openmeteo_sdk==1.23.0 python-dotenv==1.2.1 PyYAML==6.0.3 +qh3==1.5.6 referencing==0.37.0 +requests==2.32.5 rpds-py==0.29.0 sqlparse==0.5.3 uritemplate==4.2.0 +urllib3==2.5.0 +urllib3-future==2.14.908 +wassima==2.0.2 diff --git a/weather/utils.py b/weather/utils.py index 0e17ef6..35d5a67 100644 --- a/weather/utils.py +++ b/weather/utils.py @@ -1,5 +1,6 @@ import os import requests +import openmeteo_requests from django.db.models import Avg from django.utils import timezone from datetime import timedelta @@ -9,7 +10,7 @@ from rest_framework.request import Request from rest_framework import permissions from .models import WeatherStats -from project.settings_context import TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID +from project.settings_context import TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, WEATHER_LATITUDE, WEATHER_LONGITUDE class IsMikrokontroller(permissions.BasePermission): @@ -60,4 +61,25 @@ def send_telegram_stats(): requests.get(url, params) - \ No newline at end of file +def get_weather_api_data(): + now = timezone.now() + openmeteo = openmeteo_requests.Client() + start_date = now + timedelta(days=1) + end_date = start_date + timedelta(days=7) + + start_date_formatted = start_date.strftime("%Y-%m-%d") + end_date_formatted = end_date.strftime("%Y-%m-%d") + + url = "https://api.open-meteo.com/v1/forecast" + params = { + "latitude": WEATHER_LATITUDE, + "longitude": WEATHER_LONGITUDE, + "hourly": ["temperature_2m", "relative_humidity_2m", "precipitation_probability", "precipitation", "wind_speed_10m"], + "start_date": start_date_formatted, + "end_date": end_date_formatted, + } + + responses = openmeteo.weather_api(url, params=params) + response = responses[0] + + return response \ No newline at end of file diff --git a/weather/views.py b/weather/views.py index fd6dd63..6d1ccf3 100644 --- a/weather/views.py +++ b/weather/views.py @@ -10,6 +10,7 @@ from .models import WeatherStats from .serializers import WeatherStatSerializer from .utils import IsMikrokontroller, PageNumberPagination +CACHE_KEY_STATS = 'stats_latest_data' CACHE_KEY_WEATHER = 'weather_latest_data' CACHE_TIMEOUT = 30 # 30 seconds @@ -33,12 +34,12 @@ class CreateStatAPI(CreateAPIView): def perform_create(self, serializer: WeatherStatSerializer): new_data = serializer.validated_data - cached_data = cache.get(CACHE_KEY_WEATHER) + cached_data = cache.get(CACHE_KEY_STATS) if cached_data is None: serializer.save() - cache.set(CACHE_KEY_WEATHER, new_data, CACHE_TIMEOUT) + cache.set(CACHE_KEY_STATS, new_data, CACHE_TIMEOUT) @extend_schema(tags=['Weather'], @@ -55,7 +56,7 @@ class CreateStatAPI(CreateAPIView): ) class LastStatAPI(APIView): def get(self, request: Request, format=None): - cached_data = cache.get(CACHE_KEY_WEATHER) + cached_data = cache.get(CACHE_KEY_STATS) if cached_data is None: return Response( @@ -71,3 +72,9 @@ class StatsHistoryAPI(ListAPIView): queryset = WeatherStats.objects.order_by('-created_at') pagination_class = PageNumberPagination +class WeatherAPI(APIView): + def get(self, request: Request, format=None): + cached_data = cache.get(CACHE_KEY_WEATHER) + + if cached_data: + return Response(cached_data) \ No newline at end of file