File: utils.py

package info (click to toggle)
slm 2.12-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,520 kB
  • sloc: python: 15,419; javascript: 5,061; makefile: 184; sh: 182; xml: 57
file content (120 lines) | stat: -rw-r--r-- 3,557 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from io import BytesIO, StringIO

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

import pandas as pd

from numpy import nan_to_num
from base64 import b64encode
from subprocess import Popen, PIPE

from django.utils.translation import gettext as _

def svg_histogram(r, title="", label="", bins = 10):
    """
    Création d'un histogramme au format SVG
    
    @param r une série de données entières
    @param title le titre de la figure
    @param label précision du type de données que l'on compte
    @parameter bins est directement passé à pyplot.hist (10 par défaut)
    @return une chaîne de caractères
    """
    if not r:
        return None
    matplotlib.use('agg')
    plt.rcParams['svg.fonttype'] = 'none'
    plt.hist(r, label=label, bins=bins)
    plt.legend(frameon=False)
    plt.title(title)
    f = BytesIO()
    plt.savefig(f, format="svg")
    plt.clf() # reset pyplot
    plt.cla()
    plt.close()
    return f.getvalue().decode("utf-8")

def demo_svg_histogram():
    import numpy as np
    np.random.seed(19680801)
    r = np.random.randn(1000)
    with open ("svg_histogram.svg", "w") as outfile:
        outfile.write(svg_histogram(
            r, _("Voici un histogramme."), _('Nombre de livres prêtés')
        ))
    return

def svg_actions_datees(dates, name=""):
    """
    Création d'un graphique au format SVG, qui présente une frise
    chronologique des nombres d'actions, regroupées par dates ; l'axe
    vertical est logarithmique

    @param dates une série de dates (une par action, la répétition de dates
                 est possible)
    @param name un label expliquant le nature des dates
    @return une chaîne de caractères
    """
    name = str(name) if name else _("date de ...")
    matplotlib.use('agg')
    plt.rcParams['svg.fonttype'] = 'none'
    f = StringIO()
    f.write(name + "\n")
    for d in dates:
        f.write(str(d)+"\n")
    f.seek(0)
    les_dates = pd.read_csv(f, parse_dates=[name])
    s = les_dates.groupby(les_dates[name])[name].count()
    s = s.resample("1d").apply({_("compte"): lambda x: sum(nan_to_num(x))})
    fig,ax1 = plt.subplots()

    plt.plot(s.index, s.values)
    plt.title(_("nombre d'opérations, selon la {d}").format(d = name))

    plt.yscale("log")
    ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
    plt.xticks(rotation=30)

    f = BytesIO()
    plt.savefig(f, format="svg")
    plt.clf() # reset pyplot
    plt.cla()
    plt.close()
    return f.getvalue().decode("utf-8")

def demo_svg_actions_datees():
    from .models import Prets
    with open ("svg_dates_prets.svg", "w") as outfile:
        outfile.write(svg_actions_datees(
            (p.date_pret for p in Prets.objects.all()),
            _("date de prêt")
        ))
    return

def urlToQrcode(url):
    """
    Transforme une URL en un QR-Code
    @param url l'URL à encoder
    @return le code source d'un élément <img>
    """
    command = [
        'qrencode',
        '-o', '-',   # to stdout
        '-s', '6',   # pixel size
        '-l', 'H',   # highest correction level
        '-m', '8',   # margin size
        '-t', 'PNG', # type PNG
        '--background=FFFFFF',
        url          # url to encode
    ]
    p = Popen(command, stdout=PIPE, stderr=PIPE)
    outs, errs = p.communicate()
    qrcode = f"<img src='data:image/png;base64, {b64encode(outs).decode()}' "+ \
        "alt='Qr-code'/>"
    return qrcode

if __name__ == "__main__":
    # demo_svg_histogram()
    demo_svg_actions_datees()