source: asadb/util/import_db.py @ aaaa0ae

space-accessstablestage
Last change on this file since aaaa0ae was a1ff79a, checked in by Alex Dehnert <adehnert@…>, 14 years ago

Populate version history better (Trac: #49)

  • Data migration (0019_initial_revs) to run the createinitialrevisions management command, which revisions with the initial data of all the versioned models
  • Use reversion when importing new data in util/import_db.py
  • Data migration (0019_initial_revs) to create the user import_db.py claims created its revisions
  • Property mode set to 100755
File size: 3.7 KB
Line 
1#!/usr/bin/python
2import csv
3import datetime
4import os
5import sys
6
7if __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
13import django.contrib.auth.models
14import reversion
15
16import groups.models
17
18def dictize_line(header, line,):
19    line_dict = {}
20    for key, elem in zip(header, line, ):
21        line_dict[key]=elem
22    return line_dict
23
24def canonicalize_email(email):
25    if '@' in email: return email
26    elif email == '': return ''
27    else: return email + "@mit.edu"
28
29def db_parse_date(string):
30    return datetime.datetime.strptime(string, '%d-%b-%y').date()
31
32def convert_to_int(number):
33    if number == 'n/a': return None
34    if number == '': return None
35    if number == 'none': return None
36    else: return int(number)
37
38def import_group(d):
39    g = groups.models.Group()
40    g.pk                = d['ASA_STUDENT_GROUP_KEY']
41    g.name              = d['STUDENT_GROUP_NAME']
42    g.abbreviation      = d['STUDENT_GROUP_ACRONYM']
43    g.description       = d['STUDENT_GROUP_DESCRIPTION']
44    cat_name = d['GROUP_ACTIVITY_CATEGORY']
45    try:
46        g.activity_category = groups.models.ActivityCategory.objects.get(name=cat_name)
47    except groups.models.ActivityCategory.DoesNotExist:
48        print ">> Unknown category '%s' on group '%s'" % (cat_name, g.name, )
49        pass
50    class_name = d['GROUP_CLASS']
51    status_name = d['GROUP_STATUS']
52    funding_name = d['GROUP_FUNDING_TYPE']
53    if class_name == 'Standard':
54        if status_name == 'Provisional':
55            class_name = 'Unfunded'
56            status_name = 'Active'
57        elif status_name == 'Active':
58            class_name = 'MIT-funded'
59        elif status_name == 'Suspended' or status_name == 'Derecognized':
60            class_name = 'MIT-funded'
61    g.group_class = groups.models.GroupClass.objects.get(name=class_name)
62    g.group_status = groups.models.GroupStatus.objects.get(name=status_name)
63    if funding_name == 'none':
64        g.group_funding = None
65    else:
66        g.group_funding = groups.models.GroupFunding.objects.get(name=funding_name)
67    g.website_url       = d['WEBSITE_URL']
68    g.constitution_url  = d['CONSTITUTION_WEB_URL']
69    g.meeting_times     = d['MEETING_TIMES']
70    g.advisor_name      = d['ADVISOR']
71    g.num_undergrads    = convert_to_int(d['NUM_OF_UNDERGRADUATE'])
72    g.num_grads         = convert_to_int(d['NUM_OF_GRADUATE'])
73    g.num_community     = convert_to_int(d['NUM_OF_COMMUNITY'])
74    g.num_other         = convert_to_int(d['NUM_OF_OTHERS'])
75    g.group_email       = canonicalize_email(d['STUDENT_GROUP_EMAIL'])
76    g.officer_email     = canonicalize_email(d['OFFICER_EMAIL'])
77    try:
78        g.main_account_id   = convert_to_int(d['MAIN_ACCOUNT_ID'])
79    except ValueError:
80        if d['MAIN_ACCOUNT_ID'] == "contact LWard":
81            print "Ignoring account ID contact LWard..."
82            g.main_account_id = None
83        else:
84            raise
85    g.funding_account_id= convert_to_int(d['FUNDING_ACCOUNT_ID'])
86    g.athena_locker     = d['ATHENA_LOCKER']
87    g.recognition_date  = db_parse_date(d['RECOGNITION_DATE'])
88    g.update_date       = db_parse_date(d['UPDATE_DATE'])
89    g.updater           = d['UPDATER']
90    g.save()
91
92if __name__ == '__main__':
93    indb = sys.stdin
94    reader = csv.reader(indb)
95    header = reader.next()
96    with reversion.create_revision():
97        for line in reader:
98            d = dictize_line(header, line)
99            print d
100            import_group(d)
101        importer = django.contrib.auth.models.User.objects.get(username='importer@SYSTEM', )
102        reversion.set_user(importer)
103        reversion.set_comment("Groups importer")
Note: See TracBrowser for help on using the repository browser.