Beispiel #1
0
    def __init__(self, parent, title="", IDferie=0, type=""):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
                           | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)
        self.typeJour = type

        self.panel_base = wx.Panel(self, -1)
        self.staticBox_staticbox = wx.StaticBox(self.panel_base, -1, "")
        self.label_nom = wx.StaticText(self.panel_base, -1, "Nom :")
        self.text_ctrl_nom = wx.TextCtrl(self.panel_base, -1, "")
        self.label_jour_fixe = wx.StaticText(self.panel_base, -1, "Jour :")
        choices = []
        for x in range(1, 32):
            choices.append(str(x))
        self.choice_jour_fixe = wx.Choice(self.panel_base, -1, choices=choices)
        self.label_mois_fixe = wx.StaticText(self.panel_base, -1, "Mois :")
        self.choice_mois_fixe = wx.Choice(self.panel_base,
                                          -1,
                                          choices=[
                                              "Janvier",
                                              _(u"Février"), "Mars", "Avril",
                                              "Mai", "Juin", "Juillet",
                                              _(u"Août"), "Septembre",
                                              "Octobre", "Novembre",
                                              _(u"Décembre")
                                          ])
        self.label_date_variable = wx.StaticText(self.panel_base, -1, "Date :")
        self.datepicker_date_variable = DatePickerCtrl(self.panel_base,
                                                       -1,
                                                       style=DP_DROPDOWN)

        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self.panel_base,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self.panel_base,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self.panel_base,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))

        self.IDferie = IDferie
        if IDferie != 0:
            self.Importation()

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
Beispiel #2
0
    def __init__(self, parent, value=None, name="CustomDatePickerCtrl"):

        DatePickerCtrl.__init__(self,
                                parent,
                                id=wx.ID_ANY,
                                dt=wx.DefaultDateTime,
                                pos=wx.DefaultPosition,
                                size=wx.DefaultSize,
                                style=wx.adv.DP_DROPDOWN,
                                validator=wx.DefaultValidator,
                                name="CustomDatePickerCtrl")

        if value is not None:
            self.SetValue(value)
Beispiel #3
0
 def GetValue(self):
     "Get the value from the editor"
     dt = DatePickerCtrl.GetValue(self)
     if dt.IsOk():
         return datetime.date(dt.Year, dt.Month + 1, dt.Day)
     else:
         return None
Beispiel #4
0
 def SetValue(self, value):
     if value:
         dt = wx.DateTime()
         dt.Set(value.day, value.month - 1, value.year)
     else:
         dt = wx.DateTime.Today()
     DatePickerCtrl.SetValue(self, dt)
    def __init__(self, parent, title="" , IDvaleur=0):
        wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.MAXIMIZE_BOX|wx.MINIMIZE_BOX)
        self.parent = parent
        self.panel_base = wx.Panel(self, -1)
        self.sizer_contenu_staticbox = wx.StaticBox(self.panel_base, -1, "")
        self.label_valeur = wx.StaticText(self.panel_base, -1, _(u"Valeur :"))
        self.text_valeur = wx.TextCtrl(self.panel_base, -1, "", style=wx.TE_CENTRE)
        self.label_euro = wx.StaticText(self.panel_base, -1, u"¤")
        self.label_dateDebut = wx.StaticText(self.panel_base, -1, _(u"A partir du :"))
        self.datepicker_dateDebut = DatePickerCtrl(self.panel_base, -1, style=DP_DROPDOWN)
        self.bouton_aide = CTRL_Bouton_image.CTRL(self.panel_base, texte=_(u"Aide"), cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))
        self.bouton_ok = CTRL_Bouton_image.CTRL(self.panel_base, texte=_(u"Ok"), cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(self.panel_base, texte=_(u"Annuler"), cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))
        
        self.IDvaleur = IDvaleur
        if IDvaleur != 0 : 
            self.Importation()

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
Beispiel #6
0
class Dialog(wx.Dialog):
    def __init__(self, parent, title="", IDperiode=0):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
                           | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)
        self.parent = parent
        self.panel_base = wx.Panel(self, -1)

        self.sizer_periode_staticbox = wx.StaticBox(self.panel_base, -1,
                                                    _(u"Nom de la période"))
        choices = [
            _(u"Février"),
            _(u"Pâques"),
            _(u"Eté"),
            _(u"Toussaint"),
            _(u"Noël")
        ]
        self.label_nom = wx.StaticText(self.panel_base, -1, _(u"Nom :"))
        self.choice_nom = wx.Choice(self.panel_base,
                                    -1,
                                    choices=choices,
                                    size=(100, -1))
        self.label_annee = wx.StaticText(self.panel_base, -1, _(u"Année :"))
        self.text_annee = wx.TextCtrl(self.panel_base,
                                      -1,
                                      "",
                                      style=wx.TE_CENTRE,
                                      size=(50, -1))

        self.sizer_dates_staticbox = wx.StaticBox(self.panel_base, -1,
                                                  _(u"Dates de la période"))
        self.label_dateDebut = wx.StaticText(self.panel_base, -1, u"Du")
        self.datepicker_dateDebut = DatePickerCtrl(self.panel_base,
                                                   -1,
                                                   style=DP_DROPDOWN)
        self.label_dateFin = wx.StaticText(self.panel_base, -1, _(u"au"))
        self.datepicker_dateFin = DatePickerCtrl(self.panel_base,
                                                 -1,
                                                 style=DP_DROPDOWN)

        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self.panel_base,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self.panel_base,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self.panel_base,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))

        self.IDperiode = IDperiode
        if IDperiode != 0:
            self.Importation()

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)

    def __set_properties(self):
        self.SetTitle(_(u"Gestion des périodes de vacances"))
        if 'phoenix' in wx.PlatformInfo:
            _icon = wx.Icon()
        else:
            _icon = wx.EmptyIcon()
        _icon.CopyFromBitmap(
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Logo.png"),
                      wx.BITMAP_TYPE_ANY))
        self.SetIcon(_icon)
        self.choice_nom.SetToolTip(
            wx.ToolTip(_(u"Choisissez ici le nom de la période")))
        self.text_annee.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez ici l'année de la période. Ex. : '2008'")))
        self.datepicker_dateDebut.SetToolTip(
            wx.ToolTip(_(u"Saisissez ici la date de début de la période")))
        self.datepicker_dateFin.SetToolTip(
            wx.ToolTip(_(u"Saisissez ici la date de fin de la période")))
        self.bouton_aide.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide")))
        self.bouton_aide.SetSize(self.bouton_aide.GetBestSize())
        self.bouton_ok.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour valider")))
        self.bouton_ok.SetSize(self.bouton_ok.GetBestSize())
        self.bouton_annuler.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour annuler la saisie")))
        self.bouton_annuler.SetSize(self.bouton_annuler.GetBestSize())

    def __do_layout(self):
        sizer_base = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_base = wx.FlexGridSizer(rows=3, cols=1, vgap=10, hgap=10)
        grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10)

        sizer_contenu_1 = wx.StaticBoxSizer(self.sizer_periode_staticbox,
                                            wx.VERTICAL)
        grid_sizer_contenu_1 = wx.FlexGridSizer(rows=1,
                                                cols=6,
                                                vgap=10,
                                                hgap=10)
        grid_sizer_contenu_1.Add(self.label_nom, 0,
                                 wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_contenu_1.Add(self.choice_nom, 0, 0, 0)
        grid_sizer_contenu_1.Add(self.label_annee, 0,
                                 wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_contenu_1.Add(self.text_annee, 0, 0, 0)
        sizer_contenu_1.Add(grid_sizer_contenu_1, 1, wx.ALL | wx.EXPAND, 10)

        sizer_contenu_2 = wx.StaticBoxSizer(self.sizer_dates_staticbox,
                                            wx.VERTICAL)
        grid_sizer_contenu_2 = wx.FlexGridSizer(rows=1,
                                                cols=6,
                                                vgap=10,
                                                hgap=10)
        grid_sizer_contenu_2.Add(self.label_dateDebut, 0,
                                 wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_contenu_2.Add(self.datepicker_dateDebut, 0, 0, 0)
        grid_sizer_contenu_2.Add(self.label_dateFin, 0,
                                 wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_contenu_2.Add(self.datepicker_dateFin, 0, 0, 0)
        sizer_contenu_2.Add(grid_sizer_contenu_2, 1, wx.ALL | wx.EXPAND, 10)

        grid_sizer_base.Add(sizer_contenu_1, 1,
                            wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, 10)
        grid_sizer_base.Add(sizer_contenu_2, 1,
                            wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.EXPAND, 10)

        grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0)
        grid_sizer_boutons.Add((20, 20), 0, wx.EXPAND, 0)
        grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0)
        grid_sizer_boutons.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_boutons, 1,
                            wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, 10)
        self.panel_base.SetSizer(grid_sizer_base)
        sizer_base.Add(self.panel_base, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_base)
        sizer_base.Fit(self)
        self.Layout()
        self.CenterOnScreen()

    def Importation(self):
        DB = GestionDB.DB()
        req = "SELECT * FROM periodes_vacances WHERE IDperiode=%d" % self.IDperiode
        DB.ExecuterReq(req)
        donnees = DB.ResultatReq()[0]
        DB.Close()
        if len(donnees) == 0: return
        # Place la valeur dans le controle nom période
        self.SelectChoice(self.choice_nom, donnees[1])
        # Place la valeur dans le controle annee
        self.text_annee.SetValue(str(donnees[2]))
        # Place la date de début dans le cdatePicker
        jour = int(donnees[3][8:10])
        mois = int(donnees[3][5:7]) - 1
        annee = int(donnees[3][:4])
        date = wx.DateTime()
        date.Set(jour, mois, annee)
        self.datepicker_dateDebut.SetValue(date)
        # Place la date de fin dans le cdatePicker
        jour = int(donnees[4][8:10])
        mois = int(donnees[4][5:7]) - 1
        annee = int(donnees[4][:4])
        date = wx.DateTime()
        date.Set(jour, mois, annee)
        self.datepicker_dateFin.SetValue(date)

    def SelectChoice(self, controle, data):
        nbreItems = controle.GetCount()
        index = 0
        for item in range(nbreItems):
            if controle.GetString(index) == data:
                controle.SetSelection(index)
                return
            index += 1

    def GetChoiceValue(self, controle):
        selection = controle.GetSelection()
        if selection != -1:
            IDselection = controle.GetString(selection)
        else:
            IDselection = None
        return IDselection

    def Sauvegarde(self):
        """ Sauvegarde des données dans la base de données """

        # Récupération ds valeurs saisies
        varNom = self.GetChoiceValue(self.choice_nom)
        varAnnee = self.text_annee.GetValue()
        varDateDebut = self.datepicker_dateDebut.GetValue()
        varTxtDateDebut = str(
            datetime.date(varDateDebut.GetYear(),
                          varDateDebut.GetMonth() + 1, varDateDebut.GetDay()))
        varDateFin = self.datepicker_dateFin.GetValue()
        varTxtDateFin = str(
            datetime.date(varDateFin.GetYear(),
                          varDateFin.GetMonth() + 1, varDateFin.GetDay()))

        DB = GestionDB.DB()
        # Création de la liste des données
        listeDonnees = [
            ("nom", varNom),
            ("annee", varAnnee),
            ("date_debut", varTxtDateDebut),
            ("date_fin", varTxtDateFin),
        ]
        if self.IDperiode == 0:
            # Enregistrement d'une nouvelle valeur
            newID = DB.ReqInsert("periodes_vacances", listeDonnees)
            ID = newID
        else:
            # Modification des valeurs
            DB.ReqMAJ("periodes_vacances", listeDonnees, "IDperiode",
                      self.IDperiode)
            ID = self.IDperiode
        DB.Commit()
        DB.Close()
        return ID

    def OnBoutonAide(self, event):
        from Utils import UTILS_Aide
        UTILS_Aide.Aide("Lespriodesdevacances")

    def OnBoutonAnnuler(self, event):
        self.EndModal(wx.ID_CANCEL)

    def OnBoutonOk(self, event):
        """ Validation des données saisies """

        # Vérifie que des valeurs ont été saisies
        valeur = self.GetChoiceValue(self.choice_nom)
        if valeur == None:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner un nom de période dans la liste proposée !"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.choice_nom.SetFocus()
            return

        valeur = self.text_annee.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(self,
                                   _(u"Vous devez saisir une année valide."),
                                   "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.text_annee.SetFocus()
            return
        # Vérifie que la valeur est bien constituée de chiffres uniquement
        incoherences = ""
        for lettre in valeur:
            if lettre not in "0123456789.":
                incoherences += "'" + lettre + "', "
        if len(incoherences) != 0:
            dlg = wx.MessageDialog(
                self, _(u"L'année que vous avez saisie n'est pas correcte."),
                "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.text_annee.SetFocus()
            return
        valeur = int(valeur)
        if valeur < 1000 or valeur > 3000:
            dlg = wx.MessageDialog(
                self, _(u"L'année que vous avez saisie n'est pas correcte."),
                "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.text_annee.SetFocus()
            return

        date_debut = self.datepicker_dateDebut.GetValue(
        )  # self.GetDatePickerValue(self.datepicker_date_debut)
        date_fin = self.datepicker_dateFin.GetValue(
        )  # self.GetDatePickerValue(self.datepicker_date_fin)
        # Vérifie que la date de fin est supérieure à la date de début de contrat
        if date_debut > date_fin:
            dlg = wx.MessageDialog(
                self,
                _(u"La date de fin de vacances doit être supérieure à la date de début !"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.datepicker_dateFin.SetFocus()
            return

        # Sauvegarde
        self.Sauvegarde()
        # MAJ du listCtrl des valeurs de points
        if FonctionsPerso.FrameOuverte("panel_config_periodes_vacs") != None:
            self.GetParent().MAJ_ListCtrl()

        # Fermeture
        self.EndModal(wx.ID_OK)
Beispiel #7
0
    def __init__(self,
                 parent,
                 id=-1,
                 title=_(u"Saisie d'un remboursement"),
                 IDremboursement=None,
                 IDpersonne=None):
        wx.Dialog.__init__(self, parent, id, title)  #, size=(400, 450)
        self.IDremboursement = IDremboursement
        self.IDpersonne = IDpersonne

        # Généralités
        self.staticbox_generalites = wx.StaticBox(self, -1,
                                                  _(u"Caractéristiques"))

        self.label_date = wx.StaticText(self,
                                        -1,
                                        _(u"Date :"),
                                        size=(60, -1),
                                        style=wx.ALIGN_RIGHT)
        self.ctrl_date = DatePickerCtrl(self, -1, style=DP_DROPDOWN)

        self.label_montant = wx.StaticText(self,
                                           -1,
                                           _(u"Montant :"),
                                           size=(60, -1),
                                           style=wx.ALIGN_RIGHT)
        self.ctrl_montant = wx.TextCtrl(
            self,
            -1,
            u"",
            size=(50, -1),
        )
        self.label_euro_montant = wx.StaticText(self, -1, u"¤")

        self.label_utilisateur = wx.StaticText(self,
                                               -1,
                                               _(u"Utilisateur :"),
                                               size=(60, -1),
                                               style=wx.ALIGN_RIGHT)
        self.ImportationPersonnes()
        self.ctrl_utilisateur = AdvancedComboBox(self,
                                                 "",
                                                 size=(100, -1),
                                                 choices=self.listePersonnes)

        # Déplacements
        self.staticbox_deplacements = wx.StaticBox(
            self, -1, _(u"Déplacements rattachés"))

        self.label_rattachement = wx.StaticText(self, -1, u"", size=(-1, -1))
        self.ctrl_deplacements = ListCtrl_deplacements(
            self,
            size=(-1, 200),
            IDremboursement=IDremboursement,
            IDpersonne=self.IDpersonne)

        # Boutons
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self,
            id=wx.ID_CANCEL,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))
        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))

        # IDpersonne :
        if self.IDpersonne != None:
            self.SetPersonne(self.IDpersonne)
        # Si c'est une modification :
        if self.IDremboursement != None:
            self.SetTitle(_(u"Modification d'un remboursement"))
            self.Importation()
        # Cache le controle utilisateur :
        if self.IDpersonne != None:
            self.label_utilisateur.Show(False)
            self.ctrl_utilisateur.Show(False)
            self.SetSize((-1, 415))

        self.__set_properties()
        self.__do_layout()

        # Binds
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.ctrl_montant.Bind(wx.EVT_KILL_FOCUS, self.montant_EvtKillFocus)
Beispiel #8
0
 def __init__(self, parent):
     DatePickerCtrl.__init__(self, parent, -1, style=DP_DROPDOWN)
     self.parent = parent
     self.Bind(EVT_DATE_CHANGED, self.OnDateChanged)
     self.Bind(wx.EVT_CHILD_FOCUS, self.OnFocus)
Beispiel #9
0
    def __init__(self, parent, statusbar):
        scrolled.ScrolledPanel.__init__(self, parent)
        self.statusbar = statusbar
        self.parent = parent

        if _platform == "linux" or _platform == "linux2":
            size_StaticBox = (950, 140)
            size_combobox = (130, -1)
            font = wx.Font(10, wx.DEFAULT, wx.ITALIC, wx.BOLD)
            font_combobox = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL,
                                    False, u'Arial')
            font_TextCtrl = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL,
                                    False, u'Arial')
            vStatictextsize = 16
            size_text = (85, 22)
        elif _platform == "win32":
            size_StaticBox = (960, 140)
            size_combobox = (130, -1)
            font = wx.Font(9, wx.DEFAULT, wx.ITALIC, wx.BOLD)
            font_combobox = wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False,
                                    u'Arial')
            font_TextCtrl = wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False,
                                    u'Arial')
            vStatictextsize = 16
            size_text = (85, 22)
        elif _platform == 'darwin':
            size_StaticBox = (980, 140)
            size_combobox = (130, -1)
            font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.BOLD)
            font_combobox = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL,
                                    False, u'Arial')
            font_TextCtrl = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL,
                                    False, u'Arial')
            vStatictextsize = 18
            size_text = (85, 22)

        flagSizer = wx.ALL | wx.ALIGN_CENTER_VERTICAL
        """Action box"""
        action_box = wx.StaticBox(self,
                                  -1,
                                  " Select your action ",
                                  size=size_StaticBox)
        action_box.SetFont(font)
        action_box_sizer = wx.StaticBoxSizer(action_box, wx.VERTICAL)
        in_action_box_sizer = wx.GridBagSizer(hgap=2, vgap=0)

        label_1 = b"Show selected data"
        label_2 = b"Delete some data"

        self.rb1 = wx.RadioButton(self, label=label_1, style=wx.RB_GROUP)
        self.rb2 = wx.RadioButton(self, label=label_2)

        self.rb1.Bind(wx.EVT_RADIOBUTTON, self.on_set_val)
        self.rb2.Bind(wx.EVT_RADIOBUTTON, self.on_set_val)
        self.state = [True, False]
        self.rb1.SetValue(True)

        in_action_box_sizer.Add(self.rb1, pos=(0, 0), flag=flagSizer)
        in_action_box_sizer.Add(self.rb2, pos=(2, 0), flag=flagSizer)
        action_box_sizer.Add(in_action_box_sizer, 0, wx.ALL, 5)
        """ Id part """
        self.search_Id = wx.NewId()
        self.cb_name_Id = wx.NewId()
        self.name_Id = wx.NewId()
        self.cb_crystal_Id = wx.NewId()
        self.crystal_Id = wx.NewId()
        self.cb_geom_Id = wx.NewId()
        self.geom_Id = wx.NewId()
        self.cb_model_Id = wx.NewId()
        self.model_Id = wx.NewId()
        self.cb_date_Id = wx.NewId()
        self.date_Id = wx.NewId()

        self.Id_cb_list = [
            self.cb_name_Id, self.cb_crystal_Id, self.cb_geom_Id,
            self.cb_model_Id, self.cb_date_Id
        ]
        self.Id_combo_list = [
            self.name_Id, self.crystal_Id, self.geom_Id, self.model_Id
        ]

        cb_name = wx.CheckBox(self,
                              id=self.cb_name_Id,
                              label='Name',
                              pos=(20, 20))
        cb_name.SetValue(False)
        cb_name.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        name_choice = ["None"]
        self.name = wx.ComboBox(self,
                                id=self.name_Id,
                                pos=(50, 30),
                                choices=name_choice,
                                style=wx.CB_READONLY,
                                size=size_combobox)
        self.name.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.name)

        cb_crystal = wx.CheckBox(self,
                                 id=self.cb_crystal_Id,
                                 label='Crystal',
                                 pos=(20, 20))
        cb_crystal.SetValue(False)
        cb_crystal.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        crystal_choice = ["None"]
        self.crystal = wx.ComboBox(self,
                                   id=self.crystal_Id,
                                   pos=(50, 30),
                                   choices=crystal_choice,
                                   style=wx.CB_READONLY,
                                   size=size_combobox)
        self.crystal.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.crystal)

        cb_geom = wx.CheckBox(self,
                              id=self.cb_geom_Id,
                              label='Geometry',
                              pos=(20, 20))
        cb_geom.SetValue(False)
        cb_geom.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        geom_choice = ["None"]
        self.geom = wx.ComboBox(self,
                                id=self.geom_Id,
                                pos=(50, 30),
                                choices=geom_choice,
                                style=wx.CB_READONLY,
                                size=size_combobox)
        self.geom.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.geom)

        cb_model = wx.CheckBox(self,
                               id=self.cb_model_Id,
                               label='Model',
                               pos=(20, 20))
        cb_model.SetValue(False)
        cb_model.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        model_choice = ["None"]
        self.model = wx.ComboBox(self,
                                 id=self.model_Id,
                                 pos=(50, 30),
                                 choices=model_choice,
                                 style=wx.CB_READONLY,
                                 size=size_combobox)
        self.model.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.model)

        cb_date = wx.CheckBox(self,
                              id=self.cb_date_Id,
                              label='Date',
                              pos=(20, 20))
        cb_date.SetValue(False)
        cb_date.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        now = wx.DateTime().Today()
        self.dpc_1 = DatePickerCtrl(self,
                                    size=(120, -1),
                                    style=DP_DROPDOWN | DP_SHOWCENTURY
                                    | DP_ALLOWNONE)
        self.dpc_2 = DatePickerCtrl(self,
                                    size=(120, -1),
                                    style=DP_DROPDOWN | DP_SHOWCENTURY
                                    | DP_ALLOWNONE)
        self.Bind(EVT_DATE_CHANGED, self.on_select_combobox, self.dpc_1)
        self.Bind(EVT_DATE_CHANGED, self.on_select_combobox, self.dpc_2)
        self.dpc_1.SetValue(now)
        self.dpc_2.SetValue(now)

        date_choice = ["None"]
        self.date = wx.ComboBox(self,
                                id=self.date_Id,
                                pos=(50, 30),
                                choices=date_choice,
                                style=wx.CB_READONLY,
                                size=size_combobox)
        self.date.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.date)

        self.search_btn = wx.Button(self, id=self.search_Id, label=" Search")
        self.search_btn.Bind(wx.EVT_BUTTON, self.on_search_in_DB)

        txt_db = u'DataBase number of lines:'
        db_nb_lines_txt = wx.StaticText(self,
                                        -1,
                                        label=txt_db,
                                        size=(180, vStatictextsize))
        self.db_nb_lines = wx.TextCtrl(self,
                                       style=wx.TE_PROCESS_ENTER,
                                       size=size_text,
                                       validator=TextValidator(DIGIT_ONLY))
        self.db_nb_lines.SetFont(font_TextCtrl)
        self.db_nb_lines.SetValue(str(100))
        P4Rm.db_nb_line = 100

        bmp = _bp_btn2.GetBitmap()
        self.nb_lines_btn = wx.BitmapButton(self, -1, bmp)
        self.nb_lines_btn.SetToolTip("Update database list")
        # self.nb_lines_btn.SetToolTipString("Update database list")
        self.Bind(wx.EVT_BUTTON,
                  self.nb_lines_DB,
                  id=self.nb_lines_btn.GetId())
        self.Bind(wx.EVT_TEXT_ENTER, self.nb_lines_DB, self.db_nb_lines)

        self.cb_list = [cb_name, cb_crystal, cb_geom, cb_model, cb_date]

        self.combo_list = [
            self.name, self.crystal, self.geom, self.model, self.date
        ]
        for i in range(len(self.combo_list)):
            self.combo_list[i].Disable()

        mastersizer = wx.BoxSizer(wx.VERTICAL)
        DBLine = wx.BoxSizer(wx.HORIZONTAL)
        choice_sizer = wx.GridBagSizer(hgap=8, vgap=4)

        DBLine.Add(db_nb_lines_txt, 0, flag=flagSizer)
        DBLine.Add(self.db_nb_lines, 0, flag=flagSizer)
        DBLine.Add(self.nb_lines_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)

        choice_sizer.Add(cb_name, pos=(0, 0), flag=flagSizer)
        choice_sizer.Add(self.name, pos=(0, 1), flag=flagSizer)

        choice_sizer.Add(cb_crystal, pos=(1, 0), flag=flagSizer)
        choice_sizer.Add(self.crystal, pos=(1, 1), flag=flagSizer)

        choice_sizer.Add(cb_geom, pos=(2, 0), flag=flagSizer)
        choice_sizer.Add(self.geom, pos=(2, 1), flag=flagSizer)

        choice_sizer.Add(cb_model, pos=(3, 0), flag=flagSizer)
        choice_sizer.Add(self.model, pos=(3, 1), flag=flagSizer)

        choice_sizer.Add(cb_date, pos=(4, 0), flag=flagSizer)
        choice_sizer.Add(self.date, pos=(4, 1), flag=flagSizer)
        choice_sizer.Add(self.dpc_1, pos=(4, 2), flag=flagSizer)
        choice_sizer.Add(self.dpc_2, pos=(4, 3), flag=flagSizer)

        choice_sizer.Add(self.search_btn, pos=(6, 0), flag=flagSizer)

        mastersizer.Add(action_box_sizer, 0, wx.ALL, 5)
        mastersizer.Add(DBLine, 0, wx.ALL, 10)
        mastersizer.Add(choice_sizer, 0, wx.ALL, 10)

        pub.subscribe(self.on_delete_data, pubsub_sup_data_DB)
        pub.subscribe(self.on_add_new_name_to_combobox,
                      pubsub_refill_list_name_DB)
        pub.subscribe(self.on_search_in_DB, pubsub_search_combobox_DB)

        self.SetSizer(mastersizer)
        self.Layout()
        self.SetAutoLayout(1)
        self.SetupScrolling()
        self.on_fill_combobox()
