Jun 23 2023

entersys詳細

作成準備

entersysを作成するにあたり,大まかに流れを考えた.大まかに以下の 5 つに分けられる.

作成

id 判別

まず,id 判別をどのように何を使って行うのかについては,学生証のバーコードをバーコードリーダーを用いて読み取り,名簿と照合することにした.

main.py
while True
    input("Student ID > ")

次にバーコードで読み取った番号をどのように名簿と照合するのかであるが,今回はcsvモジュールを用いて csv ファイルを読み込み,配列に格納してから照合していくようにした.他にもpandas便利なモジュールもあるが今回は気分でこっちにした.標準ライブラリであるため,インストール等は不要である.

get_id.py
import csv
import update_member

with open('csvfile') as f:
    reader = csv.reader(f)
    row_list = [row for row in reader]
lastrow = len(row_list)
with open('csvfile') as f:
    for i in range(0, lastrow):
        if number == row_list[i][1]:
            id = row_list[i][0]
    break

if id == "":
    update_member.update_member()
    with open('csvfile') as f:
        reader = csv.reader(f)
        row_list = [row for row in reader]
    lastrow = len(row_list)
    with open('csvfile') as f:
        for k in range(0, lastrow):
            if number == row_list[k][1]:
                id = row_list[k][0]
            break

名簿にない場合には,入部届のスプレッドシートからこの csv ファイルに追加するようにした.それでも見つからない場合は,ldapsearchを用いることにした.ここまでに見つからない場合はエラーを返す.

ここでは,Google Spreadsheetから入部届の情報を見るために,oauth2clientモジュールとgspreadモジュールを使用している.Google の API 関連についてはいろいろ転がっているのでそちらを参考に.

update_member.py
import gspread, csv
from oauth2client.service_account import ServiceAccountCredentials

csvfile = 'csvfile'
scope = []
json = "jsonfile"
credentials = ServiceAccountCredentials.from_json_keyfile_name(json, scope)
gc = gspread.authorize(credentials)
workbook = gc.open_by_key("key")
worksheet = workbook.get_worksheet(0)

def update_member():
try:
    with open(csvfile) as f:
        reader = csv.reader(f)
        row_list = [row for row in reader]
    lastrow_in = len(list(filter(None, worksheet.col_values(2))))
    # 最新のidが一致しない時
    if worksheet.acell("A" + str(lastrow_in)).value != row_list[0][0]:
        # 入部届の一致する場所探して
        for k in range(2, lastrow_in + 1):
            if row_list[0][0] == worksheet.acell("A" + str(k)).value:
                # 一致する場所から最終行まで追加
                worksheet_last_id = worksheet.acell("A" + str(lastrow_in)).value
                while row_list[0][0] != worksheet_last_id:
                    row_list.insert( 0, [worksheet.acell("A" + str(k + 1)).value, worksheet.acell("B" + str(k + 1)).value],)
                    k += 1
                break
        with open(csvfile, "w") as f:
            writer = csv.writer(f)
            writer.writerows(row_list)
except:
    pass
else:
    with open(csvfile) as f:
        reader = csv.reader(f)
        lastrow = len(row_list) - 1
        row_list = [row for row in reader]

ここまでが id 判別の部分である.

入退室判別

次に入退室判別だが,長くなったので次に回そうと思う.

まだ次回.