예제 #1
0
 def setUp(self):
     #dummy google login details
     self.email = '*****@*****.**'
     self.password = '******'
     self.spreadsheet = 'Praekelt'
     self.empty_spreadsheet = 'Empty Spreadsheet'
     self.start = date.today() - timedelta(days=14)
     self.until = date.today()
     self.user = User.objects.all()[0]
     self.importer = Importer(self.user, self.email, self.password)
     # make sure we're actually testing some data
     self.assertTrue(Patient.objects.count() > 0)
     self.assertTrue(Visit.objects.count() > 0)
     self.assertTrue(Clinic.objects.count() > 0)
     self.random_msisdn = random.choice(range(111111111, 999999999, 123456))
     self.enrolled_patients = {
                                 1: {
                                      'appointmentdate1': date(2011, 8, 1),
                                      'fileno': 1111111,
                                      'appointmentstatus1': 'Missed',
                                      'phonenumber': self.random_msisdn
                                     },
                                 2: {
                                      'appointmentdate1': date(2011, 8, 10),
                                      'fileno': 9999999,
                                      'appointmentstatus1': 'Attended',
                                      'phonenumber': self.random_msisdn
                                     }
     }
예제 #2
0
 def handle(self, *args, **kwargs):
     try:
         for account in GoogleAccount.objects.all():
             importer = Importer(
                 email=account.username,
                 password=account.password
             )
             try:
                 #get the spreadsheet for this acount holder
                 spreadsheet = SpreadSheet.objects.get(account=account)
                 logging.debug("Spreadsheet for: %s" % account.username)
             except SpreadSheet.DoesNotExist:
                 logging.exception("No Spreadsheet for account: %s\n" %
                                   account)
             except MultipleObjectsReturned:
                 logging.exception("Account can only have one spreadsheet.")
                 return
             # from midnight
             midnight = date.today()
             start = midnight - timedelta(days=1)
             # until 14 days later
             until = midnight + timedelta(days=14)
             try:
                 importer.import_spread_sheet(spreadsheet.spreadsheet,
                                              start, until)
                 logging.debug("Import spreadsheet data using period.")
             except:
                 print "Update error for", spreadsheet.spreadsheet
                 logging.exception("Error while updating patient")
     except GoogleAccount.DoesNotExist:
         logging.exception("Google Account does not exists")
         return
예제 #3
0
 def handle(self, *args, **kwargs):
     importer = Importer(ExpatError, e
         uri='https://docs.google.com' % (
             Setting.objects.get(name='GOOGLE_USERNAME').value,
             Setting.objects.get(name='GOOGLE_PASSWORD').value
         ),
         verbose=settings.DEBUG
     )
     for spreadsheet in SpreadSheet.objects.all():
         try:
             importer.import_spread_sheet(spreadsheet)
         except e:
             print "Spreadsheet name exception ", spreadsheet
             traceback.print_exc()
         
         
     
             
예제 #4
0
 def handle(self, *args, **kwargs):
     try:
         for account in GoogleAccount.objects.all():
             importer = Importer(
                 owner=account.user,
                 email=account.username,
                 password=account.password
             )
             for spreadsheet in SpreadSheet.objects.filter(account=account):
                 midnight = date.today()
                 start = midnight - timedelta(days=1)
                 # until 14 days later
                 until = midnight + timedelta(days=14)
                 try:
                     importer.import_spread_sheet(spreadsheet.spreadsheet,
                                                  start, until)
                 except:
                     logging.exception("Update error for: %s" % (
                         spreadsheet.spreadsheet,))
                     logging.exception("Error while updating patient")
     except GoogleAccount.DoesNotExist:
         logging.exception("Google Account does not exists")
         return
예제 #5
0
class ImporterTestCase(TestCase):
    """Testing the google spreadsheet import loop"""

    fixtures = ['patient', 'visit', 'clinic']

    def setUp(self):
        #dummy google login details
        self.email = '*****@*****.**'
        self.password = '******'
        self.spreadsheet = 'Praekelt'
        self.empty_spreadsheet = 'Empty Spreadsheet'
        self.start = date.today() - timedelta(days=14)
        self.until = date.today()
        self.user = User.objects.all()[0]
        self.importer = Importer(self.user, self.email, self.password)
        # make sure we're actually testing some data
        self.assertTrue(Patient.objects.count() > 0)
        self.assertTrue(Visit.objects.count() > 0)
        self.assertTrue(Clinic.objects.count() > 0)
        self.random_msisdn = random.choice(range(111111111, 999999999, 123456))
        self.enrolled_patients = {
                                    1: {
                                         'appointmentdate1': date(2011, 8, 1),
                                         'fileno': 1111111,
                                         'appointmentstatus1': 'Missed',
                                         'phonenumber': self.random_msisdn
                                        },
                                    2: {
                                         'appointmentdate1': date(2011, 8, 10),
                                         'fileno': 9999999,
                                         'appointmentstatus1': 'Attended',
                                         'phonenumber': self.random_msisdn
                                        }
        }

    def tearDown(self):
        pass

    def test_incorrect_spreadsheet_name(self):
        """Test for import with no existing spreadsheet names."""
        #invalid spreadsheet names
        self.doc_names = [
                             '##hgh', 'copy of appointment',
                             '123456', 123456, '#Praekelt'
        ]
        #rondomly select an invalid spreadsheet name
        self.invalid_doc_name = random.choice(self.doc_names)
        self.test_doc_name, self.correct = self.importer.import_spread_sheet(
                                self.invalid_doc_name, self.start, self.until
        )
        self.str_invalid_doc_name = str(self.invalid_doc_name)
        self.assertEquals(self.test_doc_name, self.str_invalid_doc_name)
        self.assertIs(self.correct, False)

    def test_empty_worksheets(self):
        """Test for a spreadsheet with no data to update."""
        self.doc_name, self.data = self.importer.import_spread_sheet(
                               self.empty_spreadsheet, self.start, self.until
        )
        self.assertEquals(self.doc_name, self.empty_spreadsheet)
        self.assertIs(self.data, False)

    def test_import_worksheets(self):
        """Test for importing worksheets from a spreadsheet."""
        self.from_date = date(2011, 7, 18)
        self.to_date = date(2011, 9, 22)
        self.enrolled, self.updates = self.importer.import_spread_sheet(
                             self.spreadsheet, self.from_date, self.to_date
        )
        self.assertEquals(self.enrolled, self.updates)

    def test_check_file_no_format_fail(self):
        """Test invalid file number format."""
        #invalid file number formats
        self.file_numbers = ['+1234', '#ab789', 'abc8901@@', 'ab#12345']
        #random selection of invalid file numbers
        self.file_no_test = random.choice(self.file_numbers)
        self.file_no, self.file_format = self.importer.check_file_no_format(
                                                            self.file_no_test
        )
        self.assertEqual(self.file_no, self.file_no_test)
        self.assertEqual(self.file_format, False)

    def test_check_file_no_pass(self):
        """Test file number format can only be alphanumeric."""
        #invalid file number formats
        self.file_numbers = [1234, 'ab789', 'abc8901', 'ab12345']
        #random selection of invalid file numbers
        self.file_no_test = random.choice(self.file_numbers)
        self.file_no, self.file_format = self.importer.check_file_no_format(
                                                      self.file_no_test
        )
        self.test_file_no = str(self.file_no_test)
        self.assertEqual(self.file_no,  self.test_file_no)
        self.assertEqual(self.file_format, True)

    def test_check_msisdn_format_fail(self):
        """Test for an invalid msisdn format."""
        #invalid phone number formats
        self.phones = [
                          1234567, 123456789012, '+1234567',
                          '012456789', '-12345678901', '###12345',
                          'abcdefghi', '12345abcd'
        ]
        #random selection of invalid phone numbers
        self.phone_test = random.choice(self.phones)
        #phone number and format correct flag
        self.phone, self.phone_format = self.importer.check_msisdn_format(
                                                           self.phone_test
        )
        self.assertIs(self.phone_format, False)
        self.assertEquals(self.phone_test, self.phone)

    def test_check_msisdn_format_pass(self):
        """Test for valid msisdn formats. """
        #valid phone numbers
        self.valid_phones = [
                                123456789, '0123456789',
                                27123456789, '+27123456789'
        ]
        #random selection of valid msisdn
        self.valid_phone = random.choice(self.valid_phones)
        #phone number and format correct flag
        self.phone, self.phone_format = self.importer.check_msisdn_format(
                                                              self.valid_phone
        )
        self.assertIs(self.phone_format, True)

    def test_create_patient_pass(self):
        """Test if the patient was created."""
        self.random_patient = random.choice(range(11111, 99999, 1234))
        self.random_patient = str(self.random_patient)
        self.new_patient = {
                               'appointmentdate1': date(2011, 10, 1),
                               'fileno': self.random_patient,
                               'appointmentstatus1': 'Scheduled',
                               'phonenumber': self.random_msisdn
        }
        self.random_row = random.choice(range(1, 99, 1))
        self.row = self.random_row
        self.created = self.importer.create_patient(
                                self.new_patient, self.row, self.spreadsheet,
                                self.start, self.until
        )
        self.assertIs(self.created, True)

    def test_create_patient_fail(self):
        """Test if the patient was not created. """
        self.new_patient = {
                               'appointmentdate1': date(2011, 10, 1),
                               'fileno': '###s01011',
                               'appointmentstatus1': 'Scheduled',
                               'phonenumber': 190909090
        }
        self.row = 12
        self.created = self.importer.create_patient(
                                self.new_patient, self.row, self.spreadsheet,
                                self.start, self.until
        )
        self.assertIs(self.created, False)

    def test_set_cache_enrollment_status_fail(self):
        """Test caching of patient that have not enrolled."""
        self.uncached_filenos = [111100, 323232, 666666, 'abc113', '123zxy']
        self.cache_fileno = random.choice(self.uncached_filenos)
        self.cached_enrolled = self.importer.set_cache_enrollement_status(
                 self.spreadsheet, self.cache_fileno, self.start, self.until
        )
        self.assertIs(self.cached_enrolled, False)

    def test_set_cache_enrollment_status_pass(self):
        """Test caching of patient that have enrolled."""
        self.uncached_filenos = [721003, 61201, 9999999, 118801]
        self.cache_fileno = random.choice(self.uncached_filenos)
        self.cached_enrolled = self.importer.set_cache_enrollement_status(
                  self.spreadsheet, self.cache_fileno, self.start, self.until
        )
        self.assertIs(self.cached_enrolled, True)

    def test_get_cache_enrollment_status(self):
        """Test if cached enrollement status was found."""
        self.uncached_filenos = [721003, 61201, 9999999, 118801]
        self.cache_fileno = random.choice(self.uncached_filenos)
        self.importer.set_cache_enrollement_status(
                    self.spreadsheet, self.cache_fileno, self.start, self.until
        )
        self.cached = self.importer.get_cache_enrollement_status(
                                                   self.cache_fileno
        )
        self.assertIs(self.cached, True)

    def test_update_patients(self):
        """Test if a worksheet of patients is updated successfully."""
        self.enrolled, self.updates = self.importer.update_patients(
                                    self.enrolled_patients, self.spreadsheet,
                                    self.start, self.until
        )
        self.assertEqual(self.enrolled, 2)
        self.assertEqual(self.updates, 2)

    def test_invalid_file_no_(self):
        """Test if the file no is invalid."""
        #invalid phone number formats
        self.files = ['+1234', '#ab789', 'abc8901@@', 'ab#12345']
        #random selection of invalid file numbers
        self.file_test = random.choice(self.files)
        self.patient_row = {
                                'appointmentdate1': date(2011, 8, 10),
                                'fileno': self.file_test,
                                'appointmentstatus1': 'Missed',
                                'phonenumber': 987654321
        }
        self.row_no = 2
        self.valid = self.importer.update_patient(
                               self.patient_row, self.row_no, self.spreadsheet,
                               self.start, self.until
        )
        self.assertIs(self.valid, False)

    def test_invalid_patient_id(self):
        """Patient not on the database test if its created."""
        self.patient_row = {
                               'appointmentdate1': date(2011, 8, 10),
                               'fileno': 555555,
                               'appointmentstatus1': 'Missed',
                               'phonenumber': 987654321
        }
        self.row_no = 2
        self.created = self.importer.update_patient(
                               self.patient_row, self.row_no, self.spreadsheet,
                               self.start, self.until
        )
        self.assertEqual(self.created, True)

    def test_successful_patient_update(self):
        """Test that a patient was successfully updated."""
        self.msisdn = random.choice(range(111111111, 999999999, 123456))
        self.patient_row = {
                               'appointmentdate1': date(2011, 8, 9),
                               'fileno': 9999999,
                               'appointmentstatus1': 'Attended',
                               'phonenumber': self.msisdn
        }
        self.row_no = 2
        self.patient_updated = self.importer.update_patient(
                              self.patient_row, self.row_no, self.spreadsheet,
                              self.start, self.until
        )
        self.assertEqual(self.patient_updated, True)

    def test_updated_msisdn(self):
        """Test that the phone number was updated."""
        self.msisdn = random.choice(range(111111111, 999999999, 123456))
        self.msisdn = '27' + str(self.msisdn)
        self.curr_patient = Patient.objects.get(te_id='9999999')
        self.assertTrue(self.curr_patient)
        self.phone, self.created = self.importer.update_msisdn(
                                         self.msisdn, self.curr_patient
        )
        self.assertIs(self.created, True)
        self.assertEquals(self.msisdn, self.phone)

    def test_msisdn_not_updated(self):
        """Test if incorrect phone number are not updated """
        self.msisdn = random.choice(range(1111111, 9999999, 12345))
        self.curr_patient = Patient.objects.get(te_id='9999999')
        self.assertTrue(self.curr_patient)
        self.phone, self.created = self.importer.update_msisdn(
                                        self.msisdn, self.curr_patient
        )
        self.phone = int(self.phone)
        self.assertIs(self.created, False)
        self.assertEqual(self.msisdn, self.phone)

    def test_invalid_visit_id(self):
        """Visit not on the database."""
        (self.app_status, self.app_date, self.visit_id,  self.curr_patient) = (
                                   'Scheduled', date(2011, 8, 10), 'jjjjjjj',
                                   Patient.objects.get(te_id='9999999')
        )
        original_count = Visit.objects.count()
        status = self.importer.update_appointment_status(
            self.app_status,  self.curr_patient, self.app_date,
            self.visit_id, self.spreadsheet
        )
        self.assertEqual(status, 's')
        self.assertEqual(Visit.objects.count(), original_count + 1)

    def test_update_not_needed(self):
        """Appointment status already updated."""
        (self.app_status, self.app_date, self.visit_id, self.curr_patient) = (
                                'Scheduled', date(2011, 8, 10), '02-9999999',
                                Patient.objects.get(te_id='9999999')
        )
        self.updated = self.importer.update_appointment_status(
                        self.app_status,  self.curr_patient, self.app_date,
                        self.visit_id, self.spreadsheet
        )
        self.status = 's'
        self.assertEquals(self.status, 's')

    def test_status_is_updated(self):
        """Checks that the status was updated"""
        (self.app_status, self.app_date, self.visit_id, self.curr_patient) = (
                                     'Missed', date(2011, 8, 10), '02-9999999',
                                     Patient.objects.get(te_id='9999999')
        )
        self.status_updated = self.importer.update_appointment_status(
                    self.app_status,  self.curr_patient, self.app_date,
                    self.visit_id, self.spreadsheet
        )
        self.assertEquals(self.status_updated, 'm')

    def test_status_not_updated(self):
        """Test that the update failed."""
        (self.app_status, self.app_date, self.visit_id, self.curr_patient) = (
                                      'Missed', date(2011, 8, 1), '02-9999999',
                                      Patient.objects.get(te_id='9999999')
        )
        self.status_updated = self.importer.update_appointment_status(
                    self.app_status,  self.curr_patient, self.app_date,
                    self.visit_id, self.spreadsheet
        )
        self.assertEquals(self.status_updated, 'm')