Beispiel #10
0
    def __init__(self):
        wx.Frame.__init__(self, parent=None, title='量化软件', size=(1100, 700))
        # 创建显示区面板
        self.DispPanel = MPL_Panel_Base(self)  # 展示
        self.BackPanel = Loop_Panel_Base(self)  # 回测
        self.am = self.DispPanel.am
        self.vol = self.DispPanel.vol
        self.devol = self.DispPanel.devol
        self.macd = self.DispPanel.macd

        # 创建参数区面板
        self.ParaPanel = wx.Panel(self, -1)

        paraInput_Box = wx.StaticBox(self.ParaPanel, -1, '参数输入')
        paraInput_Sizer = wx.StaticBoxSizer(paraInput_Box, wx.VERTICAL)
        self.StNameCodedict = {
            "开山股份": "300257",
            "浙大网新": "600797",
            "水晶光电": "002273",
            "高鸿股份": "000851"
        }

        # 初始化股票代码变量
        self.stockName_Val = "开山股份"
        self.stockCode_Val = self.StNameCodedict[self.stockName_Val]

        self.stockName_CMBO = wx.ComboBox(
            self.ParaPanel,
            -1,
            self.stockName_Val,
            choices=list(self.StNameCodedict.keys()),
            style=wx.CB_READONLY | wx.CB_DROPDOWN)  # 股票名称
        stockCode_Text = wx.StaticText(self.ParaPanel, -1, '股票名称')

        # 策略选取
        strate_Text = wx.StaticText(self.ParaPanel, -1, '策略名称')
        strate_Combo_Val = ["双趋势融合", "待添加策略"]  # 策略
        self.pickstrate_Val = "双趋势融合"
        self.pickstrate_CMBO = wx.ComboBox(self.ParaPanel,
                                           -1,
                                           self.pickstrate_Val,
                                           choices=strate_Combo_Val,
                                           style=wx.CB_READONLY
                                           | wx.CB_DROPDOWN)  # 策略名称

        # 日历控件选择数据周期
        self.dpcEndTime = DatePickerCtrl(self.ParaPanel,
                                         -1,
                                         style=DP_DROPDOWN | DP_SHOWCENTURY
                                         | DP_ALLOWNONE)  # 结束时间
        self.dpcStartTime = DatePickerCtrl(self.ParaPanel,
                                           -1,
                                           style=DP_DROPDOWN | DP_SHOWCENTURY
                                           | DP_ALLOWNONE)  # 起始时间
        DateTimeNow = wx.DateTime.Now()  # wx.DateTime格式"03/03/18 00:00:00"
        self.dpcEndTime.SetValue(DateTimeNow)
        DateTimeNow.SetYear(DateTimeNow.year - 1)
        self.dpcStartTime.SetValue(DateTimeNow)
        stockData_Text = wx.StaticText(self.ParaPanel, -1, '日期(Start-End)')

        # 初始化时间变量
        # print('start----------')
        dateVal = self.dpcStartTime.GetValue()
        # print("dateVal ---> ", dateVal)
        # print("dateVal.year ----->", dateVal.year)
        # print("dateVal.month ---->", dateVal.month)
        # print("dateVal.day ----->", dateVal.day)
        self.stockSdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)
        # print('self.stockSdate_Val----->', self.stockSdate_Val)
        dateVal = self.dpcEndTime.GetValue()
        # print("dateVal ---> ", dateVal)
        self.stockEdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)
        # print('self.stockEdate_Val ------>', self.stockEdate_Val)
        # print('end----------')

        paraInput_Sizer.Add(stockCode_Text,
                            proportion=0,
                            flag=wx.EXPAND | wx.ALL,
                            border=2)
        paraInput_Sizer.Add(self.stockName_CMBO, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(stockData_Text,
                            proportion=0,
                            flag=wx.EXPAND | wx.ALL,
                            border=2)
        paraInput_Sizer.Add(self.dpcStartTime, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(self.dpcEndTime, 0, wx.EXPAND | wx.ALL | wx.CENTER,
                            2)
        paraInput_Sizer.Add(strate_Text, 0, wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(self.pickstrate_CMBO, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)

        RadioList = ["不显示", "跳空缺口", "金叉/死叉", "N日突破"]
        self.StratInputBox = wx.RadioBox(self.ParaPanel,
                                         -1,
                                         label='指标提示',
                                         choices=RadioList,
                                         majorDimension=4,
                                         style=wx.RA_SPECIFY_ROWS)
        self.StratInputBox.Bind(wx.EVT_RADIOBOX, self.OnRadioBox_Indicator)

        # 初始化指标变量
        self.IndicatInput_Val = self.StratInputBox.GetStringSelection()

        self.TextAInput = wx.TextCtrl(self.ParaPanel,
                                      -1,
                                      "交易信息提示:",
                                      size=(180, 200),
                                      style=wx.TE_MULTILINE
                                      | wx.TE_READONLY)  # 多行|只读

        vboxnetA = wx.BoxSizer(wx.VERTICAL)  # 纵向box
        vboxnetA.Add(paraInput_Sizer,
                     proportion=0,
                     flag=wx.EXPAND | wx.BOTTOM,
                     border=2)  # proportion参数控制容器尺寸比例
        vboxnetA.Add(self.StratInputBox,
                     proportion=0,
                     flag=wx.EXPAND | wx.BOTTOM,
                     border=2)
        vboxnetA.Add(self.TextAInput,
                     proportion=1,
                     flag=wx.EXPAND | wx.ALL,
                     border=2)
        self.ParaPanel.SetSizer(vboxnetA)

        # 创建Right面板
        self.CtrlPanel = wx.Panel(self, -1)
        # 创建FlexGridSizer布局网格
        self.FlexGridSizer = wx.FlexGridSizer(rows=3, cols=1, vgap=3, hgap=3)

        # 行情按钮
        self.Firmoffer = wx.Button(self.CtrlPanel, -1, "行情")
        self.Firmoffer.Bind(wx.EVT_BUTTON, self.FirmEvent)  # 绑定行情按钮事件

        # 回测按钮
        self.Backtrace = wx.Button(self.CtrlPanel, -1, "回测")
        self.Backtrace.Bind(wx.EVT_BUTTON, self.BackEvent)  # 绑定回测按钮事件

        # 选股按钮
        self.Stockpick = wx.Button(self.CtrlPanel, -1, "选股")
        self.Stockpick.Bind(wx.EVT_BUTTON, self.PstockpEvent)  # 绑定选股按钮事件

        # 加入Sizer中
        self.FlexGridSizer.Add(self.Firmoffer,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.Add(self.Backtrace,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.Add(self.Stockpick,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)

        self.CtrlPanel.SetSizer(self.FlexGridSizer)

        self.HBoxPanel = wx.BoxSizer()
        self.HBoxPanel.Add(self.ParaPanel,
                           proportion=1.5,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.HBoxPanel.Add(self.DispPanel,
                           proportion=8,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.HBoxPanel.Add(self.CtrlPanel,
                           proportion=1,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.SetSizer(self.HBoxPanel)

        self.Centre()
Beispiel #11
0
class Panel(wx.Panel):
    def __init__(self,
                 parent,
                 selectionLignes=[],
                 selectionPersonnes=[],
                 selectionDates=(None, None)):
        wx.Panel.__init__(self,
                          parent,
                          -1,
                          name="panel_applicModele",
                          style=wx.TAB_TRAVERSAL)
        self.parent = parent

        self.selectionLignes = selectionLignes
        self.selectionPersonnes = selectionPersonnes
        self.selectionDates = selectionDates

        self.panel_base_1 = wx.Panel(self, -1)
        self.panel_base_2 = wx.Panel(self.panel_base_1, -1)
        self.sizer_modeles_staticbox = wx.StaticBox(
            self.panel_base_2, -1, _(u"Sélection des modèles"))
        self.sizer_parametres_staticbox = wx.StaticBox(
            self.panel_base_2, -1,
            _(u"Sélection de la période et des personnes"))
        self.radio_btn_1 = wx.RadioButton(self.panel_base_2, -1, u"")
        self.radio_btn_2 = wx.RadioButton(
            self.panel_base_2, -1, _(u"Selon les paramètres suivants :"))
        self.label_periode = wx.StaticText(self.panel_base_2, -1,
                                           _(u"Période du :"))
        self.date_debut = DatePickerCtrl(self.panel_base_2,
                                         -1,
                                         style=DP_DROPDOWN)
        self.label_au = wx.StaticText(self.panel_base_2, -1, "au")
        self.date_fin = DatePickerCtrl(self.panel_base_2,
                                       -1,
                                       style=DP_DROPDOWN)
        self.label_personnes = wx.StaticText(self.panel_base_2, -1,
                                             "Personnes :")
        self.list_ctrl_personnes = listCtrl_Personnes(self.panel_base_2)
        self.list_ctrl_personnes.SetMinSize((20, 80))
        self.list_ctrl_modeles = listCtrl_Modeles(self.panel_base_2)
        self.list_ctrl_modeles.SetMinSize((20, 20))
        self.bouton_ajouter = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Ajouter.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_modifier = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Modifier.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_dupliquer = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Dupliquer.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_supprimer = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Supprimer.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_aide = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(
                Chemins.GetStaticPath("Images/BoutonsImages/Aide_L72.png"),
                wx.BITMAP_TYPE_ANY))
        self.bouton_ok = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/BoutonsImages/Ok_L72.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_annuler = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(
                Chemins.GetStaticPath("Images/BoutonsImages/Annuler_L72.png"),
                wx.BITMAP_TYPE_ANY))

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio1, self.radio_btn_1)
        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio2, self.radio_btn_2)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAjouter, self.bouton_ajouter)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonModifier, self.bouton_modifier)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonSupprimer, self.bouton_supprimer)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonDupliquer, self.bouton_dupliquer)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        self.boutonsEnabled(True, False, False)
        self.SetLabelRadio1()

        # Définit les dates des datePickers
        if self.selectionDates[0] != None:
            jour = self.selectionDates[0].day
            mois = self.selectionDates[0].month - 1
            annee = self.selectionDates[0].year
            date = wx.DateTime()
            date.Set(jour, mois, annee)
            self.date_debut.SetValue(date)

        if self.selectionDates[1] != None:
            jour = self.selectionDates[1].day
            mois = self.selectionDates[1].month - 1
            annee = self.selectionDates[1].year
            date = wx.DateTime()
            date.Set(jour, mois, annee)
            self.date_fin.SetValue(date)

    def __set_properties(self):
        self.bouton_ajouter.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour créer un modèle")))
        self.bouton_modifier.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour modifier le modèle sélectionné dans la liste"
                  )))
        self.bouton_supprimer.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour supprimer le modèle sélectionné dans la liste"
                  )))
        self.bouton_dupliquer.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour dupliquer le modèle sélectionné dans la liste"
                  )))

    def __do_layout(self):
        sizer_base_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_base_2 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_base = wx.FlexGridSizer(rows=3, cols=1, vgap=10, hgap=10)
        grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=5, vgap=10, hgap=10)
        sizer_modeles = wx.StaticBoxSizer(self.sizer_modeles_staticbox,
                                          wx.VERTICAL)
        grid_sizer_modeles = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5)
        grid_sizer_boutons_modeles = wx.FlexGridSizer(rows=4,
                                                      cols=1,
                                                      vgap=5,
                                                      hgap=5)
        sizer_parametres = wx.StaticBoxSizer(self.sizer_parametres_staticbox,
                                             wx.VERTICAL)
        grid_sizer_parametres = wx.FlexGridSizer(rows=3,
                                                 cols=1,
                                                 vgap=10,
                                                 hgap=10)
        grid_sizer_manuel = wx.FlexGridSizer(rows=2, cols=2, vgap=10, hgap=10)
        grid_sizer_dates = wx.FlexGridSizer(rows=1, cols=3, vgap=10, hgap=10)
        grid_sizer_parametres.Add(self.radio_btn_1, 0, 0, 0)
        grid_sizer_parametres.Add(self.radio_btn_2, 0, 0, 0)
        grid_sizer_manuel.Add(self.label_periode, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_dates.Add(self.date_debut, 0, 0, 0)
        grid_sizer_dates.Add(self.label_au, 0, wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_dates.Add(self.date_fin, 0, 0, 0)
        grid_sizer_manuel.Add(grid_sizer_dates, 1, wx.EXPAND, 0)
        grid_sizer_manuel.Add(self.label_personnes, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_manuel.Add(self.list_ctrl_personnes, 1, wx.EXPAND, 0)
        grid_sizer_manuel.AddGrowableCol(1)
        grid_sizer_parametres.Add(grid_sizer_manuel, 1, wx.LEFT | wx.EXPAND,
                                  30)
        grid_sizer_parametres.AddGrowableCol(0)
        sizer_parametres.Add(grid_sizer_parametres, 1, wx.ALL | wx.EXPAND, 10)
        grid_sizer_base.Add(sizer_parametres, 1, wx.EXPAND, 0)
        grid_sizer_modeles.Add(self.list_ctrl_modeles, 1, wx.EXPAND, 0)
        grid_sizer_boutons_modeles.Add(self.bouton_ajouter, 0, 0, 0)
        grid_sizer_boutons_modeles.Add(self.bouton_modifier, 0, 0, 0)
        grid_sizer_boutons_modeles.Add(self.bouton_dupliquer, 0, 0, 0)
        grid_sizer_boutons_modeles.Add(self.bouton_supprimer, 0, 0, 0)
        grid_sizer_modeles.Add(grid_sizer_boutons_modeles, 1, wx.EXPAND, 0)
        grid_sizer_modeles.AddGrowableRow(0)
        grid_sizer_modeles.AddGrowableCol(0)
        sizer_modeles.Add(grid_sizer_modeles, 1, wx.ALL | wx.EXPAND, 10)
        grid_sizer_base.Add(sizer_modeles, 1, wx.EXPAND, 0)
        grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0)
        grid_sizer_boutons.Add((20, 20), 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0)
        grid_sizer_boutons.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_boutons, 1, wx.EXPAND, 0)
        self.panel_base_2.SetSizer(grid_sizer_base)
        grid_sizer_base.AddGrowableRow(1)
        grid_sizer_base.AddGrowableCol(0)
        sizer_base_2.Add(self.panel_base_2, 1, wx.ALL | wx.EXPAND, 10)
        self.panel_base_1.SetSizer(sizer_base_2)
        sizer_base_1.Add(self.panel_base_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_base_1)
        sizer_base_1.Fit(self)
        self.Layout()
        self.grid_sizer_manuel = grid_sizer_manuel

    def SetLabelRadio1(self):
        """ Assigne un label au radio1 """
        if self.parent.GetName() == "panel_applicModele_FicheInd":
            if len(self.selectionLignes) == 0:
                txt = _(u"Selon les dates sélectionnées dans le calendrier")
            elif len(self.selectionLignes) == 1:
                txt = _(u"Selon la date sélectionnée dans le calendrier")
            else:
                txt = _(u"Selon les ") + str(len(self.selectionLignes)) + _(
                    u" dates sélectionnées dans le calendrier")
        else:
            if len(self.selectionLignes) == 0:
                txt = _(u"Selon les lignes sélectionnées dans le planning")
            elif len(self.selectionLignes) == 1:
                txt = _(u"Selon la ligne sélectionnée dans le planning")
            else:
                txt = _(u"Selon les ") + str(len(self.selectionLignes)) + _(
                    u" lignes sélectionnées dans le planning")
        self.radio_btn_1.SetLabel(txt)
        if len(self.selectionLignes) == 0:
            self.radio_btn_1.Enable(False)
            self.radio_btn_2.SetValue(True)
            self.date_debut.Enable(True)
            self.date_fin.Enable(True)
        else:
            self.radio_btn_1.Enable(True)
            self.radio_btn_1.SetValue(True)
            self.date_debut.Enable(False)
            self.date_fin.Enable(False)

    def OnClose(self, event):
        self.Fermer()
        event.Skip()

    def OnRadio1(self, event):
        self.ParamEnabled(False)

    def OnRadio2(self, event):
        self.ParamEnabled(True)

    def ParamEnabled(self, etat):
        self.label_periode.Enable(etat)
        self.date_debut.Enable(etat)
        self.label_au.Enable(etat)
        self.date_fin.Enable(etat)
        self.label_personnes.Enable(etat)
        self.list_ctrl_personnes.Enable(etat)

    def boutonsEnabled(self, ajouter=True, modifier=True, supprimer=True):
        self.bouton_ajouter.Enable(ajouter)
        self.bouton_modifier.Enable(modifier)
        self.bouton_supprimer.Enable(supprimer)
        self.bouton_dupliquer.Enable(supprimer)

    def OnBoutonAide(self, event):
        from Utils import UTILS_Aide
        UTILS_Aide.Aide("Appliquerunmodledeprsences")

    def OnBoutonAnnuler(self, event):
        self.Fermer()

    def Fermer(self):
        if self.parent.GetName() == "panel_applicModele_FicheInd":
            # Si appellée à partir de la fiche individuelle
            self.parent.GetParent().Fermer()
        else:
            # Sinon...
            self.parent.Fermer()

    def OnBoutonOk(self, event):
        """ Bouton Ok """
        # Vérifie qu'au moins un modèle a été coché
        selectionModeles = self.list_ctrl_modeles.selections
        if len(selectionModeles) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez cocher au moins un modèle dans la liste proposée."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return

        DB = GestionDB.DB()
        # Récupération des modèles
        if len(selectionModeles) == 1:
            selectionModelesTmp = "(%d)" % selectionModeles[0]
        else:
            selectionModelesTmp = str(tuple(selectionModeles))
        req = "SELECT * FROM modeles_planning WHERE IDmodele IN %s" % selectionModelesTmp
        DB.ExecuterReq(req)
        listeModeles = DB.ResultatReq()
        dictModeles = {}
        inclureFeries = False
        for modele in listeModeles:
            dictModeles[modele[0]] = (modele[1], modele[2], modele[3],
                                      modele[4], modele[5])
            if modele[5] == 1:
                inclureFeries = True
        # Récupération des tâches
        req = "SELECT * FROM modeles_taches WHERE IDmodele IN %s" % selectionModelesTmp
        DB.ExecuterReq(req)
        listeTaches = DB.ResultatReq()
        DB.Close()

        # On enlève les taches non utiles (d'autres périodes)
        listeExclusions = []
        for tache in listeTaches:
            typeModele = dictModeles[tache[1]][1]
            periodesModele = dictModeles[tache[1]][3]
            # Comparaison du type
            if typeModele != tache[2]:
                if tache[0] not in listeExclusions:
                    listeExclusions.append(tache[0])
            else:
                if tache[3] == 1 and periodesModele[0] != "1":
                    if tache[0] not in listeExclusions:
                        listeExclusions.append(tache[0])
                if tache[3] == 2 and periodesModele[1] != "1":
                    if tache[0] not in listeExclusions:
                        listeExclusions.append(tache[0])
                if tache[3] == 3 and periodesModele[2] != "1":
                    if tache[0] not in listeExclusions:
                        listeExclusions.append(tache[0])

        for exclusion in listeExclusions:
            index = 0
            for tache in listeTaches:
                if tache[0] == exclusion:
                    listeTaches.pop(index)
                    break
                index += 1

        # Creation du schéma d'application
        periodeEcole = {1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []}
        periodeVacs = {1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []}

        for tache in listeTaches:
            IDtache = tache[0]
            type = tache[2]
            periode = tache[3]
            jour = tache[4]
            heure_debut = tache[5]
            heure_fin = tache[6]
            IDcategorie = tache[7]
            intitule = tache[8]

            # Application periodeEcole :
            if periode == 1 or periode == 2:
                if type == "journ":
                    for numJour in range(1, 8):
                        detailTache = (IDtache, heure_debut, heure_fin,
                                       IDcategorie, intitule)
                        periodeEcole[numJour].append(detailTache)
                if type == "hebdo":
                    detailTache = (IDtache, heure_debut, heure_fin,
                                   IDcategorie, intitule)
                    periodeEcole[jour].append(detailTache)

            # Application periodeVacs :
            if periode == 1 or periode == 3:
                if type == "journ":
                    for numJour in range(1, 8):
                        detailTache = (IDtache, heure_debut, heure_fin,
                                       IDcategorie, intitule)
                        periodeVacs[numJour].append(detailTache)
                if type == "hebdo":
                    detailTache = (IDtache, heure_debut, heure_fin,
                                   IDcategorie, intitule)
                    periodeVacs[jour].append(detailTache)

        # On vérifie que des taches ne se chevauchent pas dans le schéma d'application
        chevauchement = 0

        for numJour in range(1, 8):
            for tacheRef in periodeEcole[numJour]:
                for tacheComp in periodeEcole[numJour]:
                    if tacheComp[0] != tacheRef[0]:
                        # Comparaison des horaires
                        ##                        if tacheComp[1] < tacheRef[1] < tacheComp[2] :
                        ##                            chevauchement += 1
                        ##                        if tacheComp[1] < tacheRef [2]< tacheComp[2] :
                        ##                            chevauchement += 1
                        if (tacheComp[1] < tacheRef[2]) and (tacheComp[2] >
                                                             tacheRef[1]):
                            chevauchement += 1

        for numJour in range(1, 8):
            for tacheRef in periodeVacs[numJour]:
                for tacheComp in periodeVacs[numJour]:
                    if tacheComp[0] != tacheRef[0]:
                        # Comparaison des horaires
                        ##                        if tacheComp[1] < tacheRef[1] < tacheComp[2] :
                        ##                            chevauchement += 1
                        ##                        if tacheComp[1] < tacheRef [2]< tacheComp[2] :
                        ##                            chevauchement += 1
                        if (tacheComp[1] < tacheRef[2]) and (tacheComp[2] >
                                                             tacheRef[1]):
                            chevauchement += 1

        if chevauchement > 0:
            nbreModelesCoches = len(selectionModeles)
            txt = _(u"Les ") + str(nbreModelesCoches) + _(
                u" modèles que vous avez sélectionnés ne sont pas compatibles entre eux : Des tâches se chevauchent. \n\nDéselectionnez ou modifiez les tâches de l'un des modèles."
            )
            dlg = wx.MessageDialog(self, txt, "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return

        # Application du schéma d'application
        listeCreationsTaches = []

        if self.radio_btn_1.GetValue() == True:

            # Récupération des dates extremes de la sélection de lignes
            listeDatesSelection = []
            for ligne in self.selectionLignes:
                listeDatesSelection.append(ligne[1])
            listeDatesSelection.sort()
            dateMin = listeDatesSelection[0]
            dateMax = listeDatesSelection[-1]

            # Récupération des dates de jours de vacances
            listeJoursVacs = self.Importation_Jours_Vacances(dateMin, dateMax)

            # Création de la liste des taches à créer
            for ligne in self.selectionLignes:

                IDpersonne = ligne[0]
                date = ligne[1]
                jourSemaine = date.isoweekday()
                if date in listeJoursVacs: periode = "vacs"
                else: periode = "ecole"

                if periode == "vacs":
                    listTachesTemp = periodeVacs[jourSemaine]
                    for tache in listTachesTemp:
                        detailTache = (IDpersonne, date, tache[1], tache[2],
                                       tache[3], tache[4])
                        listeCreationsTaches.append(detailTache)

                if periode == "ecole":
                    listTachesTemp = periodeEcole[jourSemaine]
                    for tache in listTachesTemp:
                        detailTache = (IDpersonne, date, tache[1], tache[2],
                                       tache[3], tache[4])
                        listeCreationsTaches.append(detailTache)

        if self.radio_btn_2.GetValue() == True:

            # Vérifie que au moins 1 nom de personnes a été coché dans le listCtrl
            if len(self.selectionPersonnes) == 0:
                dlg = wx.MessageDialog(
                    self,
                    _(u"Vous devez cocher au moins un nom dans la liste des personnes."
                      ), "Erreur", wx.OK)
                dlg.ShowModal()
                dlg.Destroy()
                return

            # Vérifie que les dates données dans les datePickers sont correctes
            date_tmp = self.date_debut.GetValue()
            date_debut = datetime.date(date_tmp.GetYear(),
                                       date_tmp.GetMonth() + 1,
                                       date_tmp.GetDay())
            date_tmp = self.date_fin.GetValue()
            date_fin = datetime.date(date_tmp.GetYear(),
                                     date_tmp.GetMonth() + 1,
                                     date_tmp.GetDay())

            if date_debut > date_fin:
                dlg = wx.MessageDialog(
                    self,
                    _(u"La date de début doit être inférieure à la date de fin."
                      ), "Erreur de saisie", wx.OK)
                dlg.ShowModal()
                dlg.Destroy()
                return

            # Création de la liste de dates
            listeDatesSelection = []
            nbreJours = (date_fin - date_debut).days + 1
            dateTemp = date_debut
            for date in range(nbreJours):
                listeDatesSelection.append(dateTemp)
                dateTemp = dateTemp + datetime.timedelta(days=1)
            listeDatesSelection.sort()
            dateMin = listeDatesSelection[0]
            dateMax = listeDatesSelection[-1]

            # Récupération des dates de jours de vacances
            listeJoursVacs = self.Importation_Jours_Vacances(dateMin, dateMax)

            # Création de la liste des taches à créer
            for IDpersonne in self.selectionPersonnes:
                for date in listeDatesSelection:
                    jourSemaine = date.isoweekday()
                    if date in listeJoursVacs: periode = "vacs"
                    else: periode = "ecole"

                    if periode == "vacs":
                        listTachesTemp = periodeVacs[jourSemaine]
                        for tache in listTachesTemp:
                            detailTache = [
                                IDpersonne, date, tache[1], tache[2], tache[3],
                                tache[4]
                            ]
                            listeCreationsTaches.append(detailTache)

                    if periode == "ecole":
                        listTachesTemp = periodeEcole[jourSemaine]
                        for tache in listTachesTemp:
                            detailTache = [
                                IDpersonne, date, tache[1], tache[2], tache[3],
                                tache[4]
                            ]
                            listeCreationsTaches.append(detailTache)

        if len(listeCreationsTaches) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Selon les paramètres que vous avez saisis, aucune tâche n'est à créer..."
                  ), "Information", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return

        # Création de la liste formatée de confirmation
        dictCategories = self.Importation_categories_presences()

        ##        listeConfirmations = []
        ##        for tache in listeCreationsTaches :
        ##            nomPersonne = self.list_ctrl_personnes.dictPersonnes[tache[0]][0] + " " + self.list_ctrl_personnes.dictPersonnes[tache[0]][1]
        ##            date = DatetimeDateEnStr(tache[1])
        ##            horaires = tache[2][:2] + "h" + tache[2][3:] + "-" + tache[3][:2] + "h" + tache[3][3:]
        ##            categorie = dictCategories[tache[4]]
        ##            intitule = tache[5]
        ##            detailTache = (nomPersonne, date, horaires, categorie, intitule)
        ##            listeConfirmations.append(detailTache)

        dictConfirmations = {}
        for IDpersonne in self.selectionPersonnes:
            nomPersonne = self.list_ctrl_personnes.dictPersonnes[IDpersonne][
                0] + " " + self.list_ctrl_personnes.dictPersonnes[IDpersonne][1]
            dictConfirmations[(IDpersonne, nomPersonne)] = {}

        list(dictConfirmations.keys()).sort(reverse=True)

        for tache in listeCreationsTaches:
            IDpersonne = tache[0]
            nomPersonne = self.list_ctrl_personnes.dictPersonnes[IDpersonne][
                0] + " " + self.list_ctrl_personnes.dictPersonnes[IDpersonne][1]
            key = (IDpersonne, nomPersonne)
            date = tache[1]
            horaires = (
                tache[2], tache[3]
            )  #(tache[2][:2] + "h" + tache[2][3:] + "-" + tache[3][:2] + "h" + tache[3][3:]
            categorie = dictCategories[tache[4]]
            intitule = tache[5]
            #if len(dictConfirmations[nomPersonne]) == 0 :
            if date in dictConfirmations[key]:
                dictConfirmations[key][date].append(
                    [horaires, categorie, intitule])
                dictConfirmations[key][date].sort()
            else:
                dictConfirmations[key][date] = [
                    [horaires, categorie, intitule],
                ]

        nbreTaches = len(listeCreationsTaches)

        # Fenêtre de demande de confirmation
        dlg = DLG_Confirm_appli_modele.Dialog(
            self,
            nbreTaches=nbreTaches,
            dictTaches=dictConfirmations,
            listeCreationsTaches=listeCreationsTaches,
            inclureFeries=inclureFeries)
        dlg.ShowModal()
        etat = dlg.etat
        dlg.Destroy()
        if etat == "termine":
            if self.parent.GetName() == "panel_applicModele_FicheInd":
                self.GetGrandParent().EndModal(wx.ID_OK)
            else:
                self.GetParent().EndModal(wx.ID_OK)

    def EnregistrementTaches(self, listeCreationsTaches):
        """ Enregistrement des taches dans la base de données """
        listeExceptions = []

        # Récupération des dates de jours fériés
        self.listeFeriesFixes, self.listeFeriesVariables = self.Importation_Feries(
        )

        # Initialisation de la connexion avec la Base de données
        DB = GestionDB.DB()
        for tache in listeCreationsTaches:

            IDpersonne = tache[0]
            date = tache[1]
            heure_debut = tache[2]
            heure_fin = tache[3]
            IDcategorie = tache[4]
            intitule = tache[5]

            valide = True

            # Vérifie qu'aucune tâche n'existe déjà à ce moment dans la base de données
            req = """
            SELECT IDpresence, date, heure_debut, heure_fin
            FROM presences
            WHERE (date='%s' AND IDpersonne=%d)  AND
            (heure_debut<'%s' And heure_fin>'%s');
            """ % (str(date), IDpersonne, heure_fin, heure_debut)
            DB.ExecuterReq(req)
            listePresences = DB.ResultatReq()
            nbreResultats = len(listePresences)

            # Un ou des présences existent à ce moment, donc pas d'enregistrement
            if nbreResultats != 0:
                valide = False

            # Vérifie que ce n'est pas un jour férié
            #print date, type(date)
            if (date.day, date.month) in self.listeFeriesFixes:
                valide = False
            else:
                if date in self.listeFeriesVariables:
                    valide = False

            # Enregistrement si la date est bien valide
            if valide == True:
                listeDonnees = [
                    ("IDpersonne", IDpersonne),
                    ("date", str(date)),
                    ("heure_debut", heure_debut),
                    ("heure_fin", heure_fin),
                    ("IDcategorie", IDcategorie),
                    ("intitule", intitule),
                ]
                # Enregistrement dans la base
                ID = DB.ReqInsert("presences", listeDonnees)
                DB.Commit()
            else:

                # Si date non valide : on crée un rapport
                dictPersonnes = self.list_ctrl_personnes.dictPersonnes
                nomPersonne = dictPersonnes[IDpersonne][
                    0] + " " + dictPersonnes[IDpersonne][1]
                listeExceptions.append((nomPersonne, DatetimeDateEnStr(date),
                                        (heure_debut, heure_fin)))

        # Fermeture de la base de données
        DB.Close()

        # Lecture de la liste des exceptions
        nbreInvalides = len(listeExceptions)
        nbreValides = len(listeCreationsTaches) - nbreInvalides

        if nbreInvalides != 0:
            message = ""
            if nbreValides == 0:
                message += _(
                    u"Aucune tâche n'a été correctement enregistrée.\n\nL")
            elif nbreValides == 1:
                message += str(nbreValides) + _(
                    u" tâche a été correctement enregistrée.\n\nMais l")
            else:
                message += str(nbreValides) + _(
                    u" tâches ont été correctement enregistrées.\n\nMais l"
                )
            if nbreInvalides == 1:
                message += _(
                    u"a tâche de la liste suivante n'a pas pu être saisie car elle chevauchait une ou plusieurs des tâches existantes. "
                )
                message += _(
                    u"Vous devrez donc d'abord supprimer ou modifier les horaires de ces tâches existantes avant de pouvoir saisir celle-ci.\n\n"
                )
            else:
                message += _(u"es ") + str(nbreInvalides) + _(
                    u" tâches de la liste suivante n'ont pas pu être saisies car elles chevauchaient des tâches existantes. "
                )
                message += _(
                    u"Vous devrez donc d'abord supprimer ou modifier les horaires de ces tâches existantes avant de pouvoir saisir celles-ci.\n\n"
                )
            for exception in listeExceptions:
                message += "   > Le " + exception[1] + " pour " + exception[
                    0] + " de " + exception[2][0] + u" à " + exception[2][
                        1] + ".\n"
            dlg = wx.lib.dialogs.ScrolledMessageDialog(self, message,
                                                       _(u"Rapport d'erreurs"))
            dlg.ShowModal()

        #print "fin de la procedure d'enregistrement !!!"

    def Importation_Jours_Vacances(self, dateMin=None, dateMax=None):
        """ Importation des dates d'ouverture de la structure """

        ##        # Anciennce version :
        ##        conditions = ""
        ##        if dateMin != None and dateMax != None :
        ##            conditions = " WHERE date_ouverture >= '" + str(dateMin) + "' AND date_ouverture <= '" + str(dateMax)  + "'"
        ##        DB = GestionDB.DB()
        ##        req = "SELECT * FROM dates_ouverture" + conditions + ";"
        ##        DB.ExecuterReq(req)
        ##        listeVacs1 = DB.ResultatReq()
        ##        DB.Close()
        ##
        ##        # Formatage des dates pour la liste
        ##        listeVacs2 = []
        ##        for date in listeVacs1:
        ##            dateTemp = datetime.date(int(date[1][:4]), int(date[1][5:7]), int(date[1][8:10]))
        ##            listeVacs2.append(dateTemp)
        ##        listeVacs2.sort()
        ##        return listeVacs2

        req = "SELECT * FROM periodes_vacances ORDER BY date_debut;"
        DB = GestionDB.DB()
        DB.ExecuterReq(req)
        listeVacances1 = DB.ResultatReq()
        DB.Close()

        listeVacances2 = []
        for id, nom, annee, date_debut, date_fin in listeVacances1:
            datedebut = datetime.date(int(date_debut[:4]),
                                      int(date_debut[5:7]),
                                      int(date_debut[8:10]))
            datefin = datetime.date(int(date_fin[:4]), int(date_fin[5:7]),
                                    int(date_fin[8:10]))
            listeVacances2.append(datedebut)
            for x in range((datefin - datedebut).days):
                datedebut = datedebut + datetime.timedelta(days=1)
                listeVacances2.append(datedebut)

        return listeVacances2

    def Importation_Feries(self):
        """ Importation des dates des jours fériés """

        req = "SELECT * FROM jours_feries;"
        DB = GestionDB.DB()
        DB.ExecuterReq(req)
        listeFeriesTmp = DB.ResultatReq()
        DB.Close()

        listeFeriesFixes = []
        listeFeriesVariables = []
        for ID, type, nom, jour, mois, annee in listeFeriesTmp:
            if type == "fixe":
                date = (jour, mois)
                listeFeriesFixes.append(date)
            else:
                date = datetime.date(annee, mois, jour)
                listeFeriesVariables.append(date)
        return listeFeriesFixes, listeFeriesVariables

    def Importation_categories_presences(self):
        DB = GestionDB.DB()
        req = "SELECT IDcategorie, nom_categorie FROM cat_presences"
        DB.ExecuterReq(req)
        listeCategories = DB.ResultatReq()
        DB.Close()
        # Transformation en dictionnaire
        dictCategories = {}
        for ID, nom in listeCategories:
            dictCategories[ID] = nom
        return dictCategories

    def OnBoutonAjouter(self, event):
        """ Créer un nouveau modèle """
        dlg = DLG_Saisie_modele.Dialog(self, IDmodele=0)
        dlg.ShowModal()
        dlg.Destroy()

    def OnBoutonModifier(self, event):
        """ Modifier un modèle """
        index = self.list_ctrl_modeles.GetFirstSelected()
        if index == -1:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner un modèle dans la liste proposée"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return
        IDmodele = self.list_ctrl_modeles.GetItemData(index)
        dlg = DLG_Saisie_modele.Dialog(self, IDmodele=IDmodele)
        dlg.ShowModal()
        dlg.Destroy()

    def OnBoutonSupprimer(self, event):
        """ Suppression d'un modèle """
        index = self.list_ctrl_modeles.GetFirstSelected()
        if index == -1:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner un modèle dans la liste proposée"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return
        IDmodele = self.list_ctrl_modeles.GetItemData(index)
        nomModele = self.list_ctrl_modeles.dictModeles[IDmodele][0]
        dlg = wx.MessageDialog(
            self,
            _(u"Souhaitez-vous vraiment supprimer le modèle '") + nomModele +
            "' ?", _(u"Suppression d'un modèle"),
            wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT)
        if dlg.ShowModal() == wx.ID_NO:
            dlg.Destroy()
            return
        dlg.Destroy()

        if IDmodele in self.list_ctrl_modeles.selections:
            self.list_ctrl_modeles.selections.remove(IDmodele)

        DB = GestionDB.DB()
        # Suppression des taches associées au modèle
        DB.ReqDEL("modeles_taches", "IDmodele", IDmodele)
        # Suppression du modèle
        DB.ReqDEL("modeles_planning", "IDmodele", IDmodele)
        DB.Close()

        # MAJ listCtrl Modeles
        self.list_ctrl_modeles.Remplissage()
        self.boutonsEnabled(True, False, False)

    def OnBoutonDupliquer(self, event):
        """ Dupliquer un modèle """
        # Demande de confirmation
        index = self.list_ctrl_modeles.GetFirstSelected()
        if index == -1:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner un modèle dans la liste proposée"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return
        IDmodele = self.list_ctrl_modeles.GetItemData(index)
        nomModele = self.list_ctrl_modeles.dictModeles[IDmodele][0]
        dlg = wx.MessageDialog(
            self,
            _(u"Souhaitez-vous vraiment dupliquer le modèle '") + nomModele +
            u"' ?", _(u"Duplication d'un modèle"),
            wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT)
        if dlg.ShowModal() == wx.ID_NO:
            dlg.Destroy()
            return
        dlg.Destroy()

        # Duplication du modèle
        dlg = DLG_Saisie_modele.Dialog(self, IDmodele=IDmodele)
        dlg.IDmodele = 0
        dlg.text_nom.SetValue(_(u"Copie de %s") % nomModele)
        dlg.ShowModal()
        dlg.Destroy()
Beispiel #12
0
 def __init__(self, parent):
     DatePickerCtrl.__init__(self, parent, -1, style=DP_DROPDOWN)
     self.parent = parent
    def __init__(self,
                 parent,
                 id=-1,
                 title=_(u"Saisie d'un déplacement"),
                 IDdeplacement=None,
                 IDpersonne=None):
        wx.Dialog.__init__(self, parent, id, title)
        self.IDdeplacement = IDdeplacement
        self.IDpersonne = IDpersonne

        # Création d'une liste des villes et codes postaux
        con = sqlite3.connect(Chemins.GetStaticPath("Databases/Villes.db3"))
        cur = con.cursor()
        cur.execute("SELECT ville, cp FROM villes")
        self.listeVillesTmp = cur.fetchall()
        con.close()

        # Création d'une liste de noms de villes
        self.listeNomsVilles = []
        self.listeVilles = []
        for nom, cp in self.listeVillesTmp:
            self.listeVilles.append((nom, "%05d" % cp))
            self.listeNomsVilles.append(nom)

        # Importation de la table des distances
        self.ImportationDistances()

        # Généralités
        self.staticbox_generalites = wx.StaticBox(self, -1,
                                                  _(u"Généralités"))

        self.label_date = wx.StaticText(self,
                                        -1,
                                        _(u"Date :"),
                                        size=(95, -1),
                                        style=wx.ALIGN_RIGHT)
        self.ctrl_date = DatePickerCtrl(self, -1, style=DP_DROPDOWN)

        self.label_utilisateur = wx.StaticText(self,
                                               -1,
                                               _(u"Utilisateur :"),
                                               size=(95, -1),
                                               style=wx.ALIGN_RIGHT)
        self.ImportationPersonnes()
        self.ctrl_utilisateur = AdvancedComboBox(self,
                                                 "",
                                                 size=(100, -1),
                                                 choices=self.listePersonnes)

        self.label_objet = wx.StaticText(self,
                                         -1,
                                         _(u"Objet :"),
                                         size=(95, -1),
                                         style=wx.ALIGN_RIGHT)
        self.ctrl_objet = wx.TextCtrl(self,
                                      -1,
                                      "",
                                      size=(-1, -1),
                                      style=wx.TE_MULTILINE)

        # Trajet
        self.staticbox_trajet = wx.StaticBox(self, -1, _(u"Trajet"))

        self.label_depart = wx.StaticText(self,
                                          -1,
                                          _(u"Ville de départ :"),
                                          size=(95, -1),
                                          style=wx.ALIGN_RIGHT)
        self.ctrl_cp_depart = TextCtrlCp(self,
                                         value="",
                                         listeVilles=self.listeVilles,
                                         size=(55, -1),
                                         style=wx.TE_CENTRE,
                                         mask="#####")
        self.ctrl_ville_depart = TextCtrlVille(
            self,
            value="",
            ctrlCp=self.ctrl_cp_depart,
            listeVilles=self.listeVilles,
            listeNomsVilles=self.listeNomsVilles)
        self.ctrl_cp_depart.ctrlVille = self.ctrl_ville_depart
        self.bouton_options_depart = wx.Button(self, -1, "...", size=(20, 20))

        self.label_arrivee = wx.StaticText(self,
                                           -1,
                                           _(u"Ville d'arrivée :"),
                                           size=(95, -1),
                                           style=wx.ALIGN_RIGHT)
        self.ctrl_cp_arrivee = TextCtrlCp(self,
                                          value="",
                                          listeVilles=self.listeVilles,
                                          size=(55, -1),
                                          style=wx.TE_CENTRE,
                                          mask="#####")
        self.ctrl_ville_arrivee = TextCtrlVille(
            self,
            value="",
            ctrlCp=self.ctrl_cp_arrivee,
            listeVilles=self.listeVilles,
            listeNomsVilles=self.listeNomsVilles)
        self.ctrl_cp_arrivee.ctrlVille = self.ctrl_ville_arrivee
        self.bouton_options_arrivee = wx.Button(self, -1, "...", size=(20, 20))

        self.label_distance = wx.StaticText(self,
                                            -1,
                                            _(u"Distance :"),
                                            size=(95, -1),
                                            style=wx.ALIGN_RIGHT)
        self.ctrl_distance = wx.TextCtrl(self, -1, "0", size=(55, -1))
        self.label_km = wx.StaticText(self, -1, _(u"Km  (Aller simple)"))

        self.label_aller_retour = wx.StaticText(self,
                                                -1,
                                                _(u"Aller/retour :"),
                                                size=(95, -1),
                                                style=wx.ALIGN_RIGHT)
        self.ctrl_aller_retour = wx.CheckBox(self, -1, u"")

        ##############################################################
        # Pour désactiver l'autocomplete du controle VILLE qui ne fonctionne pas sous Linux
        if "linux" in sys.platform:
            self.ctrl_ville_depart.Enable(False)
            self.ctrl_ville_arrivee.Enable(False)

        ##############################################################

        # Remboursement
        self.staticbox_remboursement = wx.StaticBox(self, -1,
                                                    _(u"Remboursement"))

        self.label_tarif = wx.StaticText(self,
                                         -1,
                                         _(u"Tarif du Km :"),
                                         size=(95, -1),
                                         style=wx.ALIGN_RIGHT)
        self.ctrl_tarif = wx.TextCtrl(self, -1, "0.00", size=(55, -1))
        self.label_euro_tarif = wx.StaticText(self, -1, u"¤")

        self.label_montant = wx.StaticText(self,
                                           -1,
                                           _(u"Montant du rmbst :"),
                                           size=(110, -1),
                                           style=wx.ALIGN_RIGHT)
        self.ctrl_montant = wx.StaticText(self, -1, u"0.00 ¤")
        font = wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD)
        self.ctrl_montant.SetFont(font)

        self.label_remboursement = wx.StaticText(self,
                                                 -1,
                                                 _(u"Remboursement :"),
                                                 size=(95, -1),
                                                 style=wx.ALIGN_RIGHT)
        self.ctrl_remboursement = wx.StaticText(self, -1,
                                                _(u"Aucun remboursement."))

        # Boutons
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self,
            id=wx.ID_CANCEL,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))
        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))

        # IDpersonne :
        if self.IDpersonne != None:
            self.SetPersonne(self.IDpersonne)
        # Si c'est une modification :
        if self.IDdeplacement != None:
            self.SetTitle(_(u"Modification d'un déplacement"))
            self.Importation()
        else:
            self.ImportDernierTarif()
        # Cache le controle utilisateur :
        if self.IDpersonne != None:
            self.label_utilisateur.Show(False)
            self.ctrl_utilisateur.Show(False)
            self.SetSize((-1, 430))

        self.__set_properties()
        self.__do_layout()

        # Binds
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOptionsDepart,
                  self.bouton_options_depart)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOptionsArrivee,
                  self.bouton_options_arrivee)
        self.Bind(wx.EVT_CHECKBOX, self.OnAllerRetour, self.ctrl_aller_retour)
        self.ctrl_distance.Bind(wx.EVT_KILL_FOCUS, self.distance_EvtKillFocus)
        self.ctrl_tarif.Bind(wx.EVT_KILL_FOCUS, self.tarif_EvtKillFocus)
