def __init__(self): self.people = None self.people_without_harvard_info = None self.people_with_address_discrepancies= None self.load_people() # initialize self.people and self.people_without_harvard_info self.hu_ldap_searcher = HUDirectorySearcher() self.connect_people_without_harvard_info() self.hu_ldap_searcher.close_connection()
def map_hcom_to_email(): searcher = HUDirectorySearcher() cnt =0 fmt_list = [] for line in huid_map: items = line.split('\t') if not len(items) ==2: fmt_list.append(line.strip() + '\t?') elif len(items)==2: cnt+=1 huid, name = items dashes() msg('(%s) %s' % (cnt, name)) lu = { 'huid': huid } members = searcher.find_people(**lu) if members is not None: member = members[0] try: person_info = HarvardPersonInfo.objects.get(uid=member.uid) except HarvardPersonInfo.DoesNotExist: print 'person_info not found' person_info = None if person_info: print person_info.person.email print person_info.person.second_email fmt_list.append('%s\t%s\t%s' % (huid, name, person_info.person.email)) else: fmt_list.append(line.strip() + '\t?') else: fmt_list.append(line.strip() + '\t?') #if cnt == 10: # break print '\n'.join(fmt_list) open('email_list.txt', 'w').write('\n'.join(fmt_list) ) searcher.close_connection()
def __init__(self): self.searcher = HUDirectorySearcher() self.msg_lines = [] self.num_records_updated = 0
class HarvardPersonInfoUpdater: def __init__(self): self.searcher = HUDirectorySearcher() self.msg_lines = [] self.num_records_updated = 0 def close_searcher_connection(self): if self.searcher: self.searcher.close_connection() def add_msg_line(self, l): if l is None: return self.msg_lines.append(l) def update_existing_harvard_info_objects(self): """Reconcile directory with HU LDAP""" msgt('update existing harvard info objects') cnt =0 for hp in HarvardPersonInfo.objects.all(): self.update_person_info(hp, cnt) cnt+=1 self.num_records_updated+=1 #if cnt==25: break self.close_searcher_connection() def update_person_info(self, hu_info_obj, cnt=0): if hu_info_obj is None: return #msg('(%s) updating %s' % (cnt, hu_info_obj)) members = self.searcher.find_people(uid=hu_info_obj.uid) if members is None: note = '''> Not found. HarvardPersonInfo with id [%s][%s] - https://webapps.sciences.fas.harvard.edu/mcb/mcb-control-panel/hu_ldap/harvardpersoninfo/%s/''' % (hu_info_obj.id, hu_info_obj, hu_info_obj.id) self.add_msg_line(note) msg(note) elif len(members)==1: m = members[0] cnt+=1 dashes() msg('(%s) %s %s' % (cnt, m.givenName, m.sn)) #m.show() hu_info_obj.lname = m.get_or_blank('sn') hu_info_obj.fname = m.get_or_blank('givenName') hu_info_obj.email = m.get_or_blank('mail') hu_info_obj.middle_name = m.get_or_blank('harvardEduMiddleName') if m.telephoneNumber is not None: phone_num_parts = m.telephoneNumber.split() if len(phone_num_parts) == 4: hu_info_obj.phone = '-'.join(phone_num_parts[1:]) hu_info_obj.city = m.get_or_blank('l') hu_info_obj.state = m.get_or_blank('st') hu_info_obj.zipcode = m.get_or_blank('postalCode') hu_info_obj.postal_address = m.get_or_blank('postalAddress') # ferpa if m.harvardEduFerpaStatus == 'TRUE': hu_info_obj.harvardEduFerpaStatus = True else: hu_info_obj.harvardEduFerpaStatus = False if m.harvardEduFerpaPastStudentIndicator == 'TRUE': hu_info_obj.harvardEduFerpaPastStudentIndicator = True else: hu_info_obj.harvardEduFerpaPastStudentIndicator = False #print 'get or neg 1', m.get_or_neg1('harvardEduImagePrivacy') # additional privacy hu_info_obj.harvardEduImagePrivacy = m.get_or_neg1('harvardEduImagePrivacy') hu_info_obj.harvardEduSpecialPrivacy = m.get_or_neg1('harvardEduSpecialPrivacy') hu_info_obj.harvardEduEmployeePrivacy = m.get_or_neg1('harvardEduEmployeePrivacy') hu_info_obj.harvardEduStudentPrivacy = m.get_or_neg1('harvardEduStudentPrivacy') hu_info_obj.harvardEduMailPrivacy = m.get_or_neg1('harvardEduMailPrivacy') hu_info_obj.harvardEduPhonePrivacy = m.get_or_neg1('harvardEduPhonePrivacy') hu_info_obj.harvardEduFaxPrivacy = m.get_or_neg1('harvardEduFaxPrivacy') hu_info_obj.harvardEduHomePhonePrivacy = m.get_or_neg1('harvardEduHomePhonePrivacy') hu_info_obj.harvardEduMobilePrivacy = m.get_or_neg1('harvardEduMobilePrivacy') hu_info_obj.harvardEduOfficeAddressPrivacy = m.get_or_neg1('harvardEduOfficeAddressPrivacy') hu_info_obj.harvardEduHomeAddressPrivacy = m.get_or_neg1('harvardEduHomeAddressPrivacy') hu_info_obj.harvardEduDormAddressPrivacy = m.get_or_neg1('harvardEduDormAddressPrivacy') hu_info_obj.save() # reset titles hu_info_obj.titles.clear() if not m.title is None: for t in m.title: try: tobj = HarvardTitle.objects.get(name=t) except HarvardTitle.DoesNotExist: tobj = HarvardTitle(name=t) tobj.save() hu_info_obj.titles.add(tobj) hu_info_obj.save() hu_info_obj.is_student_role = False hu_info_obj.is_employee_role = False hu_info_obj.is_poi_role = False hu_info_obj.is_library_borrower_role = False # reset roles hu_info_obj.eduPersonAffiliation.clear() if not m.eduPersonAffiliation is None: for role in m.eduPersonAffiliation: if role is not None and not role.strip() == '': if role == 'employee': hu_info_obj.is_employee_role = True if role == 'student': hu_info_obj.is_student_role = True if role == 'xidHolder': hu_info_obj.is_xid_holder_role = True try: tobj = HarvardAffiliation.objects.get(name=role) except HarvardAffiliation.DoesNotExist: tobj = HarvardAffiliation(name=role) tobj.save() hu_info_obj.eduPersonAffiliation.add(tobj) hu_info_obj.save() #eduPersonAffiliation = models.ManyToManyField(HarvardAffiliation, null=True, blank=True) ''' is_student_role = models.BooleanField(default=False) is_employee_role = models.BooleanField(default=False) is_poi_role = models.BooleanField('is Person of Interest role', default=False) is_library_borrower_role = models.BooleanField(default=False) ''' else: note = '''> More than one entry found. HarvardPersonInfo with id [%s][%s] - https://webapps.sciences.fas.harvard.edu/mcb/mcb-control-panel/hu_ldap/harvardpersoninfo/%s/''' % (hu_info_obj.id, hu_info_obj, hu_info_obj.id) self.add_msg_line(note) msg(note) def send_update_report(self): msgt('Preparing email with report') admin_emails = get_admin_email_addresses() # add susan, kim, and natacha to email notice for additional_email in '[email protected] [email protected] [email protected]'.split(): admin_emails.append(additional_email) from_email = admin_emails[0] to_addresses = admin_emails if len(self.msg_lines) == 0: subject = 'Privacy Data Updates: Looks Good! %s records checked' % self.num_records_updated mail_msg = """Existing privacy records updated.\n\n%s records checked. No errors.\n\n(%s)""" % (self.num_records_updated,get_datetime_now()) else: subject = 'Privacy Data Updates: %s error notes' % len(self.msg_lines) mail_msg = """%s records checked. The following records had error messages: %s (time %s)""" % (self.num_records_updated, '\n\n'.join(self.msg_lines), get_datetime_now() ) mail_msg += """ Note: This is a weekly check to ensure that people in the MCB directory are still in the HU's central directory. The possible reasons for a person failing the check are: (1) The person has left the University (2) The last name of the person has changed """ msg('from: %s' % from_email) msg('to_addresses: %s' % to_addresses) msg('mail_msg: %s' % mail_msg) msgt('(4) Sending email with results') send_message(from_email,\ to_addresses, \ subject=subject,\ text_content=mail_msg,\ html_content=mail_msg.replace('\n', '<br />')) msg('Email sent!') msgt('Done')
class DirectoryReconciler: def __init__(self): self.people = None self.people_without_harvard_info = None self.people_with_address_discrepancies= None self.load_people() # initialize self.people and self.people_without_harvard_info self.hu_ldap_searcher = HUDirectorySearcher() self.connect_people_without_harvard_info() self.hu_ldap_searcher.close_connection() def connect_people_without_harvard_info(self): if self.people_without_harvard_info is None: return info_updater = HarvardPersonInfoUpdater() #msgt('') for p in self.people_without_harvard_info: reconcile(self.hu_ldap_searcher, p, info_updater) info_updater.close_searcher_connection() def compare_contact_info(self): if self.people is None: return msgt('phone differences') phone_mismatch_cnt =0 for p in self.people: if p.hu_info is not None and p.hu_info.phone is not None: if p.phone == p.hu_info.phone or p.second_phone == p.hu_info.phone: pass else: try: phone_mismatch_cnt += 1 print '\n(%s) %s *%s* - \nhu:[%s] \nmcb:[%s | %s]' % (phone_mismatch_cnt, p, p.appointment, p.hu_info.phone, p.phone, p.second_phone) except UnicodeDecodeError: pass email_mismatch_cnt =0 msgt('email differences') for p in self.people: if p.hu_info is not None and p.hu_info.email is not None: if p.hu_info.email in [p.email, p.second_email, p.ad_username, p.fas_username]: pass else: try: email_mismatch_cnt += 1 print '\n(%s) %s *%s* - \nhu:[%s] \nmcb:[%s | %s | %s | %s]' % (email_mismatch_cnt, p, p.appointment, p.hu_info.email, p.email, p.second_email, p.ad_username, p.fas_username) except UnicodeDecodeError: pass def show_stats(self): if self.people_without_harvard_info is None: return cnt=0 msgt('people without harvard info') for p in self.people_without_harvard_info: cnt +=1 print cnt, p def load_people(self): # retrieve all people in directory people = Person.objects.all() # retrieve HarvardPersonInfo objects pinfo_lst = HarvardPersonInfo.objects.filter(person__id__in=people.values_list('id', flat=True)) # put the HarvardPersonInfo ojbects into a lookup pinfo_dict = dict([(obj.person_id, obj) for obj in pinfo_lst]) # attached info to people for person in people: person.hu_info = pinfo_dict.get(person.id, None) self.people = people self.people_without_harvard_info = filter(lambda x: x.hu_info is None, people)