mirror of
https://github.com/ae-utbm/sith.git
synced 2024-11-22 14:13:21 +00:00
Initial autofill on UV
This commit is contained in:
parent
6d0eba6bcf
commit
eeb791c460
@ -53,4 +53,5 @@ urlpatterns = [
|
|||||||
re_path(r"^login/", include("rest_framework.urls", namespace="rest_framework")),
|
re_path(r"^login/", include("rest_framework.urls", namespace="rest_framework")),
|
||||||
re_path(r"^markdown$", RenderMarkdown, name="api_markdown"),
|
re_path(r"^markdown$", RenderMarkdown, name="api_markdown"),
|
||||||
re_path(r"^mailings$", FetchMailingLists, name="mailings_fetch"),
|
re_path(r"^mailings$", FetchMailingLists, name="mailings_fetch"),
|
||||||
|
re_path(r"^uv$", uv_endpoint, name="uv_endpoint"),
|
||||||
]
|
]
|
||||||
|
@ -24,10 +24,15 @@
|
|||||||
|
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.decorators import api_view, renderer_classes
|
from rest_framework.decorators import api_view, renderer_classes
|
||||||
from rest_framework.renderers import StaticHTMLRenderer
|
from rest_framework.renderers import StaticHTMLRenderer, JSONRenderer
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
from django.core.exceptions import PermissionDenied
|
||||||
|
from rest_framework import serializers
|
||||||
|
import urllib.request
|
||||||
|
import json
|
||||||
|
|
||||||
from core.templatetags.renderer import markdown
|
from core.templatetags.renderer import markdown
|
||||||
|
from pedagogy.views import CanCreateUVFunctionMixin
|
||||||
|
|
||||||
|
|
||||||
@api_view(["POST"])
|
@api_view(["POST"])
|
||||||
@ -41,3 +46,94 @@ def RenderMarkdown(request):
|
|||||||
except:
|
except:
|
||||||
data = "Error"
|
data = "Error"
|
||||||
return Response(data)
|
return Response(data)
|
||||||
|
|
||||||
|
|
||||||
|
@api_view(["GET"])
|
||||||
|
@renderer_classes((JSONRenderer,))
|
||||||
|
def uv_endpoint(request):
|
||||||
|
if not request.user.is_authenticated or not CanCreateUVFunctionMixin.can_create_uv(
|
||||||
|
request.user
|
||||||
|
):
|
||||||
|
raise PermissionDenied
|
||||||
|
|
||||||
|
lang = "fr"
|
||||||
|
|
||||||
|
params = request.query_params
|
||||||
|
if "year" not in params or "code" not in params:
|
||||||
|
raise serializers.ValidationError("Missing query parameter")
|
||||||
|
|
||||||
|
uvs_url = "https://extranet1.utbm.fr/gpedago/api/guide/uvs/{lang}/{year}"
|
||||||
|
response = urllib.request.urlopen(uvs_url.format(lang=lang, year=params["year"]))
|
||||||
|
|
||||||
|
uvs = json.loads(response.read().decode("utf-8"))
|
||||||
|
|
||||||
|
try:
|
||||||
|
found = next(uv for uv in uvs if uv["code"] == params["code"])
|
||||||
|
except StopIteration:
|
||||||
|
# shouldn't be 404, rather something like 204
|
||||||
|
return Response(status=404)
|
||||||
|
|
||||||
|
uv_url = "https://extranet1.utbm.fr/gpedago/api/guide/uv/{lang}/{year}/{code}/{formation}"
|
||||||
|
response = urllib.request.urlopen(
|
||||||
|
uv_url.format(
|
||||||
|
lang=lang,
|
||||||
|
year=params["year"],
|
||||||
|
code=params["code"],
|
||||||
|
formation=found["codeFormation"],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
uv = json.loads(response.read().decode("utf-8"))
|
||||||
|
|
||||||
|
res = {}
|
||||||
|
|
||||||
|
res["credit_type"] = found["codeCategorie"]
|
||||||
|
|
||||||
|
semesters = {
|
||||||
|
(True, True): "AUTUMN_AND_SPRING",
|
||||||
|
(True, False): "AUTOMN",
|
||||||
|
(False, True): "SPRING",
|
||||||
|
}
|
||||||
|
res["semester"] = semesters.get(
|
||||||
|
(found["ouvertAutomne"], found["ouvertPrintemps"]), "CLOSED"
|
||||||
|
)
|
||||||
|
|
||||||
|
langs = {"es": "SP", "en": "EN", "de": "DE"}
|
||||||
|
res["language"] = langs.get(uv["codeLangue"], "FR")
|
||||||
|
|
||||||
|
if uv["departement"] == "Pôle Humanités":
|
||||||
|
res["department"] = "HUMA"
|
||||||
|
else:
|
||||||
|
departments = {
|
||||||
|
"AL": "IMSI",
|
||||||
|
"AE": "EE",
|
||||||
|
"GI": "GI",
|
||||||
|
"GC": "EE",
|
||||||
|
"GM": "MC",
|
||||||
|
"TC": "TC",
|
||||||
|
"GP": "IMSI",
|
||||||
|
"ED": "EDIM",
|
||||||
|
"AI": "GI",
|
||||||
|
"AM": "MC",
|
||||||
|
}
|
||||||
|
res["department"] = departments.get(uv["codeFormation"], "NA")
|
||||||
|
|
||||||
|
res["credits"] = uv["creditsEcts"]
|
||||||
|
|
||||||
|
activities = ("CM", "TD", "TP", "THE", "TE")
|
||||||
|
for activity in activities:
|
||||||
|
res["hours_{}".format(activity)] = 0
|
||||||
|
for activity in uv["activites"]:
|
||||||
|
if activity["code"] in activities:
|
||||||
|
res["hours_{}".format(activity["code"])] += activity["nbh"]
|
||||||
|
|
||||||
|
res["manager"] = uv["automne"]["responsable"]
|
||||||
|
|
||||||
|
res["title"] = uv["libelle"]
|
||||||
|
|
||||||
|
res["objectives"] = uv["objectifs"]
|
||||||
|
res["program"] = uv["programme"]
|
||||||
|
res["skills"] = uv["acquisitionCompetences"]
|
||||||
|
res["key_concepts"] = uv["acquisitionNotions"]
|
||||||
|
|
||||||
|
return Response(res)
|
||||||
|
68
pedagogy/templates/pedagogy/uv_create.jinja
Normal file
68
pedagogy/templates/pedagogy/uv_create.jinja
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
{% extends "core/base.jinja" %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans %}Edit UV{% endtrans %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h2>{% trans %}Edit UV{% endtrans %}</h2>
|
||||||
|
<form action="" method="post" enctype="multipart/form-data" id="uv_edit">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form.non_field_errors() }}
|
||||||
|
|
||||||
|
{% for field in form %}
|
||||||
|
|
||||||
|
{% if not field.is_hidden %}
|
||||||
|
<p>
|
||||||
|
{{ field.errors }}
|
||||||
|
<label for="{{ field.name }}">{{ field.label }}</label>
|
||||||
|
{{ field }}
|
||||||
|
|
||||||
|
|
||||||
|
{% if field.name == 'code' %}
|
||||||
|
<a href="javascript:void(0)" id="autofill">Fill</a>
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
<p><input type="submit" value="{% trans %}Update{% endtrans %}" /></p>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block script %}
|
||||||
|
{{ super() }}
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
const autofillBtn = document.getElementById('autofill')
|
||||||
|
const codeInput = document.querySelector('input[name="code"]')
|
||||||
|
|
||||||
|
autofillBtn.addEventListener('click', () => {
|
||||||
|
const today = new Date()
|
||||||
|
let year = today.getFullYear()
|
||||||
|
if (today.getMonth() < 7) { // student year, starts in september
|
||||||
|
year--
|
||||||
|
}
|
||||||
|
const url = "{{ url('api:uv_endpoint') }}?year=" + year + "&code=" + codeInput.value
|
||||||
|
$.getJSON(url, function(data) {
|
||||||
|
for (let key in data) {
|
||||||
|
if (data.hasOwnProperty(key)) {
|
||||||
|
const el = document.querySelector('[name="' + key + '"]')
|
||||||
|
if (el.tagName == 'TEXTAREA') {
|
||||||
|
el.parentNode.querySelector('.CodeMirror').CodeMirror.setValue(data[key])
|
||||||
|
} else {
|
||||||
|
el.value = data[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
@ -294,7 +294,7 @@ class UVCreateView(CanCreateMixin, CreateView):
|
|||||||
|
|
||||||
model = UV
|
model = UV
|
||||||
form_class = UVForm
|
form_class = UVForm
|
||||||
template_name = "core/edit.jinja"
|
template_name = "pedagogy/uv_create.jinja"
|
||||||
|
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
kwargs = super(UVCreateView, self).get_form_kwargs()
|
kwargs = super(UVCreateView, self).get_form_kwargs()
|
||||||
|
Loading…
Reference in New Issue
Block a user