class Panel(wx.Panel):
    def __init__(self, parent, IDemploi=None):
        wx.Panel.__init__(self,
                          parent,
                          id=-1,
                          name="panel_emploi",
                          style=wx.TAB_TRAVERSAL)
        self.IDemploi = IDemploi
        self.listeDisponibilites = []

        # Général
        self.sizer_generalites_staticbox = wx.StaticBox(
            self, -1, _(u"1. Généralités"))
        self.label_introduction = wx.StaticText(
            self, -1,
            _(u"Vous pouvez ici saisir les informations concernant l'offre d'emploi."
              ))
        self.label_date_debut = wx.StaticText(self, -1, _(u"Lancement :"))
        self.ctrl_date_debut = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.label_date_fin = wx.StaticText(self, -1, _(u"Clôture :"))
        self.ctrl_date_fin = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.label_intitule = wx.StaticText(self, -1, _(u"Intitulé :"))
        self.ctrl_intitule = wx.TextCtrl(self, -1, "")
        self.label_detail = wx.StaticText(self, -1, _(u"Détail :"))
        self.ctrl_detail = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)
        self.ctrl_detail.SetMinSize((-1, 100))
        self.label_reference = wx.StaticText(self, -1, _(u"N° ANPE :"))
        self.ctrl_reference = wx.TextCtrl(self, -1, "")

        # Disponibilités
        self.sizer_disponibilites_staticbox = wx.StaticBox(
            self, -1, _(u"2. Disponibilités"))
        self.label_periodes = wx.StaticText(self, -1, _(u"Périodes :"))
        self.ctrl_periodes = ListBoxDisponibilites(self)
        self.ctrl_periodes.SetMinSize((20, 20))
        self.bouton_ajouter_periode = wx.BitmapButton(
            self, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Ajouter.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_modifier_periode = wx.BitmapButton(
            self, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Modifier.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_supprimer_periode = wx.BitmapButton(
            self, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Supprimer.png"),
                      wx.BITMAP_TYPE_ANY))
        self.label_periodes_remarques = wx.StaticText(self, -1,
                                                      _(u"Remarques :"))
        self.ctrl_periodes_remarques = wx.TextCtrl(self, -1, u"")

        # Poste
        self.sizer_poste_staticbox = wx.StaticBox(self, -1, _(u"3. Poste"))
        self.label_fonction = wx.StaticText(self, -1, _(u"Fonction :"))
        self.ctrl_fonction = CheckListBox(self)
        self.ctrl_fonction.SetMinSize((20, 20))
        self.ctrl_fonction.Remplissage(self.Importation_fonctions())
        self.bouton_fonctions = wx.Button(self, -1, "...", size=(20, 20))
        self.label_affectation = wx.StaticText(self, -1, _(u"Affectation :"))
        self.ctrl_affectations = CheckListBox(self)
        self.ctrl_affectations.SetMinSize((20, 20))
        self.ctrl_affectations.Remplissage(self.Importation_affectations())
        self.bouton_affectations = wx.Button(self, -1, "...", size=(20, 20))
        self.label_poste_remarques = wx.StaticText(self, -1, _(u"Remarques :"))
        self.ctrl_poste_remarques = wx.TextCtrl(self, -1, "")

        # Diffuseurs
        self.sizer_diffusion_staticbox = wx.StaticBox(
            self, -1, _(u"4. Diffusion de l'offre"))
        self.label_diffuseurs = wx.StaticText(self, -1, _(u"  Diffuseurs :"))
        self.ctrl_diffuseurs = CheckListBox(self)
        self.ctrl_diffuseurs.SetMinSize((20, 20))
        self.ctrl_diffuseurs.Remplissage(self.Importation_diffuseurs())
        self.bouton_diffuseurs = wx.Button(self, -1, "...", size=(20, 20))

        # Commandes
        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))
        self.bouton_aide.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide")))
        self.bouton_ok.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour valider")))
        self.bouton_annuler.SetToolTip(
            wx.ToolTip(_(u"Cliquez pour annuler et fermer")))

        self.__set_properties()
        self.__do_layout()

        # Binds
        self.Bind(wx.EVT_BUTTON, self.Onbouton_aide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.Onbouton_ok, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.Onbouton_annuler, self.bouton_annuler)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        self.Bind(wx.EVT_BUTTON, self.OnAjouterPeriode,
                  self.bouton_ajouter_periode)
        self.Bind(wx.EVT_BUTTON, self.OnModifierPeriode,
                  self.bouton_modifier_periode)
        self.Bind(wx.EVT_BUTTON, self.OnSupprimerPeriode,
                  self.bouton_supprimer_periode)
        self.Bind(wx.EVT_BUTTON, self.OnGestionFonctions,
                  self.bouton_fonctions)
        self.Bind(wx.EVT_BUTTON, self.OnGestionAffectations,
                  self.bouton_affectations)
        self.Bind(wx.EVT_BUTTON, self.OnGestionDiffuseurs,
                  self.bouton_diffuseurs)
        self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)

        # Importation des données
        if self.IDemploi != None:
            self.Importation()

    def __set_properties(self):
        self.ctrl_date_debut.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez la date de lancement de l'offre d'emploi")))
        self.ctrl_date_fin.SetToolTip(
            wx.ToolTip(
                _(u"Sélectionnez la date de clôture du recrutement pour cette offre d'emploi"
                  )))
        self.ctrl_intitule.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez l'intitulé (nom) de l'offre. Ex : Animateur Mercredis et vacances Saison 2009-10"
                  )))
        self.ctrl_detail.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez le texte détaillé de l'offre d'emploi")))
        self.ctrl_reference.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez le numéro de l'annonce déposé à l'ANPE. Ex : X455676E"
                  )))
        self.ctrl_periodes.SetToolTip(
            wx.ToolTip(
                _(u"Sélectionnez un ou plusieurs périodes de disponibilités"
                  )))
        self.ctrl_periodes_remarques.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez un complement d'information sur les disponibilités"
                  )))
        self.ctrl_fonction.SetToolTip(
            wx.ToolTip(_(u"Cochez la ou les fonctions du poste")))
        self.ctrl_affectations.SetToolTip(
            wx.ToolTip(_(u"Cochez la ou les affectations pour le poste")))
        self.ctrl_poste_remarques.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez un complément d'information sur le poste")))
        self.bouton_ajouter_periode.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour ajouter une période")))
        self.bouton_modifier_periode.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour modifier la période sélectionnée")))
        self.bouton_supprimer_periode.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour supprimer la période sélectionnée")))
        self.bouton_fonctions.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour ajouter, modifier ou supprimer des fonctions"
                  )))
        self.bouton_affectations.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour ajouter, modifier ou supprimer des affectations"
                  )))
        self.bouton_diffuseurs.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour ajouter, modifier ou supprimer des diffuseurs"
                  )))
        self.ctrl_diffuseurs.SetToolTip(
            wx.ToolTip(
                _(u"Cochez ici les organismes ou moyens de communication utilisés pour diffuser cette offre d'emploi. Ex : ANPE, Presse, fédération, etc..."
                  )))

    def __do_layout(self):
        grid_sizer_base = wx.FlexGridSizer(rows=4, cols=1, vgap=0, hgap=0)
        grid_sizer_contenu = wx.FlexGridSizer(rows=1, cols=2, vgap=10, hgap=10)
        grid_sizer_droite = wx.FlexGridSizer(rows=2, cols=1, vgap=10, hgap=10)
        sizer_diffusion = wx.StaticBoxSizer(self.sizer_diffusion_staticbox,
                                            wx.VERTICAL)
        grid_sizer_diffusion = wx.FlexGridSizer(rows=3,
                                                cols=2,
                                                vgap=5,
                                                hgap=10)
        sizer_poste = wx.StaticBoxSizer(self.sizer_poste_staticbox,
                                        wx.VERTICAL)
        grid_sizer_poste = wx.FlexGridSizer(rows=3, cols=2, vgap=10, hgap=10)
        grid_sizer_affectation = wx.FlexGridSizer(rows=1,
                                                  cols=2,
                                                  vgap=5,
                                                  hgap=5)
        grid_sizer_fonction = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5)
        grid_sizer_gauche = wx.FlexGridSizer(rows=2, cols=1, vgap=10, hgap=10)
        sizer_disponibilites = wx.StaticBoxSizer(
            self.sizer_disponibilites_staticbox, wx.VERTICAL)
        grid_sizer_disponibilites = wx.FlexGridSizer(rows=2,
                                                     cols=2,
                                                     vgap=10,
                                                     hgap=10)
        grid_sizer_periodes = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5)
        grid_sizer_boutons_periodes = wx.FlexGridSizer(rows=5,
                                                       cols=1,
                                                       vgap=5,
                                                       hgap=5)
        sizer_generalites = wx.StaticBoxSizer(self.sizer_generalites_staticbox,
                                              wx.VERTICAL)
        grid_sizer_generalites = wx.FlexGridSizer(rows=4,
                                                  cols=2,
                                                  vgap=5,
                                                  hgap=10)
        grid_sizer_type = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5)

        grid_sizer_base.Add(self.label_introduction, 0, wx.ALL, 10)

        grid_sizer_generalites.Add(self.label_date_debut, 0,
                                   wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL,
                                   0)
        grid_sizer_dates = wx.FlexGridSizer(rows=1, cols=4, vgap=5, hgap=5)
        grid_sizer_dates.Add(self.ctrl_date_debut, 0, 0, 0)
        grid_sizer_dates.Add((5, 5), 0, wx.EXPAND, 0)
        grid_sizer_dates.Add(self.label_date_fin, 0,
                             wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_dates.Add(self.ctrl_date_fin, 0, 0, 0)
        grid_sizer_dates.AddGrowableCol(1)
        grid_sizer_generalites.Add(grid_sizer_dates, 0, wx.EXPAND, 0)

        grid_sizer_generalites.Add(self.label_intitule, 0,
                                   wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL,
                                   0)
        grid_sizer_generalites.Add(self.ctrl_intitule, 0, wx.EXPAND, 0)
        grid_sizer_generalites.Add(self.label_detail, 0, wx.ALIGN_RIGHT, 0)
        grid_sizer_generalites.Add(self.ctrl_detail, 0, wx.EXPAND, 0)
        grid_sizer_generalites.Add(self.label_reference, 0,
                                   wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL,
                                   0)
        grid_sizer_generalites.Add(self.ctrl_reference, 0, wx.EXPAND, 0)
        grid_sizer_generalites.AddGrowableCol(1)
        sizer_generalites.Add(grid_sizer_generalites, 1, wx.ALL | wx.EXPAND,
                              10)

        grid_sizer_gauche.Add(sizer_generalites, 1, wx.EXPAND, 0)

        grid_sizer_disponibilites.Add(self.label_periodes, 0, wx.ALIGN_RIGHT,
                                      0)
        grid_sizer_periodes.Add(self.ctrl_periodes, 0, wx.EXPAND, 0)
        grid_sizer_boutons_periodes.Add(self.bouton_ajouter_periode, 0, 0, 0)
        grid_sizer_boutons_periodes.Add(self.bouton_modifier_periode, 0, 0, 0)
        grid_sizer_boutons_periodes.Add(self.bouton_supprimer_periode, 0, 0, 0)
        grid_sizer_periodes.Add(grid_sizer_boutons_periodes, 1, wx.EXPAND, 0)
        grid_sizer_periodes.AddGrowableRow(0)
        grid_sizer_periodes.AddGrowableCol(0)
        grid_sizer_disponibilites.Add(grid_sizer_periodes, 1, wx.EXPAND, 0)
        grid_sizer_disponibilites.Add(
            self.label_periodes_remarques, 0,
            wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_disponibilites.Add(self.ctrl_periodes_remarques, 0,
                                      wx.EXPAND, 0)
        grid_sizer_disponibilites.AddGrowableRow(0)
        grid_sizer_disponibilites.AddGrowableCol(1)
        sizer_disponibilites.Add(grid_sizer_disponibilites, 1,
                                 wx.ALL | wx.EXPAND, 10)
        grid_sizer_gauche.Add(sizer_disponibilites, 1, wx.EXPAND, 0)
        grid_sizer_gauche.AddGrowableRow(1)
        grid_sizer_gauche.AddGrowableCol(0)
        grid_sizer_contenu.Add(grid_sizer_gauche, 1, wx.EXPAND, 0)
        grid_sizer_poste.Add(self.label_fonction, 0, wx.ALIGN_RIGHT, 0)
        grid_sizer_fonction.Add(self.ctrl_fonction, 0, wx.EXPAND, 0)
        grid_sizer_fonction.Add(self.bouton_fonctions, 0, 0, 0)
        grid_sizer_fonction.AddGrowableRow(0)
        grid_sizer_fonction.AddGrowableCol(0)
        grid_sizer_poste.Add(grid_sizer_fonction, 1, wx.EXPAND, 0)
        grid_sizer_poste.Add(self.label_affectation, 0, wx.ALIGN_RIGHT, 0)
        grid_sizer_affectation.Add(self.ctrl_affectations, 0, wx.EXPAND, 0)
        grid_sizer_affectation.Add(self.bouton_affectations, 0, 0, 0)
        grid_sizer_affectation.AddGrowableRow(0)
        grid_sizer_affectation.AddGrowableCol(0)
        grid_sizer_poste.Add(grid_sizer_affectation, 1, wx.EXPAND, 0)
        grid_sizer_poste.Add(self.label_poste_remarques, 0,
                             wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_poste.Add(self.ctrl_poste_remarques, 0, wx.EXPAND, 0)
        grid_sizer_poste.AddGrowableRow(0)
        grid_sizer_poste.AddGrowableRow(1)
        grid_sizer_poste.AddGrowableCol(1)
        sizer_poste.Add(grid_sizer_poste, 1, wx.ALL | wx.EXPAND, 10)
        grid_sizer_droite.Add(sizer_poste, 1, wx.EXPAND, 0)

        grid_sizer_diffuseurs = wx.FlexGridSizer(rows=1,
                                                 cols=2,
                                                 vgap=5,
                                                 hgap=5)
        grid_sizer_diffusion.Add(self.label_diffuseurs, 0, wx.ALIGN_RIGHT, 0)
        grid_sizer_diffuseurs.Add(self.ctrl_diffuseurs, 0, wx.EXPAND, 0)
        grid_sizer_diffuseurs.Add(self.bouton_diffuseurs, 0, 0, 0)
        grid_sizer_diffuseurs.AddGrowableRow(0)
        grid_sizer_diffuseurs.AddGrowableCol(0)
        grid_sizer_diffusion.Add(grid_sizer_diffuseurs, 1, wx.ALL | wx.EXPAND,
                                 0)
        grid_sizer_diffusion.AddGrowableRow(0)
        grid_sizer_diffusion.AddGrowableCol(1)
        sizer_diffusion.Add(grid_sizer_diffusion, 1, wx.ALL | wx.EXPAND, 10)
        grid_sizer_droite.Add(sizer_diffusion, 1, wx.EXPAND, 0)

        grid_sizer_droite.AddGrowableRow(0)
        grid_sizer_droite.AddGrowableRow(1)
        grid_sizer_droite.AddGrowableCol(0)
        grid_sizer_contenu.Add(grid_sizer_droite, 1, wx.EXPAND, 0)
        grid_sizer_contenu.AddGrowableRow(0)
        grid_sizer_contenu.AddGrowableCol(0)
        grid_sizer_contenu.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_contenu, 1, wx.ALL | wx.EXPAND, 10)

        # Spacer
        grid_sizer_base.Add((5, 5), 0, wx.EXPAND, 0)

        # Commandes
        grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=6, vgap=10, hgap=10)
        grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0)
        grid_sizer_boutons.Add((20, 20), 0, wx.EXPAND, 0)
        grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0)
        grid_sizer_boutons.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_boutons, 1,
                            wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, 10)

        self.SetSizer(grid_sizer_base)
        grid_sizer_base.Fit(self)
        grid_sizer_base.AddGrowableRow(1)
        grid_sizer_base.AddGrowableCol(0)

    def OnContextMenu(self, event):
        pass

    def SetDatePicker(self, controle, date):
        """ Met une date au format datetime dans un datePicker donné """
        annee = int(date.year)
        mois = int(date.month) - 1
        jour = int(date.day)
        date = wx.DateTime()
        date.Set(jour, mois, annee)
        controle.SetValue(date)

    def GetDatePickerValue(self, controle):
        """ Renvoie la date au format datetime d'un datePicker """
        date_tmp = controle.GetValue()
        return datetime.date(date_tmp.GetYear(),
                             date_tmp.GetMonth() + 1, date_tmp.GetDay())

    def Importation_diffuseurs(self):
        # Importation des diffuseurs
        DB = GestionDB.DB()
        req = """SELECT IDdiffuseur, diffuseur
        FROM diffuseurs ORDER BY diffuseur; """
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        return listeDonnees

    def Importation_fonctions(self):
        # Importation des fonctions disponibles
        DB = GestionDB.DB()
        req = """SELECT IDfonction, fonction
        FROM fonctions ORDER BY fonction; """
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        return listeDonnees

    def Importation_affectations(self):
        # Importation des affectations disponibles
        DB = GestionDB.DB()
        req = """SELECT IDaffectation, affectation
        FROM affectations ORDER BY affectation; """
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        return listeDonnees

    def Importation(self):
        # Importation des données de la candidature
        DB = GestionDB.DB()
        req = """SELECT IDemploi, date_debut, date_fin, intitule, detail, reference_anpe, periodes_remarques, poste_remarques 
        FROM emplois WHERE IDemploi=%d; """ % self.IDemploi
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        if len(listeDonnees) == 0: return
        IDemploi, date_debut, date_fin, intitule, detail, reference_anpe, periodes_remarques, poste_remarques = listeDonnees[
            0]

        self.SetDatePicker(
            self.ctrl_date_debut,
            datetime.date(year=int(date_debut[:4]),
                          month=int(date_debut[5:7]),
                          day=int(date_debut[8:10])))
        self.SetDatePicker(
            self.ctrl_date_fin,
            datetime.date(year=int(date_fin[:4]),
                          month=int(date_fin[5:7]),
                          day=int(date_fin[8:10])))
        self.ctrl_intitule.SetValue(intitule)
        self.ctrl_detail.SetValue(detail)
        self.ctrl_reference.SetValue(reference_anpe)
        self.ctrl_periodes_remarques.SetValue(periodes_remarques)
        self.ctrl_poste_remarques.SetValue(poste_remarques)

        # Importation des disponibilités
        DB = GestionDB.DB()
        req = """SELECT IDdisponibilite, date_debut, date_fin
        FROM emplois_dispo WHERE IDemploi=%d ORDER BY date_debut; """ % self.IDemploi
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        self.listeDisponibilites = []
        for IDdisponibilite, date_debut, date_fin in listeDonnees:
            date_debut = datetime.date(year=int(date_debut[:4]),
                                       month=int(date_debut[5:7]),
                                       day=int(date_debut[8:10]))
            date_fin = datetime.date(year=int(date_fin[:4]),
                                     month=int(date_fin[5:7]),
                                     day=int(date_fin[8:10]))
            self.listeDisponibilites.append(
                (IDdisponibilite, date_debut, date_fin))
        self.ctrl_periodes.Remplissage(self.listeDisponibilites)

        # Importation des fonctions
        DB = GestionDB.DB()
        req = """SELECT IDemploi_fonction, IDfonction
        FROM emplois_fonctions WHERE IDemploi=%d; """ % self.IDemploi
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        listeFonctions = []
        for IDemploi_fonction, IDfonction in listeDonnees:
            listeFonctions.append(IDfonction)
        self.ctrl_fonction.CocheListe(listeFonctions)

        # Importation des affectations
        DB = GestionDB.DB()
        req = """SELECT IDemploi_affectation, IDaffectation
        FROM emplois_affectations WHERE IDemploi=%d; """ % self.IDemploi
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        listeAffectations = []
        for IDemploi_affectation, IDaffectation in listeDonnees:
            listeAffectations.append(IDaffectation)
        self.ctrl_affectations.CocheListe(listeAffectations)

        # Importation des diffuseurs
        DB = GestionDB.DB()
        req = """SELECT IDemploi_diffuseur, IDdiffuseur
        FROM emplois_diffuseurs WHERE IDemploi=%d; """ % self.IDemploi
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        listeDiffuseurs = []
        for IDemploi_diffuseur, IDdiffuseur in listeDonnees:
            listeDiffuseurs.append(IDdiffuseur)
        self.ctrl_diffuseurs.CocheListe(listeDiffuseurs)

    def MAJ_fonctions(self):
        # Récupère liste des fonctions disponibles
        self.ctrl_fonction.Remplissage(self.Importation_fonctions())
        self.ctrl_fonction.CocheListe()

    def MAJ_affectations(self):
        # Récupère liste des fonctions disponibles
        self.ctrl_affectations.Remplissage(self.Importation_affectations())
        self.ctrl_affectations.CocheListe()

    def MAJ_diffuseurs(self):
        # Récupère liste des fonctions disponibles
        self.ctrl_diffuseurs.Remplissage(self.Importation_diffuseurs())
        self.ctrl_diffuseurs.CocheListe()

    def OnAjouterPeriode(self, event):
        # Ajout d'une période de disponibilités
        dlg = DLG_Selection_periode.SelectionPeriode(self)
        if dlg.ShowModal() == wx.ID_OK:
            date_debut, date_fin = dlg.GetDates()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return False
        # Modification de la liste
        self.listeDisponibilites.append((None, date_debut, date_fin))
        self.ctrl_periodes.Remplissage(self.listeDisponibilites)

    def OnModifierPeriode(self, event):
        # Modification d'une période de disponibilité
        index = self.ctrl_periodes.GetSelection()
        if index == -1:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez déjà sélectionner une période dans la liste"
                  ), _(u"Erreur"), wx.OK | wx.ICON_INFORMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return
        IDdisponibilite, date_debut, date_fin = self.listeDisponibilites[index]
        dlg = DLG_Selection_periode.SelectionPeriode(self)
        dlg.SetDates(date_debut=date_debut, date_fin=date_fin)
        if dlg.ShowModal() == wx.ID_OK:
            date_debut, date_fin = dlg.GetDates()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return False
        # Modification de la liste
        self.listeDisponibilites[index] = (IDdisponibilite, date_debut,
                                           date_fin)
        self.ctrl_periodes.Remplissage(self.listeDisponibilites)

    def OnSupprimerPeriode(self, event):
        # Suppression d'une période de disponibilité
        index = self.ctrl_periodes.GetSelection()
        if index == -1:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez déjà sélectionner une période dans la liste"
                  ), _(u"Erreur"), wx.OK | wx.ICON_INFORMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return
        IDdisponibilite, date_debut, date_fin = self.listeDisponibilites[index]

        # Demande de confirmation
        formatDate = "%d/%m/%Y"
        texteDates = _(u"Du %s au %s") % (date_debut.strftime(formatDate),
                                          date_fin.strftime(formatDate))
        txtMessage = six.text_type((_(
            u"Voulez-vous vraiment supprimer cette période de disponibilité ? \n\n> %s"
        ) % texteDates))
        dlgConfirm = wx.MessageDialog(
            self, txtMessage, _(u"Confirmation de suppression"),
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
        reponse = dlgConfirm.ShowModal()
        dlgConfirm.Destroy()
        if reponse == wx.ID_NO:
            return

        # Modification de la liste
        self.listeDisponibilites.pop(index)
        self.ctrl_periodes.Remplissage(self.listeDisponibilites)

    def OnGestionFonctions(self, event):
        dlg = DLG_Config_fonctions.Dialog(self)
        dlg.ShowModal()
        dlg.Destroy()
        self.MAJ_fonctions()

    def OnGestionAffectations(self, event):
        dlg = DLG_Config_affectations.Dialog(self)
        dlg.ShowModal()
        dlg.Destroy()
        self.MAJ_affectations()

    def OnGestionDiffuseurs(self, event):
        dlg = DLG_Config_diffuseurs.Dialog(self)
        dlg.ShowModal()
        dlg.Destroy()
        self.MAJ_diffuseurs()

    def OnClose(self, event):
        self.GetParent().Fermer()

    def Onbouton_aide(self, event):
        dlg = wx.MessageDialog(
            self,
            _(u"L'aide du module Recrutement est en cours de rédaction.\nElle sera disponible lors d'une mise à jour ultérieure."
              ), "Aide indisponible", wx.OK | wx.ICON_INFORMATION)
        dlg.ShowModal()
        dlg.Destroy()

    def Onbouton_annuler(self, event):
        # Fermeture
        self.GetParent().Fermer()

    def Onbouton_ok(self, event):
        """ Validation des données saisies """
        # Type du dépôt
        valeur = self.ctrl_intitule.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement un intitulé pour cette offre d'emploi."
                  ), "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_intitule.SetFocus()
            return

        # Disponibilités
        if len(self.listeDisponibilites) == 0:
            dlgConfirm = wx.MessageDialog(
                self,
                _(u"Vous n'avez saisi aucune période de disponibilité. Confirmez-vous ce choix ?"
                  ), _(u"Confirmation"),
                wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
            reponse = dlgConfirm.ShowModal()
            dlgConfirm.Destroy()
            if reponse == wx.ID_NO:
                return

        # Fonctions
        if len(self.ctrl_fonction.listeIDcoches) == 0:
            dlgConfirm = wx.MessageDialog(
                self,
                _(u"Vous n'avez saisi aucune demande de fonction. Confirmez-vous ce choix ?"
                  ), _(u"Confirmation"),
                wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
            reponse = dlgConfirm.ShowModal()
            dlgConfirm.Destroy()
            if reponse == wx.ID_NO:
                return

        # Affectations
        if len(self.ctrl_affectations.listeIDcoches) == 0:
            dlgConfirm = wx.MessageDialog(
                self,
                _(u"Vous n'avez saisi aucune demande d'affectation. Confirmez-vous ce choix ?"
                  ), _(u"Confirmation"),
                wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
            reponse = dlgConfirm.ShowModal()
            dlgConfirm.Destroy()
            if reponse == wx.ID_NO:
                return

        # Sauvegarde des données
        self.Sauvegarde()

        # Fermeture
        self.GetParent().Fermer()

    def Sauvegarde(self):
        # Sauvegarde des données

        # Généralités
        date_debut = str(self.GetDatePickerValue(self.ctrl_date_debut))
        date_fin = str(self.GetDatePickerValue(self.ctrl_date_fin))
        intitule = self.ctrl_intitule.GetValue()
        detail = self.ctrl_detail.GetValue()
        reference_anpe = self.ctrl_reference.GetValue()

        # Disponibilités
        listeDisponibilites = self.listeDisponibilites
        remarques_periodes = self.ctrl_periodes_remarques.GetValue()

        # Poste
        listeFonctions = self.ctrl_fonction.listeIDcoches
        listeAffectations = self.ctrl_affectations.listeIDcoches
        remarques_poste = self.ctrl_poste_remarques.GetValue()

        # Diffuseurs
        listeDiffuseurs = self.ctrl_diffuseurs.listeIDcoches

        DB = GestionDB.DB()

        # Sauvegarde de la candidature
        listeDonnees = [
            ("IDemploi", self.IDemploi),
            ("date_debut", date_debut),
            ("date_fin", date_fin),
            ("intitule", intitule),
            ("detail", detail),
            ("reference_anpe", reference_anpe),
            ("periodes_remarques", remarques_periodes),
            ("poste_remarques", remarques_poste),
        ]
        if self.IDemploi == None:
            newID = DB.ReqInsert("emplois", listeDonnees)
            self.IDemploi = newID
            nouvelEmploi = True
        else:
            DB.ReqMAJ("emplois", listeDonnees, "IDemploi", self.IDemploi)
            nouvelEmploi = False
        DB.Commit()

        # Sauvegarde des disponibilités
        listeID = []
        for IDdisponibilite, date_debut, date_fin in listeDisponibilites:
            listeDonnees = [
                ("IDemploi", self.IDemploi),
                ("date_debut", date_debut),
                ("date_fin", date_fin),
            ]
            if IDdisponibilite == None:
                newID = DB.ReqInsert("emplois_dispo", listeDonnees)
                IDdisponibilite = newID
            else:
                DB.ReqMAJ("emplois_dispo", listeDonnees, "IDdisponibilite",
                          IDdisponibilite)
            DB.Commit()
            listeID.append(IDdisponibilite)

        # Effacement des disponibilités supprimées
        if nouvelEmploi == False:
            req = """SELECT IDdisponibilite, date_debut, date_fin
            FROM emplois_dispo WHERE IDemploi=%d; """ % self.IDemploi
            DB.ExecuterReq(req)
            listeDonnees = DB.ResultatReq()
            for IDdisponibilite, date_debut, date_fin in listeDonnees:
                if IDdisponibilite not in listeID:
                    DB.ReqDEL("emplois_dispo", "IDdisponibilite",
                              IDdisponibilite)

        # Sauvegarde des fonctions
        listeIDexistantes = []
        listeIDemploi_fonction = []
        req = """SELECT IDemploi_fonction, IDfonction
        FROM emplois_fonctions WHERE IDemploi=%d; """ % self.IDemploi
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        for IDemploi_fonction, IDfonction in listeDonnees:
            listeIDexistantes.append(IDfonction)
            listeIDemploi_fonction.append((IDemploi_fonction, IDfonction))

        for IDfonction in listeFonctions:
            if IDfonction not in listeIDexistantes:
                # Si n'existe pas :
                listeDonnees = [
                    ("IDemploi", self.IDemploi),
                    ("IDfonction", IDfonction),
                ]
                newID = DB.ReqInsert("emplois_fonctions", listeDonnees)
                DB.Commit()

        # Effacement des fonctions supprimées
        if nouvelEmploi == False:
            for IDemploi_fonction, IDfonction in listeIDemploi_fonction:
                if IDfonction not in listeFonctions:
                    DB.ReqDEL("emplois_fonctions", "IDemploi_fonction",
                              IDemploi_fonction)

        # Sauvegarde des affectations
        listeIDexistantes = []
        listeIDemploi_affectation = []
        req = """SELECT IDemploi_affectation, IDaffectation
        FROM emplois_affectations WHERE IDemploi=%d; """ % self.IDemploi
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        for IDemploi_affectation, IDaffectation in listeDonnees:
            listeIDexistantes.append(IDaffectation)
            listeIDemploi_affectation.append(
                (IDemploi_affectation, IDaffectation))

        for IDaffectation in listeAffectations:
            if IDaffectation not in listeIDexistantes:
                # Si n'existe pas :
                listeDonnees = [
                    ("IDemploi", self.IDemploi),
                    ("IDaffectation", IDaffectation),
                ]
                newID = DB.ReqInsert("emplois_affectations", listeDonnees)
                DB.Commit()

        # Effacement des affectations supprimées
        if nouvelEmploi == False:
            for IDemploi_affectation, IDaffectation in listeIDemploi_affectation:
                if IDaffectation not in listeAffectations:
                    DB.ReqDEL("emplois_affectations", "IDemploi_affectation",
                              IDemploi_affectation)

        # Sauvegarde des diffuseurs
        listeIDexistantes = []
        listeIDemploi_diffuseur = []
        req = """SELECT IDemploi_diffuseur, IDdiffuseur
        FROM emplois_diffuseurs WHERE IDemploi=%d; """ % self.IDemploi
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        for IDemploi_diffuseur, IDdiffuseur in listeDonnees:
            listeIDexistantes.append(IDdiffuseur)
            listeIDemploi_diffuseur.append((IDemploi_diffuseur, IDdiffuseur))

        for IDdiffuseur in listeDiffuseurs:
            if IDdiffuseur not in listeIDexistantes:
                # Si n'existe pas :
                listeDonnees = [
                    ("IDemploi", self.IDemploi),
                    ("IDdiffuseur", IDdiffuseur),
                ]
                newID = DB.ReqInsert("emplois_diffuseurs", listeDonnees)
                DB.Commit()

        # Effacement des diffuseur supprimés
        if nouvelEmploi == False:
            for IDemploi_diffuseur, IDdiffuseur in listeIDemploi_diffuseur:
                if IDdiffuseur not in listeDiffuseurs:
                    DB.ReqDEL("emplois_diffuseurs", "IDemploi_diffuseur",
                              IDemploi_diffuseur)

        # Fin de la sauvegarde
        DB.Close()
    def __init__(self, parent, IDemploi=None):
        wx.Panel.__init__(self,
                          parent,
                          id=-1,
                          name="panel_emploi",
                          style=wx.TAB_TRAVERSAL)
        self.IDemploi = IDemploi
        self.listeDisponibilites = []

        # Général
        self.sizer_generalites_staticbox = wx.StaticBox(
            self, -1, _(u"1. Généralités"))
        self.label_introduction = wx.StaticText(
            self, -1,
            _(u"Vous pouvez ici saisir les informations concernant l'offre d'emploi."
              ))
        self.label_date_debut = wx.StaticText(self, -1, _(u"Lancement :"))
        self.ctrl_date_debut = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.label_date_fin = wx.StaticText(self, -1, _(u"Clôture :"))
        self.ctrl_date_fin = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.label_intitule = wx.StaticText(self, -1, _(u"Intitulé :"))
        self.ctrl_intitule = wx.TextCtrl(self, -1, "")
        self.label_detail = wx.StaticText(self, -1, _(u"Détail :"))
        self.ctrl_detail = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)
        self.ctrl_detail.SetMinSize((-1, 100))
        self.label_reference = wx.StaticText(self, -1, _(u"N° ANPE :"))
        self.ctrl_reference = wx.TextCtrl(self, -1, "")

        # Disponibilités
        self.sizer_disponibilites_staticbox = wx.StaticBox(
            self, -1, _(u"2. Disponibilités"))
        self.label_periodes = wx.StaticText(self, -1, _(u"Périodes :"))
        self.ctrl_periodes = ListBoxDisponibilites(self)
        self.ctrl_periodes.SetMinSize((20, 20))
        self.bouton_ajouter_periode = wx.BitmapButton(
            self, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Ajouter.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_modifier_periode = wx.BitmapButton(
            self, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Modifier.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_supprimer_periode = wx.BitmapButton(
            self, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Supprimer.png"),
                      wx.BITMAP_TYPE_ANY))
        self.label_periodes_remarques = wx.StaticText(self, -1,
                                                      _(u"Remarques :"))
        self.ctrl_periodes_remarques = wx.TextCtrl(self, -1, u"")

        # Poste
        self.sizer_poste_staticbox = wx.StaticBox(self, -1, _(u"3. Poste"))
        self.label_fonction = wx.StaticText(self, -1, _(u"Fonction :"))
        self.ctrl_fonction = CheckListBox(self)
        self.ctrl_fonction.SetMinSize((20, 20))
        self.ctrl_fonction.Remplissage(self.Importation_fonctions())
        self.bouton_fonctions = wx.Button(self, -1, "...", size=(20, 20))
        self.label_affectation = wx.StaticText(self, -1, _(u"Affectation :"))
        self.ctrl_affectations = CheckListBox(self)
        self.ctrl_affectations.SetMinSize((20, 20))
        self.ctrl_affectations.Remplissage(self.Importation_affectations())
        self.bouton_affectations = wx.Button(self, -1, "...", size=(20, 20))
        self.label_poste_remarques = wx.StaticText(self, -1, _(u"Remarques :"))
        self.ctrl_poste_remarques = wx.TextCtrl(self, -1, "")

        # Diffuseurs
        self.sizer_diffusion_staticbox = wx.StaticBox(
            self, -1, _(u"4. Diffusion de l'offre"))
        self.label_diffuseurs = wx.StaticText(self, -1, _(u"  Diffuseurs :"))
        self.ctrl_diffuseurs = CheckListBox(self)
        self.ctrl_diffuseurs.SetMinSize((20, 20))
        self.ctrl_diffuseurs.Remplissage(self.Importation_diffuseurs())
        self.bouton_diffuseurs = wx.Button(self, -1, "...", size=(20, 20))

        # Commandes
        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))
        self.bouton_aide.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide")))
        self.bouton_ok.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour valider")))
        self.bouton_annuler.SetToolTip(
            wx.ToolTip(_(u"Cliquez pour annuler et fermer")))

        self.__set_properties()
        self.__do_layout()

        # Binds
        self.Bind(wx.EVT_BUTTON, self.Onbouton_aide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.Onbouton_ok, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.Onbouton_annuler, self.bouton_annuler)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        self.Bind(wx.EVT_BUTTON, self.OnAjouterPeriode,
                  self.bouton_ajouter_periode)
        self.Bind(wx.EVT_BUTTON, self.OnModifierPeriode,
                  self.bouton_modifier_periode)
        self.Bind(wx.EVT_BUTTON, self.OnSupprimerPeriode,
                  self.bouton_supprimer_periode)
        self.Bind(wx.EVT_BUTTON, self.OnGestionFonctions,
                  self.bouton_fonctions)
        self.Bind(wx.EVT_BUTTON, self.OnGestionAffectations,
                  self.bouton_affectations)
        self.Bind(wx.EVT_BUTTON, self.OnGestionDiffuseurs,
                  self.bouton_diffuseurs)
        self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)

        # Importation des données
        if self.IDemploi != None:
            self.Importation()
