mirror of
https://github.com/GAM-team/GAM.git
synced 2026-07-03 20:31:35 +00:00
course aliases, message delete/trash, misc other
This commit is contained in:
128
gam.py
128
gam.py
@@ -24,7 +24,7 @@ For more information, see http://git.io/gam
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
__author__ = u'Jay Lee <jay0lee@gmail.com>'
|
__author__ = u'Jay Lee <jay0lee@gmail.com>'
|
||||||
__version__ = u'3.5'
|
__version__ = u'3.51'
|
||||||
__license__ = u'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
|
__license__ = u'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
|
||||||
|
|
||||||
import sys, os, time, datetime, random, socket, csv, platform, re, calendar, base64, hashlib, string
|
import sys, os, time, datetime, random, socket, csv, platform, re, calendar, base64, hashlib, string
|
||||||
@@ -470,6 +470,8 @@ def callGAPIpages(service, function, items=u'items', nextPageToken=u'nextPageTok
|
|||||||
if pageToken == '':
|
if pageToken == '':
|
||||||
return all_pages
|
return all_pages
|
||||||
except (IndexError, KeyError):
|
except (IndexError, KeyError):
|
||||||
|
if page_message:
|
||||||
|
sys.stderr.write(u'\n')
|
||||||
return all_pages
|
return all_pages
|
||||||
|
|
||||||
def getAPIVer(api):
|
def getAPIVer(api):
|
||||||
@@ -1050,22 +1052,30 @@ def deleteDelegate(users):
|
|||||||
def doAddCourseParticipant():
|
def doAddCourseParticipant():
|
||||||
croom = buildGAPIObject(u'classroom')
|
croom = buildGAPIObject(u'classroom')
|
||||||
courseId = sys.argv[2]
|
courseId = sys.argv[2]
|
||||||
if not courseId.isdigit() and courseId[:2] != u'd:':
|
body_attribute = u'userId'
|
||||||
|
if len(courseId) < 3 or (not courseId.isdigit() and courseId[:2] != u'd:'):
|
||||||
courseId = u'd:%s' % courseId
|
courseId = u'd:%s' % courseId
|
||||||
participant_type = sys.argv[4].lower()
|
participant_type = sys.argv[4].lower()
|
||||||
|
new_id = sys.argv[5]
|
||||||
if participant_type in [u'teacher', u'teachers']:
|
if participant_type in [u'teacher', u'teachers']:
|
||||||
service = croom.courses().teachers()
|
service = croom.courses().teachers()
|
||||||
elif participant_type in [u'students', u'student']:
|
elif participant_type in [u'students', u'student']:
|
||||||
service = croom.courses().students()
|
service = croom.courses().students()
|
||||||
|
elif participant_type in [u'alias']:
|
||||||
|
service = croom.courses().aliases()
|
||||||
|
body_attribute = u'alias'
|
||||||
|
if new_id[1] != u':':
|
||||||
|
new_id = u'd:%s' % new_id
|
||||||
else:
|
else:
|
||||||
print 'ERROR: expected course participant type of teacher or student, got %s' % participant_type
|
print 'ERROR: expected course participant type of teacher or student, got %s' % participant_type
|
||||||
sys.exit(4)
|
sys.exit(4)
|
||||||
userId = sys.argv[5]
|
body = {body_attribute: new_id}
|
||||||
body = {u'userId': userId}
|
|
||||||
result = callGAPI(service=service, function=u'create', courseId=courseId, body=body)
|
result = callGAPI(service=service, function=u'create', courseId=courseId, body=body)
|
||||||
if courseId[:2] == u'd:':
|
if courseId[:2] == u'd:':
|
||||||
courseId = courseId[2:]
|
courseId = courseId[2:]
|
||||||
print u'Added %s as a %s of course %s' % (userId, participant_type, courseId)
|
if new_id[:2] == u'd:':
|
||||||
|
new_id = new_id[2:]
|
||||||
|
print u'Added %s as a %s of course %s' % (new_id, participant_type, courseId)
|
||||||
|
|
||||||
def doSyncCourseParticipants():
|
def doSyncCourseParticipants():
|
||||||
courseId = sys.argv[2]
|
courseId = sys.argv[2]
|
||||||
@@ -1095,18 +1105,28 @@ def doDelCourseParticipant():
|
|||||||
if not courseId.isdigit() and courseId[:2] != u'd:':
|
if not courseId.isdigit() and courseId[:2] != u'd:':
|
||||||
courseId = u'd:%s' % courseId
|
courseId = u'd:%s' % courseId
|
||||||
participant_type = sys.argv[4].lower()
|
participant_type = sys.argv[4].lower()
|
||||||
|
remove_id = sys.argv[5]
|
||||||
|
kwargs = {}
|
||||||
if participant_type in [u'teacher', u'teachers']:
|
if participant_type in [u'teacher', u'teachers']:
|
||||||
service = croom.courses().teachers()
|
service = croom.courses().teachers()
|
||||||
|
kwargs[u'userId'] = remove_id
|
||||||
elif participant_type in [u'student', u'students']:
|
elif participant_type in [u'student', u'students']:
|
||||||
service = croom.courses().students()
|
service = croom.courses().students()
|
||||||
|
kwargs[u'userId'] = remove_id
|
||||||
|
elif participant_type in [u'alias']:
|
||||||
|
service = croom.courses().aliases()
|
||||||
|
if remove_id[1] != u':':
|
||||||
|
remove_id = u'd:%s' % remove_id
|
||||||
|
kwargs[u'alias'] = remove_id
|
||||||
else:
|
else:
|
||||||
print 'ERROR: expected course participant type of teacher or students, got %s' % participant_type
|
print 'ERROR: expected course participant type of teacher or students, got %s' % participant_type
|
||||||
sys.exit(4)
|
sys.exit(4)
|
||||||
userId = sys.argv[5]
|
callGAPI(service=service, function=u'delete', courseId=courseId, **kwargs)
|
||||||
callGAPI(service=service, function=u'delete', courseId=courseId, userId=userId)
|
|
||||||
if courseId[:2] == u'd:':
|
if courseId[:2] == u'd:':
|
||||||
courseId = courseId[2:]
|
courseId = courseId[2:]
|
||||||
print u'Removed %s as a %s of course %s' % (userId, participant_type, courseId)
|
if remove_id[:2] == u'd:':
|
||||||
|
remove_id = remove_id[2:]
|
||||||
|
print u'Removed %s as a %s of course %s' % (remove_id, participant_type, courseId)
|
||||||
|
|
||||||
def doDelCourse():
|
def doDelCourse():
|
||||||
croom = buildGAPIObject(u'classroom')
|
croom = buildGAPIObject(u'classroom')
|
||||||
@@ -1234,6 +1254,7 @@ def doPrintCourses():
|
|||||||
todrive = False
|
todrive = False
|
||||||
teacherId = None
|
teacherId = None
|
||||||
studentId = None
|
studentId = None
|
||||||
|
get_aliases = False
|
||||||
i = 3
|
i = 3
|
||||||
while i < len(sys.argv):
|
while i < len(sys.argv):
|
||||||
if sys.argv[i].lower() == u'teacher':
|
if sys.argv[i].lower() == u'teacher':
|
||||||
@@ -1245,6 +1266,9 @@ def doPrintCourses():
|
|||||||
elif sys.argv[i].lower() == u'todrive':
|
elif sys.argv[i].lower() == u'todrive':
|
||||||
todrive = True
|
todrive = True
|
||||||
i += 1
|
i += 1
|
||||||
|
elif sys.argv[i].lower() in [u'alias', u'aliases']:
|
||||||
|
get_aliases = True
|
||||||
|
i += 1
|
||||||
else:
|
else:
|
||||||
print u'ERROR: %s is not a valid argument to "gam print courses".'
|
print u'ERROR: %s is not a valid argument to "gam print courses".'
|
||||||
sys.exit(3)
|
sys.exit(3)
|
||||||
@@ -1257,6 +1281,19 @@ def doPrintCourses():
|
|||||||
if item not in titles:
|
if item not in titles:
|
||||||
titles.append(item)
|
titles.append(item)
|
||||||
croom_attributes[0][item] = item
|
croom_attributes[0][item] = item
|
||||||
|
if get_aliases:
|
||||||
|
titles.append(u'Aliases')
|
||||||
|
croom_attributes[0].update(Aliases=u'Aliases')
|
||||||
|
num_courses = len(croom_attributes[1:])
|
||||||
|
i = 1
|
||||||
|
for course in croom_attributes[1:]:
|
||||||
|
sys.stderr.write('Getting aliases for course %s (%s/%s)\n' % (course[u'id'], i, num_courses))
|
||||||
|
course_aliases = callGAPIpages(service=croom.courses().aliases(), function=u'list', items=u'aliases', courseId=course[u'id'])
|
||||||
|
my_aliases = []
|
||||||
|
for alias in course_aliases:
|
||||||
|
my_aliases.append(alias[u'alias'][2:])
|
||||||
|
course.update(Aliases=u' '.join(my_aliases))
|
||||||
|
i += 1
|
||||||
output_csv(croom_attributes, titles, u'Courses', todrive)
|
output_csv(croom_attributes, titles, u'Courses', todrive)
|
||||||
|
|
||||||
def doPrintCourseParticipants():
|
def doPrintCourseParticipants():
|
||||||
@@ -3601,6 +3638,64 @@ def doLabel(users):
|
|||||||
i += 1
|
i += 1
|
||||||
callGAPI(service=gmail.users().labels(), function=u'create', soft_errors=True, userId=user, body=body)
|
callGAPI(service=gmail.users().labels(), function=u'create', soft_errors=True, userId=user, body=body)
|
||||||
|
|
||||||
|
def doDeleteMessages(trashOrDelete, users):
|
||||||
|
query = None
|
||||||
|
doIt = False
|
||||||
|
maxToDelete = 1
|
||||||
|
i = 5
|
||||||
|
while i < len(sys.argv):
|
||||||
|
if sys.argv[i].lower() == u'query':
|
||||||
|
query = sys.argv[i+1]
|
||||||
|
i += 2
|
||||||
|
elif sys.argv[i].lower() == u'doit':
|
||||||
|
doIt = True
|
||||||
|
i += 1
|
||||||
|
elif sys.argv[i].lower().replace(u'_', u'') == u'maxtodelete':
|
||||||
|
maxToDelete = int(sys.argv[i+1])
|
||||||
|
i += 2
|
||||||
|
else:
|
||||||
|
print u'ERROR: %s is not a valid argument for gam <users> delete messages.' % sys.argv[i]
|
||||||
|
sys.exit(3)
|
||||||
|
if not query:
|
||||||
|
print u'ERROR: No query specified. You must specify some query!'
|
||||||
|
sys.exit(4)
|
||||||
|
for user in users:
|
||||||
|
gmail = buildGAPIServiceObject(u'gmail', act_as=user)
|
||||||
|
page_message = u'Got %%%%total_items%%%% messages for user %s' % user
|
||||||
|
listResult = callGAPIpages(service=gmail.users().messages(),
|
||||||
|
function=u'list', items=u'messages', page_message=page_message,
|
||||||
|
userId=u'me', q=query, includeSpamTrash=True)
|
||||||
|
del_count = len(listResult)
|
||||||
|
if not doIt:
|
||||||
|
print u'would try to delete %s messages for user %s (max %s)\n' % (del_count, user, maxToDelete)
|
||||||
|
continue
|
||||||
|
elif del_count > maxToDelete:
|
||||||
|
print u'WARNING: refusing to delete ANY messages for %s since max_to_delete is %s and messages to be deleted is %s\n' % (user, maxToDelete, del_count)
|
||||||
|
continue
|
||||||
|
i = 1
|
||||||
|
# Batch seemed like a good idea but it kills
|
||||||
|
# Gmail UI for users :-(
|
||||||
|
'''dbatch = googleapiclient.http.BatchHttpRequest()
|
||||||
|
for del_me in listResult:
|
||||||
|
print u' deleting message %s for user %s (%s/%s)' % (del_me[u'id'], user, i, del_count)
|
||||||
|
i += 1
|
||||||
|
if trashOrDelete == u'trash':
|
||||||
|
dbatch.add(gmail.users().messages().trash(userId=u'me',
|
||||||
|
id=del_me[u'id']), callback=gmail_del_result)
|
||||||
|
elif trashOrDelete == u'delete':
|
||||||
|
dbatch.add(gmail.users().messages().delete(userId=u'me',
|
||||||
|
id=del_me[u'id']), callback=gmail_del_result)
|
||||||
|
if len(dbatch._order) == 5:
|
||||||
|
dbatch.execute()
|
||||||
|
dbatch = googleapiclient.http.BatchHttpRequest()
|
||||||
|
if len(dbatch._order) > 0:
|
||||||
|
dbatch.execute()'''
|
||||||
|
for del_me in listResult:
|
||||||
|
print u' %s message %s for user %s (%s/%s)' % (trashOrDelete, del_me[u'id'], user, i, del_count)
|
||||||
|
i += 1
|
||||||
|
callGAPI(service=gmail.users().messages(), function=trashOrDelete,
|
||||||
|
id=del_me[u'id'], userId=u'me')
|
||||||
|
|
||||||
def doDeleteLabel(users):
|
def doDeleteLabel(users):
|
||||||
label = sys.argv[5]
|
label = sys.argv[5]
|
||||||
count = len(users)
|
count = len(users)
|
||||||
@@ -3639,14 +3734,14 @@ def doDeleteLabel(users):
|
|||||||
for del_me in del_labels:
|
for del_me in del_labels:
|
||||||
print u' deleting label %s (%s/%s)' % (del_me[u'name'], i, del_me_count)
|
print u' deleting label %s (%s/%s)' % (del_me[u'name'], i, del_me_count)
|
||||||
i += 1
|
i += 1
|
||||||
dbatch.add(gmail.users().labels().delete(userId=user, id=del_me[u'id']), callback=label_del_result)
|
dbatch.add(gmail.users().labels().delete(userId=user, id=del_me[u'id']), callback=gmail_del_result)
|
||||||
if len(dbatch._order) == 25:
|
if len(dbatch._order) == 10:
|
||||||
dbatch.execute()
|
dbatch.execute()
|
||||||
dbatch = googleapiclient.http.BatchHttpRequest()
|
dbatch = googleapiclient.http.BatchHttpRequest()
|
||||||
if len(dbatch._order) > 0:
|
if len(dbatch._order) > 0:
|
||||||
dbatch.execute()
|
dbatch.execute()
|
||||||
|
|
||||||
def label_del_result(request_id, response, exception):
|
def gmail_del_result(request_id, response, exception):
|
||||||
if exception is not None:
|
if exception is not None:
|
||||||
print exception
|
print exception
|
||||||
|
|
||||||
@@ -6715,6 +6810,7 @@ def doPrintGroups():
|
|||||||
group_attributes = [{u'Email': u'Email'}]
|
group_attributes = [{u'Email': u'Email'}]
|
||||||
titles = [u'Email']
|
titles = [u'Email']
|
||||||
fields = u'nextPageToken,groups(email)'
|
fields = u'nextPageToken,groups(email)'
|
||||||
|
user = None
|
||||||
while i < len(sys.argv):
|
while i < len(sys.argv):
|
||||||
if sys.argv[i].lower() == u'domain':
|
if sys.argv[i].lower() == u'domain':
|
||||||
usedomain = sys.argv[i+1].lower()
|
usedomain = sys.argv[i+1].lower()
|
||||||
@@ -6784,7 +6880,7 @@ def doPrintGroups():
|
|||||||
customerId = None
|
customerId = None
|
||||||
sys.stderr.write(u"Retrieving All Groups for Google Apps account (may take some time on a large account)...\n")
|
sys.stderr.write(u"Retrieving All Groups for Google Apps account (may take some time on a large account)...\n")
|
||||||
page_message = u'Got %%num_items%% groups: %%first_item%% - %%last_item%%\n'
|
page_message = u'Got %%num_items%% groups: %%first_item%% - %%last_item%%\n'
|
||||||
all_groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', page_message=page_message, message_attribute=u'email', customer=customerId, domain=usedomain, fields=fields)
|
all_groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', page_message=page_message, message_attribute=u'email', customer=customerId, domain=usedomain, userKey=usemember, fields=fields)
|
||||||
total_groups = len(all_groups)
|
total_groups = len(all_groups)
|
||||||
count = 0
|
count = 0
|
||||||
for group_vals in all_groups:
|
for group_vals in all_groups:
|
||||||
@@ -8464,6 +8560,12 @@ try:
|
|||||||
else:
|
else:
|
||||||
print u'Error: invalid argument to "gam <users> show..."'
|
print u'Error: invalid argument to "gam <users> show..."'
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
elif command == u'trash':
|
||||||
|
if sys.argv[4].lower() in [u'message', u'messages']:
|
||||||
|
doDeleteMessages(trashOrDelete=u'trash', users=users)
|
||||||
|
else:
|
||||||
|
print u'ERROR: invalid argument to "gam <users> trash..."'
|
||||||
|
sys.exit(2)
|
||||||
elif command == u'delete' or command == u'del':
|
elif command == u'delete' or command == u'del':
|
||||||
delWhat = sys.argv[4].lower()
|
delWhat = sys.argv[4].lower()
|
||||||
if delWhat == u'delegate':
|
if delWhat == u'delegate':
|
||||||
@@ -8472,6 +8574,8 @@ try:
|
|||||||
deleteCalendar(users)
|
deleteCalendar(users)
|
||||||
elif delWhat == u'label':
|
elif delWhat == u'label':
|
||||||
doDeleteLabel(users)
|
doDeleteLabel(users)
|
||||||
|
elif delWhat in [u'message', u'messages']:
|
||||||
|
doDeleteMessages(trashOrDelete=u'delete', users=users)
|
||||||
elif delWhat == u'photo':
|
elif delWhat == u'photo':
|
||||||
deletePhoto(users)
|
deletePhoto(users)
|
||||||
elif delWhat in [u'license', u'licence']:
|
elif delWhat in [u'license', u'licence']:
|
||||||
|
|||||||
Reference in New Issue
Block a user