diff --git a/hal/forms.py b/hal/forms.py index 08c7ade814e2d4fc97cdd0a55012ef809f1b70e9..045ecd717b451a7bc08556c017c95ba3822bbacd 100644 --- a/hal/forms.py +++ b/hal/forms.py @@ -172,6 +172,12 @@ class Csvformat2halForm(forms.Form): domains2 = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=CHOICES_DOMAINS2, label="Autres domaines", initial='info.info-gt',required=False) +class SearchDataHalForm(forms.Form): + mail_response = forms.CharField(required=True, max_length=40, label="Adresse mail de retour résultats") + annee_debut = forms.IntegerField(required=True, label="Année de début de la recherche", initial = 2015) + annee_fin = forms.IntegerField(required=True, label="Année de fin de la recherche", initial = 2022) + users_hal = forms.CharField(required=True, label="Liste utilisateurs", widget=forms.Textarea(attrs={'rows':5, 'cols':80}),) + class Text2halForm(forms.Form): form_author = forms.CharField(required=True, max_length=40, label="Forme auteur (*)") diff --git a/hal/management/commands/search_hal_data.py b/hal/management/commands/search_hal_data.py new file mode 100644 index 0000000000000000000000000000000000000000..cc91708978a14fb5a7ee2dc0436f3f022a167947 --- /dev/null +++ b/hal/management/commands/search_hal_data.py @@ -0,0 +1,117 @@ +#################################### +# Script create CSV SCIMago +#################################### +# SCIMAGO et CORE sont des agences de notation de journaux et conferences scientifiques +# SCIMAGO est generaliste et donne des notes Q1, Q2, Q3 et Q4 et ne note que les journaux +# https://www.scimagojr.com/ +# CORE est specialise en informatique et donne des notes A*, A, B et C et note journaux et conferences +# http://portal.core.edu.au/conf-ranks/ +# +# Ce script permet la creation de CSV contenant pour les journaux le titre et la note, et pour les conferences, le titre, l'acronyme et la note +# Principe : +# - on telecharge des CSV a partir d'URL dans des fichiers +# - on parse les CSV en recuperant les infos souhaitees (titre et note ou titre, acronyme et note) dans une ou des listes +# - on reconstruit un CSV a partir de la ou les listes +# +# Pour SCIMAGO, les journaux sont recuperes par annee et 3 domaines sont analyses (donc 3 URL de telechargement par annee) Computer Science, Mats et Engineering +# Pour CORE, les conf sont recuperes par annee mais une seule base pour les journaux +#################################### + +from django.core.management.base import BaseCommand, CommandError +from haltools.settings import BASE_DIR +from hal.dict_scimago_core import dict_scimago, dict_core +import requests +import csv +import os + +########### +# VARIABLES +########### + +path_csv = str(BASE_DIR+"/") +# Compteurs + + +class Command(BaseCommand): + help = "renew all Scimago and Core CSV files from dictionaries in dict_scimago_core" + + def handle(self, *args, **options): + csvf = "EC-isima-total.csv" + listpub = [] + with open(csvf, 'r') as myfile: + readfile = csv.reader(myfile, delimiter=',') + + for row in readfile : + nom = row[0].capitalize() + prenom = row[1].capitalize() + idhal = row[2] + + if len(idhal) > 0 : + url = "https://api.archives-ouvertes.fr/search/?q=authIdHal_s:{0}&start=0&rows=200&fl=uri_s,halId_s,docType_s,producedDate_s,title_s&wt=json&fq=producedDateY_i:[2018%20TO%202023]".format(idhal) + + if len(idhal) == 0 : + url = 'https://api.archives-ouvertes.fr/search/?q=authLastNameFirstName_s:"{0}+{1}"&start=0&rows=200&fl=uri_s,halId_s,docType_s,producedDate_s,title_s&wt=json&fq=producedDateY_i:[2018%20TO%202023]'.format(nom,prenom) + #url = "https://api.archives-ouvertes.fr/search/?q=authFullName_s:{0} {1}&start=0&rows=200&fl=uri_s,halId_s,docType_s,producedDate_s,title_s&wt=json&fq=producedDateY_i:[2018%20TO%202023]".format(nom,prenom) + print(url) + req = requests.get(url) + + self.stdout.write(self.style.SUCCESS("code HTTP {0}".format(req.status_code))) + #print (req.status_code) + #print (req.headers['content-type']) + if (req.status_code == 200) : + try : + json = req.json() + # recup en json et on se place dans response puis docs + tous_docs = json['response']['docs'] + + # pour chaque element de 'docs', on recupere les elements de la publi que l'on place dans publilist + cptpub=0 + for doc in tous_docs: + #print ("lecture reponse") + cptpub+=1 + + + #recup halId + recup_halId = doc["halId_s"] + #halid = recup_halId#'\"{0}\"'.format(recup_halId) + + # recup url + uri = doc["uri_s"] + #uri = '\"{0}\"'.format(uri) + + #recup doctype + doctype = doc["docType_s"] + #doctype = '\"{0}\"'.format(doctype) + + #recup title + title = doc["title_s"] + title[0].encode("utf-8") + titlefinal = title[0].replace("\""," ") + + producedDate = doc["producedDate_s"] + + print("{0} {1} -> {2} {3} {4} {5} {6}".format(nom, prenom, titlefinal, recup_halId, uri,doctype, producedDate)) + listpub.append((nom, prenom, titlefinal, recup_halId, uri,doctype, producedDate )) + except Exception as e : + print("Problem JSON pour {0} {1}".format(nom,prenom)) + else : + print("Problem requete pour {0} {1}".format(nom,prenom)) + + with open("resultat_searchhaldata.csv", 'w') as myfile: + writefile = csv.writer(myfile, delimiter=',') + + for pub in listpub : + nom = pub[0] + prenom = pub[1] + titre = pub[2] + halid = pub[3] + uri = pub[4] + doctype = pub[5] + datepub = pub[6] + writefile.writerow([nom, prenom, titre, halid, uri, doctype, datepub]) + + + print ("") + print ("FIN") + + diff --git a/hal/templates/base.html b/hal/templates/base.html index f01caba4e1a04e17163f51e35b4406929551eed2..00ddf07ee52308235d3896fa06b77a3d36a2d0c7 100644 --- a/hal/templates/base.html +++ b/hal/templates/base.html @@ -52,6 +52,10 @@ <a class="nav-link" href="{% url "verifhalconf_ranking" %}">Fix_Hal_Ranking</a> </li> + <li class="nav-item"> + <a class="nav-link" href="{% url "search_hal_data" %}">Search_Data_Hal</a> + </li> + <li class="nav-item"> <a class="nav-link" href="{% url "aide" %}">Aide</a> </li> diff --git a/hal/templates/hal/index.html b/hal/templates/hal/index.html index 610419fdd8f880ed3a94ebbff2b918d730eeda5e..9af6f6c0efbd0982261d0cad3f0f1a6dc012cc05 100644 --- a/hal/templates/hal/index.html +++ b/hal/templates/hal/index.html @@ -16,7 +16,7 @@ <h4 align="justify"> - Ce site permet à des enseignants chercheurs d'utiliser des outils d'imports massifs de publications dans HAL + Ce site permet à des enseignants chercheurs d'utiliser des outils de recherche ou d'imports massifs de publications dans HAL <br/> <br/> <div class="alert alert-dismissible alert-danger"> @@ -48,6 +48,8 @@ <br/> - <a href="https://www.scimagojr.com/" target="_blank">Scimago</a> pour les noms des journaux, <a href="http://portal.core.edu.au/conf-ranks/" target="_blank">Core ranking</a> pour les noms des conférences <br/><br/> + <b>Search_Data_Hal</b> permet de récupérer des publications à partir d'une liste d'idHal : + <br/><br/> <div class="alert alert-dismissible alert-primary"> diff --git a/hal/templates/hal/searchdatahal.html b/hal/templates/hal/searchdatahal.html new file mode 100644 index 0000000000000000000000000000000000000000..47650099b75a115ad48901c4dffb1b176a2484f6 --- /dev/null +++ b/hal/templates/hal/searchdatahal.html @@ -0,0 +1,89 @@ +{% extends "base.html" %} +{% load static %} +{% load bootstrap3 %} +{% load bootstrap_themes %} + +{% block head %} +<head> + <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> + <link rel="shortcut icon" href="{% static 'imgsite/favicon.ico' %}"> + <title>ImportHAL</title> + +</head> +{% endblock %} + +{% block content %} +<h3>Search Data HAL</h3> + <br/> + {% if user.is_authenticated %} + + {% if messages %} + {% for message in messages %} + <div style="color:red"><b>{{ message }} </b></div> + {% endfor %} + <br/> + {% endif %} + + <p align="left">Recherche de publications dans HAL à pârtir des idHal des auteurs + <br/> + Indiquez une adresse mail de récupération et bornez la recherche entre deux années (ex de 2018 à 2022) + <br/> + Indiquez aussi une liste des idHal d'auteurs de publications séparés par des virgules comme dans l'exemple ci-dessous + <br/> + <i>albert-durand,jean-dupont,celine-duchemin</i> + <br/> + Une recherche est effectuée sur les différents idhal et la réponse vous est envoyée par mail. + <div class="well bs-component"> + <form action="{% url "search_hal_data" %}" method="post"> + {% csrf_token %} + + <div class="row"> + + <!-- 1e ligne --> + + <div class="col-lg-4"> + <div class="fieldWrapper"> + {{ form.mail_response.errors }} + {{ form.mail_response.label_tag }}<br/> + {{ form.mail_response }} + </div> + </div> + + <div class="col-lg-4"> + <div class="fieldWrapper"> + {{ form.annee_debut.errors }} + {{ form.annee_debut.label_tag }}<br/> + {{ form.annee_debut }} + </div> + </div> + + <div class="col-lg-4"> + <div class="fieldWrapper"> + {{ form.annee_fin.errors }} + {{ form.annee_fin.label_tag }}<br/> + {{ form.annee_fin }} + </div> + </div> + + <div class="col-lg-12"> + <div class="fieldWrapper"> + {{ form.users_hal.errors }} + {{ form.users_hal.label_tag }}<br/> + {{ form.users_hal }} + </div> + </div> + </div> + + + <input type="submit" class="btn btn-primary" value="Submit" /> + </form> + </div> + + + {% else %} + + <br/> + + {% endif %} + +{% endblock %} diff --git a/hal/urls.py b/hal/urls.py index 9c775ef36491c61474fc5bffe6b4d90cb137c70e..75de25c4947e577c174da1e18018a3e7347e6a07 100644 --- a/hal/urls.py +++ b/hal/urls.py @@ -18,6 +18,8 @@ urlpatterns = [ #url(r'^bibtexxml$', views.bibtexxml, name='bibtexxml'), url(r'^csv2hal$', views.csv2hal, name='csv2hal'), url(r'^valid_post_hal$', views.valid_post_hal, name='valid_post_hal'), + + url(r'^searchdatahal$', views.search_hal_data, name='search_hal_data'), #url(r'^text2hal$', views.text2hal, name='text2hal'), #url(r'^textxml$', views.textxml, name='textxml'), diff --git a/hal/views.py b/hal/views.py index abfa21b5fa9b19060ec579ae5026804aa54fc538..c4112e0908a0c448c89f5780ad242e327eb850df 100644 --- a/hal/views.py +++ b/hal/views.py @@ -9,7 +9,7 @@ from django.contrib.auth import authenticate, login, logout from django.contrib import messages from django.core.checks.messages import Error -from .forms import ConnexionForm, Bibtex2halForm, BibtexXmlForm, Csv2halForm, VerifHalConfForm, Bibformat2halForm ,\ +from .forms import ConnexionForm, Bibtex2halForm, BibtexXmlForm, Csv2halForm, VerifHalConfForm, Bibformat2halForm ,SearchDataHalForm, \ TextXmlForm, ModifTextForm,TextFromRG, Text2halForm from haltools.settings import MEDIA_ROOT @@ -19,6 +19,7 @@ from .scripts_bibtex import script_bibtex_2_hal from .scripts_csv import script_csv_2_hal from .scriptupdatehalranking import script_verify_hal_ranking #, script_verif_hal_ranking from .create_xml2hal import sendselect_2hal +from .searchdatahal import searchdatahal from slugify import slugify from datetime import datetime @@ -471,6 +472,36 @@ def csv2hal(request): +################################################################################################################################## +## SEARCHHALDATA ################################################################################################################ +################################################################################################################################## + + +def search_hal_data(request): + + reponse = "" + csvfile = "" + form = SearchDataHalForm(request.POST or None) + + if form.is_valid(): + mail_response = form.cleaned_data['mail_response'] + annee_debut = form.cleaned_data['annee_debut'] + annee_fin = form.cleaned_data['annee_fin'] + users_hal = form.cleaned_data['users_hal'] + + if int(annee_debut) >= int(annee_fin) : + msg_to_announce = "Problème : l'année de début doit être inférieure à l'année de fin {0}".format(mail_response) + + else : + searchdatahal.delay(mail_response, annee_debut, annee_fin, users_hal) + + msg_to_announce = "Un mail vous sera envoyé à l'adresse suivante : {0}".format(mail_response) + + messages.add_message(request, messages.WARNING, msg_to_announce) + + return render(request, 'hal/searchdatahal.html', locals()) + + ################################################################################################################################## ## TEXT2HAL ##################################################################################################################### ##################################################################################################################################