Commit 98c89a7f authored by Sylvain Coulange's avatar Sylvain Coulange
Browse files

ajout copySerie + role admin

parent c94ff203
......@@ -109,7 +109,18 @@ def save2db(request):
def openPlayerHome(request):
updateTimeStr = updateTime()
return render(request, 'playerHome.html', {'updateTime': updateTimeStr, 'titrePage': 'phonoplayer'})
userInfo = {
"nom":request.user.username,
"superadmin":False,
"admin":False,
"droits": []
}
if request.user.groups.exists():
if "superadmin" in [x.name for x in request.user.groups.all()]: userInfo["superadmin"] = True
if "admin" in [x.name for x in request.user.groups.all()]: userInfo["admin"] = True
return render(request, 'playerHome.html', {'updateTime': updateTimeStr, 'titrePage': 'phonoplayer', 'userInfo': json.dumps(userInfo)})
from django.core import serializers
......
......@@ -61,6 +61,7 @@ urlpatterns = [
path('player/serie-<str:pk>/info', clavier_views.infoSerie, name='serie-info'),
path('player/serie-<str:pk>/play', clavier_views.openPlayerPhono, name='serie-play'),
path('player/serie-<str:pk>/edit', user_views.editSerie, name='serie-edit'),
path('player/serie-<str:pk>/copy', user_views.copySerie, name='serie-copy'),
path('_delSerie/', csrf_exempt(user_views.delSerie)),
path('_delFile/', csrf_exempt(user_views.removeFile)),
......
......@@ -70,6 +70,10 @@ var modal = document.getElementById("modalSerieInfo")
// Fonction pour ouvrir le PopUp
function getModalSerieInfo(code) {
document.getElementById('modalSerieInfoNom').innerHTML = "...";
document.getElementById('modalBtnEdit').href = "";
document.getElementById('modalBtnEdit').style.display = "none";
document.getElementById('modalBtnCopy').href = "";
document.getElementById('modalBtnCopy').style.display = "none";
getSerieInfo(code);
}
function closeModalSerieInfo() {
......@@ -105,7 +109,14 @@ async function getSerieInfo(code) {
document.getElementById('modalCode').innerHTML = data.serieInfo.code;
document.getElementById('modalUrl').innerHTML = "https://phonographe.alem-app.fr/player/serie-"+ data.serieInfo.code +"/play";
document.getElementById('modalBtnPlay').href = window.location.href + "serie-"+ data.serieInfo.code +"/play";
document.getElementById('modalBtnEdit').href = window.location.href + "serie-"+ data.serieInfo.code +"/edit";
if (userInfo.superadmin || userInfo.nom == data.serieInfo.auteur) {
document.getElementById('modalBtnEdit').href = window.location.href + "serie-"+ data.serieInfo.code +"/edit";
document.getElementById('modalBtnEdit').style.display = "block";
}
if (userInfo.admin) {
document.getElementById('modalBtnCopy').href = window.location.href + "serie-"+ data.serieInfo.code +"/copy";
document.getElementById('modalBtnCopy').style.display = "block";
}
modal.style.display = "block";
}
......
......@@ -153,6 +153,20 @@ var langJson = {
"dz": "Panneaux phonologiques & disposition des graphies",
"shy": "Panneaux phonologiques & disposition des graphies"
},
"sp_info": {
"fr": "Le PhonoGraphe est un outil inspiré de la pédagogie Gattegno. Il évolue en fonction de vos besoins, n'hésitez pas à nous en faire part sur <a href='https://groups.google.com/forum/#!forum/alem-app'>le forum ALeM</a>, toute suggestion de votre part est bienvenue ! Plus d'infos sur <a href='https://alem.hypotheses.org/outils-alem-app/phonographe'>notre site</a>. Pour demander un compte administrateur et créer vos propres activités, contactez <a href='mailto:sylvain.coulange@univ-grenoble-alpes.fr'>Sylvain Coulange</a>.",
"en": "The PhonoGraphe is a tool inspired from the Gattegno pedagogy. It evolves depending on your needs, please let us know your suggestions on <a href='https://groups.google.com/forum/#!forum/alem-app'>our Forum</a>, any suggestion from you will be welcome! Further information on <a href='https://alem.hypotheses.org/outils-alem-app/phonographe'>our website</a>. If you need a admin account to create your own activities, contact <a href='mailto:sylvain.coulange@univ-grenoble-alpes.fr'>Sylvain Coulange</a>.",
"zh": "Le PhonoGraphe est un outil inspiré de la pédagogie Gattegno. Il évolue en fonction de vos besoins, n'hésitez pas à nous en faire part sur <a href='https://groups.google.com/forum/#!forum/alem-app'>le forum ALeM</a>, toute suggestion de votre part est bienvenue ! Plus d'infos sur <a href='https://alem.hypotheses.org/outils-alem-app/phonographe'>notre site</a>. Pour demander un compte administrateur et créer vos propres activités, contactez <a href='mailto:sylvain.coulange@univ-grenoble-alpes.fr'>Sylvain Coulange</a>.",
"dz": "Le PhonoGraphe est un outil inspiré de la pédagogie Gattegno. Il évolue en fonction de vos besoins, n'hésitez pas à nous en faire part sur <a href='https://groups.google.com/forum/#!forum/alem-app'>le forum ALeM</a>, toute suggestion de votre part est bienvenue ! Plus d'infos sur <a href='https://alem.hypotheses.org/outils-alem-app/phonographe'>notre site</a>. Pour demander un compte administrateur et créer vos propres activités, contactez <a href='mailto:sylvain.coulange@univ-grenoble-alpes.fr'>Sylvain Coulange</a>.",
"shy": "Le PhonoGraphe est un outil inspiré de la pédagogie Gattegno. Il évolue en fonction de vos besoins, n'hésitez pas à nous en faire part sur <a href='https://groups.google.com/forum/#!forum/alem-app'>le forum ALeM</a>, toute suggestion de votre part est bienvenue ! Plus d'infos sur <a href='https://alem.hypotheses.org/outils-alem-app/phonographe'>notre site</a>. Pour demander un compte administrateur et créer vos propres activités, contactez <a href='mailto:sylvain.coulange@univ-grenoble-alpes.fr'>Sylvain Coulange</a>."
},
"sp_tuto": {
"fr": "Accéder aux tutoriels WikiColor",
"en": "Access WikiColor's tutorials",
"zh": "访问教程",
"dz": "Accéder aux tutoriels WikiColor",
"shy": "Accéder aux tutoriels WikiColor"
},
"sp_playerHeader": {
"fr": "Prototype d'activités de pointage phonologique",
"en": "",
......
......@@ -234,6 +234,13 @@ h1 {
border: 5px solid red;
}
.divInfo {
margin: 20px auto;
max-width: 1000px;
font-size: 1em;
font-style: italic;
}
.artitre {
font-size: 1.5em;
}
......
......@@ -92,7 +92,8 @@
<footer class="footer-copyright text-center py-3">
<div>{{ updateTime }} <a href="https://gricad-gitlab.univ-grenoble-alpes.fr/pedagogies-multimodales/phonographe"><span id="sp_footcode" class="langspan"></span></a> - <a href="https://gricad-gitlab.univ-grenoble-alpes.fr/pedagogies-multimodales/phonographe/-/commits/master"><span id="sp_footjournal" class="langspan"></span></a></div>
<div style="font-size: 20pt;"><a href="https://alem.hypotheses.org/category/tutoriels/tutoriels-wikicolor" target="_blank"><span id="sp_tuto" class="langspan"></span></a></div>
<div>S.Coulange, {{ updateTime }} <a href="https://gricad-gitlab.univ-grenoble-alpes.fr/pedagogies-multimodales/phonographe"><span id="sp_footcode" class="langspan"></span></a> - <a href="https://gricad-gitlab.univ-grenoble-alpes.fr/pedagogies-multimodales/phonographe/-/commits/master"><span id="sp_footjournal" class="langspan"></span></a></div>
<div class="licence-div">
<div><span id="sp_footlicence" class="langspan"></span></div>
......
......@@ -222,6 +222,13 @@
</div>
</div>
<div class="divInfo">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412l-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM8 5.5a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/>
</svg>
<span id="sp_info" class="langspan"></span>
</div>
<!-- Modal PopUp qui apparaît pour le copier coller -->
<div id="myModal" class="modal">
......
......@@ -11,6 +11,11 @@
{% block title %}PhonoPlayer{% endblock %}
{% block content %}
<script type="text/javascript">
var userInfo = JSON.parse("{{ userInfo|escapejs }}");
console.log("UserInfo:",userInfo)
</script>
<div class="mainContent">
<div class="homeMainContent">
<div style="width:100%; text-align: right;">
......@@ -63,7 +68,8 @@
<div class="d-flex justify-content-around" style="margin:40px 0px">
<a id="modalBtnPlay" href=""><button type="button" class="btn btn-success btn-lg">Démarrer !</button></a>
<a id="modalBtnEdit" href=""><button type="button" class="btn btn-secondary btn-lg">Éditer</button></a>
<a id="modalBtnEdit" href="" style="display:none;"><button type="button" class="btn btn-secondary btn-lg">Éditer</button></a>
<a id="modalBtnCopy" href="" style="display:none;"><button type="button" class="btn btn-primary btn-lg" title="Dupliquer et modifier cette série">Dupliquer</button></a>
</div>
<ul class="list-group list-group-flush">
......
......@@ -31,6 +31,7 @@
<div style="width:100%; text-align: right;">
<button class="btn btn-outline-secondary" onclick="goBack()">< Retour</button>
<button class="btn btn-outline-info" title="Enregistrer la série" onclick="makeSerieMots()">Enregistrer</button>
<button class="btn btn-danger ms-2" title="Supprimer la série" onclick="delSerie()">Supprimer</button>
</div>
<fieldset class="serieForm">
......
from django.contrib import admin
from .models import Profile, Trace, SynthVocTrace, SynthVocRecord
from .models import Profile, Trace, SynthVocTrace, SynthVocRecord, appstats
# TUTO : https://www.youtube.com/watch?v=g5DTIiFAiSk
......@@ -13,7 +13,12 @@ class TracesSynthVoc(admin.ModelAdmin):
list_filter = ('user', 'date', 'userAgent', 'appli',)
# fields = ('nom', 'description', 'auteur', 'images', 'phono', 'mots',)
class AppstatsAdmin(admin.ModelAdmin):
list_display = ('date', 'app', 'module', 'ip', 'agent', 'country', 'lang')
list_filter = ('date', 'app', 'module', 'ip', 'agent', 'country', 'lang')
admin.site.register(Profile)
admin.site.register(Trace, TracesAdmin)
admin.site.register(SynthVocTrace, TracesSynthVoc)
admin.site.register(SynthVocRecord)
\ No newline at end of file
admin.site.register(SynthVocRecord)
admin.site.register(appstats, AppstatsAdmin)
\ No newline at end of file
......@@ -61,3 +61,6 @@ class appstats(models.Model):
agent = models.CharField(max_length=200, default='Anonymous')
country = models.CharField(max_length=50, default='')
lang = models.CharField(max_length=10)
def __str__(self):
return f'appstat\t[{self.app}] {self.module} {self.lang}'
\ No newline at end of file
from django.shortcuts import render, redirect
from django.shortcuts import render, redirect, HttpResponseRedirect
from django.contrib import messages
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
......@@ -15,7 +15,7 @@ from .models import Trace, SynthVocTrace, SynthVocRecord, appstats
from .decorators import unauthenticated_user, allowed_users
from user_agents import parse
import json, datetime, csv, os, requests
import json, datetime, csv, os, requests, random, string
import numpy as np
......@@ -146,6 +146,43 @@ def saveNewSerie(request):
return JsonResponse(rep)
@login_required
@allowed_users(allowed_roles=['admin'])
def copySerie(request, pk=""):
s = Serie.objects.filter(code=pk).first()
code = ''.join(random.choices(string.ascii_lowercase + string.ascii_uppercase + string.digits, k=6))
while not checkIfCodeNotUsed(code):
code = ''.join(random.choices(string.hexdigits, k=6))
newSerie = Serie()
newSerie.code = code
newSerie.nom = "Copie de "+s.nom
newSerie.description = ""
newSerie.auteur = request.user
newSerie.audioDeb = s.audioDeb
newSerie.imageDeb = s.imageDeb
newSerie.videoDeb = s.videoDeb
newSerie.graphieDeb = s.graphieDeb
newSerie.audioFin = s.audioFin
newSerie.imageFin = s.imageFin
newSerie.videoFin = s.videoFin
newSerie.graphieFin = s.graphieFin
newSerie.phonoFin = s.phonoFin
newSerie.syntheseVocale = s.syntheseVocale
newSerie.panneauPartiel = s.panneauPartiel
newSerie.phonVisibles = s.phonVisibles
newSerie.mots = s.mots
newSerie.save()
return HttpResponseRedirect('/player/serie-'+code+'/edit')
def checkIfCodeNotUsed(code):
if Serie.objects.filter(code=code).first(): return False
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment