[158cc8d] | 1 | #!/usr/bin/python |
---|
| 2 | import csv |
---|
[d6e6622] | 3 | import datetime |
---|
| 4 | import os |
---|
| 5 | import sys |
---|
[158cc8d] | 6 | |
---|
| 7 | if __name__ == '__main__': |
---|
| 8 | cur_file = os.path.abspath(__file__) |
---|
| 9 | django_dir = os.path.abspath(os.path.join(os.path.dirname(cur_file), '..')) |
---|
| 10 | sys.path.append(django_dir) |
---|
| 11 | os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' |
---|
| 12 | |
---|
[a3b83ea] | 13 | from django.db import transaction |
---|
[a1ff79a] | 14 | import django.contrib.auth.models |
---|
| 15 | import reversion |
---|
| 16 | |
---|
[158cc8d] | 17 | import groups.models |
---|
| 18 | |
---|
[1753602] | 19 | def canonicalize_email(email): |
---|
| 20 | if '@' in email: return email |
---|
[cdc36fe] | 21 | elif email == '': return '' |
---|
[1753602] | 22 | else: return email + "@mit.edu" |
---|
| 23 | |
---|
[158cc8d] | 24 | def db_parse_date(string): |
---|
| 25 | return datetime.datetime.strptime(string, '%d-%b-%y').date() |
---|
| 26 | |
---|
| 27 | def convert_to_int(number): |
---|
| 28 | if number == 'n/a': return None |
---|
| 29 | if number == '': return None |
---|
| 30 | if number == 'none': return None |
---|
| 31 | else: return int(number) |
---|
| 32 | |
---|
[beaf731] | 33 | def import_group(d): |
---|
| 34 | g = groups.models.Group() |
---|
| 35 | g.pk = d['ASA_STUDENT_GROUP_KEY'] |
---|
| 36 | g.name = d['STUDENT_GROUP_NAME'] |
---|
| 37 | g.abbreviation = d['STUDENT_GROUP_ACRONYM'] |
---|
| 38 | g.description = d['STUDENT_GROUP_DESCRIPTION'] |
---|
| 39 | cat_name = d['GROUP_ACTIVITY_CATEGORY'] |
---|
| 40 | try: |
---|
| 41 | g.activity_category = groups.models.ActivityCategory.objects.get(name=cat_name) |
---|
| 42 | except groups.models.ActivityCategory.DoesNotExist: |
---|
| 43 | print ">> Unknown category '%s' on group '%s'" % (cat_name, g.name, ) |
---|
| 44 | pass |
---|
| 45 | class_name = d['GROUP_CLASS'] |
---|
| 46 | status_name = d['GROUP_STATUS'] |
---|
| 47 | funding_name = d['GROUP_FUNDING_TYPE'] |
---|
| 48 | if class_name == 'Standard': |
---|
| 49 | if status_name == 'Provisional': |
---|
| 50 | class_name = 'Unfunded' |
---|
| 51 | status_name = 'Active' |
---|
| 52 | elif status_name == 'Active': |
---|
| 53 | class_name = 'MIT-funded' |
---|
| 54 | elif status_name == 'Suspended' or status_name == 'Derecognized': |
---|
| 55 | class_name = 'MIT-funded' |
---|
| 56 | g.group_class = groups.models.GroupClass.objects.get(name=class_name) |
---|
| 57 | g.group_status = groups.models.GroupStatus.objects.get(name=status_name) |
---|
| 58 | if funding_name == 'none': |
---|
| 59 | g.group_funding = None |
---|
| 60 | else: |
---|
| 61 | g.group_funding = groups.models.GroupFunding.objects.get(name=funding_name) |
---|
| 62 | g.website_url = d['WEBSITE_URL'] |
---|
| 63 | g.constitution_url = d['CONSTITUTION_WEB_URL'] |
---|
| 64 | g.meeting_times = d['MEETING_TIMES'] |
---|
| 65 | g.advisor_name = d['ADVISOR'] |
---|
| 66 | g.num_undergrads = convert_to_int(d['NUM_OF_UNDERGRADUATE']) |
---|
| 67 | g.num_grads = convert_to_int(d['NUM_OF_GRADUATE']) |
---|
| 68 | g.num_community = convert_to_int(d['NUM_OF_COMMUNITY']) |
---|
| 69 | g.num_other = convert_to_int(d['NUM_OF_OTHERS']) |
---|
| 70 | g.group_email = canonicalize_email(d['STUDENT_GROUP_EMAIL']) |
---|
| 71 | g.officer_email = canonicalize_email(d['OFFICER_EMAIL']) |
---|
| 72 | try: |
---|
| 73 | g.main_account_id = convert_to_int(d['MAIN_ACCOUNT_ID']) |
---|
| 74 | except ValueError: |
---|
| 75 | if d['MAIN_ACCOUNT_ID'] == "contact LWard": |
---|
| 76 | print "Ignoring account ID contact LWard..." |
---|
| 77 | g.main_account_id = None |
---|
| 78 | else: |
---|
| 79 | raise |
---|
| 80 | g.funding_account_id= convert_to_int(d['FUNDING_ACCOUNT_ID']) |
---|
| 81 | g.athena_locker = d['ATHENA_LOCKER'] |
---|
| 82 | g.recognition_date = db_parse_date(d['RECOGNITION_DATE']) |
---|
| 83 | g.update_date = db_parse_date(d['UPDATE_DATE']) |
---|
| 84 | g.updater = d['UPDATER'] |
---|
| 85 | g.save() |
---|
| 86 | |
---|
[777e9b2] | 87 | if d['NOTE']: |
---|
| 88 | notes, created = groups.models.GroupNote.objects.get_or_create(group=g, author='importer/legacy-notes@SYSTEM', ) |
---|
| 89 | notes.body = d['NOTE'] |
---|
| 90 | notes.acl_read_group = False |
---|
| 91 | notes.acl_read_office = False |
---|
| 92 | notes.save() |
---|
| 93 | |
---|
| 94 | if d['OTHER_ACCOUNT_IDS']: |
---|
| 95 | accounts, created = groups.models.GroupNote.objects.get_or_create(group=g, author='importer/other-accounts@SYSTEM', ) |
---|
| 96 | accounts.body = d['OTHER_ACCOUNT_IDS'] |
---|
| 97 | accounts.acl_read_group = True |
---|
| 98 | accounts.acl_read_office = True |
---|
| 99 | accounts.save() |
---|
[a3b83ea] | 100 | |
---|
| 101 | @transaction.commit_on_success |
---|
| 102 | def import_groups(reader): |
---|
[a1ff79a] | 103 | with reversion.create_revision(): |
---|
| 104 | for line in reader: |
---|
[8a8ba4c] | 105 | #print line |
---|
[2ca295b] | 106 | import_group(line) |
---|
[a1ff79a] | 107 | importer = django.contrib.auth.models.User.objects.get(username='importer@SYSTEM', ) |
---|
| 108 | reversion.set_user(importer) |
---|
| 109 | reversion.set_comment("Groups importer") |
---|
[a3b83ea] | 110 | |
---|
| 111 | |
---|
| 112 | if __name__ == '__main__': |
---|
| 113 | indb = sys.stdin |
---|
| 114 | reader = csv.DictReader(indb) |
---|
| 115 | import_groups(reader) |
---|