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()
Ejemplo n.º 2
0
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)