Beispiel #16
0
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)

        self.dictTypes = {}

        self.sizer_dates_staticbox = wx.StaticBox(self, -1, "Dates du contrat")
        self.sizer_caract_staticbox = wx.StaticBox(
            self, -1, _(u"Caractéristiques générales"))
        self.sizer_essai_staticbox = wx.StaticBox(self, -1,
                                                  _(u"Période d'essai"))
        self.label_titre = wx.StaticText(
            self, -1, _(u"2. Caractéristiques générales du contrat"))
        self.label_intro = wx.StaticText(
            self, -1,
            _(u"Saisissez les caractéristiques générales du contrat :"))

        self.label_type = wx.StaticText(self, -1, "Type de contrat :")
        self.choice_type = wx.Choice(self, -1, choices=[])
        self.Importation_Type()
        self.bouton_type = wx.Button(self, -1, "...", style=wx.BU_EXACTFIT)

        self.label_class = wx.StaticText(self, -1, "Classification :")
        self.choice_class = wx.Choice(self, -1, choices=[])
        self.Importation_classifications()
        self.bouton_class = wx.Button(self, -1, "...", style=wx.BU_EXACTFIT)

        self.label_valpoint = wx.StaticText(self, -1, "Valeur du point :")
        self.choice_valpoint = wx.Choice(self, -1, choices=[])
        self.Importation_valPoint()
        self.bouton_valpoint = wx.Button(self, -1, "...", style=wx.BU_EXACTFIT)

        self.label_date_debut = wx.StaticText(self, -1, "       A partir du :")
        self.datepicker_date_debut = DatePickerCtrl(self,
                                                    -1,
                                                    style=DP_DROPDOWN)
        self.label_date_fin = wx.StaticText(self, -1, "Jusqu'au :")
        self.datepicker_date_fin = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.datepicker_date_debut.Enable(False)
        self.datepicker_date_fin.Enable(False)

        self.check_rupture = wx.CheckBox(
            self, -1, _(u" Rupture anticipée du contrat au :"))
        self.datepicker_rupture = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.datepicker_rupture.Enable(False)

        self.label_essai = wx.StaticText(self, -1, _(u"    Nbre de jours :"))
        self.periode_essai = wx.SpinCtrl(self, -1, "", size=(60, -1))
        self.periode_essai.SetRange(0, 99)
        self.periode_essai.SetValue(0)
        self.aide_essai = wx.StaticText(
            self, -1, _(u"  (1 jour par semaine travaillée)"))
        self.aide_essai.SetForegroundColour('Grey')

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonClassifications,
                  self.bouton_class)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonValPoint, self.bouton_valpoint)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonType, self.bouton_type)
        self.Bind(wx.EVT_CHOICE, self.OnChoiceType, self.choice_type)
        self.Bind(wx.EVT_CHECKBOX, self.OnCheckRupture, self.check_rupture)

        self.Affichage_dateFin()
        # Importation des données
        if self.GetGrandParent().dictContrats["IDcontrat"] != 0:
            self.Importation()
