Added requirements

This commit is contained in:
stepan323446 2025-11-28 11:43:30 +01:00
parent f563489328
commit 0d319eb724
4 changed files with 53 additions and 6 deletions

View File

@ -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']
TELEGRAM_CHAT_ID = os.environ['TELEGRAM_CHAT_ID']
WEATHER_LATITUDE = os.environ['WEATHER_LATITUDE']
WEATHER_LONGITUDE = os.environ['WEATHER_LONGITUDE']

View File

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

View File

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

View File

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