Exemple #1
0
class KivySurvey(ScreenManager):
    current_page = ObjectProperty(None, allownone=True)
    current_subjects = ListProperty(None, allownone=True)
    db_interface = ObjectProperty(None)
    current_subjects = ListProperty(None, allownone=True)
    subject_id = NumericProperty(None, allownone=True)
    previous_subject_ids = ListProperty(None, allownone=True)
    current_page = ObjectProperty(None, allownone=True)
    current_subjects_page = ObjectProperty(None, allownone=True)
    next_page = StringProperty(None, allownone=True)
    prev_page = StringProperty(None, allownone=True)
    survey = ObjectProperty(None)
    current_location = DictProperty({})
    gps_loc_interval = NumericProperty(30.0)
    questionnaire = StringProperty(None, allownone=True)
    top_level_questionnaire = StringProperty(None, allownone=True)
    root = ObjectProperty(None)

    def __init__(self, **kwargs):
        global_idmap.update({'kivysurvey': self})
        self.db_interface = DBInterface(self)
        super(KivySurvey, self).__init__(**kwargs)
        self.transition = SlideTransition()
        json = JsonStore(construct_target_file_name('survey.json', __file__))
        for each in json:
            print(each)
        self.survey = Survey(json)
        try:
            gps.configure(on_location=self.receive_gps)
        except:
            pass
        Clock.schedule_once(self.start_gps)

    def on_subject_id(self, instance, value):
        self.load_subjects(value, self.questionnaire)

    def create_subject(self):
        db_interface = self.db_interface
        uid = db_interface.get_unique_id()
        prev_id = self.previous_subject_ids[-1]
        db_interface.add_subject(prev_id, self.questionnaire, uid)
        return uid

    def pop_subjects(self):
        previous_subject_ids = self.previous_subject_ids
        if len(previous_subject_ids) > 0:
            self.subject_id = self.previous_subject_ids.pop()
        else:
            self.subject_id = None
              
    def on_questionnaire(self, instance, value):
        self.load_subjects(self.subject_id, value)
        self.current_subjects_page.allow_add_subject = (
            self.survey.get_allow_add_subjects(value))

    def load_subjects(self, subject_id, questionnaire):
        self.current_subjects = self.db_interface.get_subjects(
            subject_id, questionnaire)

    def get_header_lines(self):
        return self.survey.get_header_definitions(self.questionnaire)

    def set_next_page(self):
        survey = self.survey
        next_page = survey.get_next_page(
            self.questionnaire, self.current_page.page)
        
        if next_page is None:
            return False
        else:
            self.next_page = None
            self.next_page = next_page
            return True

    def add_member(self):
        self.transition.direction = 'left'
        self.previous_subject_ids.append(self.subject_id)
        self.subject_id = None
        self.reset_questionnaire()

    def open_member(self, member_id, instance):
        self.transition.direction = 'left'
        self.previous_subject_ids.append(self.subject_id)
        self.subject_id = member_id
        self.reset_questionnaire()
        current_page = self.current_page.ids.questions
        current_page.load_page_data()

    def reset_questionnaire(self):
        self.current_page.page = None
        self.set_next_page() 
        self.swap_pages()
        self.current_page.ids.questions.clear_questions()

    def set_prev_page(self):
        survey = self.survey
        prev_page = survey.get_prev_page(
            self.questionnaire, self.current_page.page)
        if prev_page is None:
            return False
        else:
            self.prev_page = prev_page
            return True

    def swap_subjects(self):
        subjects1 = self.ids.subjects1
        subjects2 = self.ids.subjects2
        current_subjects_page = self.current_subjects_page
        if current_subjects_page is subjects1:
            self.current = 'subjects2'
            self.current_subjects_page = subjects2
        elif current_subjects_page is subjects2:
            self.current = 'subjects1'
            self.current_subjects_page = subjects1
        self.current_subjects_page.allow_add_subject = (
            self.survey.get_allow_add_subjects(self.questionnaire))
        self.current_page.ids.scrollview.scroll_to_top()

    def swap_pages(self):

        questions1 = self.ids.questions1
        questions2 = self.ids.questions2
        current_page = self.current_page
        if current_page is questions1:
            self.current = 'questions2'
            self.current_page = questions2
            questions1.page = None
        elif current_page is questions2:
            self.current = 'questions1'
            self.current_page = questions1
            questions2.page = None
        self.current_page.ids.scrollview.scroll_to_top()

    def on_next_page(self, instance, value):
        questions1 = self.ids.questions1
        questions2 = self.ids.questions2
        current_page = self.current_page
        if current_page is questions1:
            questions2.page = value
        elif current_page is questions2:
            questions1.page = value

    def on_prev_page(self, instance, value):
        questions1 = self.ids.questions1
        questions2 = self.ids.questions2
        current_page = self.current_page
        if current_page is questions1:
            questions2.page = value
        elif current_page is questions2:
            questions1.page = value

    def start_questionnaire(self, questionnaire):
        self.current_page.page = None
        self.swap_subjects()
        self.questionnaire = questionnaire
        self.set_next_page()

    def save_page(self):
        current_page = self.current_page.ids.questions
        current_page.save_page_data()


    def go_back(self):
        does_page_exist = self.set_prev_page()
        survey = self.survey
        questionnaire = self.questionnaire
        prev_questionnaire = survey.get_previous_questionnaire()
        self.transition.direction = 'right'
        if self.current in ['subjects1', 'subjects2']:
            if prev_questionnaire is None:
                self.app.root.change_screen('cluster', go_back=True)
                return
            else:
                if survey.get_allow_add_subjects(questionnaire):
                    self.pop_subjects()
                self.start_questionnaire(survey.pop_previous_questionnaire())
        elif does_page_exist:
            self.swap_pages()
        else:
            if self.subject_id is None:
                self.pop_subjects()
                self.swap_subjects()
            else:
                self.pop_subjects()
                self.swap_subjects()

    def go_forward(self):
        does_page_exist = self.set_next_page()
        survey = self.survey
        questionnaire = self.questionnaire
        next_questionnaire = survey.get_next_questionnaire(questionnaire)
        self.transition.direction = 'left'
        if self.current in ['subjects1', 'subjects2']:
            if next_questionnaire is None:
                if survey.get_allow_add_subjects(questionnaire):
                    self.pop_subjects()
                prev_questionnaire = survey.pop_previous_questionnaire()
                self.start_questionnaire(prev_questionnaire)
            else:
                if survey.get_allow_forward(questionnaire):
                    survey.store_current_questionnaire(questionnaire)
                    self.start_questionnaire(next_questionnaire)
        elif does_page_exist:
            self.save_page()
            self.swap_pages()
        else:
            is_creating_subject = False
            if survey.get_allow_add_subjects(questionnaire) and (
                self.subject_id is None):
                self.subject_id = self.create_subject()
            self.save_page()
            if next_questionnaire is None:
                self.pop_subjects()
                prev_questionnaire = survey.pop_previous_questionnaire()
                self.start_questionnaire(prev_questionnaire)
            elif survey.get_allow_add_subjects(next_questionnaire):
                survey.store_current_questionnaire(questionnaire)
                self.start_questionnaire(next_questionnaire)
            else:
                self.pop_subjects()
                self.swap_subjects()

    def start_gps(self, dt):
        try:
            gps.start()
        except:
            pass

    def receive_gps(self, **kwargs):
        if kwargs is not {}:
            self.current_location = kwargs
            gps.stop()
            Clock.schedule_once(self.start_gps, self.gps_loc_interval)

    def raise_error(self, error_title, error_text):
        self.app.raise_error(error_title, error_text)

    def raise_option_dialogue(self, option_title, option_text, options, 
            callback):
        self.app.raise_option_dialogue(option_title, option_text, options,
            callback)

    def raise_numpad(self, numpad_title, callback, units=None,
        minimum=None, maximum=None, do_decimal=False):
        self.app.raise_numpad(numpad_title, callback, units, 
            minimum, maximum, do_decimal)
Exemple #2
0
class KivySurvey(ScreenManager):
    current_page = ObjectProperty(None, allownone=True)
    current_subjects = ListProperty(None, allownone=True)
    db_interface = ObjectProperty(None)
    current_subjects = ListProperty(None, allownone=True)
    subject_id = NumericProperty(None, allownone=True)
    previous_subject_ids = ListProperty(None, allownone=True)
    current_page = ObjectProperty(None, allownone=True)
    current_subjects_page = ObjectProperty(None, allownone=True)
    next_page = StringProperty(None, allownone=True)
    prev_page = StringProperty(None, allownone=True)
    survey = ObjectProperty(None)
    current_location = DictProperty({})
    gps_loc_interval = NumericProperty(30.0)
    questionnaire = StringProperty(None, allownone=True)
    top_level_questionnaire = StringProperty(None, allownone=True)
    root = ObjectProperty(None)

    def __init__(self, **kwargs):
        global_idmap.update({'kivysurvey': self})
        self.db_interface = DBInterface(self)
        super(KivySurvey, self).__init__(**kwargs)
        self.transition = SlideTransition()
        json = JsonStore(construct_target_file_name('survey.json', __file__))
        for each in json:
            print(each)
        self.survey = Survey(json)
        try:
            gps.configure(on_location=self.receive_gps)
        except:
            pass
        Clock.schedule_once(self.start_gps)

    def on_subject_id(self, instance, value):
        self.load_subjects(value, self.questionnaire)

    def create_subject(self):
        db_interface = self.db_interface
        uid = db_interface.get_unique_id()
        prev_id = self.previous_subject_ids[-1]
        db_interface.add_subject(prev_id, self.questionnaire, uid)
        return uid

    def pop_subjects(self):
        previous_subject_ids = self.previous_subject_ids
        if len(previous_subject_ids) > 0:
            self.subject_id = self.previous_subject_ids.pop()
        else:
            self.subject_id = None

    def on_questionnaire(self, instance, value):
        self.load_subjects(self.subject_id, value)
        self.current_subjects_page.allow_add_subject = (
            self.survey.get_allow_add_subjects(value))

    def load_subjects(self, subject_id, questionnaire):
        self.current_subjects = self.db_interface.get_subjects(
            subject_id, questionnaire)

    def get_header_lines(self):
        return self.survey.get_header_definitions(self.questionnaire)

    def set_next_page(self):
        survey = self.survey
        next_page = survey.get_next_page(self.questionnaire,
                                         self.current_page.page)

        if next_page is None:
            return False
        else:
            self.next_page = None
            self.next_page = next_page
            return True

    def add_member(self):
        self.transition.direction = 'left'
        self.previous_subject_ids.append(self.subject_id)
        self.subject_id = None
        self.reset_questionnaire()

    def open_member(self, member_id, instance):
        self.transition.direction = 'left'
        self.previous_subject_ids.append(self.subject_id)
        self.subject_id = member_id
        self.reset_questionnaire()
        current_page = self.current_page.ids.questions
        current_page.load_page_data()

    def reset_questionnaire(self):
        self.current_page.page = None
        self.set_next_page()
        self.swap_pages()
        self.current_page.ids.questions.clear_questions()

    def set_prev_page(self):
        survey = self.survey
        prev_page = survey.get_prev_page(self.questionnaire,
                                         self.current_page.page)
        if prev_page is None:
            return False
        else:
            self.prev_page = prev_page
            return True

    def swap_subjects(self):
        subjects1 = self.ids.subjects1
        subjects2 = self.ids.subjects2
        current_subjects_page = self.current_subjects_page
        if current_subjects_page is subjects1:
            self.current = 'subjects2'
            self.current_subjects_page = subjects2
        elif current_subjects_page is subjects2:
            self.current = 'subjects1'
            self.current_subjects_page = subjects1
        self.current_subjects_page.allow_add_subject = (
            self.survey.get_allow_add_subjects(self.questionnaire))
        self.current_page.ids.scrollview.scroll_to_top()

    def swap_pages(self):

        questions1 = self.ids.questions1
        questions2 = self.ids.questions2
        current_page = self.current_page
        if current_page is questions1:
            self.current = 'questions2'
            self.current_page = questions2
            questions1.page = None
        elif current_page is questions2:
            self.current = 'questions1'
            self.current_page = questions1
            questions2.page = None
        self.current_page.ids.scrollview.scroll_to_top()

    def on_next_page(self, instance, value):
        questions1 = self.ids.questions1
        questions2 = self.ids.questions2
        current_page = self.current_page
        if current_page is questions1:
            questions2.page = value
        elif current_page is questions2:
            questions1.page = value

    def on_prev_page(self, instance, value):
        questions1 = self.ids.questions1
        questions2 = self.ids.questions2
        current_page = self.current_page
        if current_page is questions1:
            questions2.page = value
        elif current_page is questions2:
            questions1.page = value

    def start_questionnaire(self, questionnaire):
        self.current_page.page = None
        self.swap_subjects()
        self.questionnaire = questionnaire
        self.set_next_page()

    def save_page(self):
        current_page = self.current_page.ids.questions
        current_page.save_page_data()

    def go_back(self):
        does_page_exist = self.set_prev_page()
        survey = self.survey
        questionnaire = self.questionnaire
        prev_questionnaire = survey.get_previous_questionnaire()
        self.transition.direction = 'right'
        if self.current in ['subjects1', 'subjects2']:
            if prev_questionnaire is None:
                self.app.root.change_screen('cluster', go_back=True)
                return
            else:
                if survey.get_allow_add_subjects(questionnaire):
                    self.pop_subjects()
                self.start_questionnaire(survey.pop_previous_questionnaire())
        elif does_page_exist:
            self.swap_pages()
        else:
            if self.subject_id is None:
                self.pop_subjects()
                self.swap_subjects()
            else:
                self.pop_subjects()
                self.swap_subjects()

    def go_forward(self):
        does_page_exist = self.set_next_page()
        survey = self.survey
        questionnaire = self.questionnaire
        next_questionnaire = survey.get_next_questionnaire(questionnaire)
        self.transition.direction = 'left'
        if self.current in ['subjects1', 'subjects2']:
            if next_questionnaire is None:
                if survey.get_allow_add_subjects(questionnaire):
                    self.pop_subjects()
                prev_questionnaire = survey.pop_previous_questionnaire()
                self.start_questionnaire(prev_questionnaire)
            else:
                if survey.get_allow_forward(questionnaire):
                    survey.store_current_questionnaire(questionnaire)
                    self.start_questionnaire(next_questionnaire)
        elif does_page_exist:
            self.save_page()
            self.swap_pages()
        else:
            is_creating_subject = False
            if survey.get_allow_add_subjects(questionnaire) and (
                    self.subject_id is None):
                self.subject_id = self.create_subject()
            self.save_page()
            if next_questionnaire is None:
                self.pop_subjects()
                prev_questionnaire = survey.pop_previous_questionnaire()
                self.start_questionnaire(prev_questionnaire)
            elif survey.get_allow_add_subjects(next_questionnaire):
                survey.store_current_questionnaire(questionnaire)
                self.start_questionnaire(next_questionnaire)
            else:
                self.pop_subjects()
                self.swap_subjects()

    def start_gps(self, dt):
        try:
            gps.start()
        except:
            pass

    def receive_gps(self, **kwargs):
        if kwargs is not {}:
            self.current_location = kwargs
            gps.stop()
            Clock.schedule_once(self.start_gps, self.gps_loc_interval)

    def raise_error(self, error_title, error_text):
        self.app.raise_error(error_title, error_text)

    def raise_option_dialogue(self, option_title, option_text, options,
                              callback):
        self.app.raise_option_dialogue(option_title, option_text, options,
                                       callback)

    def raise_numpad(self,
                     numpad_title,
                     callback,
                     units=None,
                     minimum=None,
                     maximum=None,
                     do_decimal=False):
        self.app.raise_numpad(numpad_title, callback, units, minimum, maximum,
                              do_decimal)