Beispiel #17
0
class Page(wx.Panel):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)

        self.dictTypes = {}

        self.sizer_dates_staticbox = wx.StaticBox(self, -1, "Dates du contrat")
        self.sizer_caract_staticbox = wx.StaticBox(
            self, -1, _(u"Caractéristiques générales"))
        self.sizer_essai_staticbox = wx.StaticBox(self, -1,
                                                  _(u"Période d'essai"))
        self.label_titre = wx.StaticText(
            self, -1, _(u"2. Caractéristiques générales du contrat"))
        self.label_intro = wx.StaticText(
            self, -1,
            _(u"Saisissez les caractéristiques générales du contrat :"))

        self.label_type = wx.StaticText(self, -1, "Type de contrat :")
        self.choice_type = wx.Choice(self, -1, choices=[])
        self.Importation_Type()
        self.bouton_type = wx.Button(self, -1, "...", style=wx.BU_EXACTFIT)

        self.label_class = wx.StaticText(self, -1, "Classification :")
        self.choice_class = wx.Choice(self, -1, choices=[])
        self.Importation_classifications()
        self.bouton_class = wx.Button(self, -1, "...", style=wx.BU_EXACTFIT)

        self.label_valpoint = wx.StaticText(self, -1, "Valeur du point :")
        self.choice_valpoint = wx.Choice(self, -1, choices=[])
        self.Importation_valPoint()
        self.bouton_valpoint = wx.Button(self, -1, "...", style=wx.BU_EXACTFIT)

        self.label_date_debut = wx.StaticText(self, -1, "       A partir du :")
        self.datepicker_date_debut = DatePickerCtrl(self,
                                                    -1,
                                                    style=DP_DROPDOWN)
        self.label_date_fin = wx.StaticText(self, -1, "Jusqu'au :")
        self.datepicker_date_fin = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.datepicker_date_debut.Enable(False)
        self.datepicker_date_fin.Enable(False)

        self.check_rupture = wx.CheckBox(
            self, -1, _(u" Rupture anticipée du contrat au :"))
        self.datepicker_rupture = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.datepicker_rupture.Enable(False)

        self.label_essai = wx.StaticText(self, -1, _(u"    Nbre de jours :"))
        self.periode_essai = wx.SpinCtrl(self, -1, "", size=(60, -1))
        self.periode_essai.SetRange(0, 99)
        self.periode_essai.SetValue(0)
        self.aide_essai = wx.StaticText(
            self, -1, _(u"  (1 jour par semaine travaillée)"))
        self.aide_essai.SetForegroundColour('Grey')

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonClassifications,
                  self.bouton_class)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonValPoint, self.bouton_valpoint)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonType, self.bouton_type)
        self.Bind(wx.EVT_CHOICE, self.OnChoiceType, self.choice_type)
        self.Bind(wx.EVT_CHECKBOX, self.OnCheckRupture, self.check_rupture)

        self.Affichage_dateFin()
        # Importation des données
        if self.GetGrandParent().dictContrats["IDcontrat"] != 0:
            self.Importation()

    def __set_properties(self):
        self.label_titre.SetFont(
            wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
        self.bouton_type.SetMinSize((20, 20))
        self.bouton_type.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour ajouter, modifier ou supprimer des types de contrat"
                  )))
        self.bouton_class.SetMinSize((20, 20))
        self.bouton_class.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour ajouter, modifier ou supprimer des classifications"
                  )))
        self.bouton_valpoint.SetMinSize((20, 20))
        self.bouton_valpoint.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour ajouter, modifier ou supprimer des valeurs de points"
                  )))
        self.check_rupture.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour saisir une date de fin de contrat si l'employeur ou le salarié ont mis fin prématurément au contrat."
                  )))

    def __do_layout(self):
        grid_sizer_base = wx.FlexGridSizer(rows=5, cols=1, vgap=10, hgap=10)
        sizer_dates = wx.StaticBoxSizer(self.sizer_dates_staticbox,
                                        wx.VERTICAL)
        grid_sizer_dates = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10)
        grid_sizer_rupture = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5)

        sizer_caract = wx.StaticBoxSizer(self.sizer_caract_staticbox,
                                         wx.VERTICAL)
        grid_sizer_caract = wx.FlexGridSizer(rows=3, cols=3, vgap=5, hgap=5)
        grid_sizer_base.Add(self.label_titre, 0, 0, 0)
        grid_sizer_base.Add(self.label_intro, 0, wx.LEFT, 20)
        grid_sizer_caract.Add(self.label_type, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_caract.Add(self.choice_type, 0, wx.EXPAND, 0)
        grid_sizer_caract.Add(self.bouton_type, 0, 0, 0)
        grid_sizer_caract.Add(self.label_class, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_caract.Add(self.choice_class, 0, wx.EXPAND, 0)
        grid_sizer_caract.Add(self.bouton_class, 0, 0, 0)
        grid_sizer_caract.Add(self.label_valpoint, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_caract.Add(self.choice_valpoint, 0, wx.EXPAND, 0)
        grid_sizer_caract.Add(self.bouton_valpoint, 0, 0, 0)
        grid_sizer_caract.AddGrowableCol(1)
        sizer_caract.Add(grid_sizer_caract, 1, wx.ALL | wx.EXPAND, 5)
        grid_sizer_base.Add(sizer_caract, 1, wx.LEFT | wx.EXPAND, 20)

        grid_sizer_dates.Add(self.label_date_debut, 0,
                             wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_dates.Add(self.datepicker_date_debut, 0, 0, 0)
        grid_sizer_dates.Add(self.label_date_fin, 0, wx.ALIGN_CENTER_VERTICAL,
                             0)
        grid_sizer_dates.Add(self.datepicker_date_fin, 0, 0, 0)
        sizer_dates.Add(grid_sizer_dates, 1, wx.ALL | wx.EXPAND, 5)

        grid_sizer_rupture.Add((90, 10), 1, wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_rupture.Add(self.check_rupture, 0, wx.ALIGN_CENTER_VERTICAL,
                               0)
        grid_sizer_rupture.Add(self.datepicker_rupture, 0,
                               wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_dates.Add(grid_sizer_rupture, 1, wx.EXPAND, 0)

        grid_sizer_base.Add(sizer_dates, 1, wx.LEFT | wx.EXPAND, 20)

        sizer_essai = wx.StaticBoxSizer(self.sizer_essai_staticbox,
                                        wx.VERTICAL)
        grid_sizer_essai = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5)
        grid_sizer_essai.Add(self.label_essai, 0,
                             wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_essai.Add(self.periode_essai, 0, wx.ALIGN_CENTER_VERTICAL,
                             0)
        grid_sizer_essai.Add(self.aide_essai, 0, wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_essai.Add(grid_sizer_essai, 1, wx.ALL | wx.EXPAND, 5)
        grid_sizer_base.Add(sizer_essai, 1, wx.LEFT | wx.EXPAND, 20)

        self.SetSizer(grid_sizer_base)
        grid_sizer_base.Fit(self)
        grid_sizer_base.AddGrowableCol(0)

    def Importation(self):
        """ Remplit les controles avec les données importées si c'est une modification """
        dictContrats = self.GetGrandParent().dictContrats

        # Controles Choice
        type = dictContrats["IDtype"]
        self.SelectChoice(self.choice_type, data=type)
        classification = dictContrats["IDclassification"]
        self.SelectChoice(self.choice_class, data=classification)
        valeur_point = dictContrats["valeur_point"]
        self.SelectChoice(self.choice_valpoint, data=valeur_point)

        # Radio et Date de Rupture
        if dictContrats["date_rupture"] != "":
            self.check_rupture.SetValue(True)
            self.datepicker_rupture.Enable(True)
            self.SetDatePicker(self.datepicker_rupture,
                               dictContrats["date_rupture"])
        else:
            self.check_rupture.SetValue(False)
            self.datepicker_rupture.Enable(False)

        # Dates de début et de fin
        date_debut = dictContrats["date_debut"]
        date_fin = dictContrats["date_fin"]
        if date_debut != "":
            self.SetDatePicker(self.datepicker_date_debut,
                               dictContrats["date_debut"])
        if date_fin != "" and date_fin != "2999-01-01":
            self.SetDatePicker(self.datepicker_date_fin,
                               dictContrats["date_fin"])
        self.datepicker_date_debut.Enable(True)
        self.datepicker_date_fin.Enable(True)

        if self.dictTypes[type] == "non":
            self.label_date_fin.Show(True)
            self.datepicker_date_fin.Show(True)
        else:
            self.label_date_fin.Show(False)
            self.datepicker_date_fin.Show(False)

        # Période d'essai
        essai = dictContrats["essai"]
        self.periode_essai.SetValue(essai)

    def CalcEssai(self):
        """ Calcule la durée de la période d'essai en fonction des dates du contrat """
        essai = 0

        # Si CDI
        if self.dictTypes[self.choice_type.GetClientData(
                self.choice_type.GetSelection())] == "oui":
            self.periode_essai.SetValue(30)
            return

        # Si CDD

        # Calcul de la durée du contrat
        date_tmp = self.datepicker_date_debut.GetValue()
        date_debut = datetime.date(date_tmp.GetYear(),
                                   date_tmp.GetMonth() + 1, date_tmp.GetDay())
        date_tmp = self.datepicker_date_fin.GetValue()
        date_fin = datetime.date(date_tmp.GetYear(),
                                 date_tmp.GetMonth() + 1, date_tmp.GetDay())

        if date_debut > date_fin:
            self.periode_essai.SetValue(0)
            return

        nbreJours = (date_fin - date_debut).days
        nbreSemaines = nbreJours // 7

        print(nbreJours, nbreSemaines)

        self.periode_essai.SetValue(essai)

    def SetDatePicker(self, controle, date):
        """ Met une date dans un datePicker donné """
        annee = int(date[:4])
        mois = int(date[5:7]) - 1
        jour = int(date[8:10])
        date = wx.DateTime()
        date.Set(jour, mois, annee)
        controle.SetValue(date)

    def OnCheckRupture(self, event):
        if self.check_rupture.GetValue() == True:
            self.datepicker_rupture.Enable(True)
        else:
            self.datepicker_rupture.Enable(False)

    def OnChoiceType(self, event):
        self.datepicker_date_debut.Enable(True)
        self.datepicker_date_fin.Enable(True)
        self.Affichage_dateFin()
        self.CalcEssai()

    def Affichage_dateFin(self):
        """ Faire apparaitre ou disparaitre le controle DateFin en fonction du type de contrat choisi """
        selection = self.choice_type.GetSelection()
        if selection != -1:
            IDselection = self.choice_type.GetClientData(selection)
        else:
            return
        if self.dictTypes[IDselection] == "non":
            self.label_date_fin.Show(True)
            self.datepicker_date_fin.Show(True)
        else:
            self.label_date_fin.Show(False)
            self.datepicker_date_fin.Show(False)

    def OnBoutonClassifications(self, event):
        dlg = DLG_Config_classifications.Dialog(self)
        dlg.ShowModal()
        dlg.Destroy()
        self.MAJ_choice_Class()

    def OnBoutonValPoint(self, event):
        dlg = DLG_Config_val_point.Dialog(self)
        dlg.ShowModal()
        dlg.Destroy()
        self.MAJ_choice_ValPoint()

    def OnBoutonType(self, event):
        dlg = DLG_Config_types_contrats.Dialog(self)
        dlg.ShowModal()
        dlg.Destroy()
        self.MAJ_choice_Type()

    def MAJ_choice_Class(self):
        self.Importation_classifications()

    def Importation_classifications(self):
        controle = self.choice_class
        selection = controle.GetSelection()
        IDselection = None
        if selection != -1: IDselection = controle.GetClientData(selection)
        # Récupération des données
        DB = GestionDB.DB()
        req = """SELECT * FROM contrats_class """
        DB.ExecuterReq(req)
        liste = DB.ResultatReq()
        DB.Close()
        # Placement de la liste dans le Choice
        controle.Clear()
        x = 0
        for key, valeur in liste:
            controle.Append(valeur, key)
            if IDselection == key: controle.SetSelection(x)
            x += 1

    def MAJ_choice_ValPoint(self):
        self.Importation_valPoint()

    def Importation_valPoint(self):
        controle = self.choice_valpoint
        selection = controle.GetSelection()
        IDselection = None
        if selection != -1: IDselection = controle.GetClientData(selection)
        # Récupération des données
        DB = GestionDB.DB()
        req = """SELECT * FROM valeurs_point ORDER BY date_debut """
        DB.ExecuterReq(req)
        liste = DB.ResultatReq()
        DB.Close()

        # Recherche de la valeur actuelle
        dateJour = str(datetime.date.today())
        valeurActuelle = None
        for ID, valeur, dateDebut in liste:
            if dateJour >= dateDebut:
                valeurActuelle = ID

        # Placement de la liste dans le Choice
        controle.Clear()
        x = 0
        for ID, valeur, dateDebut in liste:
            txt = str(valeur) + _(u" ¤  (à partir du "
                                  ) + FonctionsPerso.DateEngFr(dateDebut) + ")"
            controle.Append(txt, ID)
            # Sélection de l'ancienne valeur sélectionnée
            if IDselection == ID: controle.SetSelection(x)
            # Sélection de la valeur actuelle si rien n'a été sélectionnée
            if IDselection == None and valeurActuelle == ID:
                controle.SetSelection(x)
            x += 1

        self.listeValPoint = liste

    def MAJ_choice_Type(self):
        self.Importation_Type()

    def Importation_Type(self):
        controle = self.choice_type
        selection = controle.GetSelection()
        IDselection = None
        if selection != -1: IDselection = controle.GetClientData(selection)
        # Récupération des données
        DB = GestionDB.DB()
        req = """SELECT * FROM contrats_types """
        DB.ExecuterReq(req)
        liste = DB.ResultatReq()
        DB.Close()
        # Placement de la liste dans le Choice
        controle.Clear()
        self.dictTypes = {}
        x = 0
        for key, nom, nom_abrege, duree_indeterminee in liste:
            self.dictTypes[key] = duree_indeterminee
            controle.Append(nom, key)
            if IDselection == key: controle.SetSelection(x)
            x += 1

        if selection != -1: self.Affichage_dateFin()

    def GetDatePickerValue(self, controle):
        date_tmp = controle.GetValue()
        return str(
            datetime.date(date_tmp.GetYear(),
                          date_tmp.GetMonth() + 1, date_tmp.GetDay()))

    def GetChoiceData(self, controle):
        selection = controle.GetSelection()
        if selection != -1:
            IDselection = controle.GetClientData(selection)
        else:
            IDselection = None
        return IDselection

    def SelectChoice(self, controle, data):
        nbreItems = controle.GetCount()
        index = 0
        for item in range(nbreItems):
            if controle.GetClientData(index) == data:
                controle.SetSelection(index)
                return
            index += 1

    def Validation(self):

        # Récupération des valeurs saisies
        type = self.GetChoiceData(self.choice_type)
        classification = self.GetChoiceData(self.choice_class)
        valPoint = self.GetChoiceData(self.choice_valpoint)
        date_debut = self.GetDatePickerValue(self.datepicker_date_debut)
        date_fin = self.GetDatePickerValue(self.datepicker_date_fin)
        rupture = self.check_rupture.GetValue()
        date_rupture = self.GetDatePickerValue(self.datepicker_rupture)
        essai = self.periode_essai.GetValue()

        # Vérifie que des valeurs ont été saisies
        if type == None:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner un type de contrat dans la liste proposée."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.choice_type.SetFocus()
            return False

        if classification == None:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner une classification dans la liste proposée."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.choice_class.SetFocus()
            return False

        if valPoint == None:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner une valeur de point dans la liste proposée."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.choice_valpoint.SetFocus()
            return False

        # Vérifie que la date de fin est supérieure à la date de début de contrat
        if date_debut > date_fin and self.datepicker_date_fin.IsShown():
            dlg = wx.MessageDialog(
                self,
                _(u"La date de fin de contrat que vous avez saisie est inférieure à la date de début !"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.datepicker_date_fin.SetFocus()
            return False

        # Vérifie que la date de rupture est supérieure à la date de début de contrat
        if date_debut > date_rupture and rupture == True:
            dlg = wx.MessageDialog(
                self,
                _(u"La date de rupture de contrat que vous avez saisie est inférieure à la date de début !"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.datepicker_date_fin.SetFocus()
            return False

        # Vérifie que la date de rupture est supérieure à la date de début de contrat et inférieure à la date de fin si contrat à durée déterminée :
        if self.datepicker_date_fin.IsShown(
        ) and date_rupture >= date_fin and rupture == True:
            dlg = wx.MessageDialog(
                self,
                _(u"La date de rupture de contrat que vous avez saisie est égale ou supérieure à la date de fin de contrat !"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.datepicker_date_fin.SetFocus()
            return False

        # Vérifie que la valeur du point correspondant bien à la date de début de contrat
        valeurNecessaire = None
        for ID, valeur, dateValeur in self.listeValPoint:
            if date_debut >= dateValeur:
                valeurNecessaire = ID

        if valeurNecessaire == None:
            dlg = wx.MessageDialog(
                self,
                _(u"La valeur du point n'est pas correcte. Il n'existe pas dans la liste proposée de valeur correspondante à la date de début de contrat. \n\nVous devez donc créer une nouvelle valeur. \n\nSouhaitez-vous le faire maintenant ?"
                  ), "Erreur", wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT)
            if dlg.ShowModal() == wx.ID_NO:
                dlg.Destroy()
                return False
            else:
                dlg.Destroy()
                self.OnBoutonValPoint(None)
                return False

        if valeurNecessaire != valPoint:
            dlg = wx.MessageDialog(
                self,
                _(u"La valeur du point ne correspond pas à la date de début du contrat. Vous devez sélectionner une autre valeur de points dans la liste proposée.\n\nVoulez-vous que je le fasse à votre place ?"
                  ), "Erreur", wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT)
            if dlg.ShowModal() == wx.ID_NO:
                dlg.Destroy()
                return False
            else:
                dlg.Destroy()
                # Sélection automatique de la bonne valeur de point
                for index in range(self.choice_valpoint.GetCount()):
                    if self.choice_valpoint.GetClientData(
                            index) == valeurNecessaire:
                        self.choice_valpoint.SetSelection(index)
                        return False

        # Période d'essai
        if essai == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez saisir un nombre de jours pour période d'essai."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return False

        if essai == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous n'avez pas défini de période d'essai. \n\nSouhaitez-vous quand même continuer ? \n(Sinon cliquez 'non' ou 'annuler')"
                  ), "Erreur de saisie",
                wx.ICON_QUESTION | wx.YES_NO | wx.CANCEL | wx.NO_DEFAULT)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
            else:
                dlg.Destroy()
                return False

        # Mémorisation des données
        dictContrats = self.GetGrandParent().dictContrats
        dictContrats["IDtype"] = type
        dictContrats["IDclassification"] = classification
        dictContrats["valeur_point"] = valPoint
        dictContrats["date_debut"] = date_debut
        if self.datepicker_date_fin.IsShown():
            dictContrats["date_fin"] = date_fin
        else:
            dictContrats["date_fin"] = "2999-01-01"
        if rupture == True:
            dictContrats["date_rupture"] = date_rupture
        else:
            dictContrats["date_rupture"] = ""
        dictContrats["essai"] = essai

        return True
Beispiel #18
0
    def __init__(self, parent, title="", IDperiode=0):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
                           | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)
        self.parent = parent
        self.panel_base = wx.Panel(self, -1)

        self.sizer_periode_staticbox = wx.StaticBox(self.panel_base, -1,
                                                    _(u"Nom de la période"))
        choices = [
            _(u"Février"),
            _(u"Pâques"),
            _(u"Eté"),
            _(u"Toussaint"),
            _(u"Noël")
        ]
        self.label_nom = wx.StaticText(self.panel_base, -1, _(u"Nom :"))
        self.choice_nom = wx.Choice(self.panel_base,
                                    -1,
                                    choices=choices,
                                    size=(100, -1))
        self.label_annee = wx.StaticText(self.panel_base, -1, _(u"Année :"))
        self.text_annee = wx.TextCtrl(self.panel_base,
                                      -1,
                                      "",
                                      style=wx.TE_CENTRE,
                                      size=(50, -1))

        self.sizer_dates_staticbox = wx.StaticBox(self.panel_base, -1,
                                                  _(u"Dates de la période"))
        self.label_dateDebut = wx.StaticText(self.panel_base, -1, u"Du")
        self.datepicker_dateDebut = DatePickerCtrl(self.panel_base,
                                                   -1,
                                                   style=DP_DROPDOWN)
        self.label_dateFin = wx.StaticText(self.panel_base, -1, _(u"au"))
        self.datepicker_dateFin = DatePickerCtrl(self.panel_base,
                                                 -1,
                                                 style=DP_DROPDOWN)

        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self.panel_base,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self.panel_base,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self.panel_base,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))

        self.IDperiode = IDperiode
        if IDperiode != 0:
            self.Importation()

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
Beispiel #19
0
 def create_widget(self):
     # TODO add all the other parameters for the DatePickerCtrl initial date
     self.widget = DatePickerCtrl(self.parent_window.widget,
                                  wx.ID_ANY,
                                  style=self.style)
class Dialog(wx.Dialog):
    def __init__(self,
                 parent,
                 IDentretien=None,
                 IDcandidat=None,
                 IDpersonne=None):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
                           | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)
        self.IDentretien = IDentretien
        self.IDcandidat = IDcandidat
        self.IDpersonne = IDpersonne

        self.panel = wx.Panel(self, -1)
        self.sizer_contenu_staticbox = wx.StaticBox(self.panel, -1, "")
        self.label_date = wx.StaticText(self.panel, -1, _(u"Date :"))
        self.ctrl_date = DatePickerCtrl(self.panel, -1, style=DP_DROPDOWN)
        self.label_heure = wx.StaticText(self.panel, -1, _(u"Heure :"))
        self.ctrl_heure = masked.TextCtrl(self.panel,
                                          -1,
                                          "",
                                          size=(60, -1),
                                          style=wx.TE_CENTRE,
                                          mask="##:##",
                                          validRegex="[0-2][0-9]:[0-5][0-9]")
        self.ctrl_heure.SetCtrlParameters(invalidBackgroundColour="PINK")
        self.label_avis = wx.StaticText(self.panel, -1, _(u"Avis :"))
        listeImages = [
            (_(u"Avis inconnu"), "Smiley_question.png"),
            (_(u"Pas convaincant"), "Smiley_nul.png"),
            (_(u"Mitigé"), "Smiley_bof.png"),
            (_(u"Bien"), "Smiley_bien.png"),
            (_(u"Très bien"), "Smiley_genial.png"),
        ]
        self.ctrl_avis = MyBitmapComboBox(self.panel, listeImages=listeImages)
        self.label_remarques = wx.StaticText(self.panel, -1,
                                             _(u"Commentaire :"))
        self.ctrl_remarques = wx.TextCtrl(self.panel,
                                          -1,
                                          "",
                                          style=wx.TE_MULTILINE)

        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self.panel,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self.panel,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self.panel,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))

        if self.IDentretien != None:
            self.Importation()

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
        self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)

    def __set_properties(self):
        nom_complet = self.GetNomCandidat(self.IDcandidat, self.IDpersonne)
        if self.IDentretien == None:
            type = _(u"Saisie")
        else:
            type = _(u"Modification")
        if nom_complet == " None":
            self.SetTitle(_(u"%s d'un entretien") % type)
        else:
            self.SetTitle(
                _(u"%s d'un entretien pour %s") % (type, nom_complet))
        if 'phoenix' in wx.PlatformInfo:
            _icon = wx.Icon()
        else:
            _icon = wx.EmptyIcon()
        _icon.CopyFromBitmap(
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Logo.png"),
                      wx.BITMAP_TYPE_ANY))
        self.SetIcon(_icon)
        self.ctrl_date.SetToolTip(
            wx.ToolTip(_(u"Saisissez la date de l'entretien")))
        self.ctrl_heure.SetToolTip(
            wx.ToolTip(_(u"Saisissez l'heure de l'entretien")))
        self.ctrl_avis.SetToolTip(
            wx.ToolTip(_(u"Sélectionnez une appréciation de l'entretien")))
        self.ctrl_remarques.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez l'avis complet émis après l'entretien")))
        self.bouton_aide.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide")))
        self.bouton_ok.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour valider la saisie des données")))
        self.bouton_annuler.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour annuler")))
        self.SetMinSize((450, 330))

    def __do_layout(self):
        sizer_base = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_base = wx.FlexGridSizer(rows=2, cols=1, vgap=0, hgap=0)
        grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10)
        sizer_contenu = wx.StaticBoxSizer(self.sizer_contenu_staticbox,
                                          wx.VERTICAL)
        grid_sizer_contenu = wx.FlexGridSizer(rows=3, cols=2, vgap=10, hgap=10)
        grid_sizer_date = wx.FlexGridSizer(rows=1, cols=4, vgap=5, hgap=5)
        grid_sizer_contenu.Add(self.label_date, 0,
                               wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_date.Add(self.ctrl_date, 0, 0, 0)
        grid_sizer_date.Add((20, 20), 0, 0, 0)
        grid_sizer_date.Add(self.label_heure, 0,
                            wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_date.Add(self.ctrl_heure, 0, 0, 0)
        grid_sizer_contenu.Add(grid_sizer_date, 1, wx.EXPAND, 0)
        grid_sizer_contenu.Add(self.label_avis, 0,
                               wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_contenu.Add(self.ctrl_avis, 0, wx.EXPAND, 0)
        grid_sizer_contenu.Add(self.label_remarques, 0, wx.ALIGN_RIGHT, 0)
        grid_sizer_contenu.Add(self.ctrl_remarques, 0, wx.EXPAND, 0)
        grid_sizer_contenu.AddGrowableRow(2)
        grid_sizer_contenu.AddGrowableCol(1)
        sizer_contenu.Add(grid_sizer_contenu, 1, wx.ALL | wx.EXPAND, 10)
        grid_sizer_base.Add(sizer_contenu, 1, wx.ALL | wx.EXPAND, 10)
        grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0)
        grid_sizer_boutons.Add((20, 20), 0, wx.EXPAND, 0)
        grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0)
        grid_sizer_boutons.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_boutons, 1,
                            wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, 10)
        self.panel.SetSizer(grid_sizer_base)
        grid_sizer_base.AddGrowableRow(0)
        grid_sizer_base.AddGrowableCol(0)
        sizer_base.Add(self.panel, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_base)
        sizer_base.Fit(self)
        self.Layout()
        self.CenterOnScreen()

    def OnContextMenu(self, event):
        pass

    def SetDatePicker(self, controle, date):
        """ Met une date au format datetime dans un datePicker donné """
        annee = int(date.year)
        mois = int(date.month) - 1
        jour = int(date.day)
        date = wx.DateTime()
        date.Set(jour, mois, annee)
        controle.SetValue(date)

    def GetDatePickerValue(self, controle):
        """ Renvoie la date au format datetime d'un datePicker """
        date_tmp = controle.GetValue()
        return datetime.date(date_tmp.GetYear(),
                             date_tmp.GetMonth() + 1, date_tmp.GetDay())

    def Importation(self):
        DB = GestionDB.DB()
        req = "SELECT IDentretien, IDcandidat, IDpersonne, date, heure, avis, remarques FROM entretiens WHERE IDentretien=%d" % self.IDentretien
        DB.ExecuterReq(req)
        donnees = DB.ResultatReq()[0]
        DB.Close()
        if len(donnees) == 0: return
        # Récupération des données
        IDentretien, IDcandidat, IDpersonne, date, heure, avis, remarques = donnees
        # Date
        self.SetDatePicker(
            self.ctrl_date,
            datetime.date(year=int(date[:4]),
                          month=int(date[5:7]),
                          day=int(date[8:10])))
        # Heure
        self.ctrl_heure.SetValue(heure)
        # Avis
        self.ctrl_avis.SetSelection(avis)
        # Remarques
        self.ctrl_remarques.SetValue(remarques)

    def Sauvegarde(self):
        """ Sauvegarde des données dans la base de données """

        # Récupération ds valeurs saisies
        date = self.GetDatePickerValue(self.ctrl_date)
        heure = self.ctrl_heure.GetValue()
        avis = self.ctrl_avis.GetSelection()
        remarques = self.ctrl_remarques.GetValue()

        DB = GestionDB.DB()
        # Création de la liste des données
        listeDonnees = [
            ("IDcandidat", self.IDcandidat),
            ("IDpersonne", self.IDpersonne),
            ("date", date),
            ("heure", heure),
            ("avis", avis),
            ("remarques", remarques),
        ]
        if self.IDentretien == None:
            # Enregistrement d'une nouvelle valeur
            newID = DB.ReqInsert("entretiens", listeDonnees)
            ID = newID
        else:
            # Modification de la valeur
            DB.ReqMAJ("entretiens", listeDonnees, "IDentretien",
                      self.IDentretien)
            ID = self.IDentretien
        DB.Commit()
        DB.Close()
        return ID

    def OnBoutonAide(self, event):
        from Utils import UTILS_Aide
        UTILS_Aide.Aide("")

    def OnBoutonAnnuler(self, event):
        self.EndModal(wx.ID_CANCEL)

    def OnBoutonOk(self, event):
        """ Validation des données saisies """

        heure = self.ctrl_heure.GetValue()
        if heure == "" or heure == "  :  ":
            dlg = wx.MessageDialog(
                self, _(u"Vous devez obligatoirement saisir une heure"),
                "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_heure.SetFocus()
            return

        # Sauvegarde
        self.Sauvegarde()

        # MAJ parents
        parent = self.GetParent()
        if parent.GetName() == "OL_entretiens" or parent.GetName(
        ) == "OL_gadget_entretiens":
            parent.MAJ()

        if parent.GetName() == "OL_gadget_entretiens":
            parent.GetGrandParent().GetGrandParent().MAJpanel()

        try:
            if parent.GetGrandParent().GetParent().GetName() == "Recrutement":
                parent.GetGrandParent().GetParent().gadget_entretiens.MAJ()
                parent.GetGrandParent().GetParent().gadget_informations.MAJ()
        except:
            pass

        try:
            if self.GetGrandParent().GetParent().GetName() == "panel_resume":
                panelRecrutement = self.GetGrandParent().GetGrandParent(
                ).GetGrandParent()
                panelRecrutement.MAJpanel(MAJpanelResume=False)
                self.GetGrandParent().GetParent().MAJlabelsPages("entretiens")
        except:
            pass

        # Fermeture
        self.EndModal(wx.ID_OK)

    def GetNomCandidat(self, IDcandidat=None, IDpersonne=None):
        # Récupération des données
        DB = GestionDB.DB()
        if IDpersonne == None or IDpersonne == 0:
            req = """SELECT civilite, nom, prenom
            FROM candidats WHERE IDcandidat=%d; """ % IDcandidat
        else:
            req = """SELECT civilite, nom, prenom
            FROM personnes WHERE IDpersonne=%d; """ % IDpersonne
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        if len(listeDonnees) == 0: return ""
        civilite, nom, prenom = listeDonnees[0]
        return u"%s %s" % (nom, prenom)
class SaisieDeplacement(wx.Dialog):
    """ Saisie d'un déplacement pour les frais de déplacement """
    def __init__(self,
                 parent,
                 id=-1,
                 title=_(u"Saisie d'un déplacement"),
                 IDdeplacement=None,
                 IDpersonne=None):
        wx.Dialog.__init__(self, parent, id, title)
        self.IDdeplacement = IDdeplacement
        self.IDpersonne = IDpersonne

        # Création d'une liste des villes et codes postaux
        con = sqlite3.connect(Chemins.GetStaticPath("Databases/Villes.db3"))
        cur = con.cursor()
        cur.execute("SELECT ville, cp FROM villes")
        self.listeVillesTmp = cur.fetchall()
        con.close()

        # Création d'une liste de noms de villes
        self.listeNomsVilles = []
        self.listeVilles = []
        for nom, cp in self.listeVillesTmp:
            self.listeVilles.append((nom, "%05d" % cp))
            self.listeNomsVilles.append(nom)

        # Importation de la table des distances
        self.ImportationDistances()

        # Généralités
        self.staticbox_generalites = wx.StaticBox(self, -1,
                                                  _(u"Généralités"))

        self.label_date = wx.StaticText(self,
                                        -1,
                                        _(u"Date :"),
                                        size=(95, -1),
                                        style=wx.ALIGN_RIGHT)
        self.ctrl_date = DatePickerCtrl(self, -1, style=DP_DROPDOWN)

        self.label_utilisateur = wx.StaticText(self,
                                               -1,
                                               _(u"Utilisateur :"),
                                               size=(95, -1),
                                               style=wx.ALIGN_RIGHT)
        self.ImportationPersonnes()
        self.ctrl_utilisateur = AdvancedComboBox(self,
                                                 "",
                                                 size=(100, -1),
                                                 choices=self.listePersonnes)

        self.label_objet = wx.StaticText(self,
                                         -1,
                                         _(u"Objet :"),
                                         size=(95, -1),
                                         style=wx.ALIGN_RIGHT)
        self.ctrl_objet = wx.TextCtrl(self,
                                      -1,
                                      "",
                                      size=(-1, -1),
                                      style=wx.TE_MULTILINE)

        # Trajet
        self.staticbox_trajet = wx.StaticBox(self, -1, _(u"Trajet"))

        self.label_depart = wx.StaticText(self,
                                          -1,
                                          _(u"Ville de départ :"),
                                          size=(95, -1),
                                          style=wx.ALIGN_RIGHT)
        self.ctrl_cp_depart = TextCtrlCp(self,
                                         value="",
                                         listeVilles=self.listeVilles,
                                         size=(55, -1),
                                         style=wx.TE_CENTRE,
                                         mask="#####")
        self.ctrl_ville_depart = TextCtrlVille(
            self,
            value="",
            ctrlCp=self.ctrl_cp_depart,
            listeVilles=self.listeVilles,
            listeNomsVilles=self.listeNomsVilles)
        self.ctrl_cp_depart.ctrlVille = self.ctrl_ville_depart
        self.bouton_options_depart = wx.Button(self, -1, "...", size=(20, 20))

        self.label_arrivee = wx.StaticText(self,
                                           -1,
                                           _(u"Ville d'arrivée :"),
                                           size=(95, -1),
                                           style=wx.ALIGN_RIGHT)
        self.ctrl_cp_arrivee = TextCtrlCp(self,
                                          value="",
                                          listeVilles=self.listeVilles,
                                          size=(55, -1),
                                          style=wx.TE_CENTRE,
                                          mask="#####")
        self.ctrl_ville_arrivee = TextCtrlVille(
            self,
            value="",
            ctrlCp=self.ctrl_cp_arrivee,
            listeVilles=self.listeVilles,
            listeNomsVilles=self.listeNomsVilles)
        self.ctrl_cp_arrivee.ctrlVille = self.ctrl_ville_arrivee
        self.bouton_options_arrivee = wx.Button(self, -1, "...", size=(20, 20))

        self.label_distance = wx.StaticText(self,
                                            -1,
                                            _(u"Distance :"),
                                            size=(95, -1),
                                            style=wx.ALIGN_RIGHT)
        self.ctrl_distance = wx.TextCtrl(self, -1, "0", size=(55, -1))
        self.label_km = wx.StaticText(self, -1, _(u"Km  (Aller simple)"))

        self.label_aller_retour = wx.StaticText(self,
                                                -1,
                                                _(u"Aller/retour :"),
                                                size=(95, -1),
                                                style=wx.ALIGN_RIGHT)
        self.ctrl_aller_retour = wx.CheckBox(self, -1, u"")

        ##############################################################
        # Pour désactiver l'autocomplete du controle VILLE qui ne fonctionne pas sous Linux
        if "linux" in sys.platform:
            self.ctrl_ville_depart.Enable(False)
            self.ctrl_ville_arrivee.Enable(False)

        ##############################################################

        # Remboursement
        self.staticbox_remboursement = wx.StaticBox(self, -1,
                                                    _(u"Remboursement"))

        self.label_tarif = wx.StaticText(self,
                                         -1,
                                         _(u"Tarif du Km :"),
                                         size=(95, -1),
                                         style=wx.ALIGN_RIGHT)
        self.ctrl_tarif = wx.TextCtrl(self, -1, "0.00", size=(55, -1))
        self.label_euro_tarif = wx.StaticText(self, -1, u"¤")

        self.label_montant = wx.StaticText(self,
                                           -1,
                                           _(u"Montant du rmbst :"),
                                           size=(110, -1),
                                           style=wx.ALIGN_RIGHT)
        self.ctrl_montant = wx.StaticText(self, -1, u"0.00 ¤")
        font = wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD)
        self.ctrl_montant.SetFont(font)

        self.label_remboursement = wx.StaticText(self,
                                                 -1,
                                                 _(u"Remboursement :"),
                                                 size=(95, -1),
                                                 style=wx.ALIGN_RIGHT)
        self.ctrl_remboursement = wx.StaticText(self, -1,
                                                _(u"Aucun remboursement."))

        # Boutons
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self,
            id=wx.ID_CANCEL,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))
        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))

        # IDpersonne :
        if self.IDpersonne != None:
            self.SetPersonne(self.IDpersonne)
        # Si c'est une modification :
        if self.IDdeplacement != None:
            self.SetTitle(_(u"Modification d'un déplacement"))
            self.Importation()
        else:
            self.ImportDernierTarif()
        # Cache le controle utilisateur :
        if self.IDpersonne != None:
            self.label_utilisateur.Show(False)
            self.ctrl_utilisateur.Show(False)
            self.SetSize((-1, 430))

        self.__set_properties()
        self.__do_layout()

        # Binds
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOptionsDepart,
                  self.bouton_options_depart)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOptionsArrivee,
                  self.bouton_options_arrivee)
        self.Bind(wx.EVT_CHECKBOX, self.OnAllerRetour, self.ctrl_aller_retour)
        self.ctrl_distance.Bind(wx.EVT_KILL_FOCUS, self.distance_EvtKillFocus)
        self.ctrl_tarif.Bind(wx.EVT_KILL_FOCUS, self.tarif_EvtKillFocus)

    def __set_properties(self):
        self.bouton_ok.SetSize(self.bouton_ok.GetBestSize())
        self.bouton_annuler.SetSize(self.bouton_annuler.GetBestSize())
        self.bouton_aide.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide")))
        self.bouton_ok.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour valider")))
        self.bouton_annuler.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour annuler la saisie")))
        self.ctrl_date.SetToolTip(
            wx.ToolTip(_(u"Sélectionnez ici la date du déplacement")))
        self.ctrl_utilisateur.SetToolTip(
            wx.ToolTip(
                _(u"Sélectionnez ici l'utilisateur pour ce déplacement")))
        self.ctrl_objet.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez ici l'objet du déplacement. Ex : réunion, formation, etc..."
                  )))
        self.ctrl_cp_depart.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez ici le code postal de la ville de départ")))
        self.ctrl_ville_depart.SetToolTip(
            wx.ToolTip(_(u"Saisissez ici le nom de la ville de départ")))
        self.ctrl_cp_arrivee.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez ici le code postal de la ville d'arrivée")))
        self.ctrl_ville_arrivee.SetToolTip(
            wx.ToolTip(_(u"Saisissez ici le nom de la ville d'arrivée")))
        self.ctrl_distance.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez ici la distance en Km entre les 2 villes sélectionnées.\nSi Teamworks la connait, il l'indiquera automatiquement."
                  )))
        self.ctrl_aller_retour.SetToolTip(
            wx.ToolTip(
                _(u"Cochez cette case si le déplacement a fait l'objet d'un aller/retour.\nLa distance sera ainsi doublée."
                  )))
        self.ctrl_tarif.SetToolTip(
            wx.ToolTip(
                _(u"Saisissez ici le montant du tarif du Km pour permettre calculer le montant du remboursement pour ce déplacement."
                  )))
        self.bouton_options_depart.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour rechercher une ville ou pour saisir manuellement une ville non présente dans la base de données du logiciel"
                  )))
        self.bouton_options_arrivee.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour rechercher une ville ou pour saisir manuellement une ville non présente dans la base de données du logiciel"
                  )))

    def __do_layout(self):
        grid_sizer_base = wx.FlexGridSizer(rows=4, cols=1, vgap=10, hgap=10)

        # Généralités
        sizerStaticBox_generalites = wx.StaticBoxSizer(
            self.staticbox_generalites, wx.HORIZONTAL)
        grid_sizer_generalites = wx.FlexGridSizer(rows=3,
                                                  cols=2,
                                                  vgap=10,
                                                  hgap=10)

        grid_sizer_generalites.Add(self.label_date, 0,
                                   wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        grid_sizer_generalites.Add(self.ctrl_date, 0, wx.ALL, 0)
        grid_sizer_generalites.Add(self.label_utilisateur, 0,
                                   wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        grid_sizer_generalites.Add(self.ctrl_utilisateur, 1,
                                   wx.EXPAND | wx.ALL, 0)
        grid_sizer_generalites.Add(self.label_objet, 0,
                                   wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        grid_sizer_generalites.Add(self.ctrl_objet, 1, wx.EXPAND | wx.ALL, 0)

        grid_sizer_generalites.AddGrowableCol(1)
        sizerStaticBox_generalites.Add(grid_sizer_generalites, 1,
                                       wx.EXPAND | wx.ALL, 5)
        grid_sizer_base.Add(sizerStaticBox_generalites, 0,
                            wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 10)

        # Trajet
        sizerStaticBox_trajet = wx.StaticBoxSizer(self.staticbox_trajet,
                                                  wx.HORIZONTAL)
        grid_sizer_trajet = wx.FlexGridSizer(rows=4, cols=2, vgap=10, hgap=10)

        grid_sizer_trajet.Add(self.label_depart, 0,
                              wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        sizer_depart = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5)
        sizer_depart.Add(self.ctrl_cp_depart, 1, wx.EXPAND | wx.ALL, 0)
        sizer_depart.Add(self.ctrl_ville_depart, 1, wx.EXPAND | wx.ALL, 0)
        sizer_depart.Add(self.bouton_options_depart, 1, wx.EXPAND | wx.ALL, 0)
        sizer_depart.AddGrowableCol(1)
        grid_sizer_trajet.Add(sizer_depart, 1, wx.EXPAND | wx.ALL, 0)

        grid_sizer_trajet.Add(self.label_arrivee, 0,
                              wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        sizer_arrivee = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5)
        sizer_arrivee.Add(self.ctrl_cp_arrivee, 1, wx.EXPAND | wx.ALL, 0)
        sizer_arrivee.Add(self.ctrl_ville_arrivee, 1, wx.EXPAND | wx.ALL, 0)
        sizer_arrivee.Add(self.bouton_options_arrivee, 1, wx.EXPAND | wx.ALL,
                          0)
        sizer_arrivee.AddGrowableCol(1)
        grid_sizer_trajet.Add(sizer_arrivee, 1, wx.EXPAND | wx.ALL, 0)

        grid_sizer_trajet.Add(self.label_distance, 0,
                              wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        sizer_distance = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5)
        sizer_distance.Add(self.ctrl_distance, 1, wx.EXPAND | wx.ALL, 0)
        sizer_distance.Add(self.label_km, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL,
                           0)
        grid_sizer_trajet.Add(sizer_distance, 1, wx.EXPAND | wx.ALL, 0)

        grid_sizer_trajet.Add(self.label_aller_retour, 0,
                              wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        sizer_ar = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5)
        sizer_ar.Add(self.ctrl_aller_retour, 1, wx.EXPAND | wx.ALL, 0)
        grid_sizer_trajet.Add(sizer_ar, 1, wx.EXPAND | wx.ALL, 0)

        grid_sizer_trajet.AddGrowableCol(1)
        sizerStaticBox_trajet.Add(grid_sizer_trajet, 1, wx.EXPAND | wx.ALL, 5)
        grid_sizer_base.Add(sizerStaticBox_trajet, 0,
                            wx.EXPAND | wx.LEFT | wx.RIGHT, 10)

        # Remboursement
        sizerStaticBox_rbmt = wx.StaticBoxSizer(self.staticbox_remboursement,
                                                wx.HORIZONTAL)
        grid_sizer_rbmt = wx.FlexGridSizer(rows=3, cols=2, vgap=10, hgap=10)

        grid_sizer_rbmt.Add(self.label_tarif, 0,
                            wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        sizer_rbmt = wx.FlexGridSizer(rows=1, cols=4, vgap=5, hgap=5)
        sizer_rbmt.Add(self.ctrl_tarif, 1, wx.EXPAND | wx.ALL, 0)
        sizer_rbmt.Add(self.label_euro_tarif, 0,
                       wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        sizer_rbmt.Add(self.label_montant, 0,
                       wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        sizer_rbmt.Add(self.ctrl_montant, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL,
                       0)
        grid_sizer_rbmt.Add(sizer_rbmt, 1, wx.EXPAND | wx.ALL, 0)

        grid_sizer_rbmt.Add(self.label_remboursement, 0,
                            wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        grid_sizer_rbmt.Add(self.ctrl_remboursement, 1, wx.EXPAND | wx.ALL, 0)

        grid_sizer_rbmt.AddGrowableCol(1)
        sizerStaticBox_rbmt.Add(grid_sizer_rbmt, 1, wx.EXPAND | wx.ALL, 5)
        grid_sizer_base.Add(sizerStaticBox_rbmt, 0,
                            wx.EXPAND | wx.LEFT | wx.RIGHT, 10)

        # Boutons
        grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10)
        grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0)
        grid_sizer_boutons.Add((20, 20), 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0)
        grid_sizer_boutons.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_boutons, 1, wx.ALL | wx.EXPAND, 10)

        self.SetSizer(grid_sizer_base)
        grid_sizer_base.AddGrowableCol(0)
        grid_sizer_base.Fit(self)
        self.Layout()
        self.CenterOnScreen()

    def ImportDernierTarif(self):
        # Récupération du dernier tarif saisi
        DB = GestionDB.DB()
        req = """SELECT cp_depart, ville_depart, tarif_km FROM deplacements ORDER BY IDdeplacement DESC LIMIT 1; """
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        if len(listeDonnees) == 0:
            return
        else:
            cp_depart = listeDonnees[0][0]
            ville_depart = listeDonnees[0][1]
            tarif_km = listeDonnees[0][2]
            self.ctrl_cp_depart.autoComplete = False
            self.ctrl_ville_depart.autoComplete = False
            self.ctrl_cp_depart.SetValue(str(cp_depart))
            self.ctrl_ville_depart.SetValue(ville_depart)
            self.ctrl_cp_depart.autoComplete = True
            self.ctrl_ville_depart.autoComplete = True
            self.ctrl_tarif.SetValue(str(tarif_km))

    def OnBoutonOptionsDepart(self, event):
        print("options ville depart")

    def OnBoutonOptionsArrivee(self, event):
        print("options ville arrivee")

    def ImportationPersonnes(self):
        """ Importation de la liste des personnes """
        # Récupération de la liste des personnes
        DB = GestionDB.DB()
        req = """SELECT IDpersonne, nom, prenom FROM personnes ORDER BY nom, prenom; """
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        # Création de la liste pour le listBox
        self.listePersonnes = []
        self.dictPersonnes = {}
        index = 0
        for IDpersonne, nom, prenom in listeDonnees:
            self.listePersonnes.append(nom + " " + prenom)
            self.dictPersonnes[index] = IDpersonne
            index += 1

    def ImportationDistances(self):
        """ Importation de la table des distances """
        DB = GestionDB.DB()
        req = """SELECT * FROM distances """
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        self.listeDistances = listeDonnees

    def Importation(self):
        """ Importation des données si c'est une modification de déplacement """
        # Récupération des données du déplacement
        DB = GestionDB.DB()
        req = """SELECT * FROM deplacements WHERE IDdeplacement=%d; """ % self.IDdeplacement
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        if len(listeDonnees) == 0: return
        # Intégration des données dans le formulaire
        self.IDpersonne = listeDonnees[0][1]
        self.SetPersonne(self.IDpersonne)
        date = listeDonnees[0][2]
        self.SetDate(
            datetime.date(year=int(date[:4]),
                          month=int(date[5:7]),
                          day=int(date[8:10])))
        self.ctrl_objet.SetValue(listeDonnees[0][3])
        self.SetVilleDepart(str(listeDonnees[0][4]), listeDonnees[0][5])
        self.SetVilleArrivee(str(listeDonnees[0][6]), listeDonnees[0][7])
        distance = str(listeDonnees[0][8])
        self.ctrl_distance.SetValue(str(distance))
        if listeDonnees[0][9] == "True":
            self.SetAllerRetour(True)
        else:
            self.SetAllerRetour(False)
        self.ctrl_tarif.SetValue(str(listeDonnees[0][10]))
        self.CalcMontantRmbst()
        self.SetRemboursement(listeDonnees[0][11])

    def SetRemboursement(self, IDremboursement=None):
        """ Définit le remboursement """
        if IDremboursement == None or IDremboursement == 0 or IDremboursement == "":
            self.ctrl_remboursement.SetLabel("Aucun remboursement.")
        else:
            # Recherche date du remboursement
            DB = GestionDB.DB()
            req = """SELECT date FROM remboursements WHERE IDremboursement=%d; """ % IDremboursement
            DB.ExecuterReq(req)
            listeDonnees = DB.ResultatReq()
            DB.Close()
            dateRemboursement = self.DateEngFr(listeDonnees[0][0])
            self.ctrl_remboursement.SetLabel("N°" + str(IDremboursement) +
                                             " du " + dateRemboursement)

    def DateEngFr(self, textDate):
        text = str(textDate[8:10]) + "/" + str(textDate[5:7]) + "/" + str(
            textDate[:4])
        return text

    def SetAllerRetour(self, etat=False):
        """ Définit l'aller retour """
        self.ctrl_aller_retour.SetValue(etat)
        if etat == False:
            self.label_km.SetLabel("Km  (Aller simple)")
        else:
            self.label_km.SetLabel("Km  (Aller/retour)")

    def OnAllerRetour(self, event):
        if self.ValideControleFloat(self.ctrl_distance) == False: return
        distanceActuelle = float(self.ctrl_distance.GetValue())
        if self.ctrl_aller_retour.GetValue() == False:
            self.label_km.SetLabel("Km  (Aller simple)")
            self.ctrl_distance.SetValue(str(distanceActuelle / 2.0))
        else:
            self.label_km.SetLabel("Km  (Aller/retour)")
            self.ctrl_distance.SetValue(str(distanceActuelle * 2.0))
        # Recalcule le montant
        self.CalcMontantRmbst()

    def CalcMontantRmbst(self):
        if self.ValideControleFloat(self.ctrl_distance) == False: return
        if self.ValideControleFloat(self.ctrl_tarif) == False: return
        distance = decimal.Decimal(self.ctrl_distance.GetValue())
        tarif = decimal.Decimal(self.ctrl_tarif.GetValue())
        montant = distance * tarif
        self.ctrl_montant.SetLabel(u"%.2f ¤" % montant)

    def distance_EvtKillFocus(self, event):
        # Vérifie la validité de la valeur
        if self.ValideControleFloat(self.ctrl_distance) == False:
            dlg = wx.MessageDialog(
                self,
                _(u"La distance saisie n'est pas correcte. \nElle doit être sous la forme '32.50' ou '54' par exemple..."
                  ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_distance.SetFocus()
            return
        # Recalcule le montant
        self.CalcMontantRmbst()

    def tarif_EvtKillFocus(self, event):
        # Vérifie la validité de la valeur
        if self.ValideControleFloat(self.ctrl_tarif) == False:
            dlg = wx.MessageDialog(
                self,
                _(u"Le tarif n'est pas valide. \nIl doit être sous la forme '0.32' ou '1.53' par exemple..."
                  ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_tarif.SetFocus()
            return
        # Recalcule le montant
        self.CalcMontantRmbst()

    def ValideControleFloat(self, controle=None):
        """ Vérifie la validité d'un contrôle de type Float """
        valeur = controle.GetValue()
        # Vérifie que la valeur est bien constituée de chiffres uniquement
        incoherences = ""
        for lettre in valeur:
            if lettre not in "0123456789.":
                incoherences += "'" + lettre + "', "
        if len(incoherences) != 0:
            return False
        else:
            try:
                test = float(valeur)
            except:
                controle.SetValue("0.0")
                # Recalcule le montant
                self.CalcMontantRmbst()
                return False
            return True

    def MajDistance(self):
        """ Met à jour le Contrôle Distance en fonction des villes saisies """
        depart = (self.ctrl_cp_depart.GetValue(),
                  self.ctrl_ville_depart.GetValue())
        arrivee = (self.ctrl_cp_arrivee.GetValue(),
                   self.ctrl_ville_arrivee.GetValue())
        # Recherche une distance dans la base de données des distances
        for IDdistance, cp_depart, ville_depart, cp_arrivee, ville_arrivee, distance in self.listeDistances:
            depart_temp = (str(cp_depart), ville_depart)
            arrivee_temp = (str(cp_arrivee), ville_arrivee)
            if (depart == depart_temp and arrivee == arrivee_temp) or (
                    depart == arrivee_temp and arrivee == depart_temp):
                if self.ctrl_aller_retour.GetValue() == True:
                    self.ctrl_distance.SetValue(str(distance * 2.0))
                else:
                    self.ctrl_distance.SetValue(str(distance * 1.0))
                break
        # MAJ du montant total
        self.CalcMontantRmbst()

    def SetVilleDepart(self, cp=None, ville=None):
        """ Ecrit une ville dans le contrôle ville de départ """
        if cp != None:
            self.ctrl_cp_depart.autoComplete = False
            self.ctrl_cp_depart.SetValue(cp)
            self.ctrl_cp_depart.autoComplete = True
        if ville != None:
            self.ctrl_ville_depart.autoComplete = False
            self.ctrl_ville_depart.SetValue(ville.upper())
            self.ctrl_ville_depart.autoComplete = True

    def SetVilleArrivee(self, cp=None, ville=None):
        """ Ecrit une ville dans le contrôle ville de départ """
        if cp != None:
            self.ctrl_cp_arrivee.autoComplete = False
            self.ctrl_cp_arrivee.SetValue(cp)
            self.ctrl_cp_arrivee.autoComplete = True
        if ville != None:
            self.ctrl_ville_arrivee.autoComplete = False
            self.ctrl_ville_arrivee.SetValue(ville.upper())
            self.ctrl_ville_arrivee.autoComplete = True

    def SetPersonne(self, IDpersonne=None):
        # Recherche de l'index dans le dictPersonnes
        for index, IDpers in self.dictPersonnes.items():
            if IDpersonne == IDpers:
                self.ctrl_utilisateur.Select(index)
                break

    def SetDate(self, date):
        """ Saisi une date au format datetime dans le datepicker """
        self.SetDatePicker(self.ctrl_date, date)

    def SetDatePicker(self, controle, date):
        """ Met une date au format datetime dans un datePicker donné """
        annee = int(date.year)
        mois = int(date.month) - 1
        jour = int(date.day)
        date = wx.DateTime()
        date.Set(jour, mois, annee)
        controle.SetValue(date)

    def GetDatePickerValue(self, controle):
        """ Renvoie la date au format datetime d'un datePicker """
        date_tmp = controle.GetValue()
        return datetime.date(date_tmp.GetYear(),
                             date_tmp.GetMonth() + 1, date_tmp.GetDay())

    def OnBoutonAide(self, event):
        """ Aide """
        from Utils import UTILS_Aide
        UTILS_Aide.Aide("Enregistrerundplacement")

    def OnBoutonOk(self, event):
        """ Validation des données saisies """

        # Vérifie contrôle Utilisateur
        valeur = self.ctrl_utilisateur.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement sélectionner un utilisateur."),
                "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_utilisateur.SetFocus()
            return

        # Vérifie contrôle Objet
        valeur = self.ctrl_objet.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous n'avez pas saisi d'objet pour ce déplacement. \n\nVoulez-vous quand même valider ce déplacement ?\n(Cliquez sur 'Non' ou 'Annuler' pour modifier maintenant l'objet)"
                  ), _(u"Erreur de saisie"),
                wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION)
            reponse = dlg.ShowModal()
            if reponse == wx.ID_NO or reponse == wx.ID_CANCEL:
                dlg.Destroy()
                self.ctrl_objet.SetFocus()
                return
            else:
                dlg.Destroy()

        # Vérifie contrôle cp départ
        valeur = self.ctrl_cp_depart.GetValue()
        if valeur == "" or valeur == "     ":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement saisir un code postal pour la ville de départ."
                  ), "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_cp_depart.SetFocus()
            return

        # Vérifie contrôle ville départ
        valeur = self.ctrl_ville_depart.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement saisir un nom de ville de départ."
                  ), "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_ville_depart.SetFocus()
            return

        # Vérifie contrôle cp arrivée
        valeur = self.ctrl_cp_arrivee.GetValue()
        if valeur == "" or valeur == "     ":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement saisir un code postal pour la ville d'arrivée."
                  ), "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_cp_arrivee.SetFocus()
            return

        # Vérifie contrôle ville arrivée
        valeur = self.ctrl_ville_arrivee.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement saisir un nom de ville d'arrivée"
                  ), "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_ville_arrivee.SetFocus()
            return

        # Vérifie contrôle distance
        valeur = self.ctrl_distance.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement saisir une distance en Km pour le trajet."
                  ), "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_distance.SetFocus()
            return

        if self.ValideControleFloat(self.ctrl_distance) == False:
            dlg = wx.MessageDialog(
                self,
                _(u"La distance saisie n'est pas correcte. \nElle doit être sous la forme '32.50' ou '54' par exemple..."
                  ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_distance.SetFocus()
            return

        if float(valeur) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"La distance est de 0 Km. \n\nVoulez-vous quand même valider ce déplacement ?\n(Cliquez sur 'Non' ou 'Annuler' pour modifier maintenant la distance)"
                  ), _(u"Erreur de saisie"),
                wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION)
            reponse = dlg.ShowModal()
            if reponse == wx.ID_NO or reponse == wx.ID_CANCEL:
                dlg.Destroy()
                self.ctrl_distance.SetFocus()
                return
            else:
                dlg.Destroy()

        # Vérifie contrôle tarif
        valeur = self.ctrl_tarif.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement saisir la valeur du tarif du Km en euros."
                  ), "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_tarif.SetFocus()
            return

        if self.ValideControleFloat(self.ctrl_tarif) == False:
            dlg = wx.MessageDialog(
                self,
                _(u"Le tarif n'est pas valide. \nIl doit être sous la forme '0.32' ou '1.53' par exemple..."
                  ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_tarif.SetFocus()
            return

        if float(valeur) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Le tarif du Km est de 0 ¤. \n\nVoulez-vous quand même valider ce déplacement ?\n(Cliquez sur 'Non' ou 'Annuler' pour modifier maintenant ce tarif)"
                  ), _(u"Erreur de saisie"),
                wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION)
            reponse = dlg.ShowModal()
            if reponse == wx.ID_NO or reponse == wx.ID_CANCEL:
                dlg.Destroy()
                self.ctrl_distance.SetFocus()
                return
            else:
                dlg.Destroy()

        # Sauvegarde
        self.SauvegardeDeplacement()

        # Sauvegarde les Distances
        self.SauvegardeDistance()

        # Ferme la boîte de dialogue
        self.EndModal(wx.ID_OK)

    def SauvegardeDeplacement(self):
        """ Sauvegarde des données """
        # Récupération des valeurs saisies
        date = str(self.GetDatePickerValue(self.ctrl_date))
        IDpersonne = self.dictPersonnes[
            self.ctrl_utilisateur.GetCurrentSelection()]
        objet = self.ctrl_objet.GetValue()
        cp_depart = self.ctrl_cp_depart.GetValue()
        ville_depart = self.ctrl_ville_depart.GetValue()
        cp_arrivee = self.ctrl_cp_arrivee.GetValue()
        ville_arrivee = self.ctrl_ville_arrivee.GetValue()
        distance = float(self.ctrl_distance.GetValue())
        aller_retour = str(self.ctrl_aller_retour.GetValue())
        tarif_km = float(self.ctrl_tarif.GetValue())

        DB = GestionDB.DB()
        # Création de la liste des données
        listeDonnees = [
            ("date", date),
            ("IDpersonne", IDpersonne),
            ("objet", objet),
            ("cp_depart", cp_depart),
            ("ville_depart", ville_depart),
            ("cp_arrivee", cp_arrivee),
            ("ville_arrivee", ville_arrivee),
            ("distance", distance),
            ("aller_retour", aller_retour),
            ("tarif_km", tarif_km),
            ("IDremboursement", 0),
        ]
        if self.IDdeplacement == None:
            # Enregistrement d'un nouveau déplacement
            newID = DB.ReqInsert("deplacements", listeDonnees)
            ID = newID
        else:
            # Modification du déplacement
            DB.ReqMAJ("deplacements", listeDonnees, "IDdeplacement",
                      self.IDdeplacement)
            ID = self.IDdeplacement
        DB.Commit()
        DB.Close()
        return ID

    def SauvegardeDistance(self):
        """ Sauvegarde la distance dans la base de données """
        # Recherche dans la base si la distance existe
        depart = (self.ctrl_cp_depart.GetValue(),
                  self.ctrl_ville_depart.GetValue())
        arrivee = (self.ctrl_cp_arrivee.GetValue(),
                   self.ctrl_ville_arrivee.GetValue())
        distanceExiste = False
        distanceValeur = 0
        distanceID = None
        for IDdistance, cp_depart, ville_depart, cp_arrivee, ville_arrivee, distance in self.listeDistances:
            depart_temp = (str(cp_depart), ville_depart)
            arrivee_temp = (str(cp_arrivee), ville_arrivee)
            if (depart == depart_temp and arrivee == arrivee_temp) or (
                    depart == arrivee_temp and arrivee == depart_temp):
                distanceExiste = True
                distanceValeur = distance
                distanceID = IDdistance
                break

        # Récupération des données
        cp_depart = int(self.ctrl_cp_depart.GetValue())
        ville_depart = self.ctrl_ville_depart.GetValue()
        cp_arrivee = int(self.ctrl_cp_arrivee.GetValue())
        ville_arrivee = self.ctrl_ville_arrivee.GetValue()
        distance = float(self.ctrl_distance.GetValue())
        aller_retour = self.ctrl_aller_retour.GetValue()
        if aller_retour == True:
            distance = distance / 2

        DB = GestionDB.DB()
        # Création de la liste des données
        listeDonnees = [
            ("cp_depart", cp_depart),
            ("ville_depart", ville_depart),
            ("cp_arrivee", cp_arrivee),
            ("ville_arrivee", ville_arrivee),
            ("distance", distance),
        ]
        if distanceExiste == False:
            # Enregistrement d'une nouvelle distance
            newID = DB.ReqInsert("distances", listeDonnees)
        else:
            # Modification de la distance
            DB.ReqMAJ("distances", listeDonnees, "IDdistance", distanceID)
        DB.Commit()
        DB.Close()
    def __init__(self,
                 parent,
                 IDentretien=None,
                 IDcandidat=None,
                 IDpersonne=None):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
                           | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)
        self.IDentretien = IDentretien
        self.IDcandidat = IDcandidat
        self.IDpersonne = IDpersonne

        self.panel = wx.Panel(self, -1)
        self.sizer_contenu_staticbox = wx.StaticBox(self.panel, -1, "")
        self.label_date = wx.StaticText(self.panel, -1, _(u"Date :"))
        self.ctrl_date = DatePickerCtrl(self.panel, -1, style=DP_DROPDOWN)
        self.label_heure = wx.StaticText(self.panel, -1, _(u"Heure :"))
        self.ctrl_heure = masked.TextCtrl(self.panel,
                                          -1,
                                          "",
                                          size=(60, -1),
                                          style=wx.TE_CENTRE,
                                          mask="##:##",
                                          validRegex="[0-2][0-9]:[0-5][0-9]")
        self.ctrl_heure.SetCtrlParameters(invalidBackgroundColour="PINK")
        self.label_avis = wx.StaticText(self.panel, -1, _(u"Avis :"))
        listeImages = [
            (_(u"Avis inconnu"), "Smiley_question.png"),
            (_(u"Pas convaincant"), "Smiley_nul.png"),
            (_(u"Mitigé"), "Smiley_bof.png"),
            (_(u"Bien"), "Smiley_bien.png"),
            (_(u"Très bien"), "Smiley_genial.png"),
        ]
        self.ctrl_avis = MyBitmapComboBox(self.panel, listeImages=listeImages)
        self.label_remarques = wx.StaticText(self.panel, -1,
                                             _(u"Commentaire :"))
        self.ctrl_remarques = wx.TextCtrl(self.panel,
                                          -1,
                                          "",
                                          style=wx.TE_MULTILINE)

        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self.panel,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self.panel,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self.panel,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))

        if self.IDentretien != None:
            self.Importation()

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
        self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)
