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

Last change on this file since 7133 was 7133, checked in by jrpelegrina, 19 months ago

Fix code

File size: 16.5 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.holiday_calendar=builder.get_object("calendar")
49                self.single_day_rb=builder.get_object("single_day_rb")
50                self.single_day_entry=builder.get_object("single_day_entry")
51                self.range_day_rb=builder.get_object("range_day_rb")
52                self.range_day1_entry=builder.get_object("range_day1_entry")
53                self.range_day2_entry=builder.get_object("range_day2_entry")
54                self.remove_range_button=builder.get_object("remove_range_button")
55                self.coment_day_entry=builder.get_object("day_comment_entry")
56                self.add_day_button=builder.get_object("add_day_button")
57                self.save_day_button=builder.get_object("save_day_button")
58       
59                self.listdays_tv=builder.get_object("listday_treeview")
60                self.listdays_store=Gtk.ListStore(str,str,str)
61                self.listdays_tv.set_model(self.listdays_store)
62
63
64                column=Gtk.TreeViewColumn(_("Date"))
65                cell=Gtk.CellRendererText()
66                column.pack_start(cell,True)
67                column.add_attribute(cell,"markup",0)
68                column.add_attribute(cell,"cell_background",2)
69                column.set_expand(False)
70                column.set_property("fixed-width",150)
71                self.listdays_tv.append_column(column)
72                self.listdays_tv.connect("button-release-event",self.day_clicked)
73
74                column=Gtk.TreeViewColumn(_("Comment"))
75                cell=Gtk.CellRendererText()
76                column.pack_start(cell,False)
77                column.add_attribute(cell,"markup",1)
78                column.add_attribute(cell,"cell_background",2)
79                column.set_property("fixed-width",150)
80                column.set_expand(False)
81                self.listdays_tv.append_column(column)
82
83                self.export_daylist_button=builder.get_object("export_daylist_button")
84                self.import_daylist_button=builder.get_object("import_daylist_button")
85                self.remove_daylist_button=builder.get_object("remove_daylist_button")
86                self.remove_day_button=builder.get_object("remove_day_button")
87                self.edit_day_button=builder.get_object("edit_day_button")
88                self.calendar_message=builder.get_object("calendar_message")
89
90                self.pack_start(self.main_box,True,True,0)
91                self.set_css_info()
92                self.connect_signals()
93                self.init_calendar()
94                #self.clear_days=True
95                #self.day=""
96
97        #def render_form       
98
99
100        def set_css_info(self):
101               
102               
103                self.style_provider=Gtk.CssProvider()
104                f=Gio.File.new_for_path(self.css_file)
105                self.style_provider.load_from_file(f)
106                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
107                self.holiday_calendar.set_name("CALENDAR")
108
109        #def set_css_info       
110
111
112        def connect_signals(self):
113       
114                self.single_day_rb.connect("toggled",self.day_toggled_button,"singleDay")
115                self.range_day_rb.connect("toggled",self.day_toggled_button,"rangeDay")
116                self.holiday_calendar.connect("month-changed",self.month_changed)
117                self.holiday_calendar.connect("day_selected",self.day_selected)
118                self.remove_range_button.connect("clicked",self.remove_range)
119                self.add_day_button.connect("clicked",self.add_day_clicked)
120                self.save_day_button.connect("clicked",self.save_day_clicked)
121                self.edit_day_button.connect("clicked",self.edit_day_clicked)
122                self.remove_day_button.connect("clicked",self.remove_day_clicked)
123                self.export_daylist_button.connect("clicked",self.export_daylist_clicked)
124                self.import_daylist_button.connect("clicked",self.import_daylist_clicked)
125                self.remove_daylist_button.connect("clicked",self.remove_daylist_clicked)
126
127        #def connect_signals   
128
129
130        def start_api_connect(self):
131
132                gettext.textdomain(settings.TEXT_DOMAIN)
133                self.init_calendar()
134                self.get_holidaylist()
135                self.calendar_message.set_text("")
136
137        #def _start_api_connect
138
139
140        def init_calendar(self):
141
142                self.range=False
143                self.clear_days=True
144                self.day=""
145                self.days_inrange=[]
146                current_date=date.today().strftime('%d/%m/%Y').split("/")
147                current_month=int(current_date[1])-1
148                current_year=int(current_date[2])
149
150                self.holiday_calendar.select_day(0)
151                self.holiday_calendar.select_month(current_month,current_year)
152                self.single_day_rb.set_active(True)
153                self.single_day_entry.set_text("")
154                self.range_day1_entry.set_text("")
155                self.range_day2_entry.set_text("")
156                self.coment_day_entry.set_text("")
157                self.edit_day=False
158
159        #def init_calendar     
160               
161
162        def day_toggled_button (self,button,name):
163
164
165                if button.get_active():
166                        self.holiday_calendar.clear_marks()
167
168                        if name=="singleDay":
169                                self.range=False
170                                self.range_day1_entry.set_text("")
171                                self.range_day2_entry.set_text("")
172                        else:
173                                self.range=True
174                                self.remove_range_button.set_sensitive(True)
175                                self.single_day_entry.set_text("")
176       
177        #def day_toggled_button
178
179        def get_holidaylist(self):
180
181                result=self.n4d_holiday.read_conf(self.credentials,'HolidayListManager')
182
183                holiday_list=result["info"]
184                list_days=self.order_date(holiday_list)
185                self.listdays_store.clear()
186                color_palette=['goldenrod','DarkSlateGrey','Burlywood','DarkSlateGrey','DarkSlateBlue','bisque','LightSteelBlue','DarkSlateGrey']
187                                                       
188                for item in list_days:
189                        if "-" in item:
190                                bg_color=color_palette[6]
191                        else:
192                                bg_color=color_palette[5]       
193                        date=item
194                        description=holiday_list[item]["description"]
195                        self.listdays_store.append(("<span font='Roboto bold' size='small'>"+date+"</span>","<span font='Roboto' size='small'>"+description+"</span>",bg_color))
196
197                self.edit_day_button.set_sensitive(False)
198                self.remove_day_button.set_sensitive(False)
199
200        #def get_holidaylist   
201
202
203        def order_date(self,listdays):
204
205                tmp=[]
206                order_date=[]
207
208                if len(listdays)>0:
209                        for item in listdays:
210                                if "-" in item:
211                                        date_toformat=item.split("-")[0]
212                                else:
213                                        date_toformat=item
214
215                                datef=datetime.strptime(date_toformat,"%d/%m/%Y")
216                                x=()
217                                x=item,datef
218                                tmp.append(x)
219
220                tmp.sort(key=lambda date:date[1])
221                for item in tmp:
222                        order_date.append(item[0])
223
224                return order_date
225
226        #def order_date         
227
228
229        def day_clicked(self,x,y):     
230
231                self.init_calendar()
232                self.calendar_message.set_text("")
233                self.clear_days=False
234                selection=self.listdays_tv.get_selection()
235                model,iter=selection.get_selected()
236                self.day=model[iter][0]
237                self.day=self.day[self.day.find("<span")+38:self.day.find("</span>")]
238                self.edit_day_button.set_sensitive(True)
239                self.remove_day_button.set_sensitive(True)
240                self.coment_day=model[iter][1]
241                self.coment_day=self.coment_day[self.coment_day.find("<span")+33:self.coment_day.find("</span>")]
242
243        #def day_clicked       
244
245        def month_changed(self,widget): 
246
247                self.holiday_calendar.select_day(0)
248                self.holiday_calendar.clear_marks()
249                if not self.clear_days:
250                        self.marked_range_days(0)
251
252                else:
253                        date=self.range_day1_entry.get_text()
254                        if date!="":
255                                month_ref=self.holiday_calendar.get_date().month
256                                year_ref=self.holiday_calendar.get_date().year 
257
258                                split_date=self._splited_date(date)
259                                tmp_day=split_date[0]
260                                tmp_month=split_date[1]
261                                tmp_year=split_date[2]
262       
263                                if tmp_month==month_ref and tmp_year==year_ref:
264                                        self.holiday_calendar.mark_day(tmp_day)                         
265               
266
267        #def month_changed                                                     
268
269        def day_selected(self,widget):
270               
271
272                date_selected=self.holiday_calendar.get_date()
273               
274
275                day_selected=date_selected.day
276                if int(day_selected)!=0:
277                        if day_selected<10:
278                                day_selectedf="0"+str(day_selected)
279                        else:
280                                day_selectedf=day_selected     
281                        month_selected=date_selected.month+1
282                        if month_selected<10:
283                                month_selected="0"+str(month_selected)
284
285                        year_selected=date_selected.year
286                        date_format=str(day_selectedf)+"/"+str(month_selected)+"/"+str(year_selected)
287
288                        if not self.range:
289                                self.holiday_calendar.clear_marks()
290                                self.single_day_entry.set_text(date_format)
291                                self.range=False
292                                self.clear_days=False
293                        else:
294                                if self.range_day1_entry.get_text()=="":
295                                        self.holiday_calendar.clear_marks()
296                                        self.range_day1_entry.set_text(date_format)
297                                        self.holiday_calendar.mark_day(day_selected)
298                                        self.holiday_calendar.select_day(0)
299
300                                else:
301                                        if self.range_day2_entry.get_text()=="":
302                                                date1=datetime.strptime(self.range_day1_entry.get_text(),"%d/%m/%Y")
303                                                date2=datetime.strptime(date_format,"%d/%m/%Y")
304                                                if date2>date1:
305                                                        self.range=True
306                                                        self.clear_days=False
307                                                        self.range_day2_entry.set_text(date_format)     
308                                                        range_day=self.range_day1_entry.get_text()+"-"+self.range_day2_entry.get_text()
309                                                        self.marked_range_days(2,range_day)
310                                                        self.holiday_calendar.select_day(0)
311                                                        self.calendar_message.set_text("")
312                                                else:
313                                                        self.manage_message(True,12)   
314        #def day_selected                                               
315
316       
317        def marked_range_days(self,monthref,range_day=None):
318
319                if range_day!=None:
320                        if self.range:
321                                self.days_inrange=self.holidayManager.get_days_inrange(range_day)
322
323                if monthref==0:
324                        ref_month=self.holiday_calendar.get_date().month
325                        ref_year=self.holiday_calendar.get_date().year
326
327                elif monthref==1:
328                        if self.range:
329                                ref_date=self.range_day1_entry.get_text()
330                        else:
331                                ref_date=self.single_day_entry.get_text()
332                               
333                        split_date=self._splited_date(ref_date)
334                        ref_month=split_date[1]
335                        ref_year=split_date[2]
336
337                        self.holiday_calendar.select_month(ref_month,ref_year)
338
339                else:
340                        split_date=self._splited_date(self.range_day2_entry.get_text())
341                        ref_month=split_date[1]
342                        ref_year=split_date[2]
343
344                if self.range:
345                        for i in self.days_inrange:
346                                split_date=self._splited_date(i)
347                                tmp_day=split_date[0]
348                                tmp_month=split_date[1]
349                                tmp_year=split_date[2]
350                                if tmp_month==ref_month and tmp_year==ref_year:
351                                        self.holiday_calendar.mark_day(tmp_day)
352                       
353                else:
354                        split_date=self._splited_date(self.single_day_entry.get_text())
355                        tmp_day=split_date[0]
356                        tmp_month=split_date[1]
357                        tmp_year=split_date[2]
358                       
359                        if tmp_month==ref_month and tmp_year==ref_year:
360                                self.holiday_calendar.mark_day(tmp_day)         
361
362        #def marked_range_days                 
363
364        def _splited_date(self,date):
365
366                splited_date=[]
367                tmp_date=date.split("/")
368                tmp_day=int(tmp_date[0])
369                tmp_month=int(tmp_date[1])-1
370                tmp_year=int(tmp_date[2])
371
372                splited_date=[tmp_day,tmp_month,tmp_year]
373               
374                return splited_date
375
376        #def _splited_date     
377
378        def remove_range(self,widget):
379
380                self.holiday_calendar.clear_marks()
381                self.clear_days=True
382                self.holiday_calendar.select_day(0)
383                self.range_day1_entry.set_text("")
384                self.range_day2_entry.set_text("")
385
386        #def remove_range       
387
388
389        def add_day_clicked(self,widget):
390       
391                self.init_calendar()
392                self.calendar_message.set_text("")
393
394        #def add_day_clicked   
395
396
397        def save_day_clicked(self,widget):
398
399                result={}
400                result["status"]=True
401                error=False
402                if self.range:
403                        day1=self.range_day1_entry.get_text()
404                        day2=self.range_day2_entry.get_text()
405                        new_day=day1+"-"+day2
406
407                else:
408                        new_day=self.single_day_entry.get_text()
409
410                comment=self.coment_day_entry.get_text()       
411
412                if self.range and (day1=="" or day2=="") :
413                        error=True
414                        code=13
415                else:   
416                        if new_day!="":
417                                if self.edit_day:
418                                        if self.day!="" and self.day!=new_day:
419                                                result=self.n4d_holiday.delete_day(self.credentials,"HolidayListManager",self.day)
420                                                code=result["code"]
421                                       
422                                if result["status"]:                   
423                                        #result=self.holidayManager.add_day(new_day,comment)
424                                        result=self.n4d_holiday.add_day(self.credentials,'HolidayListManager',new_day,comment)
425                                        code=result["code"]
426                                        if result["status"]:
427                                                self.get_holidaylist()
428                                                self.init_calendar()
429
430                                        else:
431                                                error=True
432                                else:
433                                        error=True     
434                        else:
435                                error=True     
436                                code=14 
437
438                self.manage_message(error,code) 
439
440        #def save_day_clicked                   
441               
442        def edit_day_clicked(self,widget):
443
444                self.edit_day=True
445       
446                if "-" in self.day:
447                        self.range=True
448                        self.holiday_calendar.clear_marks()
449                        tmp=self.day.split("-")
450                        self.range_day_rb.set_active(True)
451                        self.range_day1_entry.set_text(tmp[0])
452                        self.range_day2_entry.set_text(tmp[1])
453                       
454                else:
455                        self.range=False
456                        self.holiday_calendar.clear_marks()
457                        self.single_day_rb.set_active(True)
458                        self.single_day_entry.set_text(self.day)
459                       
460                self.marked_range_days(1,self.day)
461                self.coment_day_entry.set_text(self.coment_day)
462
463        #def edit_day_clicked   
464
465
466        def remove_day_clicked(self,widget):
467
468                error=False
469
470                dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, self.app_name)
471                dialog.format_secondary_text(_("The date will be deleted. Do you want to continue?"))
472                response=dialog.run()
473                dialog.destroy()
474                if response == Gtk.ResponseType.YES:   
475                        result=self.n4d_holiday.delete_day(self.credentials,'HolidayListManager',self.day)
476                        if result['status']:
477                                self.get_holidaylist()
478                                self.init_calendar()
479                        else:
480                                error=True
481
482                        self.manage_message(error,result['code'])       
483
484        #def remove_day_clicked         
485
486
487        def remove_daylist_clicked(self,widget):
488
489                error=False
490                dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, self.app_name)
491                dialog.format_secondary_text(_("The current list of dates will be deleted. Do you want to continue?"))
492                response=dialog.run()
493                dialog.destroy()
494                if response == Gtk.ResponseType.YES:   
495                        result=self.n4d_holiday.reset_holiday_list(self.credentials,'HolidayListManager')
496
497                        if result['status']:
498                                self.get_holidaylist()
499                                self.init_calendar()
500                        else:
501                                error=True
502
503                        self.manage_message(error,result['code'])
504
505        #def remove_daylist_clicked             
506
507
508        def export_daylist_clicked(self,widget):
509       
510                error=False
511                dialog = Gtk.FileChooserDialog(_("Please choose a file to save day list"), None,
512                Gtk.FileChooserAction.SAVE,(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
513                Gtk.STOCK_SAVE, Gtk.ResponseType.OK))
514                dialog.set_do_overwrite_confirmation(True)
515                response = dialog.run()
516               
517                if response == Gtk.ResponseType.OK:
518                        dest=dialog.get_filename()
519                        dialog.destroy()
520                        result=self.n4d_holiday.export_holiday_list(self.credentials,'HolidayListManager',dest)
521                        if not result["status"]:
522                                error=True
523                        self.manage_message(error,result["code"])
524                else:
525                        dialog.destroy()
526               
527
528        #def export_daylist_clicked
529       
530
531        def import_daylist_clicked(self,widget):
532
533                error=False
534                dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, self.app_name)
535                dialog.format_secondary_text(_("New dates list will be loaded and replace the existing configutarion. Do you want to continue?"))
536                response=dialog.run()
537                dialog.destroy()
538                if response == Gtk.ResponseType.YES:
539                        dialog = Gtk.FileChooserDialog(_("Please choose a file to load dates list"), None,
540                        Gtk.FileChooserAction.OPEN,(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
541                        Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
542                        response = dialog.run()
543                        if response == Gtk.ResponseType.OK:
544                                orig=dialog.get_filename()
545                                dialog.destroy()
546                                result=self.n4d_holiday.import_holiday_list(self.credentials,'HolidayListManager',orig)
547                                if result['status']:
548                                        self.get_holidaylist()
549                                else:
550                                        error=True     
551                        else:
552                                dialog.destroy()               
553                               
554                                self.manage_message(error,result["code"])       
555
556        #def import_daylist_clicked                     
557
558        def manage_message(self,error,code):
559
560                msg=self.get_msg(code)
561               
562                if error:
563                        self.calendar_message.set_name("MSG_ERROR_LABEL")
564                else:
565                        self.calendar_message.set_name("MSG_CORRECT_LABEL")     
566
567                self.calendar_message.set_text(msg)
568                self.calendar_message.show()
569
570        #def manage_message             
571
572
573        def get_msg(self,code): 
574
575                if      code==1:
576                        msg_text=_("Unabled to apply changes. List blocked for other user")
577                elif code==2:
578                        msg_text=_("Changes apply succesfully")
579                elif code==3:
580                        msg_text=_("Error saving changes")
581                elif code==6:
582                        msg_text=_("List of dates imported successfully")
583                elif code==7:   
584                        msg_text=_("Unabled to import list. List blocked for other user")
585                elif code==8:
586                        msg_text=_("Error importing the list of dates")
587                elif code==9:
588                        msg_text=_("The list of dates to be imported does not exist")
589                elif code==10:
590                        msg_text=_("List of dates exported successfully")
591                elif code==11:
592                        msg_text=_("Error exporting the list of dates")                 
593                elif code==12:
594                        msg_text=_("Last date in range must be major than init date")   
595                elif code==13:
596                        msg_text=_("You must indicate the two dates of range") 
597                elif code==14:
598                        msg_text=_("You must indicate the date")       
599
600                return(msg_text)       
601
602        #def get_msg   
603       
604       
Note: See TracBrowser for help on using the repository browser.