Exemplo n.º 1
0
    def on_response(self, w, resp, d=None):
        if not hasattr(self, 'food_srch_res_dlg'):
            import food_srch_res_dlg
            self.food_srch_res_dlg = \
            food_srch_res_dlg.FoodSrchResDlg(self.app)
            self.food_srch_res_dlg.ui.dialog.connect('hide', self.on_hide)

        if resp == gtk.RESPONSE_HELP:
            help.open('')

        elif resp == gtk.RESPONSE_OK:
            page = self.ui.notebook.get_current_page()
            if page == 0:
                match_list = self.search_by_text()
                if not match_list:
                    gnutr.Dialog('warn', 'No matching foods.')
                    return
            else:
                match_list = self.search_by_nutrient()
                if not match_list:
                    gnutr.Dialog('warn', 'No matching foods.')
                    return
            self.food_srch_res_dlg.show(match_list, self.view)

        elif resp == gtk.RESPONSE_CANCEL or resp == gtk.RESPONSE_DELETE_EVENT:
            if hasattr(self, 'food_srch_res_dlg'):
                self.food_srch_res_dlg.ui.dialog.hide()
            self.ui.dialog.hide()
Exemplo n.º 2
0
    def startup(self):
        db_uname = config.get_value('Username')
        db_pword = config.get_value('Password')

        import database
        self.db = database.Database(db_uname, db_pword)
        success = self.db.change_user(db_uname, db_pword, 'gnutr_db')

        if success == 0:
            import gnutr
            import sys
            gnutr.Dialog(
                'error', 'Failed to connect to the database.\n\n' +
                'I suggest that you delete the file\n ' +
                '"~/.gnutrition/config" and run "gnutrition" again.')
            gtk.main_quit()
            sys.exit()

        import store
        self.store = store.Store()

        import person
        self.person = person.Person()
        self.person.setup()

        import base_win
        self.base_win = base_win.BaseWin(self)
        self.base_win.show()
Exemplo n.º 3
0
 def on_delete_released(self, w, d=None):
     (treemodel, iter) = self.ui.selection.get_selected()
     if not iter:
         gnutr.Dialog('warn', 'No ingredient is selected.', self.parent)
     else:
         self.ui.treemodel.remove(iter)
         self.num_ingr = self.num_ingr - 1
Exemplo n.º 4
0
    def search_by_nutrient(self):
        if self.ui.treemodel.iter_n_children(None) == 0:
            return None

        fg_desc = self.ui.nutr_fg_combo.get_active_text()
        norm_by = self.ui.norm_combo.get_active()
        num = self.ui.num_foods_entry.get_text()
        try:
            num_foods = int(num)
        except ValueError:
            gnutr.Dialog(
                'warn', 'The number of foods to list is not\n' +
                'specified or is not a number.')
            return None

        constr_list = []
        iter = self.ui.treemodel.get_iter_root()
        ret = True
        while ret:
            nutr_desc = self.ui.treemodel.get_value(iter, 0)
            constr_val = self.ui.treemodel.get_value(iter, 1)
            constr_list.append((nutr_desc, constr_val))
            ret = self.ui.treemodel.iter_next(iter)

        result_list = self.search_by_nutr_constr(fg_desc, norm_by, num_foods,
                                                 constr_list)
        return result_list
Exemplo n.º 5
0
 def on_selection_changed( self, selection, d=None):
     (model, iter) = selection.get_selected()
     if iter:
         date_str = self.ui.date.entry.get_text()
         if not date_str:
             gnutr.Dialog( 'warn', 'You must select a date before\n' +
                 'you can select a time.', self.parent)
Exemplo n.º 6
0
def update_version(version, message=None):
    """Present user with dialog notification of available newer version."""
    import gnutr
    msg = 'Version {0:s} of gnutrition is available.\n'.format(version)
    msg += 'Please visit http://www.gnu.org/software/gnutrition to download.\n'
    if message:
        msg += '\n{0:s}'.format(message)
    gnutr.Dialog('notify', msg)
Exemplo n.º 7
0
    def get_recipe(self):
        r = gnutr.Recipe()
        (r.desc,r.num_serv,r.cat_desc,r.prep_desc) = self.grab_window()

        if not r.desc:
            gnutr.Dialog('error', 'No recipe name is defined.', self.parent)
            return None

        if not r.num_serv:
            gnutr.Dialog('error', 
"""The number of servings is not defined,
or is not a number.""", self.parent)
            return None

        r.cat_num = self.store.cat_desc2num[r.cat_desc]
        r.ingr_list = self.get_ingredient_list()
        return r
Exemplo n.º 8
0
 def ask_save(self, mesg):
         dlg = gnutr.Dialog('question', mesg, self.parent)
         reply = dlg.run()
         if reply == gtk.RESPONSE_YES:
             dlg.destroy()
             self.on_save_released(None)
         else:
             info('Not saving changes.')
             dlg.destroy()
Exemplo n.º 9
0
 def on_add_released( self, w, d=None):
     (model, iter) = self.ui.selection.get_selected()
     if not iter:
         gnutr.Dialog( 'warn', 'No time selected.', self.parent)
         return
     if not hasattr( self, 'plan_add_dlg'):
         import plan_add_dlg
         self.plan_add_dlg = plan_add_dlg.PlanAddDlg( self.app)
     self.plan_add_dlg.show()
Exemplo n.º 10
0
 def on_save_released( self, w, d=None):
     dlg = gnutr.Dialog( 'question',
         'The old plan will be overwritten by the new one.\n' +
         'Are you sure you want to do this?', self.parent)
     reply = dlg.run()
     if reply == gtk.RESPONSE_YES:
         self.save_plan()
         dlg.destroy()
     else:
         dlg.destroy()
Exemplo n.º 11
0
 def on_edit_released(self, w, d=None):
     (treemodel, iter) = self.ui.selection.get_selected()
     if not iter:
         gnutr.Dialog('warn', 'No ingredient is selected.', self.parent)
     else:
         ingr = treemodel.get_value(iter, 3)
         if not hasattr(self, 'food_edit_dlg'):
             import food_edit_dlg
             self.food_edit_dlg = food_edit_dlg.FoodEditDlg(self.app)
         self.food_edit_dlg.show(ingr, gnutr_consts.RECIPE)
Exemplo n.º 12
0
    def on_add_released(self, w, d=None):
        nutr_desc = self.ui.nutr_combo.get_active_text()
        constr_val = self.ui.constraint_spin.get_value()

        if self.in_store(nutr_desc):
            gnutr.Dialog('warn', 'The nutrient is already in the list.')
            return

        iter = self.ui.treemodel.append()
        self.ui.treemodel.set_value(iter, 0, nutr_desc)
        self.ui.treemodel.set_value(iter, 1, constr_val)
Exemplo n.º 13
0
    def on_nutr_released(self, w, d=None):
        if self.num_ingr == 0:
            gnutr.Dialog('warn', 'There are no ingredients.', self.parent)
            return
        num_serv = self.ui.num_serv_entry.get_text()
        try:
            num = int(num_serv)
        except ValueError:
            gnutr.Dialog(
                'warn', """The number of servings in not specified +
or is not a number.""", self.parent)
            return
        r = self.get_recipe()
        if not r:
            return
        if not hasattr(self, 'nutr_composition_dlg'):
            import nutr_composition_dlg
            self.nutr_composition_dlg = \
                nutr_composition_dlg.NutrCompositionDlg()
        self.nutr_composition_dlg.show(recipe=r)
Exemplo n.º 14
0
 def on_compute_released(self, w, d=None):
     fd_desc = self.ui.food_entry.get_text()
     if not fd_desc:
         return
     fd_num = self.store.fd_desc2num[fd_desc]
     msre_desc = self.ui.msre_combo.get_active_text()
     try:
         amount = float(self.ui.amount_entry.get_text())
     except ValueError:
         gnutr.Dialog('error', 'The amount must be a number.', self.parent)
     self.nutr_comp_dlg.compute_food(amount, msre_desc, fd_num)
Exemplo n.º 15
0
    def get_recipe(self):
        recipe = gnutr.Recipe()
        recipe.num_serv = self.ui.num_serv_entry.get_text()
        recipe.desc = self.ui.recipe_entry.get_text()
        recipe.cat_desc = self.ui.category_combo.get_active_text()

        start = self.ui.text_buffer.get_start_iter()
        end = self.ui.text_buffer.get_end_iter()
        recipe.prep_desc = self.ui.text_buffer.get_text(start, end, True)

        if not recipe.desc:
            gnutr.Dialog('error', 'No recipe name is defined.', self.parent)
            return None

        if not recipe.num_serv:
            gnutr.Dialog(
                'error', """The number of servings is not defined,
or is not a number.""", self.parent)
            return None

        recipe.cat_num = self.store.cat_desc2num[recipe.cat_desc]
        recipe.ingr_list = self.get_ingredient_list()
        return recipe