Beispiel #23
0
class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None, title='量化软件', size=(1100, 700))
        # 创建显示区面板
        self.DispPanel = MPL_Panel_Base(self)  # 展示
        self.BackPanel = Loop_Panel_Base(self)  # 回测
        self.am = self.DispPanel.am
        self.vol = self.DispPanel.vol
        self.devol = self.DispPanel.devol
        self.macd = self.DispPanel.macd

        # 创建参数区面板
        self.ParaPanel = wx.Panel(self, -1)

        paraInput_Box = wx.StaticBox(self.ParaPanel, -1, '参数输入')
        paraInput_Sizer = wx.StaticBoxSizer(paraInput_Box, wx.VERTICAL)
        self.StNameCodedict = {
            "开山股份": "300257",
            "浙大网新": "600797",
            "水晶光电": "002273",
            "高鸿股份": "000851"
        }

        # 初始化股票代码变量
        self.stockName_Val = "开山股份"
        self.stockCode_Val = self.StNameCodedict[self.stockName_Val]

        self.stockName_CMBO = wx.ComboBox(
            self.ParaPanel,
            -1,
            self.stockName_Val,
            choices=list(self.StNameCodedict.keys()),
            style=wx.CB_READONLY | wx.CB_DROPDOWN)  # 股票名称
        stockCode_Text = wx.StaticText(self.ParaPanel, -1, '股票名称')

        # 策略选取
        strate_Text = wx.StaticText(self.ParaPanel, -1, '策略名称')
        strate_Combo_Val = ["双趋势融合", "待添加策略"]  # 策略
        self.pickstrate_Val = "双趋势融合"
        self.pickstrate_CMBO = wx.ComboBox(self.ParaPanel,
                                           -1,
                                           self.pickstrate_Val,
                                           choices=strate_Combo_Val,
                                           style=wx.CB_READONLY
                                           | wx.CB_DROPDOWN)  # 策略名称

        # 日历控件选择数据周期
        self.dpcEndTime = DatePickerCtrl(self.ParaPanel,
                                         -1,
                                         style=DP_DROPDOWN | DP_SHOWCENTURY
                                         | DP_ALLOWNONE)  # 结束时间
        self.dpcStartTime = DatePickerCtrl(self.ParaPanel,
                                           -1,
                                           style=DP_DROPDOWN | DP_SHOWCENTURY
                                           | DP_ALLOWNONE)  # 起始时间
        DateTimeNow = wx.DateTime.Now()  # wx.DateTime格式"03/03/18 00:00:00"
        self.dpcEndTime.SetValue(DateTimeNow)
        DateTimeNow.SetYear(DateTimeNow.year - 1)
        self.dpcStartTime.SetValue(DateTimeNow)
        stockData_Text = wx.StaticText(self.ParaPanel, -1, '日期(Start-End)')

        # 初始化时间变量
        # print('start----------')
        dateVal = self.dpcStartTime.GetValue()
        # print("dateVal ---> ", dateVal)
        # print("dateVal.year ----->", dateVal.year)
        # print("dateVal.month ---->", dateVal.month)
        # print("dateVal.day ----->", dateVal.day)
        self.stockSdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)
        # print('self.stockSdate_Val----->', self.stockSdate_Val)
        dateVal = self.dpcEndTime.GetValue()
        # print("dateVal ---> ", dateVal)
        self.stockEdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)
        # print('self.stockEdate_Val ------>', self.stockEdate_Val)
        # print('end----------')

        paraInput_Sizer.Add(stockCode_Text,
                            proportion=0,
                            flag=wx.EXPAND | wx.ALL,
                            border=2)
        paraInput_Sizer.Add(self.stockName_CMBO, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(stockData_Text,
                            proportion=0,
                            flag=wx.EXPAND | wx.ALL,
                            border=2)
        paraInput_Sizer.Add(self.dpcStartTime, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(self.dpcEndTime, 0, wx.EXPAND | wx.ALL | wx.CENTER,
                            2)
        paraInput_Sizer.Add(strate_Text, 0, wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(self.pickstrate_CMBO, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)

        RadioList = ["不显示", "跳空缺口", "金叉/死叉", "N日突破"]
        self.StratInputBox = wx.RadioBox(self.ParaPanel,
                                         -1,
                                         label='指标提示',
                                         choices=RadioList,
                                         majorDimension=4,
                                         style=wx.RA_SPECIFY_ROWS)
        self.StratInputBox.Bind(wx.EVT_RADIOBOX, self.OnRadioBox_Indicator)

        # 初始化指标变量
        self.IndicatInput_Val = self.StratInputBox.GetStringSelection()

        self.TextAInput = wx.TextCtrl(self.ParaPanel,
                                      -1,
                                      "交易信息提示:",
                                      size=(180, 200),
                                      style=wx.TE_MULTILINE
                                      | wx.TE_READONLY)  # 多行|只读

        vboxnetA = wx.BoxSizer(wx.VERTICAL)  # 纵向box
        vboxnetA.Add(paraInput_Sizer,
                     proportion=0,
                     flag=wx.EXPAND | wx.BOTTOM,
                     border=2)  # proportion参数控制容器尺寸比例
        vboxnetA.Add(self.StratInputBox,
                     proportion=0,
                     flag=wx.EXPAND | wx.BOTTOM,
                     border=2)
        vboxnetA.Add(self.TextAInput,
                     proportion=1,
                     flag=wx.EXPAND | wx.ALL,
                     border=2)
        self.ParaPanel.SetSizer(vboxnetA)

        # 创建Right面板
        self.CtrlPanel = wx.Panel(self, -1)
        # 创建FlexGridSizer布局网格
        self.FlexGridSizer = wx.FlexGridSizer(rows=3, cols=1, vgap=3, hgap=3)

        # 行情按钮
        self.Firmoffer = wx.Button(self.CtrlPanel, -1, "行情")
        self.Firmoffer.Bind(wx.EVT_BUTTON, self.FirmEvent)  # 绑定行情按钮事件

        # 回测按钮
        self.Backtrace = wx.Button(self.CtrlPanel, -1, "回测")
        self.Backtrace.Bind(wx.EVT_BUTTON, self.BackEvent)  # 绑定回测按钮事件

        # 选股按钮
        self.Stockpick = wx.Button(self.CtrlPanel, -1, "选股")
        self.Stockpick.Bind(wx.EVT_BUTTON, self.PstockpEvent)  # 绑定选股按钮事件

        # 加入Sizer中
        self.FlexGridSizer.Add(self.Firmoffer,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.Add(self.Backtrace,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.Add(self.Stockpick,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)

        self.CtrlPanel.SetSizer(self.FlexGridSizer)

        self.HBoxPanel = wx.BoxSizer()
        self.HBoxPanel.Add(self.ParaPanel,
                           proportion=1.5,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.HBoxPanel.Add(self.DispPanel,
                           proportion=8,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.HBoxPanel.Add(self.CtrlPanel,
                           proportion=1,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.SetSizer(self.HBoxPanel)

        self.Centre()

    def ProcessStock(self):
        # df_stockload = web.DataReader("600797.SS", "yahoo", datetime.datetime(2017,1,1), datetime.date.today())
        df_stockload = GetStockDatPro(self.stockCode_Val, self.stockSdate_Val,
                                      self.stockEdate_Val)
        """ 绘制移动平均线图 """
        # self.am.plot(self.numic[0:self.butNum],self.close[0:self.butNum],'#0f0ff0',linewidth=1.0)

        dispCont_List = []

        examp_trade = Excave_Indic_Base()
        if self.IndicatInput_Val == "金叉/死叉":
            dispCont_pd, dispCont_List = examp_trade.plot_Aver_Cross(
                df_stockload)
            self.DispPanel.draw_avercross(df_stockload, dispCont_pd)
        elif self.IndicatInput_Val == "跳空缺口":
            dispCont_pd, dispCont_List = examp_trade.plot_Jump_Thrd(
                df_stockload)
            self.DispPanel.draw_jumpgap(df_stockload, dispCont_pd)
        elif self.IndicatInput_Val == "N日突破":
            dispCont_pd, dispCont_List = examp_trade.plot_Ndays_Break(
                df_stockload)
            self.DispPanel.draw_ndaysbreak(df_stockload, dispCont_pd)
        else:
            dispCont_List = dispCont_List

        self.TextAInput.SetValue("指标提示信息如下:" + '\n')
        for i in dispCont_List:
            self.TextAInput.AppendText(i)

        numic = np.arange(0, len(df_stockload.index))
        butNum = len(df_stockload.index)
        self.DispPanel.xylabel_tick_lim(self.stockName_Val, df_stockload.index)
        self.DispPanel.draw_subgraph(df_stockload, numic)

    def ProcessLoop(self):

        df_stockload = GetStockDatPro(self.stockCode_Val, self.stockSdate_Val,
                                      self.stockEdate_Val)
        dispCont_List = []
        if self.pickstrate_Val == "双趋势融合":
            # 多趋势融合策略执行 """
            examp_trade = QuantPickTimeSys(df_stockload)
            dispCont_List = examp_trade.run_factor_plot(
                self.BackPanel.trade, self.BackPanel.total,
                self.BackPanel.profit)
        else:

            # 执行其他策略
            # 扩展其他策略

            pass

        self.TextAInput.SetValue(u"策略提示信息如下:" + '\n')
        for i in dispCont_List:
            self.TextAInput.AppendText(i)
        self.BackPanel.xylabel_tick_lim(self.stockName_Val)

    def reFlashLoop(self):
        self.BackPanel.clear_subgraph()  # 必须清理图形才能显示下一幅图
        self.ProcessLoop()
        self.BackPanel.update_subgraph()  # 必须刷新才能显示下一幅图

    def reFlashFrame(self):
        self.DispPanel.clear_subgraph()  # 必须清理图形才能显示下一幅图
        self.ProcessStock()
        self.DispPanel.update_subgraph()  # 必须刷新才能显示下一幅图

    def FirmEvent(self, event):
        # 显示行情面板
        self.HBoxPanel.Hide(self.BackPanel)
        self.HBoxPanel.Replace(self.BackPanel, self.DispPanel)
        self.HBoxPanel.Show(self.DispPanel)
        # self.HBoxPanel.Remove(self.BackPanel)
        self.SetSizer(self.HBoxPanel)
        self.HBoxPanel.Layout()

        # 获取列表股票代码和起始时间
        self.stockName_Val = self.stockName_CMBO.GetString(
            self.stockName_CMBO.GetSelection())
        self.stockCode_Val = self.StNameCodedict[self.stockName_Val]

        dateVal = self.dpcStartTime.GetValue()
        # print('------------')
        # print('dateVal:', dateVal, type(dateVal))
        # print('dateVal.Year:', dateVal.Year, type(dateVal.Year))
        self.stockSdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)
        dateVal = self.dpcEndTime.GetValue()
        self.stockEdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)

        self.reFlashFrame()

    def BackEvent(self, event):
        # 显示回测面板
        self.HBoxPanel.Hide(self.DispPanel)
        self.HBoxPanel.Replace(self.DispPanel, self.BackPanel)
        self.HBoxPanel.Show(self.BackPanel)
        # self.HBoxPanel.Remove(self.DispPanel)
        self.SetSizer(self.HBoxPanel)
        self.HBoxPanel.Layout()

        # 获取策略名称
        self.pickstrate_Val = self.pickstrate_CMBO.GetString(
            self.pickstrate_CMBO.GetSelection())
        self.reFlashLoop()

    def PstockpEvent(self, event):
        """选股事件触发"""
        dlg = wx.TextEntryDialog(self, '输入需要查询的股票代码', '自选窗')

        if dlg.ShowModal() == wx.ID_OK:
            # 获取代码编号
            code = dlg.GetValue()
            # 获取名称
            stockName = format_code_name(code)
            print('股票名称为', stockName)
            self.StNameCodedict[stockName] = dlg.GetValue()
            self.stockName_CMBO.Append(stockName)  # 添加数据
            self.stockName_CMBO.Update()
            self.stockName_CMBO.Refresh()
            self.ParaPanel.Update()

        # print("股票池:", self.StNameCodedict)
        dlg.Destroy()
        # print('销毁对话')

    def OnRadioBox_Indicator(self, event):
        self.IndicatInput_Val = self.StratInputBox.GetStringSelection()
Beispiel #24
0
    def __DoLayout(self):
        title_lbl = wx.StaticText(self, label="Equipement - Details")
        font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL)
        title_lbl.SetFont(font)

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(title_lbl, 0, wx.ALL, 5)
        mainSizer.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.TOP | wx.BOTTOM,
                      5)

        text = ""
        typeLbl = wx.StaticText(self, -1, "Type:")

        typeList = ['Autoclave', 'Ultra Sound']
        self.type = wx.ComboBox(self, -1, "", (10, 30), (130, 23), typeList,
                                wx.CB_DROPDOWN)

        makeModelLbl = wx.StaticText(self, -1, "Make/Model:")
        self.makeModel = wx.TextCtrl(self, -1, text, size=(200, 23))

        serialNoLbl = wx.StaticText(self, -1, "Serial No:")
        self.serialNo = wx.TextCtrl(self, -1, text, size=(200, 23))

        purchasedLbl = wx.StaticText(self, -1, "Purchased:")
        self.purchased = DatePickerCtrl(self, -1, wx.DateTime.Today())

        costLbl = wx.StaticText(self, -1, "Cost:")
        self.cost = wx.TextCtrl(self, -1, text, size=(30, 23))

        nextServiceLbl = wx.StaticText(self, -1, "Next Service:")
        self.nextService = DatePickerCtrl(self, -1, wx.DateTime.Today())

        lastServiceLbl = wx.StaticText(self, -1, "Last Service:")
        self.lastService = DatePickerCtrl(self, -1, wx.DateTime.Today())

        intervalList = ['3 Months', '6 Months', 'Year', '2 Years', '5 years']
        serviceIntervalLbl = wx.StaticText(self, -1, "Service Interval:")
        self.serviceInterval = wx.ComboBox(self, -1, "", (10, 30), (130, 23),
                                           intervalList, wx.CB_DROPDOWN)

        spList = ['GEC Equipment', 'H&I Services']
        serviceProviderLbl = wx.StaticText(self, -1, "Service Provider:")
        self.serviceProvider = wx.ComboBox(self, -1, "", (10, 30), (200, 23),
                                           spList, wx.CB_DROPDOWN)
        spAddButton = wx.Button(self, -1, "Add", size=(50, 23))

        grpSizer = wx.GridBagSizer(vgap=8, hgap=8)

        grpSizer.Add(typeLbl, (1, 1))
        grpSizer.Add(self.type, (1, 2))

        grpSizer.Add(makeModelLbl, (2, 1))
        grpSizer.Add(self.makeModel, (2, 2))

        grpSizer.Add(serialNoLbl, (3, 1))
        grpSizer.Add(self.serialNo, (3, 2))

        grpSizer.Add(purchasedLbl, (4, 1))
        grpSizer.Add(self.purchased, (4, 2))

        grpSizer.Add(costLbl, (4, 3))
        grpSizer.Add(self.cost, (4, 4))

        grpSizer.Add(nextServiceLbl, (5, 1))
        grpSizer.Add(self.nextService, (5, 2))

        grpSizer.Add(lastServiceLbl, (5, 3))
        grpSizer.Add(self.lastService, (5, 4))

        grpSizer.Add(serviceIntervalLbl, (6, 1))
        grpSizer.Add(self.serviceInterval, (6, 2))

        grpSizer.Add(serviceProviderLbl, (7, 1))
        grpSizer.Add(self.serviceProvider, (7, 2))
        grpSizer.Add(spAddButton, (7, 3))

        mainSizer.Add(grpSizer, 0, wx.EXPAND | wx.ALL, 10)
        self.SetSizer(mainSizer)
 def create_widget(self):
     # TODO add all the other parameters for the DatePickerCtrl initial date
     self.widget = DatePickerCtrl(self.parent.widget,
                                  self.id,
                                  style=self.style)
    def general_panel(self):
        # --------------------
        # Controls
        # --------------------
        panel = wx.Panel(self)

        label_project_title = wx.StaticText(panel,
                                            label='Project Title',
                                            name='project_title')
        self.entry_project_title = wx.TextCtrl(panel)
        self.entry_project_title.SetValue(self.project.project_name)

        label_project_manager = wx.StaticText(panel,
                                              label='Project Manager',
                                              name='project_manager')
        self.entry_project_manager = wx.TextCtrl(panel)
        self.entry_project_manager.SetValue(self.project.project_manager)

        label_start_date = wx.StaticText(panel, label='Start Date')
        self.entry_start_date = DatePickerCtrl(panel,
                                               -1,
                                               style=wx.adv.DP_DROPDOWN)
        if self.start_date is None:
            self.entry_start_date.SetValue(wx.DateTime.Now())
        else:
            self.entry_start_date.SetValue(self.start_date)

        label_finish_date = wx.StaticText(panel, label='Finish Date')
        entry_finish_date = DatePickerCtrl(panel, -1, style=wx.adv.DP_DROPDOWN)

        duration = self.project.get_project_duration()
        date_span = wx.DateSpan(0, 0, 0, int(duration) - 1)

        date_finish = copy.copy(self.project.start_date)
        date_finish = py_date_to_wx_datetime(date_finish)

        date_finish.Add(date_span)
        entry_finish_date.SetValue(date_finish)
        entry_finish_date.Disable()

        # --------------------
        # Sizers
        # --------------------
        sizer_main = wx.BoxSizer(wx.VERTICAL)
        sizer_project_title = wx.BoxSizer(wx.HORIZONTAL)
        sizer_project_manager = wx.BoxSizer(wx.HORIZONTAL)
        sizer_minor_details_main = wx.BoxSizer(wx.HORIZONTAL)
        sizer_left_main = wx.BoxSizer(wx.VERTICAL)
        sizer_start_date = wx.BoxSizer(wx.HORIZONTAL)
        sizer_finish_date = wx.BoxSizer(wx.HORIZONTAL)

        # --------------------
        # Populating each sizer
        # --------------------
        sizer_main.Add(sizer_project_title)

        sizer_project_title.AddSpacer(INPUT_GROUP_PADDING)
        sizer_project_title.Add(label_project_title, 1)
        sizer_project_title.AddSpacer(46)
        sizer_project_title.Add(self.entry_project_title, 5)
        sizer_project_title.AddSpacer(INPUT_GROUP_PADDING)

        sizer_main.AddSpacer(INPUT_ROW_SPACER)
        sizer_main.Add(sizer_project_manager)

        sizer_project_manager.AddSpacer(INPUT_GROUP_PADDING)
        sizer_project_manager.Add(label_project_manager, 1)
        sizer_project_manager.AddSpacer(20)
        sizer_project_manager.Add(self.entry_project_manager, 2)
        sizer_project_manager.AddSpacer(INPUT_GROUP_PADDING)

        sizer_main.AddSpacer(INPUT_ROW_SPACER)
        sizer_main.Add(sizer_minor_details_main,
                       flag=wx.EXPAND | wx.TOP | wx.RIGHT | wx.BOTTOM
                       | wx.LEFT)

        sizer_left_main.Add(sizer_start_date)
        sizer_left_main.Add(sizer_finish_date)

        sizer_start_date.Add(label_start_date, .5)
        sizer_start_date.AddSpacer(59)
        sizer_start_date.Add(self.entry_start_date, 1)

        sizer_finish_date.Add(label_finish_date, .5)
        sizer_finish_date.AddSpacer(53)
        sizer_finish_date.Add(entry_finish_date)

        sizer_minor_details_main.AddSpacer(INPUT_GROUP_PADDING)
        sizer_minor_details_main.Add(sizer_left_main, 1)

        sizer_main.AddSpacer(INPUT_ROW_SPACER)

        panel.SetSizerAndFit(sizer_main)

        return panel
Beispiel #27
0
    def __init__(self,
                 parent,
                 selectionLignes=[],
                 selectionPersonnes=[],
                 selectionDates=(None, None)):
        wx.Panel.__init__(self,
                          parent,
                          -1,
                          name="panel_applicModele",
                          style=wx.TAB_TRAVERSAL)
        self.parent = parent

        self.selectionLignes = selectionLignes
        self.selectionPersonnes = selectionPersonnes
        self.selectionDates = selectionDates

        self.panel_base_1 = wx.Panel(self, -1)
        self.panel_base_2 = wx.Panel(self.panel_base_1, -1)
        self.sizer_modeles_staticbox = wx.StaticBox(
            self.panel_base_2, -1, _(u"Sélection des modèles"))
        self.sizer_parametres_staticbox = wx.StaticBox(
            self.panel_base_2, -1,
            _(u"Sélection de la période et des personnes"))
        self.radio_btn_1 = wx.RadioButton(self.panel_base_2, -1, u"")
        self.radio_btn_2 = wx.RadioButton(
            self.panel_base_2, -1, _(u"Selon les paramètres suivants :"))
        self.label_periode = wx.StaticText(self.panel_base_2, -1,
                                           _(u"Période du :"))
        self.date_debut = DatePickerCtrl(self.panel_base_2,
                                         -1,
                                         style=DP_DROPDOWN)
        self.label_au = wx.StaticText(self.panel_base_2, -1, "au")
        self.date_fin = DatePickerCtrl(self.panel_base_2,
                                       -1,
                                       style=DP_DROPDOWN)
        self.label_personnes = wx.StaticText(self.panel_base_2, -1,
                                             "Personnes :")
        self.list_ctrl_personnes = listCtrl_Personnes(self.panel_base_2)
        self.list_ctrl_personnes.SetMinSize((20, 80))
        self.list_ctrl_modeles = listCtrl_Modeles(self.panel_base_2)
        self.list_ctrl_modeles.SetMinSize((20, 20))
        self.bouton_ajouter = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Ajouter.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_modifier = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Modifier.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_dupliquer = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Dupliquer.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_supprimer = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Supprimer.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_aide = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(
                Chemins.GetStaticPath("Images/BoutonsImages/Aide_L72.png"),
                wx.BITMAP_TYPE_ANY))
        self.bouton_ok = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/BoutonsImages/Ok_L72.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_annuler = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(
                Chemins.GetStaticPath("Images/BoutonsImages/Annuler_L72.png"),
                wx.BITMAP_TYPE_ANY))

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio1, self.radio_btn_1)
        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio2, self.radio_btn_2)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAjouter, self.bouton_ajouter)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonModifier, self.bouton_modifier)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonSupprimer, self.bouton_supprimer)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonDupliquer, self.bouton_dupliquer)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        self.boutonsEnabled(True, False, False)
        self.SetLabelRadio1()

        # Définit les dates des datePickers
        if self.selectionDates[0] != None:
            jour = self.selectionDates[0].day
            mois = self.selectionDates[0].month - 1
            annee = self.selectionDates[0].year
            date = wx.DateTime()
            date.Set(jour, mois, annee)
            self.date_debut.SetValue(date)

        if self.selectionDates[1] != None:
            jour = self.selectionDates[1].day
            mois = self.selectionDates[1].month - 1
            annee = self.selectionDates[1].year
            date = wx.DateTime()
            date.Set(jour, mois, annee)
            self.date_fin.SetValue(date)
