1
0
mirror of https://gitlab.crans.org/mediatek/med.git synced 2024-11-26 21:27:11 +00:00

Add present field

This commit is contained in:
Yohann D'ANELLO 2020-09-25 14:20:17 +02:00
parent 57659acc93
commit 7ed6b9712b
5 changed files with 203 additions and 12 deletions

View File

@ -0,0 +1,48 @@
# Generated by Django 2.2.16 on 2020-09-25 12:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('media', '0038_auto_20200923_2030'),
]
operations = [
migrations.AddField(
model_name='bd',
name='present',
field=models.BooleanField(default=False, help_text='Tell that the medium is present in the Mediatek.', verbose_name='present'),
),
migrations.AddField(
model_name='cd',
name='present',
field=models.BooleanField(default=False, help_text='Tell that the medium is present in the Mediatek.', verbose_name='present'),
),
migrations.AddField(
model_name='futuremedia',
name='present',
field=models.BooleanField(default=False, help_text='Tell that the medium is present in the Mediatek.', verbose_name='present'),
),
migrations.AddField(
model_name='manga',
name='present',
field=models.BooleanField(default=False, help_text='Tell that the medium is present in the Mediatek.', verbose_name='present'),
),
migrations.AddField(
model_name='revue',
name='present',
field=models.BooleanField(default=False, help_text='Tell that the medium is present in the Mediatek.', verbose_name='present'),
),
migrations.AddField(
model_name='roman',
name='present',
field=models.BooleanField(default=False, help_text='Tell that the medium is present in the Mediatek.', verbose_name='present'),
),
migrations.AddField(
model_name='vinyle',
name='present',
field=models.BooleanField(default=False, help_text='Tell that the medium is present in the Mediatek.', verbose_name='present'),
),
]

View File

@ -77,6 +77,12 @@ class BD(models.Model):
null=True, null=True,
) )
present = models.BooleanField(
verbose_name=_("present"),
help_text=_("Tell that the medium is present in the Mediatek."),
default=False,
)
def __str__(self): def __str__(self):
if self.subtitle: if self.subtitle:
return "{} : {}".format(self.title, self.subtitle) return "{} : {}".format(self.title, self.subtitle)
@ -136,6 +142,12 @@ class Manga(models.Model):
null=True, null=True,
) )
present = models.BooleanField(
verbose_name=_("present"),
help_text=_("Tell that the medium is present in the Mediatek."),
default=False,
)
def __str__(self): def __str__(self):
return self.title return self.title
@ -192,6 +204,12 @@ class Roman(models.Model):
null=True, null=True,
) )
present = models.BooleanField(
verbose_name=_("present"),
help_text=_("Tell that the medium is present in the Mediatek."),
default=False,
)
def __str__(self): def __str__(self):
return self.title return self.title
@ -225,6 +243,12 @@ class Vinyle(models.Model):
verbose_name=_('authors'), verbose_name=_('authors'),
) )
present = models.BooleanField(
verbose_name=_("present"),
help_text=_("Tell that the medium is present in the Mediatek."),
default=False,
)
def __str__(self): def __str__(self):
return self.title return self.title
@ -250,6 +274,12 @@ class CD(models.Model):
verbose_name=_('authors'), verbose_name=_('authors'),
) )
present = models.BooleanField(
verbose_name=_("present"),
help_text=_("Tell that the medium is present in the Mediatek."),
default=False,
)
def __str__(self): def __str__(self):
return self.title return self.title
@ -295,6 +325,12 @@ class Revue(models.Model):
default=False, default=False,
) )
present = models.BooleanField(
verbose_name=_("present"),
help_text=_("Tell that the medium is present in the Mediatek."),
default=False,
)
def __str__(self): def __str__(self):
return self.title + "" + str(self.number) return self.title + "" + str(self.number)
@ -323,6 +359,12 @@ class FutureMedia(models.Model):
max_length=8, max_length=8,
) )
present = models.BooleanField(
verbose_name=_("present"),
help_text=_("Tell that the medium is present in the Mediatek."),
default=False,
)
class Meta: class Meta:
verbose_name = _("future medium") verbose_name = _("future medium")
verbose_name_plural = _("future media") verbose_name_plural = _("future media")

View File

