CAT-SOOP is a flexible, programmable learning management system based on the Python programming language. https://catsoop.mit.edu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

66 lines
2.5 KiB

  1. # This file is part of CAT-SOOP
  2. # Copyright (c) 2011-2017 Adam Hartz <hartz@mit.edu>
  3. #
  4. # This program is free software: you can redistribute it and/or modify it under
  5. # the terms of the GNU Affero General Public License as published by the Free
  6. # Software Foundation, either version 3 of the License, or (at your option) any
  7. # later version.
  8. #
  9. # This program is distributed in the hope that it will be useful, but WITHOUT
  10. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  11. # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  12. # details.
  13. #
  14. # You should have received a copy of the GNU Affero General Public License
  15. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. import json
  17. api_token = cs_form.get('api_token', None)
  18. path = cs_form.get('path', None)
  19. section = cs_form.get('section', None)
  20. error = None
  21. if api_token is None:
  22. error = "api_token is required"
  23. try:
  24. path = opath = json.loads(path)
  25. course, path = path[0], path[1:]
  26. except:
  27. error = "invalid path: %s" % path
  28. if error is None:
  29. output = csm_api.get_user_information(globals(), api_token=api_token, course=course)
  30. if output['ok']:
  31. uinfo = output['user_info']
  32. if 'groups' not in uinfo['permissions'] and 'admin' not in uinfo['permissions']:
  33. error = 'Permission Denied'
  34. if error is not None:
  35. output = {'ok': False, 'error': error}
  36. else:
  37. ctx = csm_loader.spoof_early_load(opath)
  38. groups = csm_groups.list_groups(ctx, course, path)
  39. all_students = {i: csm_util.read_user_file(globals(), course, i, {})
  40. for i in csm_util.list_all_users(globals(), course)}
  41. if section is not None:
  42. groups = groups.get(section, {})
  43. all_partnered = sum(groups.values(), [])
  44. unpartnered = [i for i in all_students
  45. if i not in all_partnered and
  46. str(all_students[i].get('section', 'default')) == section]
  47. groups['_unpartnered'] = unpartnered
  48. else:
  49. for section in groups:
  50. secgrp = groups[section]
  51. all_partnered = sum(secgrp.values(), [])
  52. unpartnered = [i for i in all_students
  53. if i not in all_partnered and
  54. str(all_students[i].get('section', 'default')) == section]
  55. secgrp['_unpartnered'] = unpartnered
  56. output = {'ok': True, 'groups': groups}
  57. cs_handler = 'raw_response'
  58. content_type = 'application/json'
  59. response = json.dumps(output)