diff --git a/modules/bibrank/lib/bibrank_downloads_grapher.py b/modules/bibrank/lib/bibrank_downloads_grapher.py index 96f929996..923114508 100644 --- a/modules/bibrank/lib/bibrank_downloads_grapher.py +++ b/modules/bibrank/lib/bibrank_downloads_grapher.py @@ -1,243 +1,243 @@ ## $Id$ ## This file is part of the CERN Document Server Software (CDSware). ## Copyright (C) 2002 CERN. ## ## The CDSware is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2 of the ## License, or (at your option) any later version. ## ## The CDSware is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with CDSware; if not, write to the Free Software Foundation, Inc., ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # -*- coding: utf-8 -*- ## DO NOT EDIT THIS FILE! IT WAS AUTOMATICALLY GENERATED FROM CDSware WML SOURCES. import string import os import sys import time import tempfile from config import weburl, cdslang from messages import msg_downloads_history from dbquery import run_sql from bibrank_downloads_indexer import database_tuples_to_single_list from bibrank_grapher import * color_line_list = ['9', '19', '10', '15', '21', '18'] cfg_id_bibdoc_id_bibrec = 5 cfg_bibrank_print_download_history = 1 cfg_bibrank_print_download_split_by_id = 0 def create_download_history_graph_and_box(id_bibrec, ln=cdslang): """Create graph with citation history for record ID_BIBREC (into a temporary file) and return HTML box refering to that image. Called by Detailed record pages. Notes: if id_bibrec=0 : its an oustide-stored document and it has no id_bibdoc --> only one line if nb_id_bibdoc <= cfg_id_bibdoc_id_bibrec draw one line per id_bibdoc if nb_id_bibdoc > cfg_id_bibdoc_id_bibrec draw only one line which hold simultaneously the downloads per id_bibdoc Each time this function is called, all the images older than 10 minutes are deleted. """ html_code = "" html_content = "" users_analysis_text = "" if cfg_bibrank_print_download_split_by_id: users_analysis_text = "and Users repartition" #remove images older than 10 minutes remove_old_img("download") #Users analysis graphe ips = database_tuples_to_single_list(run_sql("select client_host from rnkDOWNLOADS where id_bibrec=%s;" % id_bibrec)) if ips == []: pass else : users_analysis_results = create_users_analysis_graph(id_bibrec, ips) graphe_file_users = weburl + "/img/" + users_analysis_results[0] file_to_close_users = users_analysis_results[1] html_content += """""" % graphe_file_users if file_to_close_users: if os.path.exists(file_to_close_users): os.unlink(file_to_close_users) #Downloads history graphe and return html code used by get_file or search_engine if cfg_bibrank_print_download_history: remove_old_img("download") nb_id_bibdoc = run_sql("select distinct id_bibdoc from rnkDOWNLOADS where id_bibrec=%s;" % id_bibrec) history_analysis_results = () if nb_id_bibdoc == (): pass elif nb_id_bibdoc[0][0] <= cfg_id_bibdoc_id_bibrec and (0, ) not in nb_id_bibdoc: history_analysis_results = draw_downloads_statistics(id_bibrec, list(nb_id_bibdoc)) else: history_analysis_results = draw_downloads_statistics(id_bibrec, []) if history_analysis_results: graph_file_history = weburl + "/img/" + history_analysis_results[0] file_to_close_history = history_analysis_results[1] html_content += """""" % graph_file_history if file_to_close_history : if os.path.exists(file_to_close_history): os.unlink(file_to_close_history) out = "" if html_content != "": out += """

%s %s
- """ % (msg_downloads_history[ln], user_analysis_text) +
""" % (msg_downloads_history[ln], users_analysis_text) out += html_content out += "
" return out def draw_downloads_statistics(id_bibrec, id_bibdoc_list): """Create a graph about download history using a temporary file to store datas and a new png file for each id_bibrec to store the image of the graph which will be referenced by html code.""" intervals = [] #Will be used to name the different curves when len(id_bibdoc_list)>1 docfile_name_list = [] #Will be used to name the unique curve when len(id_bibdoc_list)=0 or > cfg_id_bibdoc_id_bibrec record_name = run_sql("select value from bibrec_bib24x,bib24x where id_bibrec=%s and id_bibxxx=id;" % id_bibrec)[0][0] #list of lists of tuples: [[("09/2004",4),..],[(..,..)]..] #Each list element of the list will be represented by a curve coordinates_list = [] #If the document is not stored in CdsWare it has id_bibrec 0 and no creation date #In this case the beginning date is the first time the document has been downloaded creation_date_res = run_sql("""SELECT DATE_FORMAT(creation_date,"%%Y-%%m-%%d") FROM bibrec WHERE id=%s;""" % id_bibrec) if creation_date_res == (): creation_date_res = run_sql("""SELECT DATE_FORMAT(MIN(download_time),"%%Y-%%m-%%d") FROM rnkDOWNLOADS where id_bibrec=%s;""" % id_bibrec) creation_date_year, creation_date_month, creation_date_day = string.split(creation_date_res[0][0], "-") creation_date_year = string.atoi(creation_date_year) creation_date_month = string.atoi(creation_date_month) creation_date_day = string.atoi(creation_date_day) #create intervals and corresponding values local_time = time.localtime() intervals = create_tic_intervals(local_time, creation_date_year, creation_date_month) if id_bibdoc_list == []: coordinates_list.append(create_list_tuple_data(creation_date_day, intervals, id_bibrec)) docfile_name_list = record_name else : for i in range(len(id_bibdoc_list)): datas = create_list_tuple_data(creation_date_day, intervals, id_bibrec, id_bibdoc_query_addition="and id_bibdoc=%s" % id_bibdoc_list[i][0]) coordinates_list.append(datas) docfile_name_list.append(run_sql("select docname from bibdoc where id=%s;" % id_bibdoc_list[i][0])[0][0]) #In case of multiple id_bibdocs datas_max will be used to draw a line which is the total of the others lines datas_max = create_list_tuple_total(intervals, coordinates_list) coordinates_list.append(datas_max) #write coordinates_list in a temporary file result2 = write_coordinates_in_tmp_file(coordinates_list) #Use the previous temporary file and some others parameters to create the graphe return create_temporary_image(id_bibrec, 'download_history', result2[0], '', 'Downloads/month', (0, 0), result2[1], id_bibdoc_list, docfile_name_list,intervals) def create_list_tuple_data(creation_date_day, intervals, id_bibrec, id_bibdoc_query_addition=""): """-Return a list of tuple of the form [('10/2004',3),(..)] which will be used to plot graph Where 3 is the number of downloads between 03/2004 and 04/2004""" list_tuple = [] text = "-%s 00:00:00" % (creation_date_day) for i in range(len(intervals)-1): act_str_interv = string.split(intervals[i+1], '/') prev_str_interv = string.split(intervals[i], '/') date1 = "%s-%s%s" % (prev_str_interv[1], prev_str_interv[0], text) date2 = "%s-%s%s" % (act_str_interv[1], act_str_interv[0], text) res = run_sql("select count(*) from rnkDOWNLOADS where id_bibrec=%s %s and download_time>='%s' and download_time<'%s';" \ % (id_bibrec, id_bibdoc_query_addition, date1, date2))[0][0] list_tuple.append((intervals[i], res)) list_tuple = sort_list_tuple_by_date(list_tuple) return (list_tuple) def sort_list_tuple_by_date(list_tuple): """Sort a list of tuple of the forme ("09/2004", 3)according to the year of the first element of the tuple""" list_tuple.sort(lambda x, y: (cmp(string.split(x[0], '/')[1], string.split(y[0], '/')[1]))) return list_tuple def create_list_tuple_total(intervals, list_data): """In the case of multiple id_bibdocs, a last paragraph is added at the end to show the global evolution of the record""" list_tuple = [] for i in range(len(intervals)-1): res = 0 for j in range(len(list_data)): res += list_data[j][i][1] list_tuple.append((intervals[i], res)) list_tuple = sort_list_tuple_by_date(list_tuple) return list_tuple def create_tic_intervals(local_time, creation_date_year, creation_date_month): """Create intervals since document creation date until now Return a list of the form ["04/2004", "05/2004", ...]. Note: make sure that at least two dates are returned. Useful for drawing graphs. """ # safety belt: diminish the creation_date_month by one to make sure that # we shall have at least two output values creation_date_month = creation_date_month - 1 if creation_date_month == 0: creation_date_month = 12 creation_date_year = creation_date_year - 1 # okay, off we go list_result = [] local_month = local_time.tm_mon local_year = local_time.tm_year y_period = local_year - creation_date_year - 1 m_period = 12 - creation_date_month period = (y_period * 12) + local_month + m_period counter = 1 if period > 12 and period <= 36: #compute every 3 months counter = 3 elif period > 36 and period <= 60: #compute every 6 months counter = 6 elif period > 60: #compute every year counter = 12 c = 1 while (creation_date_year, creation_date_month) <= (local_year, local_month) and creation_date_month <= 12: if c == counter : list_result.append("%s/%s" % (creation_date_month, creation_date_year)) c = 1 else : c += 1 if creation_date_month != 12: creation_date_month = creation_date_month+1 else : creation_date_year = creation_date_year+1 creation_date_month = 1 return list_result def create_users_analysis_graph(id_bibrec, ips): """For a given id_bibrec, classify cern users and other users Draw a percentage graphic reprentation""" cern_users = 0 other_users = 0 coordinates_list = [] #compute users repartition for i in range(len(ips)): if 2307522817 <= ips[i] <= 2307588095 or 2156724481 <= ips[i] <= 2156789759: cern_users += 1 else : other_users += 1 tot = float(cern_users+other_users) #prepare coordinates list coordinates_list.append((1, str(float(cern_users)/tot*100))) coordinates_list.append((3, str(float(other_users)/tot*100))) #write coordinates in a temporary file result2 = write_coordinates_in_tmp_file([coordinates_list]) #plot the graphe return create_temporary_image(id_bibrec, 'download_users', result2[0], '', '', (0, 0), result2[1], [], [], [1, 3])
diff --git a/modules/bibrank/lib/bibrank_downloads_grapher.py.wml b/modules/bibrank/lib/bibrank_downloads_grapher.py.wml index 96f929996..923114508 100644 --- a/modules/bibrank/lib/bibrank_downloads_grapher.py.wml +++ b/modules/bibrank/lib/bibrank_downloads_grapher.py.wml @@ -1,243 +1,243 @@ ## $Id$ ## This file is part of the CERN Document Server Software (CDSware). ## Copyright (C) 2002 CERN. ## ## The CDSware is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2 of the ## License, or (at your option) any later version. ## ## The CDSware is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with CDSware; if not, write to the Free Software Foundation, Inc., ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # -*- coding: utf-8 -*- ## DO NOT EDIT THIS FILE! IT WAS AUTOMATICALLY GENERATED FROM CDSware WML SOURCES. import string import os import sys import time import tempfile from config import weburl, cdslang from messages import msg_downloads_history from dbquery import run_sql from bibrank_downloads_indexer import database_tuples_to_single_list from bibrank_grapher import * color_line_list = ['9', '19', '10', '15', '21', '18'] cfg_id_bibdoc_id_bibrec = 5 cfg_bibrank_print_download_history = 1 cfg_bibrank_print_download_split_by_id = 0 def create_download_history_graph_and_box(id_bibrec, ln=cdslang): """Create graph with citation history for record ID_BIBREC (into a temporary file) and return HTML box refering to that image. Called by Detailed record pages. Notes: if id_bibrec=0 : its an oustide-stored document and it has no id_bibdoc --> only one line if nb_id_bibdoc <= cfg_id_bibdoc_id_bibrec draw one line per id_bibdoc if nb_id_bibdoc > cfg_id_bibdoc_id_bibrec draw only one line which hold simultaneously the downloads per id_bibdoc Each time this function is called, all the images older than 10 minutes are deleted. """ html_code = "" html_content = "" users_analysis_text = "" if cfg_bibrank_print_download_split_by_id: users_analysis_text = "and Users repartition" #remove images older than 10 minutes remove_old_img("download") #Users analysis graphe ips = database_tuples_to_single_list(run_sql("select client_host from rnkDOWNLOADS where id_bibrec=%s;" % id_bibrec)) if ips == []: pass else : users_analysis_results = create_users_analysis_graph(id_bibrec, ips) graphe_file_users = weburl + "/img/" + users_analysis_results[0] file_to_close_users = users_analysis_results[1] html_content += """""" % graphe_file_users if file_to_close_users: if os.path.exists(file_to_close_users): os.unlink(file_to_close_users) #Downloads history graphe and return html code used by get_file or search_engine if cfg_bibrank_print_download_history: remove_old_img("download") nb_id_bibdoc = run_sql("select distinct id_bibdoc from rnkDOWNLOADS where id_bibrec=%s;" % id_bibrec) history_analysis_results = () if nb_id_bibdoc == (): pass elif nb_id_bibdoc[0][0] <= cfg_id_bibdoc_id_bibrec and (0, ) not in nb_id_bibdoc: history_analysis_results = draw_downloads_statistics(id_bibrec, list(nb_id_bibdoc)) else: history_analysis_results = draw_downloads_statistics(id_bibrec, []) if history_analysis_results: graph_file_history = weburl + "/img/" + history_analysis_results[0] file_to_close_history = history_analysis_results[1] html_content += """""" % graph_file_history if file_to_close_history : if os.path.exists(file_to_close_history): os.unlink(file_to_close_history) out = "" if html_content != "": out += """

