Commit 4b90401445f9dddaf044fba9f95dc89a1360bdcd
1 parent
c2589779
Exists in
dev
Add view to get sequences for a period and improving pyros_api.py
Showing
5 changed files
with
78 additions
and
29 deletions
Show diff stats
CHANGELOG
1 | +21-02-2022 (AKo): v0.3.8.0 | |
2 | + - Improve pyros_api with (click) commands | |
3 | + - Add view to get all sequences within a date period (start_date and end_date) | |
4 | + | |
1 | 5 | 18-02-2022 (AKo): v0.3.7.0 |
2 | 6 | - Add API url to get a full sequence (i.e. with albums and plans) |
3 | 7 | - Add API urls for querying Plan and Album models | ... | ... |
VERSION
1 | -import requests, sys, yaml | |
1 | +#!/usr/bin/env python3 | |
2 | +import requests, sys, yaml, click | |
2 | 3 | |
3 | 4 | class PyrosAPI: |
4 | 5 | """ |
5 | 6 | Request Pyros API with an PyrosUser account linked to the username and password |
6 | 7 | """ |
7 | 8 | BASE_PYROS_URL = "http://localhost:8000/api/" |
8 | - def __init__(self, username : str, password : str ) -> None: | |
9 | + | |
10 | + def __init__(self, username: str, password: str) -> None: | |
9 | 11 | """ |
10 | 12 | Initialize PyrosAPI class by getting the authentification token required to use the API |
11 | 13 | |
... | ... | @@ -15,8 +17,7 @@ class PyrosAPI: |
15 | 17 | """ |
16 | 18 | self.get_token(username, password) |
17 | 19 | |
18 | - | |
19 | - def get_token(self,username : str,password : str): | |
20 | + def get_token(self, username: str, password: str): | |
20 | 21 | """ |
21 | 22 | get the authentification token linked to the user account |
22 | 23 | |
... | ... | @@ -25,12 +26,12 @@ class PyrosAPI: |
25 | 26 | password : Password of the user |
26 | 27 | """ |
27 | 28 | url = f"{self.BASE_PYROS_URL}api-token-auth/" |
28 | - request = requests.post(url, data={"username":username,"password":password}) | |
29 | + request = requests.post(url, data={"username": username, "password": password}) | |
29 | 30 | json_response = request.json() |
30 | 31 | self.token = json_response["token"] |
31 | 32 | print(f"Token is {self.token}") |
32 | 33 | |
33 | - def get_url(self,url : str) -> dict: | |
34 | + def get_url(self, url: str) -> dict: | |
34 | 35 | """ |
35 | 36 | Query the url and return the response as json |
36 | 37 | |
... | ... | @@ -45,7 +46,7 @@ class PyrosAPI: |
45 | 46 | request = requests.get(self.BASE_PYROS_URL+url, headers=headers) |
46 | 47 | return request.json() |
47 | 48 | |
48 | - def submit_sequence_file(self,file : str) -> dict: | |
49 | + def submit_sequence_file(self, file: str) -> dict: | |
49 | 50 | """ |
50 | 51 | Submit sequence file by querying the API via PUT method |
51 | 52 | |
... | ... | @@ -60,27 +61,57 @@ class PyrosAPI: |
60 | 61 | 'Content-type': 'application/json', |
61 | 62 | } |
62 | 63 | url = f"{self.BASE_PYROS_URL}submit_sequence" |
63 | - yaml_file = open(file,"r") | |
64 | + yaml_file = open(file, "r") | |
64 | 65 | sequence_file_as_dict = yaml.safe_load(yaml_file) |
65 | 66 | print(f"File content : {sequence_file_as_dict}") |
66 | 67 | request = requests.put(url, headers=headers, json=sequence_file_as_dict) |
67 | 68 | print(f"Request status code {request.status_code}") |
68 | 69 | return request.json() |
69 | 70 | |
70 | - | |
71 | -def main(): | |
72 | - username = sys.argv[1] | |
73 | - password = sys.argv[2] | |
74 | - url = sys.argv[3] | |
75 | - yaml_file = None | |
76 | - api = PyrosAPI(username,password) | |
77 | - if len(sys.argv) > 4 and sys.argv[4]: | |
78 | - yaml_file = sys.argv[4] | |
79 | - print(api.submit_sequence_file(yaml_file)) | |
80 | - else: | |
81 | - print(username,password,url) | |
82 | - print(api.get_url(url)) | |
83 | - | |
84 | - | |
85 | -if __name__ == "__main__": | |
86 | - main() | |
71 | + def get_sequences_for_period(self, start_date:str, end_date:str) -> dict: | |
72 | + """ | |
73 | + Return all the sequence between two dates | |
74 | + Args: | |
75 | + start_date : start date of the period we want to retrieve (format : day/month/year, example : 13/02/2022) | |
76 | + end_date : end date of the period we want to retrieve (same format as start_date) | |
77 | + Returns: | |
78 | + dict : Json object that represents the response of the API | |
79 | + """ | |
80 | + url = f"{self.BASE_PYROS_URL}full_sequences/get_sequences_for_period/" | |
81 | + headers = {"Authorization": f"Token {self.token}"} | |
82 | + response = requests.get(url, params={"start_date": start_date, "end_date": end_date}, headers=headers) | |
83 | + return response.json() | |
84 | + | |
85 | +@click.group() | |
86 | +@click.argument("username") | |
87 | +@click.argument("password") | |
88 | +@click.pass_context | |
89 | +def cli(ctx, username, password): | |
90 | + ctx.obj = PyrosAPI(username, password) | |
91 | + | |
92 | + | |
93 | +@cli.command("get_sequences") | |
94 | +@click.argument("start_date") | |
95 | +@click.argument("end_date") | |
96 | +@click.pass_obj | |
97 | +def get_sequences_for_period(api, start_date: str, end_date: str): | |
98 | + response = api.get_sequences_for_period(start_date, end_date) | |
99 | + print(response) | |
100 | + | |
101 | + | |
102 | +@cli.command("submit_sequence") | |
103 | +@click.argument("file_path") | |
104 | +@click.pass_obj | |
105 | +def submit_sequence(api, file_path): | |
106 | + response = api.submit_sequence_file(file_path) | |
107 | + print(response) | |
108 | + | |
109 | +@cli.command("query_url") | |
110 | +@click.argument("url") | |
111 | +@click.pass_obj | |
112 | +def query_url(api, url): | |
113 | + response = api.get_url(url) | |
114 | + print(response) | |
115 | + | |
116 | +if __name__ == '__main__': | |
117 | + cli(obj={}) | ... | ... |
src/core/pyros_django/api/urls.py
1 | 1 | from django.urls import path, include |
2 | 2 | from . import views |
3 | 3 | from rest_framework.authtoken.views import obtain_auth_token |
4 | -from rest_framework import routers | |
4 | +from rest_framework import routers, renderers | |
5 | 5 | |
6 | 6 | router = routers.DefaultRouter() |
7 | 7 | router.register(r'users', views.UserViewSet) | ... | ... |
src/core/pyros_django/api/views.py
1 | 1 | from django.shortcuts import render |
2 | 2 | from rest_framework.views import APIView |
3 | 3 | from rest_framework.response import Response |
4 | -from rest_framework import viewsets | |
4 | +from rest_framework import viewsets, renderers | |
5 | 5 | from rest_framework.permissions import IsAuthenticated, AllowAny |
6 | -from rest_framework.decorators import api_view, permission_classes | |
6 | +from rest_framework.decorators import api_view, permission_classes, action | |
7 | 7 | from django.core.validators import ValidationError |
8 | 8 | from src.core.pyros_django.user_manager import views as user_views |
9 | 9 | from api.serializers import AlbumSerializer, FullSequenceSerializer, PlanSerializer, SequenceSerializer, UserSerializer |
10 | 10 | from common.models import PyrosUser, Sequence, Album, Plan, UserLevel, SP_Period_User |
11 | 11 | from routine_manager.functions import check_sequence_file_validity |
12 | 12 | from rest_framework.request import Request |
13 | +from django.db.models import Q | |
14 | +from datetime import datetime | |
13 | 15 | |
14 | 16 | # Create your views here. |
15 | 17 | |
... | ... | @@ -104,6 +106,18 @@ class FullSequenceViewSet(viewsets.ModelViewSet): |
104 | 106 | else: |
105 | 107 | return Sequence.objects.filter(pyros_user=user).order_by("-updated") |
106 | 108 | |
109 | + @action(detail=False, methods=["get"]) | |
110 | + def get_sequences_for_period(self, request): | |
111 | + """ | |
112 | + Return the list of sequences corresponding to the requested period | |
113 | + """ | |
114 | + params = request.query_params | |
115 | + start_date = datetime.strptime(params.get("start_date"),"%d/%m/%Y") | |
116 | + end_date = datetime.strptime(params.get("end_date"),"%d/%m/%Y") | |
117 | + queryset = Sequence.objects.filter(Q(start_date__gte=start_date) | Q(start_date__lte=end_date)) | |
118 | + serializer = self.get_serializer(queryset,many=True) | |
119 | + response = Response(serializer.data) | |
120 | + return response | |
107 | 121 | |
108 | 122 | class AlbumViewSet(viewsets.ModelViewSet): |
109 | 123 | """ | ... | ... |