proto.py 8.19 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
    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
88
def resort_fsr(fsr, num_cols=5):
89
    """resort list for pascal style sorting"""
Lorenz Steinert's avatar
Lorenz Steinert committed
90 91
    fsr += [""] * (num_cols - len(fsr) % num_cols)
    depth = len(fsr) // num_cols
Lorenz Steinert's avatar
Lorenz Steinert committed
92 93

    tmp = [[] for i in range(depth)]
Lorenz Steinert's avatar
Lorenz Steinert committed
94

Lorenz Steinert's avatar
Lorenz Steinert committed
95
    for index, elem in zip(range(len(fsr)), fsr):
Lorenz Steinert's avatar
Lorenz Steinert committed
96
        tmp[index % depth] += [elem]
Lorenz Steinert's avatar
Lorenz Steinert committed
97 98

    return [j for i in tmp for j in i]
Lorenz Steinert's avatar
Lorenz Steinert committed
99

Lorenz Steinert's avatar
Lorenz Steinert committed
100
def gen_attendance_tab(fsr, num_cols=5, ext=False):
Lorenz Steinert's avatar
Lorenz Steinert committed
101
    """generate the atandance tables"""
Lorenz Steinert's avatar
Lorenz Steinert committed
102 103 104

    fsr = resort_fsr(fsr, num_cols)

Lorenz Steinert's avatar
Lorenz Steinert committed
105
    tabdef = '||' + 'c|l||' * num_cols
Lorenz Steinert's avatar
Lorenz Steinert committed
106

Lorenz Steinert's avatar
Lorenz Steinert committed
107 108
    fsr_tab = ''

Lorenz Steinert's avatar
Lorenz Steinert committed
109 110 111 112 113 114 115 116
    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
117 118
    for elem, index in zip(fsr, range(len(fsr))):
        if index % num_cols == 0:
Lorenz Steinert's avatar
Lorenz Steinert committed
119 120 121 122
            fsr_tab += " "
        else:
            fsr_tab += "&"

Lorenz Steinert's avatar
Lorenz Steinert committed
123
        fsr_tab += "  &" + elem
Lorenz Steinert's avatar
Lorenz Steinert committed
124

Lorenz Steinert's avatar
Lorenz Steinert committed
125
        if index % num_cols == num_cols - 1:
Lorenz Steinert's avatar
Lorenz Steinert committed
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
            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
141 142
    #look for the foot*.tex skripts
    # if not found abort
Lorenz Steinert's avatar
Lorenz Steinert committed
143
    if vollversamlung:
144 145 146 147 148 149 150 151
        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
152
    else:
153 154 155 156 157 158 159 160
        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
161

Lorenz Steinert's avatar
Lorenz Steinert committed
162
    #replace the placeholder strings in f_foot
Lorenz Steinert's avatar
Lorenz Steinert committed
163 164 165 166 167
    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
168

Lorenz Steinert's avatar
Lorenz Steinert committed
169

Lorenz Steinert's avatar
Lorenz Steinert committed
170 171 172 173 174
if __name__ == "__main__":

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

Lorenz Steinert's avatar
Lorenz Steinert committed
176
    SHARE_DIR = get_share(RUNDIR, CONFIG, OPT.sharedir)
Lorenz Steinert's avatar
Lorenz Steinert committed
177
    LDAP_SERVER = get_ldap_server(CONFIG, OPT.Server)
178
    LDAP_SERVER_BASE = get_ldap_base(CONFIG, OPT.base)
179
    SERVER_TIMEOUT = get_server_timeout(CONFIG, OPT.test)
Lorenz Steinert's avatar
Lorenz Steinert committed
180 181 182 183 184 185 186 187

    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')}

188
    if CONFIG:
189 190
        NUM_COLS = CONFIG['PROROKOLL'].getint('NUM_COLS')
        NUM_COLS_EXT = CONFIG['PROTOKOLL'].getint('NUM_COLS_EXT')
191 192 193
    else:
        NUM_COLS = 5
        NUM_COLS_EXT = 5
Lorenz Steinert's avatar
Lorenz Steinert committed
194

195 196
    ESME = FsrLdap(LDAP_SERVER, LDAP_SERVER_BASE, OPT.debug,
                   SERVER_TIMEOUT)
Lorenz Steinert's avatar
Lorenz Steinert committed
197 198 199 200

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

201 202
    SPRECHER = get_sprecher(CONFIG)
    PROTOKOLLANT = ESME.get_protokollant_ldap(CONFIG)
Lorenz Steinert's avatar
Lorenz Steinert committed
203

Lorenz Steinert's avatar
Lorenz Steinert committed
204 205
    DATE = get_date(OPT.test)

Lorenz Steinert's avatar
Lorenz Steinert committed
206 207
    #Fetch the FSR from the Server
    #and if not able to connect fall back to the textfiles
Lorenz Steinert's avatar
Lorenz Steinert committed
208 209
    FSR = [ESME.get_fsr_ldap(SHARE_DIR),
           ESME.get_fsr_extern_ldap(SHARE_DIR)]
Lorenz Steinert's avatar
Lorenz Steinert committed
210

Lorenz Steinert's avatar
Lorenz Steinert committed
211 212
    #Generate the Path for the Protokoll in depandance of OPT.VV
    #and make the directory
213 214 215 216 217 218
    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
219 220 221
    if not os.path.exists(OUTDIR):
        os.makedirs(OUTDIR)

Lorenz Steinert's avatar
Lorenz Steinert committed
222
    #Generate the path of the .tex file
Lorenz Steinert's avatar
Lorenz Steinert committed
223
    OUTFILE = os.path.join(OUTDIR, "fsr_physik_protokoll_"
Lorenz Steinert's avatar
Lorenz Steinert committed
224
                           + '-'.join(DATE[1:]) + ".tex")
Lorenz Steinert's avatar
Lorenz Steinert committed
225

Lorenz Steinert's avatar
Lorenz Steinert committed
226 227
    shutil.copyfile(os.path.join(SHARE_DIR, "FS-Logo.pdf"),
                    os.path.join(OUTDIR, "FS-Logo.pdf"))
Lorenz Steinert's avatar
Lorenz Steinert committed
228

Lorenz Steinert's avatar
Lorenz Steinert committed
229
    msg = gen_head(SHARE_DIR, REG, SPRECHER, PROTOKOLLANT, DATE)
Lorenz Steinert's avatar
Lorenz Steinert committed
230 231 232 233

    msg += "~\\newline\n"

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

237
    msg += gen_foot(SHARE_DIR, OPT.Vollversamlung, REG,
Lorenz Steinert's avatar
Lorenz Steinert committed
238
                    SPRECHER, PROTOKOLLANT, DATE)
Steinert's avatar
Steinert committed
239

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