Exemplo n.º 16
0
 def on_response(self, w, r, d=None):
     if r == gtk.RESPONSE_HELP:
         help.open('')
     elif r == gtk.RESPONSE_OK:
         try:
             self.recipe.num_portions = \
                 float(self.ui.num_serv_entry.get_text())
         except ValueError:
             gnutr.Dialog('error',
                          'The number of portions must be a number.')
         self.app.base_win.plan.replace_recipe(self.recipe)
         self.ui.dialog.hide()
     elif r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT:
         self.ui.dialog.hide()
Exemplo n.º 17
0
    def add_recipe( self, recipe):
        date = self.ui.date.entry.get_text()
        time = self.get_time_of_day()
        recipe_list = self.get_recipes_for_time( time, date)
        for r in recipe_list:
            if r.num == recipe.num:
                gnutr.Dialog( 'error', 'Cannot have the same recipe twice\n' +
                    'for the same day and time.')
                return
        person_num = self.person.get_person_num()

        self.db.query( "INSERT INTO recipe_plan_temp VALUES ( " +
            "'%d', '%s', '%s', '%f', '%d' )"
            %( person_num, date, time, recipe.num_portions, recipe.num))
        self.update()
Exemplo n.º 18
0
    def on_clear_released(self, w, d=None):
        if self.num_ingr != 0:
            dlg = gnutr.Dialog(
                'question', """You are about to clear the recipe. 
Do you wish to save it first?""", self.parent)
            reply = dlg.run()
            if reply == gtk.RESPONSE_OK:
                dlg.destroy()
                self.on_save_released(None)
            else:
                dlg.destroy()
        self.ui.recipe_entry.set_text('')
        self.ui.num_serv_entry.set_text('')
        self.ui.treemodel.clear()
        self.num_ingr = 0
        self.ui.text_buffer.set_text('')
Exemplo n.º 19
0
    def add_food( self, food):
        date = self.ui.date.entry.get_text()
        time = self.get_time_of_day()
        food_list = self.get_foods_for_time( time, date)
        for f in food_list:
            if f.food_num == food.food_num:
                gnutr.Dialog( 'error', 'Cannot have the same food twice\n' +
                    'for the same day and time.', self.parent)
                return
        person_num = self.person.get_person_num()

        # Note: the temporary table is used
        self.db.query( "INSERT INTO food_plan_temp VALUES ( " +
            "'%d', '%s', '%s', '%f', '%d', '%d' )"
            %( person_num, date, time, food.amount, food.msre_num, 
            food.food_num))
        self.update()
Exemplo n.º 20
0
    def on_save_released(self, w, d=None):
        recipe = self.get_recipe()
        if not recipe:
            return

        recipe.num = self.check_recipe_exists(recipe.desc)
        if recipe.num:
            dlg = gnutr.Dialog(
                'question', """A recipe with the same name exists
in the database. Do you want to overwrite it?""", self.parent)
            reply = dlg.run()
            if reply == gtk.RESPONSE_YES:
                dlg.destroy()
                self.delete_recipe(recipe.desc)
            else:
                dlg.destroy()
        self.save_recipe(recipe)
Exemplo n.º 21
0
    def on_response( self, w, r, d=None):
        if r == gtk.RESPONSE_HELP:
            help.open( '')

        elif r == gtk.RESPONSE_OK:
            (model, iter) = self.ui.selection.get_selected()
            if not iter:
                return

            food_num = model.get_value( iter, 1)

            if not food_num in self.store.fd_num2desc:
                return

            ingr = gnutr.Ingredient()
            ingr.food_num = food_num
            ingr.food_desc = self.store.fd_num2desc[ ingr.food_num]

            if self.view_type != gnutr_consts.FOOD:
                try:
                    ingr.amount = float( self.ui.amount_entry.get_text())
                except ValueError:
                    gnutr.Dialog( 'error', 'The amount must be a number.')

            if (self.view_type == gnutr_consts.PLAN or
                    self.view_type == gnutr_consts.RECIPE):
                ingr.msre_desc = self.ui.combo.get_active_text()
                ingr.msre_num = self.store.msre_desc2num[ ingr.msre_desc]

            if self.view_type == gnutr_consts.PLAN:
                self.ui.dialog.hide()
                self.app.base_win.plan.add_food( ingr)
                self.ui.tree.clear()
            elif self.view_type == gnutr_consts.RECIPE:
                self.app.base_win.recipe.add_ingredient( ingr)
            else:
                self.app.base_win.food.update( ingr)

            if self.view_type != gnutr_consts.PLAN:
                self.ui.dialog.hide()
                self.ui.tree.clear()

        elif r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT:
            self.ui.dialog.hide()
            self.ui.tree.clear()
