Skip to content

Commit

Permalink
feat(admin): display allocations for a specific institution
Browse files Browse the repository at this point in the history
  • Loading branch information
Thomas committed Oct 8, 2024
1 parent a6214c6 commit a13aefb
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 3 deletions.
30 changes: 28 additions & 2 deletions django_gar/admin.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
import csv

from django.contrib import admin
from django.utils.safestring import mark_safe

from .gar import get_gar_subscription
from .gar import get_gar_subscription, get_allocations
from .forms import GARInstitutionForm
from .models import GARInstitution


@admin.register(GARInstitution)
class GARInstitutionAdmin(admin.ModelAdmin):
raw_id_fields = ("user",)
list_display = ("institution_name", "user", "uai", "ends_at")
list_select_related = ("user",)
readonly_fields = ("id_ent", "gar_subscription_response")
readonly_fields = ("id_ent", "gar_subscription_response", "get_allocations")
ordering = ("institution_name",)
search_fields = ("institution_name", "user__email", "uai", "project_code")
list_filter = ["project_code"]
Expand All @@ -34,3 +37,26 @@ def gar_subscription_response(self, obj):
response += f"{element.name} : {element.text}<br/>"

return mark_safe(f"<code>{response}</code>")

@admin.display(description="Etat des affectations")
def get_allocations(self, obj):
if not obj.uai:
return ""

response = get_allocations(subscription_id=obj.subscription_id)
decoded_response = response.content.decode("utf-8")

allocations = decoded_response
if response.status_code == 200:
lines = decoded_response.splitlines()
reader = csv.reader(lines, delimiter=";")
rows = list(reader)
headers = rows[0]
values = rows[1]
allocations = ""
for header, value in zip(headers, values):
allocations += f"{header} : {value}<br/>"
elif response.status_code == 404:
allocations = "L'établissement n'a pas encore affecté la ressource.<br/>Les informations fournies par le webservice font l’objet d’un traitement asynchrone et sont par conséquent actualisées quotidiennement. Il peut être constaté une latence dans la prise en compte de changements en cas d’affectations / récupérations de licences au sein d’une même journée."

return mark_safe(f"<code>{allocations}</code>")
5 changes: 5 additions & 0 deletions django_gar/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class DjangoGARException(Exception):
def __init__(self, status_code, message):
self.status_code = status_code
self.message = message
super().__init__(f"Error {status_code}: {message}")
30 changes: 29 additions & 1 deletion django_gar/gar.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import requests

from bs4 import BeautifulSoup
from urllib.parse import urlencode

from django.conf import settings

from .exceptions import DjangoGARException


GAR_SUBSCRIPTION_PREFIX = getattr(settings, "GAR_SUBSCRIPTION_PREFIX", "")
GAR_BASE_SUBSCRIPTION_URL = getattr(settings, "GAR_BASE_SUBSCRIPTION_URL", "")

GAR_ALLOCATIONS_URL = (
"https://decompte-affectations.gar.education.fr/decompteaffectations"
)
GAR_DISTRIBUTOR_ID = getattr(settings, "GAR_DISTRIBUTOR_ID", "")

GAR_CERTIFICATE_PATH = getattr(settings, "GAR_CERTIFICATE_PATH", "")
Expand Down Expand Up @@ -86,3 +91,26 @@ def get_gar_institution_list():
cert=get_gar_certificate(),
headers=get_gar_headers(),
)


def get_allocations(subscription_id=None, project_code=None):
if not subscription_id and not project_code:
raise DjangoGARException(
status_code=400,
message="At least one of subscription_id or project_code is mandatory",
)
elif subscription_id and project_code:
raise DjangoGARException(
status_code=400,
message="Cannot set subscription_id and project_code at the same time",
)

params = {"codeProjetRessource": project_code}
if subscription_id:
params = {"idAbonnement": subscription_id}

return requests.request(
"GET",
f"{GAR_ALLOCATIONS_URL}?{urlencode(params)}",
cert=get_gar_certificate(),
)

0 comments on commit a13aefb

Please sign in to comment.