source: holiday-manager/trunk/fuentes/holiday-manager/python3-holidaymanager/HolidayBox.py @ 7269

Last change on this file since 7269 was 7269, checked in by jrpelegrina, 2 years ago

Fix code

File size: 18.9 KB
Line 
1#!/usr/bin/env python3
2
3
4import gi
5gi.require_version('Gtk', '3.0')
6from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib,Gdk
7
8from . import HolidayManager
9from . import settings
10import gettext
11gettext.textdomain(settings.TEXT_DOMAIN)
12_ = gettext.gettext
13
14
15import signal
16import os
17import xmlrpc.client as n4dclient
18import ssl
19from datetime import datetime, date,timedelta
20
21
22class HolidayBox(Gtk.Box):
23
24        def __init__(self,app_name):
25               
26                Gtk.Box.__init__(self)
27
28                self.credentials=[]
29                server='localhost'
30                context=ssl._create_unverified_context()
31                self.n4d_holiday = n4dclient.ServerProxy("https://"+server+":9779",context=context,allow_none=True)
32                self.app_name=app_name
33                self.holidayManager=HolidayManager.HolidayManager()
34                self.render_form()
35
36        #def __init__
37
38        def render_form(self):
39       
40                builder=Gtk.Builder()
41                builder.set_translation_domain(settings.TEXT_DOMAIN)
42                ui_path=settings.RSRC_DIR + "/holiday-manager.ui"
43                builder.add_from_file(ui_path) 
44
45                self.css_file=settings.RSRC_DIR+"/holiday-manager.css"
46
47                self.main_box=builder.get_object("holiday_box")
48                self.edit_data_window=builder.get_object("edit_data_window")
49                self.holiday_calendar=builder.get_object("calendar")
50                self.single_day_rb=builder.get_object("single_day_rb")
51                self.single_day_entry=builder.get_object("single_day_entry")
52                self.range_day_rb=builder.get_object("range_day_rb")
53                self.range_day1_entry=builder.get_object("range_day1_entry")
54                self.range_day2_entry=builder.get_object("range_day2_entry")
55                self.remove_range_button=builder.get_object("remove_range_button")
56                self.coment_day_entry=builder.get_object("day_comment_entry")
57                self.add_day_button=builder.get_object("add_day_button")
58                self.edit_message_label=builder.get_object("edit_message_label")
59                self.save_day_button=builder.get_object("save_day_button")
60                self.cancel_day_button=builder.get_object("cancel_day_button")
61       
62                self.listdays_tv=builder.get_object("listday_treeview")
63                self.listdays_store=Gtk.ListStore(str,str,str,str,str)
64                self.listdays_tv.set_model(self.listdays_store)
65
66
67                column=Gtk.TreeViewColumn(_("Date"))
68                cell=Gtk.CellRendererText()
69                column.pack_start(cell,True)
70                column.add_attribute(cell,"markup",0)
71                column.add_attribute(cell,"cell_background",4)
72                column.set_expand(False)
73                column.set_property("fixed-width",200)
74                self.listdays_tv.append_column(column)
75                self.listdays_tv.connect("button-release-event",self.day_clicked)
76
77                column=Gtk.TreeViewColumn(_("Comment"))
78                cell=Gtk.CellRendererText()
79                column.pack_start(cell,False)
80                column.add_attribute(cell,"markup",1)
81                column.add_attribute(cell,"cell_background",4)
82                #column.set_property("fixed-width",300)
83                column.set_expand(True)
84                self.listdays_tv.append_column(column)
85
86                column=Gtk.TreeViewColumn("")
87                cell=Gtk.CellRendererPixbuf()
88                cell.set_property("stock-size",Gtk.IconSize.BUTTON)
89                column.set_expand(False)
90                column.pack_start(cell,False)
91                column.add_attribute(cell,"icon-name",2)
92                column.add_attribute(cell,"cell_background",4)
93                column.set_property("fixed-width",50)
94                self.listdays_tv.append_column(column)
95                self.col_edit=column
96
97                column=Gtk.TreeViewColumn("")
98                cell=Gtk.CellRendererPixbuf()
99                cell.set_property("stock-size",Gtk.IconSize.BUTTON)
100                column.set_expand(False)
101                column.pack_start(cell,False)
102                column.add_attribute(cell,"icon-name",3)
103                column.add_attribute(cell,"cell_background",4)
104                column.set_property("fixed-width",50)
105                self.listdays_tv.append_column(column)
106                self.col_remove=column
107
108                self.export_daylist_button=builder.get_object("export_daylist_button")
109                self.import_daylist_button=builder.get_object("import_daylist_button")
110                self.remove_daylist_button=builder.get_object("remove_daylist_button")
111                self.calendar_message=builder.get_object("calendar_message")
112
113                self.pack_start(self.main_box,True,True,0)
114                self.set_css_info()
115                self.connect_signals()
116                self.edit_data_window.hide()
117                self.init_calendar()
118                #self.clear_days=True
119                #self.day=""
120
121        #def render_form       
122
123
124        def set_css_info(self):
125               
126               
127                self.style_provider=Gtk.CssProvider()
128                f=Gio.File.new_for_path(self.css_file)
129                self.style_provider.load_from_file(f)
130                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
131                self.holiday_calendar.set_name("CALENDAR")
132
133        #def set_css_info       
134
135
136        def connect_signals(self):
137       
138                self.single_day_rb.connect("toggled",self.day_toggled_button,"singleDay")
139                self.range_day_rb.connect("toggled",self.day_toggled_button,"rangeDay")
140                self.holiday_calendar.connect("month-changed",self.month_changed)
141                self.holiday_calendar.connect("day_selected",self.day_selected)
142                self.remove_range_button.connect("clicked",self.remove_range)
143                self.add_day_button.connect("clicked",self.add_day_clicked)
144                self.save_day_button.connect("clicked",self.save_day_clicked)
145                self.cancel_day_button.connect("clicked",self.cancel_day_clicked)
146                self.export_daylist_button.connect("clicked",self.export_daylist_clicked)
147                self.import_daylist_button.connect("clicked",self.import_daylist_clicked)
148                self.remove_daylist_button.connect("clicked",self.remove_daylist_clicked)
149
150                self.edit_data_window.connect("delete_event",self.on_edit_delete_event)
151
152        #def connect_signals   
153
154        def on_edit_delete_event(self,window,event):
155
156                window.hide()
157                return True
158
159
160        #def on_edit_delete_event
161
162        def start_api_connect(self):
163
164                gettext.textdomain(settings.TEXT_DOMAIN)
165                self.init_calendar()
166                self.get_holidaylist()
167                self.calendar_message.set_text("")
168
169        #def _start_api_connect
170
171
172        def init_calendar(self):
173
174                self.range=False
175                self.clear_days=False
176                self.day=""
177                self.days_inrange=[]
178                current_date=date.today().strftime('%d/%m/%Y').split("/")
179                current_month=int(current_date[1])-1
180                current_year=int(current_date[2])
181
182                self.holiday_calendar.select_day(0)
183                self.holiday_calendar.select_month(current_month,current_year)
184                self.single_day_rb.set_active(True)
185                self.remove_range_button.set_sensitive(False)
186                self.single_day_entry.set_text("")
187                self.range_day1_entry.set_text("")
188                self.range_day2_entry.set_text("")
189                self.coment_day_entry.set_text("")
190                self.edit_day=False
191
192
193        #def init_calendar     
194               
195
196        def day_toggled_button (self,button,name):
197
198
199                if button.get_active():
200                        self.holiday_calendar.clear_marks()
201
202
203                        if name=="singleDay":
204                                self.range=False
205                                self.range_day1_entry.set_text("")
206                                self.range_day2_entry.set_text("")
207                                self.remove_range_button.set_sensitive(False)
208
209                        else:
210                                self.holiday_calendar.select_day(0)
211                                self.range=True
212                                self.remove_range_button.set_sensitive(True)
213                                self.single_day_entry.set_text("")
214       
215        #def day_toggled_button
216
217        def get_holidaylist(self):
218
219                result=self.n4d_holiday.read_conf(self.credentials,'HolidayListManager')
220
221                holiday_list=result["info"]
222                list_days=self.order_date(holiday_list)
223                self.listdays_store.clear()
224                color_palette=['LightGreen','bisque']
225                for item in list_days:
226                        if "-" in item:
227                                bg_color=color_palette[0]
228                        else:
229                                bg_color=color_palette[1]       
230                        date=item
231                        description=holiday_list[item]["description"]
232
233                        self.listdays_store.append(("<span font='Roboto bold' size='medium'>"+date+"</span>","<span font='Roboto' size='medium'>"+description+"</span>","gtk-edit","gtk-remove",bg_color))
234
235
236        #def get_holidaylist   
237
238
239        def order_date(self,listdays):
240
241                tmp=[]
242                order_date=[]
243
244                if len(listdays)>0:
245                        for item in listdays:
246                                if "-" in item:
247                                        date_toformat=item.split("-")[0]
248                                else:
249                                        date_toformat=item
250
251                                datef=datetime.strptime(date_toformat,"%d/%m/%Y")
252                                x=()
253                                x=item,datef
254                                tmp.append(x)
255
256                tmp.sort(key=lambda date:date[1])
257                for item in tmp:
258                        order_date.append(item[0])
259
260                return order_date
261
262        #def order_date         
263
264
265
266        def _get_day_clicked_action(self,event):
267
268                action=''
269                row=None
270
271                if type(event)==type(Gtk.TreePath()):
272                        action='edit'
273                else:
274                        try:
275                                row=self.listdays_tv.get_path_at_pos(int(event.x),int(event.y))
276                        except Exception as e:
277                                self._debug(e)
278                        if row:
279                                if row[1]==self.col_remove:
280                                        action='remove'
281                                elif row[1]==self.col_edit:
282                                        action='edit'
283                return action
284
285        #def _get_day_clicked_action   
286
287        def day_clicked(self,x,event): 
288
289                self.init_calendar()
290                self.calendar_message.set_text("")
291                self.clear_days=True
292                selection=self.listdays_tv.get_selection()
293                model,iter=selection.get_selected()
294
295                if event!=None:
296                        action=self._get_day_clicked_action(event)
297
298                self.day=model[iter][0]
299                self.day=self.day[self.day.find("<span")+39:self.day.find("</span>")]
300                #self.edit_day_button.set_sensitive(True)
301                #self.remove_day_button.set_sensitive(True)
302                self.coment_day=model[iter][1]
303                self.coment_day=self.coment_day[self.coment_day.find("<span")+34:self.coment_day.find("</span>")]
304
305                if action=="edit":
306                        self.edit_day_clicked()
307                elif action=="remove":
308                        self.remove_day_clicked()               
309
310        #def day_clicked       
311
312        def month_changed(self,widget): 
313
314                self.holiday_calendar.select_day(0)
315                self.holiday_calendar.clear_marks()
316
317
318                if  self.clear_days:
319                        self.marked_range_days(0)
320
321                else:
322                        date=self.range_day1_entry.get_text()
323                        if date!="":
324                                month_ref=self.holiday_calendar.get_date().month
325                                year_ref=self.holiday_calendar.get_date().year 
326
327                                split_date=self._splited_date(date)
328                                tmp_day=split_date[0]
329                                tmp_month=split_date[1]
330                                tmp_year=split_date[2]
331       
332                                if tmp_month==month_ref and tmp_year==year_ref:
333                                        self.holiday_calendar.mark_day(tmp_day)                         
334               
335
336        #def month_changed                                                     
337
338        def day_selected(self,widget):
339               
340
341                date_selected=self.holiday_calendar.get_date()
342               
343
344                day_selected=date_selected.day
345                if int(day_selected)!=0:
346                        if day_selected<10:
347                                day_selectedf="0"+str(day_selected)
348                        else:
349                                day_selectedf=day_selected     
350                        month_selected=date_selected.month+1
351                        if month_selected<10:
352                                month_selected="0"+str(month_selected)
353
354                        year_selected=date_selected.year
355                        date_format=str(day_selectedf)+"/"+str(month_selected)+"/"+str(year_selected)
356
357                        if not self.range:
358                                self.holiday_calendar.clear_marks()
359                                self.single_day_entry.set_text(date_format)
360                                self.range=False
361                                self.clear_days=True
362                        else:
363                                if self.range_day1_entry.get_text()=="":
364                                        self.clear_days=False
365                                        self.holiday_calendar.clear_marks()
366                                        self.range_day1_entry.set_text(date_format)
367                                        self.holiday_calendar.mark_day(day_selected)
368                                        self.holiday_calendar.select_day(0)
369
370                                else:
371                                        if self.range_day2_entry.get_text()=="":
372                                                date1=datetime.strptime(self.range_day1_entry.get_text(),"%d/%m/%Y")
373                                                date2=datetime.strptime(date_format,"%d/%m/%Y")
374                                                if date2>date1:
375                                                        self.range=True
376                                                        self.clear_days=True
377                                                        self.range_day2_entry.set_text(date_format)     
378                                                        range_day=self.range_day1_entry.get_text()+"-"+self.range_day2_entry.get_text()
379                                                        self.marked_range_days(2,range_day)
380                                                        self.holiday_calendar.select_day(0)
381                                                        self.edit_message_label.set_text("")
382                                                else:
383                                                        self.holiday_calendar.select_day(0)
384                                                        self.manage_message(True,12)   
385        #def day_selected                                               
386
387       
388        def marked_range_days(self,monthref,range_day=None):
389
390
391                if range_day!=None:
392                        if self.range:
393                                self.days_inrange=self.holidayManager.get_days_inrange(range_day)
394
395                if monthref==0:
396                        ref_month=self.holiday_calendar.get_date().month
397                        ref_year=self.holiday_calendar.get_date().year
398
399                elif monthref==1:
400                        if self.range:
401                                ref_date=self.range_day1_entry.get_text()
402                        else:
403                                ref_date=self.single_day_entry.get_text()
404                               
405                        split_date=self._splited_date(ref_date)
406                        ref_month=split_date[1]
407                        ref_year=split_date[2]
408
409                        self.holiday_calendar.select_month(ref_month,ref_year)
410
411                else:
412                        split_date=self._splited_date(self.range_day2_entry.get_text())
413                        ref_month=split_date[1]
414                        ref_year=split_date[2]
415
416                if self.range:
417                        for i in self.days_inrange:
418                                split_date=self._splited_date(i)
419                                tmp_day=split_date[0]
420                                tmp_month=split_date[1]
421                                tmp_year=split_date[2]
422                                if tmp_month==ref_month and tmp_year==ref_year:
423                                        self.holiday_calendar.mark_day(tmp_day)
424                       
425                else:
426                        if self.single_day_entry.get_text()!="":
427                                split_date=self._splited_date(self.single_day_entry.get_text())
428                                tmp_day=split_date[0]
429                                tmp_month=split_date[1]
430                                tmp_year=split_date[2]
431                               
432                                if tmp_month==ref_month and tmp_year==ref_year:
433                                        self.holiday_calendar.mark_day(tmp_day)         
434
435        #def marked_range_days                 
436
437        def _splited_date(self,date):
438
439                splited_date=[]
440                tmp_date=date.split("/")
441                tmp_day=int(tmp_date[0])
442                tmp_month=int(tmp_date[1])-1
443                tmp_year=int(tmp_date[2])
444
445                splited_date=[tmp_day,tmp_month,tmp_year]
446               
447                return splited_date
448
449        #def _splited_date     
450
451        def remove_range(self,widget):
452
453                self.holiday_calendar.clear_marks()
454                self.clear_days=False
455                self.holiday_calendar.select_day(0)
456                self.range_day1_entry.set_text("")
457                self.range_day2_entry.set_text("")
458                self.edit_message_label.set_text("")
459
460        #def remove_range       
461
462
463        def add_day_clicked(self,widget):
464       
465                self.init_calendar()
466                self.edit_message_label.set_text("")
467                self.calendar_message.set_text("")
468                self.edit_data_window.set_title(_("Add date"))
469                self.edit_data_window.show()
470
471        #def add_day_clicked   
472
473
474        def save_day_clicked(self,widget):
475
476                result={}
477                result["status"]=True
478                error=False
479                edit_error_range_codes=[1,12,13,14]
480                if self.range:
481                        day1=self.range_day1_entry.get_text()
482                        day2=self.range_day2_entry.get_text()
483                        new_day=day1+"-"+day2
484
485                else:
486                        new_day=self.single_day_entry.get_text()
487
488                comment=self.coment_day_entry.get_text()       
489
490                if self.range and (day1=="" or day2=="") :
491                        error=True
492                        code=13
493                else:   
494                        if new_day!="":
495                                if self.edit_day:
496                                        if self.day!="" and self.day!=new_day:
497                                                result=self.n4d_holiday.delete_day(self.credentials,"HolidayListManager",self.day)
498                                                code=result["code"]
499                                       
500                                if result["status"]:                   
501                                        #result=self.holidayManager.add_day(new_day,comment)
502                                        result=self.n4d_holiday.add_day(self.credentials,'HolidayListManager',new_day,comment)
503                                        code=result["code"]
504                                        if result["status"]:
505                                                self.get_holidaylist()
506                                                self.init_calendar()
507
508                                        else:
509                                                error=True
510                                else:
511                                        error=True     
512                        else:
513                                error=True     
514                                code=14 
515
516                if error:       
517                        self.manage_message(error,code) 
518                else:
519                        self.edit_data_window.hide()
520                        self.manage_message(error,code) 
521
522        #def save_day_clicked   
523
524        def cancel_day_clicked(self,widget):
525
526                self.edit_data_window.hide()
527
528        #def cancel_day_clicked                 
529               
530        def edit_day_clicked(self):
531
532                self.edit_day=True
533       
534                if "-" in self.day:
535                        self.range=True
536                        self.holiday_calendar.clear_marks()
537                        tmp=self.day.split("-")
538                        self.range_day_rb.set_active(True)
539                        self.range_day1_entry.set_text(tmp[0])
540                        self.range_day2_entry.set_text(tmp[1])
541                       
542                else:
543                        self.range=False
544                        self.holiday_calendar.clear_marks()
545                        self.single_day_rb.set_active(True)
546                        self.single_day_entry.set_text(self.day)
547                       
548                self.marked_range_days(1,self.day)
549                self.coment_day_entry.set_text(self.coment_day)
550                self.edit_message_label.set_text("")
551                self.edit_data_window.set_title(_("Edit date"))
552                self.edit_data_window.show()
553
554        #def edit_day_clicked   
555
556
557        def remove_day_clicked(self):
558
559                error=False
560
561                dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, self.app_name)
562                dialog.format_secondary_text(_("The date will be deleted. Do you want to continue?"))
563                response=dialog.run()
564                dialog.destroy()
565                if response == Gtk.ResponseType.YES:   
566                        result=self.n4d_holiday.delete_day(self.credentials,'HolidayListManager',self.day)
567                        if result['status']:
568                                self.get_holidaylist()
569                                self.init_calendar()
570                        else:
571                                error=True
572
573                        self.manage_message(error,result['code'])       
574
575        #def remove_day_clicked         
576
577
578        def remove_daylist_clicked(self,widget):
579
580                error=False
581                dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, self.app_name)
582                dialog.format_secondary_text(_("The current list of dates will be deleted. Do you want to continue?"))
583                response=dialog.run()
584                dialog.destroy()
585                if response == Gtk.ResponseType.YES:   
586                        result=self.n4d_holiday.reset_holiday_list(self.credentials,'HolidayListManager')
587
588                        if result['status']:
589                                self.get_holidaylist()
590                                self.init_calendar()
591                        else:
592                                error=True
593
594                        self.manage_message(error,result['code'])
595
596        #def remove_daylist_clicked             
597
598
599        def export_daylist_clicked(self,widget):
600       
601                error=False
602                dialog = Gtk.FileChooserDialog(_("Please choose a file to save day list"), None,
603                Gtk.FileChooserAction.SAVE,(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
604                Gtk.STOCK_SAVE, Gtk.ResponseType.OK))
605                dialog.set_do_overwrite_confirmation(True)
606                response = dialog.run()
607               
608                if response == Gtk.ResponseType.OK:
609                        dest=dialog.get_filename()
610                        dialog.destroy()
611                        result=self.n4d_holiday.export_holiday_list(self.credentials,'HolidayListManager',self.credentials[0],dest)
612                        if not result["status"]:
613                                error=True
614
615                        self.manage_message(error,result["code"])
616                else:
617                        dialog.destroy()
618               
619
620        #def export_daylist_clicked
621       
622
623        def import_daylist_clicked(self,widget):
624
625                error=False
626                dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, self.app_name)
627                dialog.format_secondary_text(_("New dates list will be loaded and replace the existing configutarion. Do you want to continue?"))
628                response=dialog.run()
629                dialog.destroy()
630                if response == Gtk.ResponseType.YES:
631                        dialog = Gtk.FileChooserDialog(_("Please choose a file to load dates list"), None,
632                        Gtk.FileChooserAction.OPEN,(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
633                        Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
634                        response = dialog.run()
635                        if response == Gtk.ResponseType.OK:
636                                orig=dialog.get_filename()
637                                dialog.destroy()
638                                result=self.n4d_holiday.import_holiday_list(self.credentials,'HolidayListManager',orig)
639                                if result['status']:
640                                        self.get_holidaylist()
641                                else:
642                                        error=True     
643                        else:
644                                dialog.destroy()               
645                               
646                                self.manage_message(error,result["code"])       
647
648        #def import_daylist_clicked                     
649
650        def manage_message(self,error,code):
651
652                msg=self.get_msg(code)
653                edit_date_errors=[1,2,3,12,13,14]
654
655                if error:
656                        if code in edit_date_errors:
657                                self.edit_message_label.set_name("MSG_ERROR_LABEL")
658                                self.edit_message_label.set_text(msg)
659                                self.edit_message_label.show()
660                        else:
661                                self.calendar_message.set_name("MSG_ERROR_LABEL")       
662                                self.calendar_message.set_text(msg)
663                                self.calendar_message.show()   
664                else:
665                        self.calendar_message.set_name("MSG_CORRECT_LABEL")     
666                        self.calendar_message.set_text(msg)
667                        self.calendar_message.show()
668
669        #def manage_message             
670
671
672        def get_msg(self,code): 
673
674                if      code==1:
675                        msg_text=_("Unabled to apply changes. List blocked for other user")
676                elif code==2:
677                        msg_text=_("Changes apply succesfully")
678                elif code==3:
679                        msg_text=_("Error saving changes")
680                elif code==6:
681                        msg_text=_("List of dates imported successfully")
682                elif code==7:   
683                        msg_text=_("Unabled to import list. List blocked for other user")
684                elif code==8:
685                        msg_text=_("Error importing the list of dates")
686                elif code==9:
687                        msg_text=_("The list of dates to be imported does not exist")
688                elif code==10:
689                        msg_text=_("List of dates exported successfully")
690                elif code==11:
691                        msg_text=_("Error exporting the list of dates")                 
692                elif code==12:
693                        msg_text=_("Last date in range must be major than init date")   
694                elif code==13:
695                        msg_text=_("You must indicate the two dates of range") 
696                elif code==14:
697                        msg_text=_("You must indicate the date")       
698
699                return(msg_text)       
700
701        #def get_msg   
702       
703       
Note: See TracBrowser for help on using the repository browser.