Newer
Older
skyldap / autocomplete / thu.py
@One One on 2 Apr 2022 2 KB initial
import os
import logging
import csv
import time

import pymssql
import pandas as pd


class AutocompleteTHU:
    def __init__(self, conf):
        self.config = {
            "db_server": "",
            "db_user": "",
            "db_password": "",
            "db_name": "",

            "csv_file": os.path.join(os.path.dirname(os.path.realpath(__file__)), "tmp/thu.csv"),
            "csv_expire": 86400   # seconds
        }

        self.config.update(conf)

        # db is loaded
        self.db = None

    def sync_db(self):
        logging.info(__name__, "Sync database...")

        # connect
        conn = pymssql.connect(
            server=self.config["db_server"], 
            user=self.config["db_user"], 
            password=self.config["db_password"], 
            database=self.config["db_name"])

        # query
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM ReaderInfo")

        # export csv
        with open(self.config["csv_file"], "w") as f:
            writer = csv.writer(f, quoting=csv.QUOTE_ALL)
            writer.writerow(col[0] for col in cursor.description)
            for row in cursor:
                writer.writerow(row)
            f.close()

        # close
        cursor.close()
        conn.close()

    def load_db(self):
        if self.db is not None:
            return

        # sync if csv expired
        if (not os.path.isfile(self.config["csv_file"])) \
           or (time.time() - os.path.getmtime(self.config["csv_file"]) >= self.config["csv_expire"]):

           self.sync_db()

        # load db
        self.db = pd.read_csv(self.config["csv_file"])

    def run(self, fields):
        autocomplete = {}
        # get index
        uniid = fields.get("employeeNumber")
        if uniid:
            # fill fields
            self.load_db()
            rows = self.db[self.db["uniid"] == uniid]

            if len(rows):
                item = rows.iloc[0].to_dict()
                autocomplete = {
                    "uid": item["yhm"],
                    "cn": item["username"],
                    "employeeType": item["deptno_name"]
                }
        
        return {**autocomplete, **fields}