diff --git a/catalog/admin.py b/catalog/admin.py index 069098e8b9f1f57381f5f109bb25c8d7ffd06790..04d45f85db2b0bb7a0c4467eab14d698cde4ceeb 100644 --- a/catalog/admin.py +++ b/catalog/admin.py @@ -24,6 +24,12 @@ class FAQItemAdmin(admin.ModelAdmin): class FAQCategoryAdmin(admin.ModelAdmin): list_display = ("name", "order") + +class LicenceAdmin(admin.ModelAdmin): + list_display = ("id", "name") + +class SubmissionAdmin(admin.ModelAdmin): + list_display = ("submit_date", "is_valid", "is_added", "review_date") admin.site.register(models.Subject) admin.site.register(models.User) @@ -35,3 +41,5 @@ admin.site.register(models.Review) admin.site.register(models.SubjectsSelection, SubjectsSelectionAdmin) admin.site.register(models.Catalog, CatalogAdmin) admin.site.register(models.Resource, ResourceAdmin) +admin.site.register(models.Licence, LicenceAdmin) +admin.site.register(models.Submission, SubmissionAdmin) diff --git a/catalog/forms.py b/catalog/forms.py index d09a2c8387f475c14938d79aa4cea2d76f9391c0..83c111cfb5308ccb7fd6dccf897508e84466fec3 100644 --- a/catalog/forms.py +++ b/catalog/forms.py @@ -5,7 +5,7 @@ from django.db.models import Q from django.core.exceptions import ValidationError -from .models import Subject, Resource +from .models import Subject, Resource, Licence class SignupForm(UserCreationForm): @@ -55,3 +55,34 @@ class SelectSubjectForm(forms.ModelForm): # trendings = Subject.objects.annotate( # Count('subjectsselection')).order_by('-subjectsselection__count')[:10].values_list('pk', flat=True) # self.fields["label"].queryset = Subject.objects.filter(pk__in=set([*frequents, *favorites, *trendings])) + +# Formulaire d'envoi de ressource +class SubmissionForm(forms.Form): + url = forms.URLField( + label="URL de la ressource ou collection *", + required=True, + widget=forms.TextInput( + attrs={"class": "form-control"} + ) + ) + keywords = forms.CharField( + label="Mots-clefs (les séparer d'un point-virgule)", + required=False, + widget=forms.TextInput( + attrs={"class": "form-control"} + ) + ) + email = forms.EmailField( + label="Votre adresse e-mail", + required=False, + widget=forms.TextInput( + attrs={"class": "form-control"} + ) + ) + licence = forms.CharField( + label = 'Licence', + required=False, + widget=forms.TextInput( + attrs={"class": "form-control"} + ) + ) diff --git a/catalog/migrations/0012_licence_submission.py b/catalog/migrations/0012_licence_submission.py new file mode 100644 index 0000000000000000000000000000000000000000..a41aac1bea9eea9579b5264d42aa39be26d9a40d --- /dev/null +++ b/catalog/migrations/0012_licence_submission.py @@ -0,0 +1,38 @@ +# Generated by Django 4.1.3 on 2023-04-11 13:41 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalog', '0011_resource_dead_entry_point'), + ] + + operations = [ + migrations.CreateModel( + name='Licence', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Submission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField()), + ('submit_date', models.DateTimeField(auto_now_add=True)), + ('is_valid', models.BooleanField(null=True)), + ('is_added', models.BooleanField()), + ('review_date', models.DateTimeField()), + ('sender_keywords', models.TextField()), + ('reviewer_keywords', models.TextField()), + ('sender_email', models.EmailField(max_length=254)), + ('licence', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='catalog.licence')), + ('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/catalog/migrations/0013_alter_submission_licence_and_more.py b/catalog/migrations/0013_alter_submission_licence_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..b35d488147144c672372639ccfbb5de637e4ec6f --- /dev/null +++ b/catalog/migrations/0013_alter_submission_licence_and_more.py @@ -0,0 +1,39 @@ +# Generated by Django 4.1.3 on 2023-04-11 14:21 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalog', '0012_licence_submission'), + ] + + operations = [ + migrations.AlterField( + model_name='submission', + name='licence', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='catalog.licence'), + ), + migrations.AlterField( + model_name='submission', + name='review_date', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='submission', + name='reviewer_keywords', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='submission', + name='sender_email', + field=models.EmailField(blank=True, max_length=254, null=True), + ), + migrations.AlterField( + model_name='submission', + name='sender_keywords', + field=models.TextField(blank=True, null=True), + ), + ] diff --git a/catalog/migrations/0014_alter_submission_is_added_alter_submission_licence.py b/catalog/migrations/0014_alter_submission_is_added_alter_submission_licence.py new file mode 100644 index 0000000000000000000000000000000000000000..d90af15dcbd9db6a051968ef11246484d09215f0 --- /dev/null +++ b/catalog/migrations/0014_alter_submission_is_added_alter_submission_licence.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.3 on 2023-04-12 11:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalog', '0013_alter_submission_licence_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='submission', + name='is_added', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='submission', + name='licence', + field=models.TextField(blank=True, null=True), + ), + ] diff --git a/catalog/migrations/0015_alter_submission_sender.py b/catalog/migrations/0015_alter_submission_sender.py new file mode 100644 index 0000000000000000000000000000000000000000..6f61bf75304eaf0396d73e585ba142227ca4f171 --- /dev/null +++ b/catalog/migrations/0015_alter_submission_sender.py @@ -0,0 +1,20 @@ +# Generated by Django 4.1.3 on 2023-04-12 11:52 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalog', '0014_alter_submission_is_added_alter_submission_licence'), + ] + + operations = [ + migrations.AlterField( + model_name='submission', + name='sender', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/catalog/models.py b/catalog/models.py index 518ecb6d694af23015f2fd2d35a77fa82fb14f21..53e1c1b365a37c4a008bb9d50ca5ceef73088a78 100644 --- a/catalog/models.py +++ b/catalog/models.py @@ -154,3 +154,20 @@ class Review(models.Model): category=category, description=f"Hashtag permettant à l'utilisateur {self.reviewer.username} d'annoter les contours de la ressource « {self.resource.title} » par {self.resource.author} du catalogue {self.resource.catalog}.") self.review_tag.save() + +class Licence(models.Model): + name = models.CharField(max_length=100) + def __str__(self): + return self.name + +class Submission(models.Model): + url = models.URLField() + submit_date = models.DateTimeField(auto_now_add=True) + sender = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True) + is_valid = models.BooleanField(null=True) + is_added = models.BooleanField(null=False, default=False) + review_date = models.DateTimeField(null=True, blank=True) + licence = models.TextField(null=True, blank=True) + sender_keywords = models.TextField(null=True, blank=True) + reviewer_keywords = models.TextField(null=True, blank=True) + sender_email = models.EmailField(null=True, blank=True) diff --git a/catalog/templates/catalog/footer.html b/catalog/templates/catalog/footer.html index 6e1d4b787c476b2d16b602864bfc39ccb71c5d5e..5835f09eaa475d2992fb7eb25ad7c1fe48db72a2 100644 --- a/catalog/templates/catalog/footer.html +++ b/catalog/templates/catalog/footer.html @@ -7,36 +7,33 @@ <!-- Grid container --> <div class="container-fluid"> <!-- Section: Links --> - <section class="mt-1"> + <section class="mt-1 mx-2"> <!-- Grid row--> <div class="row text-center d-flex justify-content-center pt-2"> - <!-- Grid column --> - <div class="col-md-2"> + <div class="col"> <h6 class="text-uppercase font-weight-bold"> - <a href="{% url 'index' %}" class="text-white">Accueil</a> + <a href="{% url 'about' %}" class="text-white">À propos de Florilège</a> </h6> </div> <!-- Grid column --> <!-- Grid column --> - <div class="col-md-2"> + <div class="col"> <h6 class="text-uppercase font-weight-bold"> - <a href="{% url 'about' %}" class="text-white">À propos de Florilège</a> + <a href="{% url 'instructions' %}" class="text-white">Comment annoter ?</a> </h6> </div> <!-- Grid column --> - <!-- Grid column --> - <div class="col-md-2"> + <div class="col"> <h6 class="text-uppercase font-weight-bold"> - <a href="{% url 'instructions' %}" class="text-white">Comment annoter ?</a> + <a href="{% url 'submission' %}" class="text-white">Soumettre une REL</a> </h6> </div> - <!-- Grid column --> <!-- Grid column --> - <div class="col-md-2"> + <div class="col"> <h6 class="text-uppercase font-weight-bold"> <a href="{% url 'faq' %}" class="text-white">Foire aux questions</a> </h6> @@ -44,7 +41,7 @@ <!-- Grid column --> <!-- Grid column --> - <div class="col-md-2"> + <div class="col"> <h6 class="text-uppercase font-weight-bold"> <a href="{% url 'legal' %}" class="text-white">Mentions légales</a> </h6> @@ -52,7 +49,7 @@ <!-- Grid column --> <!-- Grid column --> - <div class="col-md-2"> + <div class="col"> <h6 class="text-uppercase font-weight-bold"> <a href="{% url 'contact' %}" class="text-white">Contact</a> </h6> @@ -92,61 +89,61 @@ </section> --> <!-- Section: Text --> - <div class="row align-items-center"> - <div class="col border-right"> - <!-- Section: Partenaire --> - <section class="text-center"> - <h6 class="text-uppercase font-weight-bold align-text-top">Nos partenaires :</h6> - <div class="row align-items-center"> - <div class="col"> - <a href="https://chaireunescorelia.univ-nantes.fr/" target="_blank"> <img src="{% static 'catalog/assets/images/logo_chaire.jpg' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo Chaire UNESCO RELIA"></a> - </div> - <div class="col"> - <a href="https://www.x5gon.org/" target="_blank"> <img src="{% static 'catalog/assets/images/logo_x5gon_2.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo X5GON"></a> - </div> - <div class="col"> - <a href="https://next-isite.fr/" target="_blank"> <img src="{% static 'catalog/assets/images/logo_next.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo NEXT"></a> - </div> - <div class="col"> - <a href="https://chaireunescorelia.univ-nantes.fr/tag/gtnum-2/" target="_blank"> <img src="{% static 'catalog/assets/images/logo_gtnum.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo Chaire GTnum"></a> - </div> - <div class="col"> - <a href="https://www.gouvernement.fr/le-programme-d-investissements-d-avenir" target="_blank"> <img src="{% static 'catalog/assets/images/logo_PIA.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo PIA"></a> - </div> - <div class="col"> - <a href="https://anr.fr/fr/" target="_blank"> <img src="{% static 'catalog/assets/images/logo_anr.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo ANR"></a> - </div> + <div class="row align-items-center mx-2"> + <div class="col-md-9 col-8 border-right"> + <!-- Section: Partenaire --> + <section class="text-center"> + <h6 class="text-uppercase font-weight-bold align-text-top">Nos partenaires :</h6> + <div class="row align-items-center"> + <div class="col-md col-4"> + <a href="https://chaireunescorelia.univ-nantes.fr/" target="_blank"> + <img src="{% static 'catalog/assets/images/logo_chaire.jpg' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo Chaire UNESCO RELIA"> + </a> + </div> + <div class="col-md col-4"> + <a href="https://www.x5gon.org/" target="_blank"> + <img src="{% static 'catalog/assets/images/logo_x5gon_2.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo X5GON"> + </a> + </div> + <div class="col-md col-4"> + <a href="https://next-isite.fr/" target="_blank"> + <img src="{% static 'catalog/assets/images/logo_next.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo NEXT"> + </a> + </div> + <div class="col-md col-4"> + <a href="https://chaireunescorelia.univ-nantes.fr/tag/gtnum-2/" target="_blank"> + <img src="{% static 'catalog/assets/images/logo_gtnum.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo Chaire GTnum"> + </a> + </div> + <div class="col-md col-4"> + <a href="https://www.gouvernement.fr/le-programme-d-investissements-d-avenir" target="_blank"> + <img src="{% static 'catalog/assets/images/logo_PIA.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo anr"> + </a> + </div> + <div class="col-md col-4"> + <a href="https://anr.fr/fr/" target="_blank"> + <img src="{% static 'catalog/assets/images/logo_anr.png' %}" class="img-fluid rounded float-right" width="100" height="100" alt="Logo ANR"> + </a> + </div> + </div> + </section> + </div> + <!-- Section: Partenaire --> + <div class="col-md-3 col-4"> + <!-- Section: Social --> + <section class="text-center mb-1"> + <h6 class="text-uppercase font-weight-bold align-text-top">Suivez-nous :</h6> + <a href="https://twitter.com/chaire_relia" target="_blank" class="text-white me-4 fs-2"> + <i class="fab fa-twitter fa-lg"></i> + </a> + <a href="https://gitlab.univ-nantes.fr/florilege-team/florilege-website" target="_blank" class="text-white me-4 fs-2"> + <i class="fab fa-gitlab fa-lg"></i> + </a> + <a href="https://chaireunescorelia.univ-nantes.fr/" target="_blank" class="text-white fs-2"> + <i class="fab fa-wordpress fa-lg"></i> + </a> + </section> </div> - </section> - </div> - <!-- Section: Partenaire --> - <div class="col"> - <!-- Section: Social --> - <section class="text-center mb-1"> - <h6 class="text-uppercase font-weight-bold align-text-top">Suivez-nous :</h6> - <!-- <a href="" class="text-white me-4"> - <i class="fab fa-facebook-f"></i> - </a> --> - <a href="https://twitter.com/chaire_relia" target="_blank" class="text-white me-4 fs-2"> - <i class="fab fa-twitter fa-lg"></i> - </a> - <!-- <a href="" class="text-white me-4"> - <i class="fab fa-google"></i> - </a> - <a href="" class="text-white me-4"> - <i class="fab fa-instagram"></i> - </a> - <a href="" class="text-white me-4"> - <i class="fab fa-linkedin"></i> - </a> --> - <a href="https://gitlab.univ-nantes.fr/florilege-team/florilege-website" target="_blank" class="text-white me-4 fs-2"> - <i class="fab fa-gitlab fa-lg"></i> - </a> - <a href="https://chaireunescorelia.univ-nantes.fr/" target="_blank" class="text-white fs-2"> - <i class="fab fa-wordpress fa-lg"></i> - </a> - </section> - </div> <!-- Section: Social --> </div> <!-- Grid container --> diff --git a/catalog/templates/catalog/submission.html b/catalog/templates/catalog/submission.html new file mode 100644 index 0000000000000000000000000000000000000000..3dd24ba89eb2572118e9533867670b33fb11d093 --- /dev/null +++ b/catalog/templates/catalog/submission.html @@ -0,0 +1,50 @@ +{% extends 'catalog/base.html' %} + +{% load static %} + +{% block content %} +<div class="container-sm"> + <div class="bg-light bg-opacity-10 container-sm p-5 rounded my-5" style="--mdb-bg-opacity: 0.6;"> + <h1 class="w-60 d-flex justify-content-center text-center p-5 " + id="welcome"> + Suggestion de REL + </h1> + <p> + Vous avez trouvé ou créé une Ressource Éducative Libre ou une collection de REL ? Vous pouvez nous en informer en complétant ce formulaire. + </p> + <form action="/submission/" method="post"> + {{ form.url.errors }} + {{ form.keywords.errors }} + {{ form.licence.errors }} + {{ form.email.errors }} + <div class="row"> + <div class="form-group col-sm-12 col-md"> + {{ form.url.label }} + {{ form.url }} + </div> + <div class="form-group col-sm-12 col-md"> + {{ form.keywords.label }} + {{ form.keywords }} + </div> + </div> + {% csrf_token %} + <div class="row"> + <div class="form-group col-sm-12 col-md"> + {{ form.licence.label }} + {{ form.licence }} + </div> + <div class="form-group col-sm-12 col-md"> + {{ form.email.label }} + {{ form.email }} + </div> + </div> + <p>* : champ obligatoire</p> + <div class="row"> + <div class="col text-center"> + <input class="btn btn-primary" type="submit" value="Envoyer"> + </div> + </div> + </form> + </div> +</div> +{% endblock %} \ No newline at end of file diff --git a/catalog/urls.py b/catalog/urls.py index 720c8e0c002529893672cf5d84b3f69be224bff2..8a7d9ebf79a9798d187d610785a31f363231ac72 100644 --- a/catalog/urls.py +++ b/catalog/urls.py @@ -16,5 +16,6 @@ urlpatterns = [ path('unknown/', views.unknown, name='unknown'), path('faq/', views.faq, name='faq'), path('instructions/', views.instructions, name='instructions'), - path('thanks/', views.thanks, name='thanks') + path('thanks/', views.thanks, name='thanks'), + path('submission/', views.submission, name='submission') ] diff --git a/catalog/views.py b/catalog/views.py index fcc2687c40779d99b873729e2c75533afbd4598f..f9e3b75e89453320f7d446d1714eca6fe5d8ce8b 100644 --- a/catalog/views.py +++ b/catalog/views.py @@ -3,17 +3,18 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth import login, authenticate, get_user_model from django.conf import settings from django.http import JsonResponse - +from django.http import HttpResponseRedirect from django.db.models import Count, Q from random import sample -from .models import Subject, Resource, SubjectsSelection, Review, FAQItem, Hashtag +from .models import Subject, Resource, SubjectsSelection, Review, FAQItem, Hashtag, Submission, User import random from catalog import forms +from .forms import SubmissionForm @login_required def select_subjects(request): @@ -88,10 +89,27 @@ def about(request): def contact(request): return render(request, 'catalog/contact.html') - def thanks(request): return render(request, 'catalog/thanks.html') +def submission(request): + if request.method == "POST": + form = SubmissionForm(request.POST) + if form.is_valid(): + newSubmission = Submission( + url=form.cleaned_data.get("url"), + sender_keywords = form.cleaned_data.get("keywords"), + sender_email = form.cleaned_data.get("email"), + licence = form.cleaned_data.get("licence") + ) + if isinstance(request.user, User): + newSubmission.sender = request.user + newSubmission.save() + + return HttpResponseRedirect("/thanks") + else: + form = SubmissionForm() + return render(request, 'catalog/submission.html', {"form": form}) def instructions(request): return render(request, 'catalog/instructions.html',