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)
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)
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
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)
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)
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 __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)
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 __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()
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()
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()
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()
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
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 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)
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()
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
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 __init__(self, parent): DatePickerCtrl.__init__(self, parent, -1, style=DP_DROPDOWN) self.parent = parent
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()
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
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)
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)