-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmembers.py
145 lines (132 loc) · 5.8 KB
/
members.py
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import csv
import sqlite3
import os
import codecs
import datetime
class Members(object):
def __init__(self):
pass
def migrate(self, dbConnection, db_schema_version):
if db_schema_version == 0:
dbConnection.execute('''
CREATE TABLE members (barcode TEXT UNIQUE,
displayName TEXT)
''')
if db_schema_version <= 8:
past = datetime.datetime.now() - datetime.timedelta(-90)
# default is expires in 90 days
future = datetime.datetime.now() + datetime.timedelta(90)
dbConnection.execute('''
CREATE TABLE new_members (barcode TEXT UNIQUE,
displayName TEXT,
firstName TEXT,
lastName TEXT,
email TEXT,
membershipExpires TIMESTAMP)
''')
for row in dbConnection.execute("SELECT * FROM members"):
dbConnection.execute(
'''
INSERT INTO new_members VALUES (?,?,'','','',?)''',
(row[0], row[1], future if row[2] else past)) # pragma: no cover
dbConnection.execute('''DROP TABLE members''')
dbConnection.execute(
'''ALTER TABLE new_members RENAME TO members''')
if db_schema_version < 14:
dbConnection.execute('''
CREATE VIEW v_current_members (
barcode,
displayName
)
AS SELECT barcode, displayName
FROM members
WHERE membershipExpires > date() +
(SELECT value FROM config WHERE key="grace_period");
''')
if db_schema_version < 15:
dbConnection.execute('''DROP VIEW v_current_members''')
dbConnection.execute('''
CREATE VIEW v_current_members (
barcode,
displayName,
membershipExpires
)
AS SELECT barcode, displayName, membershipExpires
FROM members
WHERE membershipExpires > date('now','-' || (SELECT value FROM config WHERE key="grace_period") ||' days' )
''')
def injectData(self, dbConnection, data):
for datum in data:
dbConnection.execute("INSERT INTO members VALUES (?,?,?,?,?,?)",
(datum["barcode"], datum["displayName"],
datum["firstName"], datum["lastName"],
datum["email"], datum["membershipExpires"]))
def bulkAdd(self, dbConnection, csvFile):
numMembers = 0
for row in csv.DictReader(codecs.iterdecode(csvFile.file, 'utf-8')):
displayName = row['TFI Display Name for Button']
if not displayName:
displayName = row['First Name'] + ' ' + row['Last Name'][0]
barcode = row['TFI Barcode for Button']
if not barcode:
barcode = row['TFI Barcode AUTONUM']
try:
email = row['Email']
except KeyError:
email = ''
try:
(month, day, year) = row['Membership End Date'].split("/")
except ValueError:
(month, day, year) = (6, 30, 2019)
membershipExpires = datetime.datetime(year=int(year),
month=int(month),
day=int(day))
# This is because I can't figure our how to get the ubuntu to use
# the newer version of sqlite3. At some point this should go back
# to the commit before this one. Arrggghhhh.
try:
data = dbConnection.execute(
'''
INSERT INTO MEMBERS(barcode, displayName, firstName, lastName, email, membershipExpires)
VALUES (?,?,?,?,?,?)''',
(barcode, displayName, row['First Name'], row['Last Name'],
email, membershipExpires))
except sqlite3.IntegrityError:
data = dbConnection.execute(
'''
UPDATE MEMBERS SET
displayName = ?,
firstName = ?,
lastName = ?,
email = ?,
membershipExpires = ?
WHERE barcode=?''',
(displayName, row['First Name'], row['Last Name'], email,
membershipExpires, barcode))
# ON CONFLICT(barcode)
# DO UPDATE SET
# displayName=excluded.displayName,
# firstName=excluded.firstName,
# lastName=excluded.lastName,
# email=excluded.email,
# membershipExpires=excluded.membershipExpires
# ''',
numMembers = numMembers + 1
return f"Imported {numMembers} from {csvFile.filename}"
def getActive(self, dbConnection):
listUsers = []
for row in dbConnection.execute(
'''SELECT displayName, barcode
FROM v_current_members ORDER BY displayName ASC'''):
listUsers.append([row[0], row[1]])
return listUsers
# TODO: should this check for inactive?
def getName(self, dbConnection, barcode):
data = dbConnection.execute(
"SELECT displayName FROM members WHERE barcode==?",
(barcode, )).fetchone()
if data is None:
return ('Invalid: ' + barcode, None) # pragma: no cover
else:
# Add code here for inactive
return ('', data[0])