[SUCS Devel] [Git][sucs/accountmanager][master] Lots of new features.
Imran Hussain
imranh at sucs.org
Sat Mar 9 16:10:12 GMT 2019
Imran Hussain pushed to branch master at sucs / accountmanager
Commits:
014f5b14 by Imran Hussain at 2019-03-09T16:08:56Z
Lots of new features.
* Can send out reminder emails
* debugmode
* can handle people paying for membership in advance
* Start of the actual deletion stuff
- - - - -
1 changed file:
- sucsam.py
Changes:
=====================================
sucsam.py
=====================================
@@ -1,13 +1,102 @@
+debugmode = 1
+
import os
+import pwd
import sys
import readline
import psycopg2
+import datetime
+import smtplib
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+
+def correctPaidUntilStr():
+ #same logic as suapi stuff
+ # if it's greater than Sept then year+1
+ # if it's less than Spet then year
+ if (month >= 9):
+ paidyear = year +1
+ elif (month < 8):
+ paidyear = year
+ else:
+ print("Something went really wrong")
+ sys.exit(3)
+ return "Sept. " + str(paidyear)
+
+# annoyingly when people have paid until is stored as a string in the DB
+# as something like "Sept. $YEAR"
+# so explode the str on " " cast $year to int and compare to correct year
+def stripFuturePeople(listofpeeps):
+ badpeeps = []
+ for person in listofpeeps:
+ if person[1] == "delete":
+ badpeeps.append(person)
+ else:
+ paidyeararray = person[1].split(' ')
+ if (month >= 9):
+ paidyear = year + 1
+ elif (month < 8):
+ paidyear = year
+ else:
+ print("Something went really wrong")
+ sys.exit(3)
+ if int(paidyeararray[1]) < paidyear:
+ badpeeps.append(person)
+ return badpeeps
+
+# ok this needs explaning
+# in comes a list [('user1', 'Sept. 2015'), ('user2', 'Sept. 2014')]
+# we need to work out what account type it is,
+# select type from members where username=$peep[0]
+# then from that find the right email text file and send
+# easy peasy
+def sendReminderEmail(listofpeeps):
+ for person in listofpeeps:
+ cur = DBconn.cursor()
+ cur.execute("SELECT * from members WHERE username=%(user)s",{"user" : person[0]})
+ DBdata = cur.fetchall()
+ cur.close()
+
+ username = DBdata[0][1]
+ realname = DBdata[0][2]
+ email = DBdata[0][3]
+ type = DBdata[0][7]
+ adminname = pwd.getpwuid(os.geteuid())[0]
+
+ if os.path.isfile(str(type)+"-email"):
+ file = open(str(type)+"-email","r")
+ data = file.read()
+ file.close()
+ data = data.replace("{$realname}",realname)
+ data = data.replace("{$username}",username)
+ data = data.replace("{$adminname}",adminname)
+ sender = 'staff at sucs.org'
+ if debugmode > 0
+ receiver = 'imranh at sucs.org'
+ else:
+ receiver = email
+ message = MIMEMultipart()
+ message['From'] = sender
+ message['To'] = receiver
+ message['Subject'] = 'Your SUCS account is due for renewal'
+ messageBody = MIMEText(data, 'plain')
+ message.attach(messageBody)
+
+ smtpConn = smtplib.SMTP('localhost')
+ smtpConn.sendmail(sender, receiver, message.as_string())
+ smtpConn.quit()
+ sys.exit(0)
+ else:
+ print("Renewal email template not found!")
+ sys.exit(4)
def mainMenu():
print("\nPlease choose an option")
print("[h] Diplay some help")
print("[qs] View quick stats of all accounts")
print("[la] View a list of ALL accounts")
+ print("[r] Renewals & Reminders")
+ print("[d] Delete accounts")
print("[q] Quit")
option = input("Option: ")
@@ -25,6 +114,12 @@ def mainMenu():
elif (option == "la"):
listUsers()
mainMenu()
+ elif (option == "r"):
+ reminderMenu()
+ mainMenu()
+ elif (option == "d"):
+ deleteAccounts()
+ mainMenu()
else:
mainMenu()
@@ -69,7 +164,78 @@ def listUsers():
for hon in hons:
print(str(hon[0]) + " (" + str(hon[1]) + ")")
+def reminderMenu():
+ print("")
+ print("Double check https://sucs.org/Admin/SU that everyone that has paid to renew has been marked as renwed. This tool doesn't do that job yet!")
+ print("")
+ print("1. View a list of accounts that aren't marked as renewed in the DB")
+ print("2. Semd email to all students reminding them to renew")
+ print("0. Return to main menu")
+ option = input("Option: ")
+
+ if (option == "1"):
+ for student in studentsBad:
+ print(str(student[0]) + " because the DB says: " + str(student[1]) )
+ for soc in soceitiesBad:
+ print(str(soc[0]) + " because the DB says: " + str(soc[1]) )
+ for ass in associatesBad:
+ print(str(ass[0]) + " because the DB says: " + str(ass[1]) )
+ reminderMenu()
+ if (option == "2"):
+ sendReminderEmail(studentsBad)
+ if (option == "0"):
+ mainMenu()
+ else:
+ reminderMenu()
+
+def deleteMenu(deleteArray):
+ print("")
+ print("1. View list of accounts to be deleted")
+ print("2. Add/delete users from delete list")
+ print("3. Auto populate list of users to be deleted")
+ print("9. Do the delete")
+ print("0. Go back to main menu")
+
+ option = input("Option: ")
+
+ if (option == "1"):
+ print("\nThe following users will be deleted: ")
+ for user in deleteArray:
+ print(user)
+ deleteMenu(deleteArray)
+ elif (option == "2"):
+ print("Enter a username to add or remoeve it from the list.")
+ user = input("Username: ")
+ if (user in deleteArray):
+ deleteArray.remove(user)
+ print(str(user) + " won't be deleted.")
+ else:
+ deleteArray.append(user)
+ print(str(user) + " will be deleted.")
+ deleteMenu(deleteArray)
+ elif (option == "3"):
+ for student in studentsBad:
+ print("Adding " + str(student[0]) + " to the list because the DB says: " + str(student[1]) )
+ deleteArray.append(student[0])
+ for soc in societiesBad:
+ print("Adding " + str(soc[0]) + " to the list because the DB says: " + str(soc[1]) )
+ deleteArray.append(soc[0])
+ deleteMenu(deleteArray)
+ elif (option == "9"):
+ print("Nope not yet")
+ deleteMenu(deleteArray)
+ elif (option == "0"):
+ mainMenu()
+ else:
+ deleteMenu(deleteArray)
+
+def deleteAccounts():
+ #list that store usernames to be deleted
+ #gets reset everytime you go into this bit on purpose
+ tobedeleted = []
+
+ deleteMenu(tobedeleted)
### MAIN ###
@@ -77,6 +243,11 @@ if (os.geteuid() == 0):
print("Don't run this as root!")
sys.exit(1)
+# get some date/time info ready
+now = datetime.datetime.now()
+year = now.year
+month = now.month
+
#This tool was written for python *3*
#but doesn't mean we can't support 2 as well :)
try:
@@ -96,10 +267,13 @@ cur = DBconn.cursor()
cur.execute("SELECT username,paid from members WHERE type=1 ORDER BY paid")
students = cur.fetchall()
+studentsBad = stripFuturePeople(students)
cur.execute("SELECT username,paid from members WHERE type=2 ORDER BY paid")
societies = cur.fetchall()
+societiesBad = stripFuturePeople(societies)
cur.execute("SELECT username,paid from members WHERE type=5 ORDER BY paid")
associates = cur.fetchall()
+associatesBad = stripFuturePeople(associates)
cur.execute("SELECT username,paid from members WHERE type=4 ORDER BY username")
lifers = cur.fetchall()
cur.execute("SELECT username,paid from members WHERE type=3 ORDER BY username")
View it on GitLab: https://projects.sucs.org/sucs/accountmanager/commit/014f5b146623f95244976d6a93f8c4f65ec1f43f
--
View it on GitLab: https://projects.sucs.org/sucs/accountmanager/commit/014f5b146623f95244976d6a93f8c4f65ec1f43f
You're receiving this email because of your account on projects.sucs.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sucs.org/pipermail/devel/attachments/20190309/78b26e6e/attachment-0001.html>
More information about the Devel
mailing list