@ -1,22 +1,38 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
<form action="#" onsubmit="searchISBN()"> <form id="form" action="#" onsubmit="searchISBN()">
<label for="isbn" id="id_isbn_label">ISBN :</label> <label for="isbn" id="id_isbn_label">ISBN :</label>
<input type="text" id="isbn" autofocus /> <input type="text" id="isbn" autofocus>
<input type="submit" id="isbn_search" /> <input type="hidden" id="old-isbn">
<input type="submit" id="isbn_search">
<input type="checkbox" id="mark_as_present" checked onchange="document.getElementById('isbn').focus()" />
<label for="mark_as_present">Marquer automatiquement comme présent si trouvé et que je cherche par ISBN</label>
</form> </form>
<ul id="result"></ul> <ul id="result"></ul>
{% endblock %} {% endblock %}
{% block extrajavascript %} {% block extrajavascript %}
<script> <script>
function markAsPresent(type, id, present=true) {
let request = new XMLHttpRequest();
request.open("GET", "/media/mark-as-present/" + type + "/" + id + "/" + (present ? "" : "?absent=1"), true);
request.onload = function() {
document.getElementById("isbn").value = document.getElementById("old-isbn").value;
searchISBN();
};
request.send();
}
function searchISBN() { function searchISBN() {
let isbn = document.getElementById("isbn").value; let isbn = document.getElementById("isbn").value;
let result_div = document.getElementById("result"); let result_div = document.getElementById("result");
let markAsPresent = document.getElementById("mark_as_present").checked;
result_div.innerHTML = "<li id='recap-isbn'>Recherche : " + isbn + "</li>"; result_div.innerHTML = "<li id='recap-isbn'>Recherche : " + isbn + "</li>";
document.getElementById("isbn").value = ""; document.getElementById("isbn").value = "";
document.getElementById("old-isbn").value = isbn;
document.getElementById("isbn").focus(); document.getElementById("isbn").focus();
let bd_request = new XMLHttpRequest(); let bd_request = new XMLHttpRequest();
@ -24,9 +40,18 @@
bd_request.onload = function () { bd_request.onload = function () {
let data = JSON.parse(this.response); let data = JSON.parse(this.response);
data.results.forEach(bd => { data.results.forEach(bd => {
let present = bd.present;
if (markAsPresent && isbn === bd.isbn) {
present = true;
let presentRequest = new XMLHttpRequest();
presentRequest.open("GET", "/media/mark-as-present/bd/" + bd.id + "/", true);
presentRequest.send();
}
result_div.innerHTML += "<li id='bd_" + bd.id + "'>" + result_div.innerHTML += "<li id='bd_" + bd.id + "'>" +
"<a href='/database/media/bd/" + bd.id + "/change/'>BD : " "<a href='/database/media/bd/" + bd.id + "/change/'>BD : "
+ bd.title + (bd.subtitle ? " - " + bd.subtitle : "") + "</a></li>"; + bd.title + (bd.subtitle ? " - " + bd.subtitle : "") + "</a>"
+ (present ? " (<a class='absent' href='#' onclick=\"markAsPresent('bd', " + bd.id + ", false)\">marquer comme absent</a>)"
: " (absent, <a class='present' href='#' onclick=\"markAsPresent('bd', " + bd.id + ")\">marquer comme présent</a>)") + "</li>";
}); });
} }
bd_request.send(); bd_request.send();
@ -36,9 +61,18 @@
manga_request.onload = function () { manga_request.onload = function () {
let data = JSON.parse(this.response); let data = JSON.parse(this.response);
data.results.forEach(manga => { data.results.forEach(manga => {
let present = manga.present;
if (markAsPresent && isbn === manga.isbn) {
present = true;
let presentRequest = new XMLHttpRequest();
presentRequest.open("GET", "/media/mark-as-present/manga/" + manga.id + "/", true);
presentRequest.send();
}
result_div.innerHTML += "<li id='manga_" + manga.id + "'>" + result_div.innerHTML += "<li id='manga_" + manga.id + "'>" +
"<a href='/database/media/manga/" + manga.id + "/change/'>Manga : " "<a href='/database/media/manga/" + manga.id + "/change/'>Manga : "
+ manga.title + (manga.subtitle ? " - " + manga.subtitle : "") + "</a></li>"; + manga.title + (manga.subtitle ? " - " + manga.subtitle : "") + "</a>"
+ (present ? " (<a class='absent' href='#' onclick=\"markAsPresent('manga', " + manga.id + ", false)\">marquer comme absent</a>)"
: " (absent, <a class='present' href='#' onclick=\"markAsPresent('manga', " + manga.id + ")\">marquer comme présent</a>)") + "</li>";
}); });
} }
manga_request.send(); manga_request.send();
@ -48,8 +82,11 @@
cd_request.onload = function () { cd_request.onload = function () {
let data = JSON.parse(this.response); let data = JSON.parse(this.response);
data.results.forEach(cd => { data.results.forEach(cd => {
let present = cd.present;
result_div.innerHTML += "<li id='cd_" + cd.id + "'>" + result_div.innerHTML += "<li id='cd_" + cd.id + "'>" +
"<a href='/database/media/cd/" + cd.id + "/change/'>CD : " + cd.title + "</a></li>"; "<a href='/database/media/cd/" + cd.id + "/change/'>CD : " + cd.title + "</a>"
+ (present ? " (<a class='absent' href='#' onclick=\"markAsPresent('cd', " + cd.id + ", false)\">marquer comme absent</a>)"
: " (absent, <a class='present' href='#' onclick=\"markAsPresent('cd', " + cd.id + ")\">marquer comme présent</a>)") + "</li>";
}); });
} }
cd_request.send(); cd_request.send();
@ -59,8 +96,11 @@
vinyle_request.onload = function () { vinyle_request.onload = function () {
let data = JSON.parse(this.response); let data = JSON.parse(this.response);
data.results.forEach(vinyle => { data.results.forEach(vinyle => {
let present = markAsPresent || vinyle.present;
result_div.innerHTML += "<li id='vinyle_" + vinyle.id + "'>" + result_div.innerHTML += "<li id='vinyle_" + vinyle.id + "'>" +
"<a href='/database/media/vinyle/" + vinyle.id + "/change/'>Vinyle : " + vinyle.title + "</a></li>"; "<a href='/database/media/vinyle/" + vinyle.id + "/change/'>Vinyle : " + vinyle.title + "</a>"
+ (present ? " (<a class='absent' href='#' onclick=\"markAsPresent('vinyle', " + vinyle.id + ", false)\">marquer comme absent</a>)"
: " (absent, <a class='present' href='#' onclick=\"markAsPresent('vinyle', " + vinyle.id + ")\">marquer comme présent</a>)") + "</li>";
}); });
} }
vinyle_request.send(); vinyle_request.send();
@ -70,8 +110,17 @@
roman_request.onload = function () { roman_request.onload = function () {
let data = JSON.parse(this.response); let data = JSON.parse(this.response);
data.results.forEach(roman => { data.results.forEach(roman => {
let present = roman.present;
if (markAsPresent && isbn === roman.isbn) {
present = true;
let presentRequest = new XMLHttpRequest();
presentRequest.open("GET", "/media/mark-as-present/roman/" + roman.id + "/", true);
presentRequest.send();
}
result_div.innerHTML += "<li id='roman_" + roman.id + "'>" + result_div.innerHTML += "<li id='roman_" + roman.id + "'>" +
"<a href='/database/media/roman/" + roman.id + "/change/'>Roman : " + roman.title + "</a></li>"; "<a href='/database/media/roman/" + roman.id + "/change/'>Roman : " + roman.title + "</a>"
+ (present ? " (<a class='absent' href='#' onclick=\"markAsPresent('roman', " + roman.id + ", false)\">marquer comme absent</a>)"
: " (absent, <a class='present' href='#' onclick=\"markAsPresent('roman', " + roman.id + ")\">marquer comme présent</a>)") + "</li>";
}); });
} }
roman_request.send(); roman_request.send();
@ -81,9 +130,17 @@
future_request.onload = function () { future_request.onload = function () {
let data = JSON.parse(this.response); let data = JSON.parse(this.response);
data.results.forEach(future => { data.results.forEach(future => {
let present = future.present;
if (markAsPresent && isbn === future.isbn) {
present = true;
let presentRequest = new XMLHttpRequest();
presentRequest.open("GET", "/media/mark-as-present/future/" + bd.id + "/", true);
presentRequest.send();
}
result_div.innerHTML += "<li id='future_" + future.id + "'>" + result_div.innerHTML += "<li id='future_" + future.id + "'>" +
"<a href='/database/media/future/" + future.id + "/change/'>Medium non traité : " "<a href='/database/media/future/" + future.id + "/change/'>Medium non traité : " + future.title + "</a>"
+ future.title + "</a></li>"; + (present ? " (<a class='absent' href='#' onclick=\"markAsPresent('future', " + future.id + ", false)\">marquer comme absent</a>)"
: " (absent, <a class='present' href='#' onclick=\"markAsPresent('future', " + future.id + ")\">marquer comme présent</a>)") + "</li>";
}); });
} }
future_request.send(); future_request.send();

View File

@ -12,4 +12,11 @@ urlpatterns = [
url(r'^retour_emprunt/(?P<empruntid>[0-9]+)$', views.retour_emprunt, url(r'^retour_emprunt/(?P<empruntid>[0-9]+)$', views.retour_emprunt,
name='retour-emprunt'), name='retour-emprunt'),
path('find/', views.FindMediumView.as_view(), name="find"), path('find/', views.FindMediumView.as_view(), name="find"),
path('mark-as-present/bd/<int:pk>/', views.MarkBDAsPresent.as_view(), name="mark_bd_as_present"),
path('mark-as-present/manga/<int:pk>/', views.MarkMangaAsPresent.as_view(), name="mark_manga_as_present"),
path('mark-as-present/cd/<int:pk>/', views.MarkCDAsPresent.as_view(), name="mark_cd_as_present"),
path('mark-as-present/vinyle/<int:pk>/', views.MarkVinyleAsPresent.as_view(), name="mark_vinyle_as_present"),
path('mark-as-present/roman/<int:pk>/', views.MarkRomanAsPresent.as_view(), name="mark_roman_as_present"),
path('mark-as-present/revue/<int:pk>/', views.MarkRevueAsPresent.as_view(), name="mark_revue_as_present"),
path('mark-as-present/future/<int:pk>/', views.MarkFutureAsPresent.as_view(), name="mark_future_as_present"),
] ]

View File

@ -1,16 +1,18 @@
# -*- mode: python; coding: utf-8 -*- # -*- mode: python; coding: utf-8 -*-
# Copyright (C) 2017-2019 by BDE ENS Paris-Saclay # Copyright (C) 2017-2019 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from http.client import NO_CONTENT
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponse
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from django.db import transaction from django.db import transaction
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.generic import TemplateView from django.views.generic import TemplateView, DetailView
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework.filters import SearchFilter from rest_framework.filters import SearchFilter
from reversion import revisions as reversion from reversion import revisions as reversion
@ -53,6 +55,42 @@ class FindMediumView(LoginRequiredMixin, TemplateView):
template_name = "media/find_medium.html" template_name = "media/find_medium.html"
class MarkMediumAsPresent(LoginRequiredMixin, DetailView):
def dispatch(self, request, *args, **kwargs):
object = self.get_object()
object.present = not request.GET.get("absent", False)
object.save()
return HttpResponse("", content_type=204)
class MarkBDAsPresent(MarkMediumAsPresent):
model = BD
class MarkMangaAsPresent(MarkMediumAsPresent):
model = Manga
class MarkCDAsPresent(MarkMediumAsPresent):
model = CD
class MarkVinyleAsPresent(MarkMediumAsPresent):
model = Vinyle
class MarkRomanAsPresent(MarkMediumAsPresent):
model = Roman
class MarkRevueAsPresent(MarkMediumAsPresent):
model = Revue
class MarkFutureAsPresent(MarkMediumAsPresent):
model = FutureMedia
class AuteurViewSet(viewsets.ModelViewSet): class AuteurViewSet(viewsets.ModelViewSet):
""" """
API endpoint that allows authors to be viewed or edited. API endpoint that allows authors to be viewed or edited.
@ -127,7 +165,6 @@ class RevueViewSet(viewsets.ModelViewSet):
search_fields = ["$title"] search_fields = ["$title"]
class FutureMediaViewSet(viewsets.ModelViewSet): class FutureMediaViewSet(viewsets.ModelViewSet):
""" """
API endpoint that allows media to be viewed or edited. API endpoint that allows media to be viewed or edited.