-
Notifications
You must be signed in to change notification settings - Fork 19
/
CoffeePairing.py
159 lines (119 loc) · 4.64 KB
/
CoffeePairing.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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import pandas as pd
import csv
import random
import copy
import os
# path to the CSV files with participant data
participants_csv = "Coffee Partner Lottery participants.csv"
# header names in the CSV file (name and e-mail of participants)
header_name = "Your name:"
header_email = "Your e-mail:"
# path to TXT file that stores the pairings of this round
new_pairs_txt = "Coffee Partner Lottery new pairs.txt"
# path to CSV file that stores the pairings of this round
new_pairs_csv = "Coffee Partner Lottery new pairs.csv"
# path to CSV file that stores all pairings (to avoid repetition)
all_pairs_csv = "Coffee Partner Lottery all pairs.csv"
# init set of old pairs
opairs = set()
DELIMITER=','
# load all previous pairings (to avoid redundancies)
if os.path.exists(all_pairs_csv):
with open(all_pairs_csv, "r") as file:
csvreader = csv.reader(file, delimiter=DELIMITER)
for row in csvreader:
group = []
for i in range(0,len(row)):
group.append(row[i])
opairs.add(tuple(group))
# load participant's data
formdata = pd.read_csv(participants_csv, sep=DELIMITER)
# create duplicate-free list of participants
participants = list(set(formdata[header_email]))
# init set of new pairs
npairs = set()
# running set of participants
nparticipants = copy.deepcopy(participants)
# Boolean flag to check if new pairing has been found
new_pairs_found = False
# try creating new pairing until successful
while not new_pairs_found: # to do: add a maximum number of tries
# if odd number of participants, create one triple, then pairs
if len(participants)%2 != 0:
# take three random participants from list of participants
p1 = random.choice(nparticipants)
nparticipants.remove(p1)
p2 = random.choice(nparticipants)
nparticipants.remove(p2)
p3 = random.choice(nparticipants)
nparticipants.remove(p3)
# create alphabetically sorted list of participants
plist = [p1, p2, p3]
plist.sort()
# add alphabetically sorted list to set of pairs
npairs.add(tuple(plist))
# while still participants left to pair...
while len(nparticipants) > 0:
# take two random participants from list of participants
p1 = random.choice(nparticipants)
nparticipants.remove(p1)
p2 = random.choice(nparticipants)
nparticipants.remove(p2)
# create alphabetically sorted list of participants
plist = [p1, p2]
plist.sort()
# add alphabetically sorted list to set of pairs
npairs.add(tuple(plist))
# check if all new pairs are indeed new, else reset
if npairs.isdisjoint(opairs):
new_pairs_found = True
else:
npairs = set()
nparticipants = copy.deepcopy(participants)
# assemble output for printout
output_string = ""
output_string += "------------------------\n"
output_string += "Today's coffee partners:\n"
output_string += "------------------------\n"
for pair in npairs:
pair = list(pair)
output_string += "* "
for i in range(0,len(pair)):
name_email_pair = f"{formdata[formdata[header_email] == pair[i]].iloc[0][header_name]} ({pair[i]})"
if i < len(pair)-1:
output_string += name_email_pair + ", "
else:
output_string += name_email_pair + "\n"
# write output to console
print(output_string)
# write output into text file for later use
with open(new_pairs_txt, "wb") as file:
file.write(output_string.encode("utf8"))
# write new pairs into CSV file (for e.g. use in MailMerge)
with open(new_pairs_csv, "w") as file:
header = ["name1", "email1", "name2", "email2", "name3", "email3"]
file.write(DELIMITER.join(header) + "\n")
for pair in npairs:
pair = list(pair)
for i in range(0,len(pair)):
name_email_pair = f"{formdata[formdata[header_email] == pair[i]].iloc[0][header_name]}{DELIMITER} {pair[i]}"
if i < len(pair)-1:
file.write(name_email_pair + DELIMITER + " ")
else:
file.write(name_email_pair + "\n")
# append pairs to history file
if os.path.exists(all_pairs_csv):
mode = "a"
else:
mode = "w"
with open(all_pairs_csv, mode) as file:
for pair in npairs:
pair = list(pair)
for i in range(0,len(pair)):
if i < len(pair)-1:
file.write(pair[i] + DELIMITER)
else:
file.write(pair[i] + "\n")
# print finishing message
print()
print("Job done.")