Beispiel #28
0
 def __init__(self, parent):
     DatePickerCtrl.__init__(self, parent, -1, style=DP_DROPDOWN)
     self.parent = parent
Beispiel #29
0
class DataBaseManagement(scrolled.ScrolledPanel):
    def __init__(self, parent, statusbar):
        scrolled.ScrolledPanel.__init__(self, parent)
        self.statusbar = statusbar
        self.parent = parent

        if _platform == "linux" or _platform == "linux2":
            size_StaticBox = (950, 140)
            size_combobox = (130, -1)
            font = wx.Font(10, wx.DEFAULT, wx.ITALIC, wx.BOLD)
            font_combobox = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL,
                                    False, u'Arial')
            font_TextCtrl = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL,
                                    False, u'Arial')
            vStatictextsize = 16
            size_text = (85, 22)
        elif _platform == "win32":
            size_StaticBox = (960, 140)
            size_combobox = (130, -1)
            font = wx.Font(9, wx.DEFAULT, wx.ITALIC, wx.BOLD)
            font_combobox = wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False,
                                    u'Arial')
            font_TextCtrl = wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False,
                                    u'Arial')
            vStatictextsize = 16
            size_text = (85, 22)
        elif _platform == 'darwin':
            size_StaticBox = (980, 140)
            size_combobox = (130, -1)
            font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.BOLD)
            font_combobox = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL,
                                    False, u'Arial')
            font_TextCtrl = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL,
                                    False, u'Arial')
            vStatictextsize = 18
            size_text = (85, 22)

        flagSizer = wx.ALL | wx.ALIGN_CENTER_VERTICAL
        """Action box"""
        action_box = wx.StaticBox(self,
                                  -1,
                                  " Select your action ",
                                  size=size_StaticBox)
        action_box.SetFont(font)
        action_box_sizer = wx.StaticBoxSizer(action_box, wx.VERTICAL)
        in_action_box_sizer = wx.GridBagSizer(hgap=2, vgap=0)

        label_1 = b"Show selected data"
        label_2 = b"Delete some data"

        self.rb1 = wx.RadioButton(self, label=label_1, style=wx.RB_GROUP)
        self.rb2 = wx.RadioButton(self, label=label_2)

        self.rb1.Bind(wx.EVT_RADIOBUTTON, self.on_set_val)
        self.rb2.Bind(wx.EVT_RADIOBUTTON, self.on_set_val)
        self.state = [True, False]
        self.rb1.SetValue(True)

        in_action_box_sizer.Add(self.rb1, pos=(0, 0), flag=flagSizer)
        in_action_box_sizer.Add(self.rb2, pos=(2, 0), flag=flagSizer)
        action_box_sizer.Add(in_action_box_sizer, 0, wx.ALL, 5)
        """ Id part """
        self.search_Id = wx.NewId()
        self.cb_name_Id = wx.NewId()
        self.name_Id = wx.NewId()
        self.cb_crystal_Id = wx.NewId()
        self.crystal_Id = wx.NewId()
        self.cb_geom_Id = wx.NewId()
        self.geom_Id = wx.NewId()
        self.cb_model_Id = wx.NewId()
        self.model_Id = wx.NewId()
        self.cb_date_Id = wx.NewId()
        self.date_Id = wx.NewId()

        self.Id_cb_list = [
            self.cb_name_Id, self.cb_crystal_Id, self.cb_geom_Id,
            self.cb_model_Id, self.cb_date_Id
        ]
        self.Id_combo_list = [
            self.name_Id, self.crystal_Id, self.geom_Id, self.model_Id
        ]

        cb_name = wx.CheckBox(self,
                              id=self.cb_name_Id,
                              label='Name',
                              pos=(20, 20))
        cb_name.SetValue(False)
        cb_name.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        name_choice = ["None"]
        self.name = wx.ComboBox(self,
                                id=self.name_Id,
                                pos=(50, 30),
                                choices=name_choice,
                                style=wx.CB_READONLY,
                                size=size_combobox)
        self.name.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.name)

        cb_crystal = wx.CheckBox(self,
                                 id=self.cb_crystal_Id,
                                 label='Crystal',
                                 pos=(20, 20))
        cb_crystal.SetValue(False)
        cb_crystal.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        crystal_choice = ["None"]
        self.crystal = wx.ComboBox(self,
                                   id=self.crystal_Id,
                                   pos=(50, 30),
                                   choices=crystal_choice,
                                   style=wx.CB_READONLY,
                                   size=size_combobox)
        self.crystal.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.crystal)

        cb_geom = wx.CheckBox(self,
                              id=self.cb_geom_Id,
                              label='Geometry',
                              pos=(20, 20))
        cb_geom.SetValue(False)
        cb_geom.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        geom_choice = ["None"]
        self.geom = wx.ComboBox(self,
                                id=self.geom_Id,
                                pos=(50, 30),
                                choices=geom_choice,
                                style=wx.CB_READONLY,
                                size=size_combobox)
        self.geom.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.geom)

        cb_model = wx.CheckBox(self,
                               id=self.cb_model_Id,
                               label='Model',
                               pos=(20, 20))
        cb_model.SetValue(False)
        cb_model.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        model_choice = ["None"]
        self.model = wx.ComboBox(self,
                                 id=self.model_Id,
                                 pos=(50, 30),
                                 choices=model_choice,
                                 style=wx.CB_READONLY,
                                 size=size_combobox)
        self.model.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.model)

        cb_date = wx.CheckBox(self,
                              id=self.cb_date_Id,
                              label='Date',
                              pos=(20, 20))
        cb_date.SetValue(False)
        cb_date.Bind(wx.EVT_CHECKBOX, self.un_check_choice)
        now = wx.DateTime().Today()
        self.dpc_1 = DatePickerCtrl(self,
                                    size=(120, -1),
                                    style=DP_DROPDOWN | DP_SHOWCENTURY
                                    | DP_ALLOWNONE)
        self.dpc_2 = DatePickerCtrl(self,
                                    size=(120, -1),
                                    style=DP_DROPDOWN | DP_SHOWCENTURY
                                    | DP_ALLOWNONE)
        self.Bind(EVT_DATE_CHANGED, self.on_select_combobox, self.dpc_1)
        self.Bind(EVT_DATE_CHANGED, self.on_select_combobox, self.dpc_2)
        self.dpc_1.SetValue(now)
        self.dpc_2.SetValue(now)

        date_choice = ["None"]
        self.date = wx.ComboBox(self,
                                id=self.date_Id,
                                pos=(50, 30),
                                choices=date_choice,
                                style=wx.CB_READONLY,
                                size=size_combobox)
        self.date.SetFont(font_combobox)
        self.Bind(wx.EVT_COMBOBOX, self.on_select_combobox, self.date)

        self.search_btn = wx.Button(self, id=self.search_Id, label=" Search")
        self.search_btn.Bind(wx.EVT_BUTTON, self.on_search_in_DB)

        txt_db = u'DataBase number of lines:'
        db_nb_lines_txt = wx.StaticText(self,
                                        -1,
                                        label=txt_db,
                                        size=(180, vStatictextsize))
        self.db_nb_lines = wx.TextCtrl(self,
                                       style=wx.TE_PROCESS_ENTER,
                                       size=size_text,
                                       validator=TextValidator(DIGIT_ONLY))
        self.db_nb_lines.SetFont(font_TextCtrl)
        self.db_nb_lines.SetValue(str(100))
        P4Rm.db_nb_line = 100

        bmp = _bp_btn2.GetBitmap()
        self.nb_lines_btn = wx.BitmapButton(self, -1, bmp)
        self.nb_lines_btn.SetToolTip("Update database list")
        # self.nb_lines_btn.SetToolTipString("Update database list")
        self.Bind(wx.EVT_BUTTON,
                  self.nb_lines_DB,
                  id=self.nb_lines_btn.GetId())
        self.Bind(wx.EVT_TEXT_ENTER, self.nb_lines_DB, self.db_nb_lines)

        self.cb_list = [cb_name, cb_crystal, cb_geom, cb_model, cb_date]

        self.combo_list = [
            self.name, self.crystal, self.geom, self.model, self.date
        ]
        for i in range(len(self.combo_list)):
            self.combo_list[i].Disable()

        mastersizer = wx.BoxSizer(wx.VERTICAL)
        DBLine = wx.BoxSizer(wx.HORIZONTAL)
        choice_sizer = wx.GridBagSizer(hgap=8, vgap=4)

        DBLine.Add(db_nb_lines_txt, 0, flag=flagSizer)
        DBLine.Add(self.db_nb_lines, 0, flag=flagSizer)
        DBLine.Add(self.nb_lines_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)

        choice_sizer.Add(cb_name, pos=(0, 0), flag=flagSizer)
        choice_sizer.Add(self.name, pos=(0, 1), flag=flagSizer)

        choice_sizer.Add(cb_crystal, pos=(1, 0), flag=flagSizer)
        choice_sizer.Add(self.crystal, pos=(1, 1), flag=flagSizer)

        choice_sizer.Add(cb_geom, pos=(2, 0), flag=flagSizer)
        choice_sizer.Add(self.geom, pos=(2, 1), flag=flagSizer)

        choice_sizer.Add(cb_model, pos=(3, 0), flag=flagSizer)
        choice_sizer.Add(self.model, pos=(3, 1), flag=flagSizer)

        choice_sizer.Add(cb_date, pos=(4, 0), flag=flagSizer)
        choice_sizer.Add(self.date, pos=(4, 1), flag=flagSizer)
        choice_sizer.Add(self.dpc_1, pos=(4, 2), flag=flagSizer)
        choice_sizer.Add(self.dpc_2, pos=(4, 3), flag=flagSizer)

        choice_sizer.Add(self.search_btn, pos=(6, 0), flag=flagSizer)

        mastersizer.Add(action_box_sizer, 0, wx.ALL, 5)
        mastersizer.Add(DBLine, 0, wx.ALL, 10)
        mastersizer.Add(choice_sizer, 0, wx.ALL, 10)

        pub.subscribe(self.on_delete_data, pubsub_sup_data_DB)
        pub.subscribe(self.on_add_new_name_to_combobox,
                      pubsub_refill_list_name_DB)
        pub.subscribe(self.on_search_in_DB, pubsub_search_combobox_DB)

        self.SetSizer(mastersizer)
        self.Layout()
        self.SetAutoLayout(1)
        self.SetupScrolling()
        self.on_fill_combobox()

    def on_set_val(self, event):
        self.state = []
        state1 = self.rb1.GetValue()
        state2 = self.rb2.GetValue()
        self.state = [state1, state2]

    def on_fill_combobox(self):
        a = P4Rm()
        choice_list = []
        c = DataBaseUse()
        c.on_read_part_DB()

        if P4Rm.DBDict['name']:
            choice_list.append(a.DBDict['name'])
        else:
            choice_list.append(["List empty"])
        choice_list.append(a.crystal_list)
        choice_list.append(p4R.sample_geometry)
        choice_list.append(p4R.Strain_DW_choice)
        choice_list.append(["equal", "=<", ">=", "between"])

        for i in range(len(self.combo_list)):
            self.combo_list[i].SetItems(choice_list[i])
            self.combo_list[i].SetStringSelection(choice_list[i][0])

        self.dpc_1.Hide()
        self.dpc_2.Hide()

    def on_add_new_name_to_combobox(self):
        a = P4Rm()
        if not a.PathDict['project_name'] in a.DBDict['name']:
            c = DataBaseUse()
            c.on_read_part_DB()
            self.name.SetItems(a.DBDict['name'])
            self.name.SetStringSelection(a.DBDict['name'][0])
            self.Layout()
            self.SetAutoLayout(1)

    def un_check_choice(self, event):
        widget = event.GetId()
        isChecked = event.GetEventObject().GetValue()
        indexx = self.Id_cb_list.index(widget)
        if isChecked:
            self.combo_list[indexx].Enable()
        else:
            self.combo_list[indexx].Disable()
        if widget == self.cb_date_Id:
            if isChecked:
                self.dpc_1.Show()
                if self.date.GetStringSelection() == 'between':
                    self.dpc_2.Show()
            else:
                self.dpc_1.Hide()
                self.dpc_2.Hide()

    def on_select_combobox(self, event):
        widget = event.GetId()
        val = event.GetString()
        if widget == self.date_Id:
            if val == 'between':
                self.dpc_2.Show()
            else:
                self.dpc_2.Hide()

    def nb_lines_DB(self, event):
        obj = self.db_nb_lines.GetValue()
        P4Rm.db_nb_line = int(obj)
        pub.sendMessage(pubsub_update_db_nb_line)

    def on_search_in_DB(self, event=None):
        list_temp = []
        P4Rm.DBDict['choice_state'] = self.rb1.GetValue()
        for i in range(len(self.cb_list)):
            if self.cb_list[i].IsChecked():
                list_temp.append(self.combo_list[i].GetStringSelection())
            else:
                list_temp.append(None)
        P4Rm.DBDict['choice_combo'] = list_temp
        if self.cb_list[-1].IsChecked():
            P4Rm.DBDict['date_1'] = '{:%Y-%m-%d %H:%M:%S}'.format(
                wxdate2pydate(self.dpc_1.GetValue()))
            P4Rm.DBDict['date_2'] = '{:%Y-%m-%d %H:%M:%S}'.format(
                wxdate2pydate(self.dpc_2.GetValue()))
        c = DataBaseUse()
        c.on_search_in_DB()

    def on_delete_data(self):
        a = P4Rm()
        _msg = "Do you really want to delete these datas?"
        dlg = GMD.GenericMessageDialog(None,
                                       _msg,
                                       "Confirm Suppression",
                                       agwStyle=wx.OK | wx.CANCEL
                                       | wx.ICON_QUESTION)
        result = dlg.ShowModal()
        dlg.Destroy()
        if result == wx.ID_OK:
            c = DataBaseUse()
            c.on_delete_data()
            self.on_fill_combobox()
            state1 = self.rb1.SetValue(True)
            state2 = self.rb2.SetValue(False)
            self.state = [state1, state2]
            for i in range(len(self.cb_list)):
                self.cb_list[i].SetValue(False)
                self.combo_list[i].Disable()
            empty = a.DBDict['session'].query(RadMaxData).first()
            if empty is None:
                s = a.DBDict['session'].query(RadMaxData).order_by(
                    RadMaxData.id)
                c.on_read_database_and_fill_list(s)
            else:
                self.on_search_in_DB()