%s %s
- """ % (msg_downloads_history[ln], user_analysis_text) +
""" % (msg_downloads_history[ln], users_analysis_text) out += html_content out += "
" return out def draw_downloads_statistics(id_bibrec, id_bibdoc_list): """Create a graph about download history using a temporary file to store datas and a new png file for each id_bibrec to store the image of the graph which will be referenced by html code.""" intervals = [] #Will be used to name the different curves when len(id_bibdoc_list)>1 docfile_name_list = [] #Will be used to name the unique curve when len(id_bibdoc_list)=0 or > cfg_id_bibdoc_id_bibrec record_name = run_sql("select value from bibrec_bib24x,bib24x where id_bibrec=%s and id_bibxxx=id;" % id_bibrec)[0][0] #list of lists of tuples: [[("09/2004",4),..],[(..,..)]..] #Each list element of the list will be represented by a curve coordinates_list = [] #If the document is not stored in CdsWare it has id_bibrec 0 and no creation date #In this case the beginning date is the first time the document has been downloaded creation_date_res = run_sql("""SELECT DATE_FORMAT(creation_date,"%%Y-%%m-%%d") FROM bibrec WHERE id=%s;""" % id_bibrec) if creation_date_res == (): creation_date_res = run_sql("""SELECT DATE_FORMAT(MIN(download_time),"%%Y-%%m-%%d") FROM rnkDOWNLOADS where id_bibrec=%s;""" % id_bibrec) creation_date_year, creation_date_month, creation_date_day = string.split(creation_date_res[0][0], "-") creation_date_year = string.atoi(creation_date_year) creation_date_month = string.atoi(creation_date_month) creation_date_day = string.atoi(creation_date_day) #create intervals and corresponding values local_time = time.localtime() intervals = create_tic_intervals(local_time, creation_date_year, creation_date_month) if id_bibdoc_list == []: coordinates_list.append(create_list_tuple_data(creation_date_day, intervals, id_bibrec)) docfile_name_list = record_name else : for i in range(len(id_bibdoc_list)): datas = create_list_tuple_data(creation_date_day, intervals, id_bibrec, id_bibdoc_query_addition="and id_bibdoc=%s" % id_bibdoc_list[i][0]) coordinates_list.append(datas) docfile_name_list.append(run_sql("select docname from bibdoc where id=%s;" % id_bibdoc_list[i][0])[0][0]) #In case of multiple id_bibdocs datas_max will be used to draw a line which is the total of the others lines datas_max = create_list_tuple_total(intervals, coordinates_list) coordinates_list.append(datas_max) #write coordinates_list in a temporary file result2 = write_coordinates_in_tmp_file(coordinates_list) #Use the previous temporary file and some others parameters to create the graphe return create_temporary_image(id_bibrec, 'download_history', result2[0], '', 'Downloads/month', (0, 0), result2[1], id_bibdoc_list, docfile_name_list,intervals) def create_list_tuple_data(creation_date_day, intervals, id_bibrec, id_bibdoc_query_addition=""): """-Return a list of tuple of the form [('10/2004',3),(..)] which will be used to plot graph Where 3 is the number of downloads between 03/2004 and 04/2004""" list_tuple = [] text = "-%s 00:00:00" % (creation_date_day) for i in range(len(intervals)-1): act_str_interv = string.split(intervals[i+1], '/') prev_str_interv = string.split(intervals[i], '/') date1 = "%s-%s%s" % (prev_str_interv[1], prev_str_interv[0], text) date2 = "%s-%s%s" % (act_str_interv[1], act_str_interv[0], text) res = run_sql("select count(*) from rnkDOWNLOADS where id_bibrec=%s %s and download_time>='%s' and download_time<'%s';" \ % (id_bibrec, id_bibdoc_query_addition, date1, date2))[0][0] list_tuple.append((intervals[i], res)) list_tuple = sort_list_tuple_by_date(list_tuple) return (list_tuple) def sort_list_tuple_by_date(list_tuple): """Sort a list of tuple of the forme ("09/2004", 3)according to the year of the first element of the tuple""" list_tuple.sort(lambda x, y: (cmp(string.split(x[0], '/')[1], string.split(y[0], '/')[1]))) return list_tuple def create_list_tuple_total(intervals, list_data): """In the case of multiple id_bibdocs, a last paragraph is added at the end to show the global evolution of the record""" list_tuple = [] for i in range(len(intervals)-1): res = 0 for j in range(len(list_data)): res += list_data[j][i][1] list_tuple.append((intervals[i], res)) list_tuple = sort_list_tuple_by_date(list_tuple) return list_tuple def create_tic_intervals(local_time, creation_date_year, creation_date_month): """Create intervals since document creation date until now Return a list of the form ["04/2004", "05/2004", ...]. Note: make sure that at least two dates are returned. Useful for drawing graphs. """ # safety belt: diminish the creation_date_month by one to make sure that # we shall have at least two output values creation_date_month = creation_date_month - 1 if creation_date_month == 0: creation_date_month = 12 creation_date_year = creation_date_year - 1 # okay, off we go list_result = [] local_month = local_time.tm_mon local_year = local_time.tm_year y_period = local_year - creation_date_year - 1 m_period = 12 - creation_date_month period = (y_period * 12) + local_month + m_period counter = 1 if period > 12 and period <= 36: #compute every 3 months counter = 3 elif period > 36 and period <= 60: #compute every 6 months counter = 6 elif period > 60: #compute every year counter = 12 c = 1 while (creation_date_year, creation_date_month) <= (local_year, local_month) and creation_date_month <= 12: if c == counter : list_result.append("%s/%s" % (creation_date_month, creation_date_year)) c = 1 else : c += 1 if creation_date_month != 12: creation_date_month = creation_date_month+1 else : creation_date_year = creation_date_year+1 creation_date_month = 1 return list_result def create_users_analysis_graph(id_bibrec, ips): """For a given id_bibrec, classify cern users and other users Draw a percentage graphic reprentation""" cern_users = 0 other_users = 0 coordinates_list = [] #compute users repartition for i in range(len(ips)): if 2307522817 <= ips[i] <= 2307588095 or 2156724481 <= ips[i] <= 2156789759: cern_users += 1 else : other_users += 1 tot = float(cern_users+other_users) #prepare coordinates list coordinates_list.append((1, str(float(cern_users)/tot*100))) coordinates_list.append((3, str(float(other_users)/tot*100))) #write coordinates in a temporary file result2 = write_coordinates_in_tmp_file([coordinates_list]) #plot the graphe return create_temporary_image(id_bibrec, 'download_users', result2[0], '', '', (0, 0), result2[1], [], [], [1, 3])