Exemplo n.º 22
0
    def on_response( self, w, r, d=None):
        if r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT: 
            self.ui.dialog.hide()

        elif r == 1:    #save
            goal_list = []
            for nutr in self.ui.nutr_list:
                try:
                    val = float( nutr.entry.get_text())
                except:
                    gnutr.Dialog( 'error', 
                        'Save Failed: A nutrient goal entry\nis not a number.')
                    return
                goal_list.append( ( nutr.num, val))
            self.save_goal( goal_list)

        elif r == gtk.RESPONSE_HELP:
            help.open( '')
Exemplo n.º 23
0
    def on_response(self, w, response_id, d=None):
        if response_id == gtk.RESPONSE_HELP:
            help.open('')
        if response_id == gtk.RESPONSE_OK:
            try:
                self.ingr.amount = float(self.ui.amount_entry.get_text())
            except ValueError:
                gnutr.Dialog('error', 'The amount must be a number.')
            self.ingr.msre_desc = self.ui.combo.get_active_text()

            if self.view == gnutr_consts.RECIPE:
                self.app.base_win.recipe.replace_ingredient(self.ingr)
            else:
                self.app.base_win.plan.replace_food(self.ingr)
            self.ui.dialog.hide()

        if response_id == gtk.RESPONSE_CANCEL:
            self.ui.dialog.hide_all()
Exemplo n.º 24
0
    def on_response(self, w, r, d=None):
        if r == gtk.RESPONSE_HELP:
            help.open('')
        elif r == gtk.RESPONSE_OK:
            result_list = self.get_search_match()
            if not result_list:
                gnutr.Dialog('warn', 'No recipe found.')
                return

            if not hasattr(self, 'recipe_srch_res_dlg'):
                import recipe_srch_res_dlg
                self.recipe_srch_res_dlg = \
                    recipe_srch_res_dlg.RecipeSrchResDlg(self.app)
                self.recipe_srch_res_dlg.ui.dialog.connect(
                    'hide', self.on_hide)
            self.recipe_srch_res_dlg.show(result_list, gnutr_consts.RECIPE)
        elif r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT:
            self.ui.dialog.hide()
Exemplo n.º 25
0
    def on_edit_released( self, w, d=None):
        (model, iter) = self.ui.selection.get_selected()
        if not iter:
            gnutr.Dialog( 'warn', 'You must select a recipe or food to edit.',
                self.parent)
            return

        data = model.get_value( iter, 4)
        if isinstance( data, gnutr.Ingredient):
            if not hasattr( self, 'food_edit_dlg'):
                import food_edit_dlg
                self.food_edit_dlg = food_edit_dlg.FoodEditDlg( self.app)
            self.food_edit_dlg.show( data, gnutr_consts.PLAN)
        elif isinstance( data, gnutr.Recipe):
            if not hasattr( self, 'recipe_edit_dlg'):
                import recipe_edit_dlg
                self.recipe_edit_dlg = recipe_edit_dlg.RecipeEditDlg( self.app)
            self.recipe_edit_dlg.show( data)
Exemplo n.º 26
0
    def add_food(self, food):
        date = self.ui.date.entry.get_text()
        time = self.get_time_of_day()
        food_list = self.get_foods_for_time(time, date)
        for f in food_list:
            if f.food_num == food.food_num:
                gnutr.Dialog(
                    'error', 'Cannot have the same food twice\n' +
                    'for the same day and time.', self.parent)
                return
        person_num = self.person.get_person_num()

        # Note: the temporary table is used
        #FIXME: One of fields is formated as it were number, but it's string. Causes ValueError
        self.db.query("INSERT INTO food_plan_temp VALUES (" +
                      "{0:d}, '{1:s}', '{2:s}', {3:f}, '{4:s}', {5:d})".format(
                          person_num, date, time, food.amount, food.msre_desc,
                          food.food_num),
                      caller='PlanWin.add_food')
        self.update()
Exemplo n.º 27
0
    def on_response(self, w, r, d=None):
        if r == gtk.RESPONSE_HELP:
            help.open('')

        elif r == 1:
            start_date = self.ui.start_date.entry.get_text()
            end_date = self.ui.end_date.entry.get_text()
            if self.start_later_than_end(start_date, end_date):
                gnutr.Dialog(
                    'error',
                    'The start date is later\n' + 'than the end date.')
                return

            avg = self.ui.avg_rad_button.get_active()
            result = self.compute(start_date, end_date, avg)
            if not hasattr(self, 'nutr_composition_dlg'):
                import nutr_composition_dlg
                self.nutr_composition_dlg = \
                    nutr_composition_dlg.NutrCompositionDlg()
            self.nutr_composition_dlg.show(nutr_list=result)

        elif r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT:
            self.ui.dialog.hide()
Exemplo n.º 28
0
    def on_delete_released( self, w, d=None):
        (model, iter) = self.ui.selection.get_selected()
        if not iter:
            gnutr.Dialog( 'warn', 'You must select a recipe or food to delete.',
                self.parent)
            return
        
        date = self.ui.date.entry.get_text()

        data = model.get_value( iter, 4)
        if data:
            if isinstance( data, gnutr.Ingredient):
                self.delete_from_plan_temp_db( date, food=data) 
            elif isinstance( data, gnutr.Recipe):
                self.delete_from_plan_temp_db( date, recipe=data) 
            else:
                return
            model.set_value( iter, 1, '')
            model.set_value( iter, 2, '')
            model.set_value( iter, 3, '')
            model.set_value( iter, 4, gobject.GObject())
        else:
            return
Exemplo n.º 29
0
 def on_delete_released(self, w, d=None):
     modell, iter = self.ui.selection.get_selected()
     if not iter:
         gnutr.Dialog('warn', 'No nutrient is selected.')
     else:
         self.ui.treemodel.remove(iter)
Exemplo n.º 30
0
    def on_response(self, w, r, d=None):
        if r == gtk.RESPONSE_HELP:
            help.open('')

        elif r == gtk.RESPONSE_OK:
            recipe = gnutr.Recipe()
            model, iter = self.ui.selection.get_selected()
            if not iter:
                gnutr.Dialog('warn',
                             'A recipe must be selected from the list.')
                return

            recipe.desc = model.get_value(iter, 0)
            recipe.num = model.get_value(iter, 1)
            if not recipe.desc or not recipe.num:
                return

            # FIXME: this should be recipe_win.py and
            # plan_win.py
            if self.view == gnutr_consts.RECIPE:
                self.db.query(
                    "SELECT no_serv, category_no FROM " +
                    "recipe WHERE recipe_no = {0:d}".format(recipe.num))
                recipe.num_serv, recipe.cat_num = self.db.get_row_result()
                recipe.cat_desc = self.store.cat_num2desc[recipe.cat_num]

                self.db.query("SELECT prep_desc FROM preparation WHERE " +
                              "recipe_no = {0:d}".format(recipe.num))
                recipe.prep_desc = self.db.get_single_result()

                self.db.query(
                    "SELECT amount, Msre_Desc, NDB_No FROM " +
                    "ingredient WHERE recipe_no = {0:d}".format(recipe.num))
                ingr_list = self.db.get_result()

                recipe.ingr_list = []
                for amount, msre_desc, food_num in ingr_list:
                    ingr = gnutr.Ingredient()
                    ingr.amount = amount
                    ingr.food_num = food_num
                    ingr.food_desc = self.store.fd_num2desc[food_num]
                    ingr.msre_desc = msre_desc
                    recipe.ingr_list.append(ingr)

                self.app.base_win.recipe.update(recipe)
                self.ui.dialog.hide()

            elif self.view == gnutr_consts.PLAN:
                try:
                    recipe.num_portions = \
                        float(self.ui.num_serv_entry.get_text())
                except ValueError:
                    gnutr.Dialog('error',
                                 'The number of portions must be specified.')
                    return

                self.ui.dialog.hide()
                self.app.base_win.plan.add_recipe(recipe)

        elif r == 1:
            desc = self.ui.recipe_entry.get_text()
            if not desc or len(desc) == 0:
                return
            dlg = gnutr.Dialog(
                'question',
                'You are about to delete a recipe from the database.\n' +
                'Are you sure you want to do this?')
            reply = dlg.run()
            if reply == gtk.RESPONSE_YES:
                self.app.base_win.recipe.delete_recipe(desc)
                model, iter = self.ui.selection.get_selected()
                if not iter:
                    return
                model.remove(iter)
                self.ui.recipe_entry.set_text('')
                dlg.destroy()
            else:
                dlg.destroy()

        elif r == gtk.RESPONSE_CANCEL:
            self.ui.treemodel.clear()
            self.ui.dialog.hide()