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)
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)