proto.py 7.8 KB
Newer Older
Steinert's avatar
Steinert committed
1 2 3 4 5
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Nov 24 15:35:04 2017

6
@author: Lorenz Steinert
Steinert's avatar
Steinert committed
7 8 9
"""

import re
Lorenz Steinert's avatar
Lorenz Steinert committed
10
import os
11
import sys
Lorenz Steinert's avatar
Lorenz Steinert committed
12
import shutil
Lorenz Steinert's avatar
Lorenz Steinert committed
13
import codecs
Lorenz Steinert's avatar
Lorenz Steinert committed
14
import argparse
15
from module.esme import FsrLdap, get_date, get_sprecher, get_config, get_share, get_path, get_ldap_server, get_ldap_base, get_server_timeout
Lorenz Steinert's avatar
Lorenz Steinert committed
16

Lorenz Steinert's avatar
Lorenz Steinert committed
17

Lorenz Steinert's avatar
Lorenz Steinert committed
18 19 20 21
def build_parser():
    """definition for the cli-arguments of the skript"""
    parser = argparse.ArgumentParser(description="Create Protokoll")
    parser.add_argument('-d', '--debug', '-v', '--verbose',
Lorenz Steinert's avatar
Lorenz Steinert committed
22
                        action='store_true', help='enable debug mode')
Lorenz Steinert's avatar
Lorenz Steinert committed
23
    parser.add_argument('-VV', '--Vollversamlung',
Lorenz Steinert's avatar
Lorenz Steinert committed
24
                        action='store_true', help='gennerate VV Protokoll')
Lorenz Steinert's avatar
Lorenz Steinert committed
25
    parser.add_argument('-t', '--test',
Lorenz Steinert's avatar
Lorenz Steinert committed
26
                        action='store_true', help='enable test mode')
Lorenz Steinert's avatar
Lorenz Steinert committed
27 28 29
    parser.add_argument('-p', '--path', help='set the protokoll directory')
    parser.add_argument('-c', '--config', help='set the config file')
    parser.add_argument('-s', '--sharedir', help='set the share directory')
30 31
    parser.add_argument('-S', '--Server', help='set the ldap Server')
    parser.add_argument('-b', '--base', help='set the ldap Server search base')
Lorenz Steinert's avatar
Lorenz Steinert committed
32 33 34 35 36 37

    return parser.parse_args()


def gen_head(share_dir, reg, sprecher, protokollant, date):
    """generate the head of the protokoll"""
Lorenz Steinert's avatar
Lorenz Steinert committed
38
    #look for the name.tex and if not found ignore it
39 40 41 42 43
    if os.path.isfile(os.path.join(share_dir, 'name.tex')):
        with codecs.open(os.path.join(share_dir, 'name.tex'),
                         'r', 'utf-8') as fobj_name:
            f_name = fobj_name.read()
    else:
44 45
        print(os.path.abspath(os.path.join(share_dir, 'name.tex'))
              + " not found. Ignoring")
46 47
        f_name = ""

Lorenz Steinert's avatar
Lorenz Steinert committed
48 49
    #look for the acroname.tex and the acro.tex if one is not found
    #ignore both
50
    if (os.path.isfile(os.path.join(share_dir, 'acroname.tex'))
51 52
            and os.path.isfile(os.path.join(share_dir, 'acro.tex'))):

53 54 55 56 57 58 59 60
        with codecs.open(os.path.join(share_dir, 'acroname.tex'),
                         'r', 'utf-8') as fobj_acroname:
            f_acroname = fobj_acroname.read()

        with codecs.open(os.path.join(share_dir, 'acro.tex'),
                         'r', 'utf-8') as fobj_acro:
            f_acro = fobj_acro.read()
    else:
61
        print(os.path.abspath(os.path.join(share_dir, 'acroname.tex'))
62 63
              + " or "
              + os.path.abspath(os.path.join(share_dir, 'acro.tex'))
64
              + " not found. Ignoring")
65 66 67
        f_acroname = ""
        f_acro = ""

68
    #look for teh head.tex and abort if it is not found
69 70 71 72 73 74 75 76
    if os.path.isfile(os.path.join(share_dir, 'head.tex')):
        with codecs.open(os.path.join(share_dir, 'head.tex'),
                         'r', 'utf-8') as fobj_head:
            f_head = fobj_head.read()
    else:
        print(os.path.abspath(os.path.join(share_dir, 'head.tex'))
              + " not found. Aborting!")
        sys.exit(1)
Lorenz Steinert's avatar
Lorenz Steinert committed
77

Lorenz Steinert's avatar
Lorenz Steinert committed
78
    #Replace the paceholder strings with the files
Lorenz Steinert's avatar
Lorenz Steinert committed
79 80 81 82 83 84 85 86 87 88
    f_head = reg['FSRN'].sub(f_name, f_head)
    f_head = reg['ACRON'].sub(f_acroname, f_head)
    f_head = reg['ACRO'].sub(f_acro, f_head)
    f_head = reg['SPR'].sub(sprecher, f_head)
    f_head = reg['PRO'].sub(protokollant, f_head)
    f_head = reg['DATE'].sub(date[0], f_head)

    return f_head


Lorenz Steinert's avatar
Lorenz Steinert committed
89
def gen_attendance_tab(fsr, num_cols=5, ext=False):
Lorenz Steinert's avatar
Lorenz Steinert committed
90
    """generate the atandance tables"""
Lorenz Steinert's avatar
Lorenz Steinert committed
91

Lorenz Steinert's avatar
Lorenz Steinert committed
92
    tabdef = '||' + 'c|l||' * num_cols
Lorenz Steinert's avatar
Lorenz Steinert committed
93

Lorenz Steinert's avatar
Lorenz Steinert committed
94 95
    fsr_tab = ''

Lorenz Steinert's avatar
Lorenz Steinert committed
96 97 98 99 100 101 102 103
    if ext:
        fsr_tab += "Externe Referenten\\\\\n\\\\\n" \
                   + r"\scriptsize{\begin{tabular}{" \
                   + tabdef + "}\n\\hline\n"
    else:
        fsr_tab += "FSR-Mitglieder\\\\\n\\\\\n\\scriptsize{\\begin{tabular}{" \
                   + tabdef + "}\n\\hline\n"

Lorenz Steinert's avatar
Lorenz Steinert committed
104 105
    for elem, index in zip(fsr, range(len(fsr))):
        if index % num_cols == 0:
Lorenz Steinert's avatar
Lorenz Steinert committed
106 107 108 109
            fsr_tab += " "
        else:
            fsr_tab += "&"

Lorenz Steinert's avatar
Lorenz Steinert committed
110
        fsr_tab += "  &" + elem
Lorenz Steinert's avatar
Lorenz Steinert committed
111

Lorenz Steinert's avatar
Lorenz Steinert committed
112
        if index % num_cols == num_cols - 1:
Lorenz Steinert's avatar
Lorenz Steinert committed
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
            fsr_tab += "\\\\\\hline\n"
        else:
            fsr_tab += "\n"

    if ext:
        fsr_tab += "\\end{tabular}}\\normalsize"
    else:
        fsr_tab += r"\end{tabular}}\normalsize\vspace{1em}"
        fsr_tab += "\n\\newline\n"

    return fsr_tab


def gen_foot(share_dir, vollversamlung, reg, sprecher, protokollant, date):
    """generate the foot of the protokoll"""
Lorenz Steinert's avatar
Lorenz Steinert committed
128 129
    #look for the foot*.tex skripts
    # if not found abort
Lorenz Steinert's avatar
Lorenz Steinert committed
130
    if vollversamlung:
131 132 133 134 135 136 137 138
        if os.path.isfile(os.path.join(share_dir, 'foot_VV.tex')):
            with codecs.open(os.path.join(share_dir, 'foot_VV.tex'),
                             'r', 'utf-8') as fobj_foot:
                f_foot = fobj_foot.read()
        else:
            print(os.path.abspath(os.path.join(share_dir, 'foot_VV.tex'))
                  + " not found. Aborting")
            sys.exit(1)
Lorenz Steinert's avatar
Lorenz Steinert committed
139
    else:
140 141 142 143 144 145 146 147
        if os.path.isfile(os.path.join(share_dir, 'foot.tex')):
            with codecs.open(os.path.join(share_dir, 'foot.tex'),
                             'r', 'utf-8') as fobj_foot:
                f_foot = fobj_foot.read()
        else:
            print(os.path.abspath(os.path.join(share_dir, 'foot.tex'))
                  + " not found. Aborting")
            sys.exit(1)
Lorenz Steinert's avatar
Lorenz Steinert committed
148

Lorenz Steinert's avatar
Lorenz Steinert committed
149
    #replace the placeholder strings in f_foot
Lorenz Steinert's avatar
Lorenz Steinert committed
150 151 152 153 154
    f_foot = reg['SPR'].sub(sprecher, f_foot)
    f_foot = reg['PRO'].sub(protokollant, f_foot)
    f_foot = reg['DATE'].sub(date[0], f_foot)

    return f_foot
Lorenz Steinert's avatar
Lorenz Steinert committed
155

Lorenz Steinert's avatar
Lorenz Steinert committed
156

Lorenz Steinert's avatar
Lorenz Steinert committed
157 158 159 160 161
if __name__ == "__main__":

    RUNDIR = os.path.dirname(os.path.realpath(__file__))
    OPT = build_parser()
    CONFIG = get_config(RUNDIR, OPT.config)
162

Lorenz Steinert's avatar
Lorenz Steinert committed
163
    SHARE_DIR = get_share(RUNDIR, CONFIG, OPT.sharedir)
Lorenz Steinert's avatar
Lorenz Steinert committed
164
    LDAP_SERVER = get_ldap_server(CONFIG, OPT.Server)
165
    LDAP_SERVER_BASE = get_ldap_base(CONFIG, OPT.base)
166
    SERVER_TIMEOUT = get_server_timeout(CONFIG, OPT.test)
Lorenz Steinert's avatar
Lorenz Steinert committed
167 168 169 170 171 172 173 174

    REG = {'SPR': re.compile('%%SPRECHER'),
           'PRO': re.compile('%%PROTOKOLLANT'),
           'DATE': re.compile('%%DATE'),
           'ACRO': re.compile('%%ACRO'),
           'ACRON': re.compile('%%ACRONAME'),
           'FSRN': re.compile('%%FSRNAME')}

175
    if CONFIG:
Lorenz Steinert's avatar
Lorenz Steinert committed
176
        NUM_COLS = CONFIG['PROTOKOLL'].getint('NUM_COLS')
177
        NUM_COLS_EXT = CONFIG['PROTOKOLL'].getint('NUM_COLS_EXT')
178 179 180
    else:
        NUM_COLS = 5
        NUM_COLS_EXT = 5
Lorenz Steinert's avatar
Lorenz Steinert committed
181

182
    ESME = FsrLdap(LDAP_SERVER, LDAP_SERVER_BASE, SHARE_DIR, OPT.debug,
183
                   SERVER_TIMEOUT)
Lorenz Steinert's avatar
Lorenz Steinert committed
184 185 186 187

    print("\n")
    print("Wenn der Standardwert (in []) stimmt einfach Enter!\n")

188 189
    SPRECHER = get_sprecher(CONFIG)
    PROTOKOLLANT = ESME.get_protokollant_ldap(CONFIG)
Lorenz Steinert's avatar
Lorenz Steinert committed
190

Lorenz Steinert's avatar
Lorenz Steinert committed
191 192
    DATE = get_date(OPT.test)

Lorenz Steinert's avatar
Lorenz Steinert committed
193 194
    #Fetch the FSR from the Server
    #and if not able to connect fall back to the textfiles
195
    FSR = [ESME.get_fsr(), ESME.get_fsr_extern()]
Lorenz Steinert's avatar
Lorenz Steinert committed
196

Lorenz Steinert's avatar
Lorenz Steinert committed
197 198
    #Generate the Path for the Protokoll in depandance of OPT.VV
    #and make the directory
199 200 201 202 203 204
    if OPT.Vollversamlung:
        OUTDIR = os.path.join(get_path(RUNDIR, CONFIG, OPT.path), DATE[1],
                              "fsr_physik_vollversamlung_" + '-'.join(DATE[1:]))
    else:
        OUTDIR = os.path.join(get_path(RUNDIR, CONFIG, OPT.path), DATE[1],
                              "fsr_physik_sitzung_" + '-'.join(DATE[1:]))
Lorenz Steinert's avatar
Lorenz Steinert committed
205 206 207
    if not os.path.exists(OUTDIR):
        os.makedirs(OUTDIR)

Lorenz Steinert's avatar
Lorenz Steinert committed
208
    #Generate the path of the .tex file
Lorenz Steinert's avatar
Lorenz Steinert committed
209
    OUTFILE = os.path.join(OUTDIR, "fsr_physik_protokoll_"
Lorenz Steinert's avatar
Lorenz Steinert committed
210
                           + '-'.join(DATE[1:]) + ".tex")
Lorenz Steinert's avatar
Lorenz Steinert committed
211

Lorenz Steinert's avatar
Lorenz Steinert committed
212 213
    shutil.copyfile(os.path.join(SHARE_DIR, "FS-Logo.pdf"),
                    os.path.join(OUTDIR, "FS-Logo.pdf"))
Lorenz Steinert's avatar
Lorenz Steinert committed
214

Lorenz Steinert's avatar
Lorenz Steinert committed
215
    msg = gen_head(SHARE_DIR, REG, SPRECHER, PROTOKOLLANT, DATE)
Lorenz Steinert's avatar
Lorenz Steinert committed
216 217 218 219

    msg += "~\\newline\n"

    if not OPT.Vollversamlung:
Lorenz Steinert's avatar
Lorenz Steinert committed
220 221 222
        msg += gen_attendance_tab(FSR[0], NUM_COLS)
        msg += gen_attendance_tab(FSR[1], NUM_COLS_EXT, ext=True)

223
    msg += gen_foot(SHARE_DIR, OPT.Vollversamlung, REG,
Lorenz Steinert's avatar
Lorenz Steinert committed
224
                    SPRECHER, PROTOKOLLANT, DATE)
Steinert's avatar
Steinert committed
225

Lorenz Steinert's avatar
Lorenz Steinert committed
226 227
    with codecs.open(OUTFILE, 'w', 'utf-8') as fobj_out:
        fobj_out.write(msg)