Beispiel #30
0
class SaisieRemboursement(wx.Dialog):
    """ Saisie d'un remboursement pour les frais de déplacement """
    def __init__(self,
                 parent,
                 id=-1,
                 title=_(u"Saisie d'un remboursement"),
                 IDremboursement=None,
                 IDpersonne=None):
        wx.Dialog.__init__(self, parent, id, title)  #, size=(400, 450)
        self.IDremboursement = IDremboursement
        self.IDpersonne = IDpersonne

        # Généralités
        self.staticbox_generalites = wx.StaticBox(self, -1,
                                                  _(u"Caractéristiques"))

        self.label_date = wx.StaticText(self,
                                        -1,
                                        _(u"Date :"),
                                        size=(60, -1),
                                        style=wx.ALIGN_RIGHT)
        self.ctrl_date = DatePickerCtrl(self, -1, style=DP_DROPDOWN)

        self.label_montant = wx.StaticText(self,
                                           -1,
                                           _(u"Montant :"),
                                           size=(60, -1),
                                           style=wx.ALIGN_RIGHT)
        self.ctrl_montant = wx.TextCtrl(
            self,
            -1,
            u"",
            size=(50, -1),
        )
        self.label_euro_montant = wx.StaticText(self, -1, u"¤")

        self.label_utilisateur = wx.StaticText(self,
                                               -1,
                                               _(u"Utilisateur :"),
                                               size=(60, -1),
                                               style=wx.ALIGN_RIGHT)
        self.ImportationPersonnes()
        self.ctrl_utilisateur = AdvancedComboBox(self,
                                                 "",
                                                 size=(100, -1),
                                                 choices=self.listePersonnes)

        # Déplacements
        self.staticbox_deplacements = wx.StaticBox(
            self, -1, _(u"Déplacements rattachés"))

        self.label_rattachement = wx.StaticText(self, -1, u"", size=(-1, -1))
        self.ctrl_deplacements = ListCtrl_deplacements(
            self,
            size=(-1, 200),
            IDremboursement=IDremboursement,
            IDpersonne=self.IDpersonne)

        # Boutons
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self,
            id=wx.ID_CANCEL,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))
        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))

        # IDpersonne :
        if self.IDpersonne != None:
            self.SetPersonne(self.IDpersonne)
        # Si c'est une modification :
        if self.IDremboursement != None:
            self.SetTitle(_(u"Modification d'un remboursement"))
            self.Importation()
        # Cache le controle utilisateur :
        if self.IDpersonne != None:
            self.label_utilisateur.Show(False)
            self.ctrl_utilisateur.Show(False)
            self.SetSize((-1, 415))

        self.__set_properties()
        self.__do_layout()

        # Binds
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.ctrl_montant.Bind(wx.EVT_KILL_FOCUS, self.montant_EvtKillFocus)

    def __set_properties(self):
        self.bouton_ok.SetSize(self.bouton_ok.GetBestSize())
        self.bouton_annuler.SetSize(self.bouton_annuler.GetBestSize())
        self.bouton_aide.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide")))
        self.bouton_ok.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour valider")))
        self.bouton_annuler.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour annuler la saisie")))
        self.ctrl_date.SetToolTip(
            wx.ToolTip(_(u"Sélectionnez ici la date du déplacement")))
        self.ctrl_utilisateur.SetToolTip(
            wx.ToolTip(
                _(u"Sélectionnez ici l'utilisateur pour ce déplacement")))


##        self.ctrl_objet.SetToolTip(wx.ToolTip(_(u"Saisissez ici l'objet du déplacement. Ex : réunion, formation, etc...")))
##        self.ctrl_cp_depart.SetToolTip(wx.ToolTip(_(u"Saisissez ici le code postal de la ville de départ")))
##        self.ctrl_ville_depart.SetToolTip(wx.ToolTip(_(u"Saisissez ici le nom de la ville de départ")))
##        self.ctrl_cp_arrivee.SetToolTip(wx.ToolTip(_(u"Saisissez ici le code postal de la ville d'arrivée")))
##        self.ctrl_ville_arrivee.SetToolTip(wx.ToolTip(_(u"Saisissez ici le nom de la ville d'arrivée")))
##        self.ctrl_distance.SetToolTip(wx.ToolTip(_(u"Saisissez ici la distance en Km entre les 2 villes sélectionnées.\nSi Teamworks la connait, il l'indiquera automatiquement.")))
##        self.ctrl_aller_retour.SetToolTip(wx.ToolTip(_(u"Cochez cette case si le déplacement a fait l'objet d'un aller/retour.\nLa distance sera ainsi doublée.")))
##        self.ctrl_tarif.SetToolTip(wx.ToolTip(_(u"Saisissez ici le montant du tarif du Km pour permettre calculer le montant du remboursement pour ce déplacement.")))
##        self.bouton_options_depart.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour rechercher une ville ou pour saisir manuellement une ville non présente dans la base de données du logiciel")))
##        self.bouton_options_arrivee.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour rechercher une ville ou pour saisir manuellement une ville non présente dans la base de données du logiciel")))

    def __do_layout(self):
        grid_sizer_base = wx.FlexGridSizer(rows=3, cols=1, vgap=10, hgap=10)

        # Généralités
        sizerStaticBox_generalites = wx.StaticBoxSizer(
            self.staticbox_generalites, wx.HORIZONTAL)
        grid_sizer_generalites = wx.FlexGridSizer(rows=3,
                                                  cols=2,
                                                  vgap=10,
                                                  hgap=10)

        grid_sizer_generalites.Add(self.label_date, 0,
                                   wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)

        sizer_generalites = wx.FlexGridSizer(rows=1, cols=5, vgap=5, hgap=5)
        sizer_generalites.Add(self.ctrl_date, 0, wx.ALL, 0)
        sizer_generalites.Add((20, 5), 0, wx.ALL, 0)
        sizer_generalites.Add(self.label_montant, 0,
                              wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        sizer_generalites.Add(self.ctrl_montant, 1, wx.EXPAND | wx.ALL, 0)
        sizer_generalites.Add(self.label_euro_montant, 0,
                              wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        grid_sizer_generalites.Add(sizer_generalites, 1, wx.EXPAND | wx.ALL, 0)

        grid_sizer_generalites.Add(self.label_utilisateur, 0,
                                   wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0)
        grid_sizer_generalites.Add(self.ctrl_utilisateur, 1,
                                   wx.EXPAND | wx.ALL, 0)

        grid_sizer_generalites.AddGrowableCol(1)
        sizerStaticBox_generalites.Add(grid_sizer_generalites, 1,
                                       wx.EXPAND | wx.ALL, 5)
        grid_sizer_base.Add(sizerStaticBox_generalites, 0,
                            wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 10)

        # Déplacements
        sizerStaticBox_deplacements = wx.StaticBoxSizer(
            self.staticbox_deplacements, wx.HORIZONTAL)
        grid_sizer_deplacements = wx.FlexGridSizer(rows=2,
                                                   cols=1,
                                                   vgap=10,
                                                   hgap=10)

        grid_sizer_deplacements.Add(self.ctrl_deplacements, 1,
                                    wx.EXPAND | wx.ALL, 0)
        grid_sizer_deplacements.Add(self.label_rattachement, 1,
                                    wx.EXPAND | wx.ALL, 0)

        grid_sizer_deplacements.AddGrowableRow(0)
        grid_sizer_deplacements.AddGrowableCol(0)
        sizerStaticBox_deplacements.Add(grid_sizer_deplacements, 1,
                                        wx.EXPAND | wx.ALL, 5)
        grid_sizer_base.Add(sizerStaticBox_deplacements, 0,
                            wx.EXPAND | wx.LEFT | wx.RIGHT, 10)

        # Boutons
        grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10)
        grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0)
        grid_sizer_boutons.Add((20, 20), 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0)
        grid_sizer_boutons.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_boutons, 1, wx.ALL | wx.EXPAND, 10)

        self.SetSizer(grid_sizer_base)
        grid_sizer_base.AddGrowableCol(0)
        grid_sizer_base.Fit(self)
        self.Layout()
        self.CenterOnScreen()

    def ImportationPersonnes(self):
        """ Importation de la liste des personnes """
        # Récupération de la liste des personnes
        DB = GestionDB.DB()
        req = """SELECT IDpersonne, nom, prenom FROM personnes ORDER BY nom, prenom; """
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        # Création de la liste pour le listBox
        self.listePersonnes = []
        self.dictPersonnes = {}
        index = 0
        for IDpersonne, nom, prenom in listeDonnees:
            self.listePersonnes.append(nom + " " + prenom)
            self.dictPersonnes[index] = IDpersonne
            index += 1

    def Importation(self):
        """ Importation des données si c'est une modification de déplacement """

        # Récupération des données du déplacement
        DB = GestionDB.DB()
        req = """SELECT IDremboursement, IDpersonne, date, montant, listeIDdeplacement FROM remboursements WHERE IDremboursement=%d; """ % self.IDremboursement
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        DB.Close()
        if len(listeDonnees) == 0: return

        # Intégration des données dans le formulaire
        self.IDpersonne = listeDonnees[0][1]
        self.SetPersonne(self.IDpersonne)
        date = listeDonnees[0][2]
        self.SetDate(
            datetime.date(year=int(date[:4]),
                          month=int(date[5:7]),
                          day=int(date[8:10])))
        self.ctrl_montant.SetValue(str(listeDonnees[0][3]))
        # MAJ de l'affichage
        self.MajIDpersonne()
        self.MajLabelRattachement(float(self.ctrl_montant.GetValue()))

    def SetRemboursement(self, IDremboursement=None):
        """ Définit le remboursement """
        if IDremboursement == None or IDremboursement == 0 or IDremboursement == "":
            self.ctrl_remboursement.SetLabel("Aucun remboursement.")
        else:
            # Recherche date du remboursement
            DB = GestionDB.DB()
            req = """SELECT date FROM remboursements WHERE IDremboursement=%d; """ % IDremboursement
            DB.ExecuterReq(req)
            listeDonnees = DB.ResultatReq()
            DB.Close()
            dateRemboursement = self.DateEngFr(listeDonnees[0][0])
            self.ctrl_remboursement.SetLabel("N°" + str(IDremboursement) +
                                             " du " + dateRemboursement)

    def DateEngFr(self, textDate):
        text = str(textDate[8:10]) + "/" + str(textDate[5:7]) + "/" + str(
            textDate[:4])
        return text

    def SetAllerRetour(self, etat=False):
        """ Définit l'aller retour """
        self.ctrl_aller_retour.SetValue(etat)
        if etat == False:
            self.label_km.SetLabel("Km  (Aller simple)")
        else:
            self.label_km.SetLabel("Km  (Aller/retour)")

    def CalcMontantRmbst(self):
        if self.ValideControleFloat(self.ctrl_distance) == False: return
        if self.ValideControleFloat(self.ctrl_tarif) == False: return
        distance = float(self.ctrl_distance.GetValue())
        tarif = float(self.ctrl_tarif.GetValue())
        montant = distance * tarif
        self.ctrl_montant.SetLabel(u"%.2f ¤" % montant)

    def montant_EvtKillFocus(self, event):
        # Vérifie la validité de la valeur
        if self.ValideControleFloat(self.ctrl_montant) == False:
            dlg = wx.MessageDialog(
                self,
                _(u"Le montant n'est pas valide. \nIl doit être sous la forme '1.32' ou '100.50' par exemple..."
                  ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_deplacements.Enable(False)
            self.ctrl_montant.SetFocus()
            return
        # Met à jour le montant dans le listCtrl
        if self.ctrl_utilisateur.GetCurrentSelection() != -1:
            self.MajLabelRattachement(float(self.ctrl_montant.GetValue()))

    def MajIDpersonne(self):
        """ Quand l'utilisateur est mis à jour """
        self.IDpersonne = self.GetPersonne()
        self.ctrl_deplacements.IDpersonne = self.IDpersonne
        self.ctrl_deplacements.MAJListeCtrl()

    def MajLabelRattachement(self, montant=None):
        # Met à jour le montant dans le listCtrl
        if montant != None:
            self.ctrl_deplacements.montantRemboursement = montant
        self.ctrl_deplacements.MajLabelRattachement()

    def ValideControleFloat(self, controle=None):
        """ Vérifie la validité d'un contrôle de type Float """
        valeur = controle.GetValue()
        if valeur == "": return True
        # Vérifie que la valeur est bien constituée de chiffres uniquement
        incoherences = ""
        for lettre in valeur:
            if lettre not in "0123456789.":
                incoherences += "'" + lettre + "', "
        if len(incoherences) != 0:
            return False
        else:
            try:
                test = float(valeur)
            except:
                return False
            return True

    def MajDistance(self):
        """ Met à jour le Contrôle Distance en fonction des villes saisies """
        depart = (self.ctrl_cp_depart.GetValue(),
                  self.ctrl_ville_depart.GetValue())
        arrivee = (self.ctrl_cp_arrivee.GetValue(),
                   self.ctrl_ville_arrivee.GetValue())

        for IDdistance, cp_depart, ville_depart, cp_arrivee, ville_arrivee, distance in self.listeDistances:
            depart_temp = (str(cp_depart), ville_depart)
            arrivee_temp = (str(cp_arrivee), ville_arrivee)
            if (depart == depart_temp and arrivee == arrivee_temp) or (
                    depart == arrivee_temp and arrivee == depart_temp):
                if self.ctrl_aller_retour.GetValue() == True:
                    self.ctrl_distance.SetValue(str(distance * 2))
                else:
                    self.ctrl_distance.SetValue(str(distance))
                break

    def GetPersonne(self):
        """ Récupère l'IDpersonne du comboBox """
        index = self.ctrl_utilisateur.GetCurrentSelection()
        if index == -1: return None
        IDpersonne = self.dictPersonnes[index]
        return IDpersonne

    def SetPersonne(self, IDpersonne=None):
        # Recherche de l'index dans le dictPersonnes
        for index, IDpers in self.dictPersonnes.items():
            if IDpersonne == IDpers:
                self.ctrl_utilisateur.Select(index)
                break

    def SetDate(self, date):
        """ Saisi une date au format datetime dans le datepicker """
        self.SetDatePicker(self.ctrl_date, date)

    def SetDatePicker(self, controle, date):
        """ Met une date au format datetime dans un datePicker donné """
        annee = int(date.year)
        mois = int(date.month) - 1
        jour = int(date.day)
        date = wx.DateTime()
        date.Set(jour, mois, annee)
        controle.SetValue(date)

    def GetDatePickerValue(self, controle):
        """ Renvoie la date au format datetime d'un datePicker """
        date_tmp = controle.GetValue()
        return datetime.date(date_tmp.GetYear(),
                             date_tmp.GetMonth() + 1, date_tmp.GetDay())

    def OnBoutonAide(self, event):
        """ Aide """
        from Utils import UTILS_Aide
        UTILS_Aide.Aide("Enregistrerunremboursement")

    def OnBoutonOk(self, event):
        """ Validation des données saisies """

        # Vérifie contrôle Utilisateur
        valeur = self.ctrl_utilisateur.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement sélectionner un utilisateur."),
                "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_utilisateur.SetFocus()
            return

        # Vérifie contrôle montant
        valeur = self.ctrl_montant.GetValue()
        if valeur == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement saisir un montant en euros pour ce remboursement."
                  ), "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_montant.SetFocus()
            return

        if self.ValideControleFloat(self.ctrl_montant) == False:
            dlg = wx.MessageDialog(
                self,
                _(u"Le montant saisi n'est pas valide \nIl doit être sous la forme '32.50' ou '54' par exemple..."
                  ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_montant.SetFocus()
            return

        if float(valeur) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Le montant que vous avez saisi est de 0 ¤\n\nSouhaitez-vous conserver ce montant ?\n(Cliquez sur 'Non' ou 'Annuler' pour modifier maintenant le montant)"
                  ), _(u"Erreur de saisie"),
                wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION)
            reponse = dlg.ShowModal()
            if reponse == wx.ID_NO or reponse == wx.ID_CANCEL:
                dlg.Destroy()
                self.ctrl_montant.SetFocus()
                return
            else:
                dlg.Destroy()

        # Vérifie contrôle déplacements
        listeIDcoches, listeIDdecoches = self.ctrl_deplacements.ListeItemsCoches(
        )

        if len(listeIDcoches) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous n'avez coché aucun déplacement dans la liste.\n\nSouhaitez-vous quand même valider ?\n(Cliquez sur 'Non' ou 'Annuler' pour cocher maintenant des déplacements)"
                  ), _(u"Erreur de saisie"),
                wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION)
            reponse = dlg.ShowModal()
            if reponse == wx.ID_NO or reponse == wx.ID_CANCEL:
                dlg.Destroy()
                return
            else:
                dlg.Destroy()

        # Sauvegarde
        self.Sauvegarde()

        # Ferme la boîte de dialogue
        self.EndModal(wx.ID_OK)

    def Sauvegarde(self):
        """ Sauvegarde des données """
        # Récupération des valeurs saisies
        date = str(self.GetDatePickerValue(self.ctrl_date))
        IDpersonne = self.dictPersonnes[
            self.ctrl_utilisateur.GetCurrentSelection()]
        montant = float(self.ctrl_montant.GetValue())
        # Récupération des déplacements cochés
        listeIDcoches, listeIDdecoches = self.ctrl_deplacements.ListeItemsCoches(
        )
        texteID = ""
        if len(listeIDcoches) != 0:
            for ID in listeIDcoches:
                texteID += str(ID) + "-"
            texteID = texteID[:-1]

        DB = GestionDB.DB()
        # Création de la liste des données
        listeDonnees = [
            ("date", date),
            ("IDpersonne", IDpersonne),
            ("montant", montant),
            ("listeIDdeplacement", texteID),
        ]
        if self.IDremboursement == None:
            # Enregistrement d'un nouveau remboursement
            newID = DB.ReqInsert("remboursements", listeDonnees)
            ID = newID
        else:
            # Modification du remboursement
            DB.ReqMAJ("remboursements", listeDonnees, "IDremboursement",
                      self.IDremboursement)
            ID = self.IDremboursement
        DB.Commit()
        DB.Close()

        #
        # Modification du IDdeplacement de chaque déplacement rattaché
        #
        DB = GestionDB.DB()
        # Création de la liste des données
        for IDdeplacement in listeIDcoches:
            listeDonnees = [
                ("IDremboursement", ID),
            ]
            DB.ReqMAJ("deplacements", listeDonnees, "IDdeplacement",
                      IDdeplacement)
        # Décoche les autres items
        for IDdeplacement in listeIDdecoches:
            listeDonnees = [
                ("IDremboursement", 0),
            ]
            DB.ReqMAJ("deplacements", listeDonnees, "IDdeplacement",
                      IDdeplacement)
        DB.Commit()
        DB.Close()

        return ID
Beispiel #31
0
 def __init__(self, parent):
     DatePickerCtrl.__init__(self, parent, -1, style=DP_DROPDOWN)
     self.parent = parent
     self.Bind(EVT_DATE_CHANGED, self.OnDateChanged)
     self.Bind(wx.EVT_CHILD_FOCUS, self.OnFocus)
Beispiel #32
0
    def __init__(self, parent):
        super(AppointmentPickerPanel, self).__init__(parent,
                                                     style=wx.LB_BOTTOM,
                                                     size=(1000, 600))
        self.appointmentBookCtrl = AppointmentBookCtrl(self)
        title_lbl = wx.StaticText(self, label="Appointment date")
        font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL)
        title_lbl.SetFont(font)

        text = ""
        makeModelLbl = wx.StaticText(self, -1, "Date:")
        self.date = DatePickerCtrl(self,
                                   size=(100, -1),
                                   style=DatePickerCtrl.DP_DROPDOWN
                                   | DatePickerCtrl.DP_SHOWCENTURY)

        serialNoLbl = wx.StaticText(self, -1, "Time:")

        timeSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.hour = wx.SpinCtrl(self,
                                -1,
                                "",
                                size=(40, 23),
                                min=0,
                                max=23,
                                initial=9)
        hourLbl = wx.StaticText(self, -1, " hour ")
        self.min = wx.SpinCtrl(self,
                               -1,
                               "",
                               size=(40, 23),
                               min=0,
                               max=59,
                               initial=30)
        minLbl = wx.StaticText(self, -1, " min")
        self.amRadio = wx.RadioButton(self, -1, "am")
        self.pmRadio = wx.RadioButton(self, -1, "pm")
        timeSizer.Add(self.hour)
        timeSizer.Add(hourLbl)
        timeSizer.Add(self.min)
        timeSizer.Add(minLbl)
        timeSizer.Add(self.amRadio)
        timeSizer.Add(self.pmRadio)

        grpSizer = wx.GridBagSizer(vgap=8, hgap=8)
        grpSizer.Add(makeModelLbl, (1, 1))
        grpSizer.Add(self.date, (1, 2))

        grpSizer.Add(serialNoLbl, (2, 1))
        grpSizer.Add(timeSizer, (2, 2))

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(title_lbl, 0, wx.ALL, 5)
        mainSizer.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.TOP | wx.BOTTOM,
                      5)

        listSizer = wx.GridBagSizer(vgap=2, hgap=2)
        listSizer.Add(self.appointmentBookCtrl, (1, 1))
        mainSizer.Add(grpSizer, 0, wx.EXPAND | wx.ALL, 10)
        mainSizer.Add(listSizer, 0, wx.EXPAND | wx.ALL, 10)
        self.SetSizer(mainSizer)

        self.hour.Bind(wx.EVT_TEXT, self.OnText)
        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnClicked)