def row_1(self, action=None):
        """ Name : USERS
            cols : 1 """

        if action == "construct":

            # -- CREATE ROW -- #
            self.grid.row(width=self.width,
                          height=150,
                          padx=0,
                          pady=0,
                          bg="#ffffff")
            # -- CREATE COLS -- #
            self.grid.column(span=2,
                             row=1,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)
            self.grid.column(span=2,
                             row=1,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)
            self.grid.column(span=2,
                             row=1,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)
            self.grid.column(span=2,
                             row=1,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)
            self.grid.column(span=2,
                             row=1,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)
            self.grid.column(span=2,
                             row=1,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)

        elif action == "fill":

            if self.w_avatars_fill is not True:

                # Get texts for this row
                txt = self.json_script.get("row_1")

                user_counter = 0
                free_space = 0

                while user_counter != len(self.users):

                    user = self.users[user_counter]

                    # -- COLUMN 1 : USER AVATAR IMAGE -- #
                    img = Image.open("frontend/images/avatars/{}.png".format(
                        user.get("user_avatar_name")))
                    img_resize = img.resize((75, 75), Image.ANTIALIAS)
                    img_tkinter = ImageTk.PhotoImage(img_resize)

                    w_avatar_icon = Label(
                        self.grid.col_frames[1][user_counter],
                        image=img_tkinter,
                        borderwidth=0,
                        bg="#ffffff")

                    w_avatar_icon.image = img_tkinter

                    w_avatar_icon.pack(fill='both', expand=True)

                    # -- COLUMN 1 : USER AVATAR NAME -- #
                    w_avatar_name = Label(
                        self.grid.col_frames[1][user_counter],
                        text="{}".format(user.get("user_name")),
                        anchor="n",
                        bg="#ffffff",
                        pady=10,
                    )

                    w_avatar_name.pack(fill='both', expand=True)

                    # -- COLUMN 1 : USER AVATAR RADIO -- #
                    w_user_radio = Radiobutton(
                        self.grid.col_frames[1][user_counter],
                        variable=self.var_user_id,
                        value=user.get("user_id"),
                        bg="#ffffff")

                    w_user_radio.pack(fill='both', expand=True)

                    if user_counter == 0:
                        w_user_radio.select()

                    self.w_avatar_icons.append(w_avatar_icon)
                    self.w_avatar_names.append(w_avatar_name)
                    self.w_user_radios.append(w_user_radio)

                    user_counter += 1

                free_space = 6 - user_counter

                free_counter = 0
                while free_counter != free_space:

                    # -- COLUMN 1 : USER AVATAR IMAGE -- #
                    img = Image.open(
                        "frontend/images/avatars/empty.png").convert("RGBA")
                    img_resize = img.resize((75, 75), Image.ANTIALIAS)
                    img_tkinter = ImageTk.PhotoImage(img_resize)

                    w_avatar_icon = Label(
                        self.grid.col_frames[1][user_counter],
                        image=img_tkinter,
                        bg="#ffffff")

                    w_avatar_icon.image = img_tkinter

                    w_avatar_icon.pack(fill="both", expand=True)

                    # -- COLUMN 1 : USER AVATAR NAME -- #
                    w_avatar_name = Label(
                        self.grid.col_frames[1][user_counter],
                        text=txt.get("user_empty"),
                        anchor="n",
                        bg="#ffffff",
                        pady=10,
                    )

                    w_avatar_name.pack(fill='both', expand=True)

                    # -- COLUMN 1 : FREE USER SUBSCRIBE BUTTON -- #
                    w_subscribe_button = Button(
                        self.grid.col_frames[1][user_counter],
                        text=txt.get("user_empty_button"),
                        borderwidth=0,
                        font="Helvetica 8 bold",
                        bg="#7dd2f0",
                        fg="#ffffff",
                        activebackground="#71bdd8",
                        activeforeground="#ffffff",
                        command=self.display_create_user)

                    w_subscribe_button.pack(fill='both', expand=True)

                    self.w_avatar_icons.append(w_avatar_icon)
                    self.w_avatar_names.append(w_avatar_name)
                    self.w_subscribe_buttons.append(w_subscribe_button)

                    user_counter += 1
                    free_counter += 1

            self.w_avatars_fill = True

        elif action == "refresh":
            """ Refresh this row. """

            for w_avatar_icon in self.w_avatar_icons:
                w_avatar_icon.pack_forget()

            for w_avatar_name in self.w_avatar_names:
                w_avatar_name.pack_forget()

            for w_user_radio in self.w_user_radios:
                w_user_radio.pack_forget()

            for w_subscribe_button in self.w_subscribe_buttons:
                w_subscribe_button.pack_forget()

            self.w_subscribe_buttons = []
            self.w_avatar_icons = []
            self.w_avatar_names = []
            self.w_user_radios = []

            self.w_avatars_fill = False
class UpdateLanguages():
    def __init__(self, container=None, displayer=None, session=None):
        """ 'container'     (Obj  ): instance of Container.
            'displayer'     (obj  ): instance of Displayer.
            'session,'      (obj  ): instance of Session.
            'grid'          (Obj  ): instance of Grid.

            'f_container'   (Frame): container frame.
            'm_frame'       (Frame): master frame of view.

            'name'          (str  ): name of view.
            'json_script'   (dict ): json dict of script.

            'width'         (int  ): view width.
            'height'        (int  ): view height.
            'padx'          (int  ): view
            'pady'          (int  ): view
            'bg'            (str  ): view bg. """

        # Instances
        self.container = container
        self.displayer = displayer
        self.session = session
        self.grid = None

        # Frames
        self.f_container = self.container.f_container
        self.m_frame = None

        # Informations
        self.name = None

        # Script
        self.json_script = None

        # Style Sheet
        self.width = self.container.width
        self.height = self.container.height
        self.padx = 0
        self.pady = 0
        self.bg = "#ffffff"

        # Tk control variables
        self.var_notification = StringVar()
        self.var_language = StringVar()

        # Widgets row 0
        self.w_title = None
        # Widgets row 1
        self.w_en_flag = None
        self.w_en_name = None
        self.w_en_check = None

        self.w_fr_flag = None
        self.w_fr_name = None
        self.w_fr_check = None

        self.w_de_flag = None
        self.w_de_name = None
        self.w_de_check = None
        # Widgets row 2
        self.w_it_flag = None
        self.w_it_name = None
        self.w_it_check = None

        self.w_es_flag = None
        self.w_es_name = None
        self.w_es_check = None

        self.w_nl_flag = None
        self.w_nl_name = None
        self.w_nl_check = None

        # Widgets row 3
        self.w_previous_button = None
        self.w_submit_button = None

        # Fill status
        self.fill_status = False

        # -- Displayer initialisation -- #
        self.construct()

    def construct(self, **kwargs):
        """ Construt view.
            'displayer' (Bool): to not create the view \
                during initialization. """

        # 2. Create new grid in page container.
        self.grid = Grid(frame=self.f_container,
                         width=self.width,
                         height=self.height,
                         padx=self.padx,
                         pady=self.pady,
                         bg=self.bg)
        # 3. Get view frame for displayer function
        self.m_frame = self.grid.master_frame

        self.row_0(action="construct")
        self.row_1(action="construct")
        self.row_2(action="construct")
        self.row_3(action="construct")

    def fill(self, **kwargs):

        # 1. Get the script.
        self.json_script = self.session.get_script(package_name="update",
                                                   file_name="languages")
        self.name = self.json_script.get("view_name")

        self.var_notification.set(" ")

        # 3. Refresh rows.
        if self.fill_status is True:
            self.row_0(action="refresh")
            self.row_1(action="refresh")
            self.row_2(action="refresh")
            self.row_3(action="refresh")

        self.row_0(action="fill")
        self.row_1(action="fill")
        self.row_2(action="fill")
        self.row_3(action="fill")
        self.fill_status = True

    def display_previous(self):
        """ Display view 'update_server_conn'. """

        self.displayer.display(c_view="update_languages",
                               f_view="update_server_conn")

    def display_step_3(self):
        """ Display view 'update_categories'. """

        self.displayer.display(c_view="update_languages",
                               f_view="update_categories",
                               language=str(self.var_language.get()))

    def row_0(self, action=None):
        """ Name : VIEW TITLE
            cols : 1 """

        if action == "construct":

            # -- CREATE ROW -- #
            self.grid.row(width=self.width,
                          height=250,
                          padx=self.padx,
                          pady=self.pady,
                          bg="#ffffff")

            # -- CREATE COLS -- #
            self.grid.column(span=12,
                             row=0,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)

        elif action == "fill":

            # Get script
            txt = self.json_script.get("row_0")

            # -- COLUMN 1/1 : VIEW TITLE -- #
            if self.w_title is None:

                self.w_title = Label(self.grid.col_frames[0][0],
                                     pady=50,
                                     anchor="s",
                                     text=txt.get("view_title"),
                                     bg="#ffffff",
                                     fg="#000000",
                                     font="Helvetica 12 bold")
                self.w_title.pack(fill='both', expand=True)

        elif action == "refresh":

            self.w_title.pack_forget()
            self.w_title = None

    def row_1(self, action=None):
        """ Name : LANGAGE 1-3
            cols : 3 """

        if action == "construct":

            # -- CREATE ROW -- #
            self.grid.row(width=self.width,
                          height=150,
                          padx=self.padx,
                          pady=self.pady,
                          bg="#ffffff")

            # -- CREATE COLS -- #
            self.grid.column(span=4,
                             row=1,
                             width=None,
                             height=None,
                             padx=None,
                             pady=20,
                             bg=None)
            self.grid.column(span=4,
                             row=1,
                             width=None,
                             height=None,
                             padx=None,
                             pady=20,
                             bg=None)
            self.grid.column(span=4,
                             row=1,
                             width=None,
                             height=None,
                             padx=None,
                             pady=20,
                             bg=None)

        elif action == "fill":

            # Get script
            txt = self.json_script.get("row_1")

            # -- COLUMN 1/3 : ENGLISH LANGUAGE -- #
            img = Image.open("frontend/images/flags/en.png")
            imgResize = img.resize((30, 30), Image.ANTIALIAS)
            imgTkinter = ImageTk.PhotoImage(imgResize)

            if self.w_en_flag is None:

                self.w_en_flag = Label(self.grid.col_frames[1][0],
                                       image=imgTkinter,
                                       borderwidth=0,
                                       bg="#ffffff")
                self.w_en_flag.image = imgTkinter
                self.w_en_flag.pack(fill='both', expand=True)

            if self.w_en_name is None:

                self.w_en_name = Label(self.grid.col_frames[1][0],
                                       pady=0,
                                       text=txt.get("english_label"),
                                       bg="#ffffff",
                                       fg="#000000",
                                       font="Helvetica 12 bold")
                self.w_en_name.pack(fill='both', expand=True)

            if self.w_en_check is None:

                self.w_en_check = Radiobutton(self.grid.col_frames[1][0],
                                              variable=self.var_language,
                                              value="en",
                                              bg="#ffffff")
                self.w_en_check.pack(fill='both', expand=True)

                if self.session.gui_language == "en":
                    self.w_en_check.select()

            # -- COLUMN 2/3 : FRENCH LANGUAGE -- #
            img = Image.open("frontend/images/flags/fr.png")
            imgResize = img.resize((30, 30), Image.ANTIALIAS)
            imgTkinter = ImageTk.PhotoImage(imgResize)

            if self.w_fr_flag is None:

                self.w_fr_flag = Label(self.grid.col_frames[1][1],
                                       image=imgTkinter,
                                       borderwidth=0,
                                       bg="#ffffff")
                self.w_fr_flag.image = imgTkinter
                self.w_fr_flag.pack(fill='both', expand=True)

            if self.w_fr_name is None:

                self.w_fr_name = Label(self.grid.col_frames[1][1],
                                       pady=0,
                                       text=txt.get("french_label"),
                                       bg="#ffffff",
                                       fg="#000000",
                                       font="Helvetica 12 bold")
                self.w_fr_name.pack(fill='both', expand=True)

            if self.w_fr_check is None:

                self.w_fr_check = Radiobutton(self.grid.col_frames[1][1],
                                              variable=self.var_language,
                                              value="fr",
                                              bg="#ffffff")
                self.w_fr_check.pack(fill='both', expand=True)

                if self.session.gui_language == "fr":
                    self.w_fr_check.select()

            # -- COLUMN 3/3 : GERMAN LANGUAGE -- #
            img = Image.open("frontend/images/flags/de.png")
            imgResize = img.resize((30, 30), Image.ANTIALIAS)
            imgTkinter = ImageTk.PhotoImage(imgResize)

            if self.w_de_flag is None:

                self.w_de_flag = Label(self.grid.col_frames[1][2],
                                       image=imgTkinter,
                                       borderwidth=0,
                                       bg="#ffffff")
                self.w_de_flag.image = imgTkinter
                self.w_de_flag.pack(fill='both', expand=True)

            if self.w_de_name is None:

                self.w_de_name = Label(self.grid.col_frames[1][2],
                                       pady=0,
                                       text=txt.get("german_label"),
                                       bg="#ffffff",
                                       fg="#000000",
                                       font="Helvetica 12 bold")
                self.w_de_name.pack(fill='both', expand=True)

            if self.w_de_check is None:

                self.w_de_check = Radiobutton(self.grid.col_frames[1][2],
                                              variable=self.var_language,
                                              value="de",
                                              bg="#ffffff")
                self.w_de_check.pack(fill='both', expand=True)

        elif action == "refresh":

            self.w_en_flag.pack_forget()
            self.w_en_name.pack_forget()
            self.w_en_check.pack_forget()

            self.w_fr_flag.pack_forget()
            self.w_fr_name.pack_forget()
            self.w_fr_check.pack_forget()

            self.w_de_flag.pack_forget()
            self.w_de_name.pack_forget()
            self.w_de_check.pack_forget()

            self.w_en_flag = None
            self.w_en_name = None
            self.w_en_check = None

            self.w_fr_flag = None
            self.w_fr_name = None
            self.w_fr_check = None

            self.w_de_flag = None
            self.w_de_name = None
            self.w_de_check = None

    def row_2(self, action=None):
        """ Name : LANGAGE 3-6
            cols : 3 """

        if action == "construct":

            # -- CREATE ROW -- #
            self.grid.row(width=self.width,
                          height=140,
                          padx=self.padx,
                          pady=self.pady,
                          bg="#ffffff")

            # -- CREATE COLS -- #
            self.grid.column(span=4,
                             row=2,
                             width=None,
                             height=None,
                             padx=None,
                             pady=20,
                             bg=None)
            self.grid.column(span=4,
                             row=2,
                             width=None,
                             height=None,
                             padx=None,
                             pady=20,
                             bg=None)
            self.grid.column(span=4,
                             row=2,
                             width=None,
                             height=None,
                             padx=None,
                             pady=20,
                             bg=None)

        elif action == "fill":

            # Get script
            txt = self.json_script.get("row_2")

            # -- COLUMN 1/3 : ITALIAN LANGUAGE -- #
            img = Image.open("frontend/images/flags/it.png")
            imgResize = img.resize((30, 30), Image.ANTIALIAS)
            imgTkinter = ImageTk.PhotoImage(imgResize)

            if self.w_it_flag is None:

                self.w_it_flag = Label(self.grid.col_frames[2][0],
                                       image=imgTkinter,
                                       borderwidth=0,
                                       bg="#ffffff")
                self.w_it_flag.image = imgTkinter
                self.w_it_flag.pack(fill='both', expand=True)

            if self.w_it_name is None:

                self.w_it_name = Label(self.grid.col_frames[2][0],
                                       pady=0,
                                       text=txt.get("italian_label"),
                                       bg="#ffffff",
                                       fg="#000000",
                                       font="Helvetica 12 bold")
                self.w_it_name.pack(fill='both', expand=True)

            if self.w_it_check is None:

                self.w_it_check = Radiobutton(self.grid.col_frames[2][0],
                                              variable=self.var_language,
                                              value="it",
                                              bg="#ffffff")
                self.w_it_check.pack(fill='both', expand=True)

            # -- COLUMN 2/3 : SPANISH LANGUAGE -- #
            img = Image.open("frontend/images/flags/es.png")
            imgResize = img.resize((30, 30), Image.ANTIALIAS)
            imgTkinter = ImageTk.PhotoImage(imgResize)

            if self.w_es_flag is None:

                self.w_es_flag = Label(self.grid.col_frames[2][1],
                                       image=imgTkinter,
                                       borderwidth=0,
                                       bg="#ffffff")
                self.w_es_flag.image = imgTkinter
                self.w_es_flag.pack(fill='both', expand=True)

            if self.w_es_name is None:

                self.w_es_name = Label(self.grid.col_frames[2][1],
                                       pady=0,
                                       text=txt.get("spanish_label"),
                                       bg="#ffffff",
                                       fg="#000000",
                                       font="Helvetica 12 bold")
                self.w_es_name.pack(fill='both', expand=True)

            if self.w_es_check is None:

                self.w_es_check = Radiobutton(self.grid.col_frames[2][1],
                                              variable=self.var_language,
                                              value="es",
                                              bg="#ffffff")
                self.w_es_check.pack(fill='both', expand=True)

            # -- COLUMN 3/3 : DUTCH LANGUAGE -- #
            img = Image.open("frontend/images/flags/nl.png")
            imgResize = img.resize((30, 30), Image.ANTIALIAS)
            imgTkinter = ImageTk.PhotoImage(imgResize)

            if self.w_nl_flag is None:

                self.w_nl_flag = Label(self.grid.col_frames[2][2],
                                       image=imgTkinter,
                                       borderwidth=0,
                                       bg="#ffffff")
                self.w_nl_flag.image = imgTkinter
                self.w_nl_flag.pack(fill='both', expand=True)

            if self.w_nl_name is None:

                self.w_nl_name = Label(self.grid.col_frames[2][2],
                                       pady=0,
                                       text=txt.get("dutch_label"),
                                       bg="#ffffff",
                                       fg="#000000",
                                       font="Helvetica 12 bold")
                self.w_nl_name.pack(fill='both', expand=True)

            if self.w_nl_check is None:

                self.w_nl_check = Radiobutton(self.grid.col_frames[2][2],
                                              variable=self.var_language,
                                              value="nl",
                                              bg="#ffffff")
                self.w_nl_check.pack(fill='both', expand=True)

        elif action == "refresh":

            self.w_it_flag.pack_forget()
            self.w_it_name.pack_forget()
            self.w_it_check.pack_forget()

            self.w_es_flag.pack_forget()
            self.w_es_name.pack_forget()
            self.w_es_check.pack_forget()

            self.w_nl_flag.pack_forget()
            self.w_nl_name.pack_forget()
            self.w_nl_check.pack_forget()

            self.w_it_flag = None
            self.w_it_name = None
            self.w_it_check = None

            self.w_es_flag = None
            self.w_es_name = None
            self.w_es_check = None

            self.w_nl_flag = None
            self.w_nl_name = None
            self.w_nl_check = None

    def row_3(self, action=None):
        """ Name : SUBMIT BUTTON
            cols : 4 """

        if action == "construct":

            # -- CREATE ROW -- #
            self.grid.row(width=self.width,
                          height=60,
                          padx=self.padx,
                          pady=self.pady,
                          bg="#ffffff")
            # -- CREATE COLS -- #
            self.grid.column(span=2,
                             row=3,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)
            self.grid.column(span=4,
                             row=3,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)
            self.grid.column(span=4,
                             row=3,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)
            self.grid.column(span=2,
                             row=3,
                             width=None,
                             height=None,
                             padx=None,
                             pady=None,
                             bg=None)

        elif action == "fill":

            txt = self.json_script.get("row_3")

            # -- COLUMN 1/4 : EMPTY -- #
            # -- COLUMN 2/4 : SUBMIT BUTTON -- #
            if self.w_previous_button is None:

                self.w_previous_button = Button(
                    self.grid.col_frames[3][1],
                    text=txt.get("previous_button"),
                    fg="#ffffff",
                    bg="#7A57EC",
                    activeforeground="#ffffff",
                    activebackground="#845EFF",
                    command=self.display_previous)
                self.w_previous_button.pack(side=BOTTOM, fill=X)

            # -- COLUMN 3/4 : SUBMIT BUTTON -- #
            if self.w_submit_button is None:

                self.w_submit_button = Button(self.grid.col_frames[3][2],
                                              text=txt.get("submit_button"),
                                              fg="#ffffff",
                                              bg="#7A57EC",
                                              activeforeground="#ffffff",
                                              activebackground="#845EFF",
                                              command=self.display_step_3)
                self.w_submit_button.pack(side=BOTTOM, fill=X)
            # -- COLUMN 3/3 : EMPTY -- #

        elif action == "refresh":

            self.w_previous_button.pack_forget()
            self.w_submit_button.pack_forget()

            self.w_previous_button = None
            self.w_submit_button = None