Module za_warudo.gui.edit_event_page

Expand source code
from functools import partial
from datetime import datetime
from tkinter import *
from tkinter import ttk
import logging as log
import re

import ttkwidgets as tkw

from gui.widgets import EntryDate
from gui.widgets import Spinbox

class EditEventPage(ttk.Frame):
    '''
    Frame to create a new event
    Upon creation the user is redirected to the events page
    TODO frame to create AND edit an event
    '''

    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        self.controller = controller

        self.edit_mode = False
        self.event_id = None

        self.error_text = StringVar()
        title = ttk.Label(self, text="Create event", font=("TkDefaultFont", "15"))
        error_label = ttk.Label(self, textvariable=self.error_text, font=("TkDefaultFont", "7"))
        error_label.configure(style="Red.TLabel")
        buttons_frame = ttk.Frame(self)
        back_button = ttk.Button(buttons_frame, text='Back', command=partial(self.controller.show_frame, "EventsPage"))

        # And of course, the button to save it all
        save_button = ttk.Button(buttons_frame, text="Save", command=self.save)

        # Event form
        self.name = StringVar()
        name_label = ttk.Label(self, text="Name")
        self.name_entry = ttk.Entry(self, textvariable=self.name)

        # Variables to get the values after input
        self.begin_text = StringVar()
        self.hour_text = StringVar()
        self.running_time_text = StringVar()

        self.hour_text.set('12')
        self.running_time_text.set('60')

        # Input for the date of the event
        begin = ttk.Label(self, text="Day")
        begin_entry = EntryDate(self, textvariable=self.begin_text)
        # Input for the hour of the event
        hour = ttk.Label(self, text="Hour")
        hour_entry = Spinbox(self, from_=0, to=24, textvariable=self.hour_text)
        # Input for the running time, in minutes
        # TODO actually we can type anything in this s* widget
        # do something to prevent that by using regex
        # When clicking on the save button, there may be a label
        # if the input is wrong
        running_time = ttk.Label(self, text="Running time (minutes)")
        running_time_entry = Spinbox(self, from_=0, to=500, textvariable=self.running_time_text)

        # Dropdown list for the type of the projection (film, docu)
        pj_label = ttk.Label(self, text="Projection type")
        self.projection_type_choosen = StringVar()
        projection_types = ttk.Combobox(self, textvariable=self.projection_type_choosen, state='readonly')
        projection_types['values'] = ["Film", "Documentary"]
        projection_types.current(0)

        pjs = [pj['location'] for pj in controller.get_projection_rooms().dicts()]

        # Dropdown list for the location of the event
        pr_label = ttk.Label(self, text="Projection room")
        self.projection_room_choosen = StringVar()
        projection_rooms = ttk.Combobox(self, textvariable=self.projection_room_choosen, state='readonly')
        projection_rooms['values'] = pjs
        projection_rooms.current(0)

        # Inputs for the event's status to go 'finished'
        self.room_reserved = IntVar()
        self.management = IntVar()
        self.equipment_reserved = IntVar()
        self.guest_attendance = IntVar()

        check_frame = ttk.Frame(self)
        room_chbutton = ttk.Checkbutton(check_frame, text="Room reserved", variable=self.room_reserved)
        equipment_chbutton = ttk.Checkbutton(check_frame, text="Equipment reserved", variable=self.equipment_reserved)
        management_chbutton = ttk.Checkbutton(check_frame, text="Management reserved", variable=self.management)
        guest_attendance_chbutton = ttk.Checkbutton(check_frame, text="Guest attendance confirmed", variable=self.guest_attendance)



        members_frame = ttk.Frame(self)
        members_label = ttk.Label(self, text="Add members")
        members_scrollbar = ttk.Scrollbar(members_frame, orient=VERTICAL)
        # List of users; the responsible has to choose among them
        # members that'll participate in the event's organisation
        self.members_tree = tkw.CheckboxTreeview(members_frame, columns=('Events'), selectmode='browse', yscrollcommand=members_scrollbar.set)
        members_scrollbar.configure(command=self.members_tree.yview)

        self.members_tree.column("Events")#, width=50)
        self.members_tree.heading("#0", text="Name")
        self.members_tree.heading("Events", text="Events")

        self.members_tree.tag_configure('odd', background="#F0F0F0")
        self.members_tree.tag_configure('even', background="#FAFAFA")
        self.display_members(event_id=None)

        # CATEGORIES
        categories_label = ttk.Label(self, text="Add categories")

        cats_frame = ttk.Frame(self)
        cats_scrollbar = ttk.Scrollbar(cats_frame, orient=VERTICAL)
        self.cats_tree = tkw.CheckboxTreeview(cats_frame, columns=('Price'), selectmode='none')
        cats_scrollbar.configure(command=self.cats_tree.yview)
        self.cats_tree.column("#0", width=140)
        self.cats_tree.column("Price", anchor='center')
        self.cats_tree.heading("#0", text="Title")
        self.cats_tree.heading("Price", text="Price")

        self.cats_tree.tag_configure('odd', background="#F0F0F0")
        self.cats_tree.tag_configure('even', background="#FAFAFA")

        self.display_categories(event_id=None)

        # PRESENTATION
        self.presentation = IntVar()
        self.author = StringVar()
        self.context = StringVar()

        presentation_frame = ttk.Frame(self)
        presentation_check = ttk.Checkbutton(presentation_frame,
                                             text="Author presentation",
                                             variable=self.presentation)

        # DEBATE
        self.debate = IntVar()
        self.speaker = StringVar()
        self.contact_details = StringVar()

        debate_frame = ttk.Frame(self)
        debate_check = ttk.Checkbutton(debate_frame,
                                       text="Debate",
                                       variable=self.debate)

        # Placing the components
        # ROW 0
        title.grid(row=0, column=0, sticky=(W+N))
        error_label.grid(row=0, column=1, sticky=W+N+S, columnspan=3, padx=(10, 0))
        buttons_frame.grid(row=0, column=5, sticky=E)
        back_button.grid(row=0, column=2, pady=5, padx=5, sticky=E)
        save_button.grid(row=0, column=3, pady=5, padx=5, sticky=E)

        # ROW 1
        name_label.grid(row=1, column=0, sticky=W, pady=5, padx=5)
        self.name_entry.grid(row=1, column=1, pady=5, padx=5, sticky=E)
        running_time.grid(row=1, column=2, pady=5, padx=5, sticky=W)
        running_time_entry.grid(row=1, column=3, pady=5, padx=5, sticky=E)

        # ROW 2
        begin.grid(row=2, column=0, sticky=W, pady=5, padx=5)
        begin_entry.grid(row=2, column=1, sticky=E, pady=5, padx=5)
        hour.grid(row=2, column=2, sticky=W, pady=5, padx=5)
        hour_entry.grid(row=2, column=3, sticky=E, pady=5, padx=5)

        # ROW 3
        pj_label.grid(row=3, column=0, sticky=W, pady=5, padx=5)
        projection_types.grid(row=3, column=1, sticky=E, pady=5, padx=5)
        pr_label.grid(row=3, column=2, pady=5, sticky=W, padx=5)
        projection_rooms.grid(row=3, column=3, sticky=E, pady=5, padx=5)

        # ROW 0 RIGHT SIDE
        presentation_frame.grid(row=1, column=4, sticky=NSEW, columnspan=2, rowspan=2, pady=5, padx=5)
        presentation_check.grid(row=0, column=0, sticky=W)

        # ROW 3 RIGHT SIDE
        debate_frame.grid(row=3, column=4, sticky=NSEW, rowspan=2, columnspan=2, pady=5, padx=5)
        debate_check.grid(row=0, column=0, sticky=W)

        # ROW 5 RIGHT SIDE
        check_frame.grid(row=5, column=4, rowspan=2, columnspan=2, sticky=N+W, pady=5, padx=5)
        room_chbutton.grid(row=4, column=2, sticky=W)
        equipment_chbutton.grid(row=5, column=2, sticky=W)
        management_chbutton.grid(row=6, column=2, sticky=W)
        guest_attendance_chbutton.grid(row=7, column=2, sticky=W)

        # ROW 6
        members_frame.grid(row=5, column=0, columnspan=2, pady=5, padx=5, sticky=NSEW)
        members_label.grid(row=4, column=0, pady=5, padx=5, sticky=W)
        self.members_tree.pack(side=LEFT)
        members_scrollbar.pack()

        categories_label.grid(row=4, column=2, pady=5, padx=5, sticky=W)
        cats_frame.grid(row=5, column=2, columnspan=2, pady=5, padx=5, sticky=NSEW)
        self.cats_tree.pack(side=LEFT, expand=True)
        cats_scrollbar.pack()

    def check_missing_or_incorrect_input(self) -> str:
        '''
        Name, day, hour, running time, must not be empty
        p = re.compile('^(2[0-4]|1[0-9]|[1-9])$')
        if p.match(self.hour_text.get()) == None:
            print("Wrong hour format")
        '''
        error_msg = []

        if self.name_entry.get() == '':
            error_msg.append('Name')
        if self.begin_text.get() == '':
            error_msg.append('Day')
        if self.hour_text.get() == '':
            error_msg.append('Hour')
        if self.running_time_text.get() == '':
            error_msg.append('Running time')

        if len(self.members_tree.get_checked()) == 0:
            error_msg.append('Members (at least one)')
        if len(self.cats_tree.get_checked()) == 0:
            error_msg.append('Categories (at least one)')

        if len(error_msg) == 0:
            return None
        else:
            return ' '.join(['Missing or incorrect fields :', ', '.join(error_msg)])

    def save(self, event=None):
        '''
        Get all the datas from the form to create an
        event. Redirects to the events page
        '''
        error_msg = self.check_missing_or_incorrect_input()

        if error_msg != None:
            print(error_msg)
            self.error_text.set(error_msg)
            return


        new_event = dict()

        new_event['room_reserved'] = self.room_reserved.get() == 1
        new_event['management'] = self.management.get() == 1
        new_event['equipment_reserved'] = self.equipment_reserved.get() == 1
        new_event['guest_attendance'] = self.guest_attendance.get() == 1

        member_names = [self.members_tree.item(member)['text'] for member in self.members_tree.get_checked()]
        cat_titles = [self.cats_tree.item(title)['text'] for title in self.cats_tree.get_checked()]

        log.info("Name " + self.name_entry.get())
        log.info("Day " + self.begin_text.get())
        log.info("Hour " + self.hour_text.get())
        log.info("Running time " + self.running_time_text.get())

        log.info("Projection type " + self.projection_type_choosen.get())
        log.info("Projection room " + self.projection_room_choosen.get())

        log.info(member_names)
        log.info(cat_titles)

        new_event['name'] = self.name_entry.get()
        new_event['begin'] = self.begin_text.get() + ' ' + self.hour_text.get() + ':00'
        new_event['running_time'] = self.running_time_text.get()
        new_event['projection_type'] = self.projection_type_choosen.get()
        new_event['projection_room'] = self.projection_room_choosen.get()

        new_event['debate'] = self.debate.get() == 1
        new_event['presentation'] = self.presentation.get() == 1

        if self.edit_mode:
            self.controller.update_event(new_event, self.event_id)
            self.controller.update_team(member_names, self.event_id)
            self.controller.update_events_categories(cat_titles, self.event_id)
        else:
            event_id = self.controller.create_event(new_event)
            self.controller.create_team(member_names, event_id)
            self.controller.create_events_categories(cat_titles, event_id)
        self.controller.update_events_page()
        self.controller.show_frame("EventsPage")

    def set_event(self, event: Event):
        self.event = event

    def set_projection_room(self, projection_room):
        self.projection_room = projection_room

    def set_inputs(self):

        self.name.set(self.event.name)
        day = self.event.begin.strftime('%Y-%m-%d')
        hour = self.event.begin.strftime('%H')
        self.begin_text.set(day)
        self.hour_text.set(hour)
        self.running_time_text.set(self.event.running_time)
        self.projection_type_choosen.set(self.event.projection_type)
        self.projection_room_choosen.set(self.projection_room.location)


        if self.event.room_reserved:
            self.room_reserved.set(1)
        else:
            self.room_reserved.set(0)

        if self.event.management:
            self.management.set(1)
        else:
            self.management.set(0)

        if self.event.equipment_reserved:
            self.equipment_reserved.set(1)
        else:
            self.equipment_reserved.set(0)

        if self.event.guest_attendance:
            self.guest_attendance.set(1)
        else:
            self.guest_attendance.set(0)

        self.display_members(event_id=self.event.id)
        self.display_categories(event_id=self.event.id)
        self.event_id = self.event.id

    def display_members(self, event_id: int=None):

        self.members_tree.delete(*self.members_tree.get_children())
        users = self.controller.get_events_per_user(event_id)

        for i in range(len(users)):
            self.members_tree.insert('', 'end', iid=str(i), text=users[i]['user'], tags=('even' if i % 2 else 'odd',), values=(users[i]['events'],))
            self.members_tree.change_state(str(i), users[i]['checked'])

    def display_categories(self, event_id: int=None):

        # The tree is cleaned
        self.cats_tree.delete(*self.cats_tree.get_children())
        # We get the categories realted to the event
        categories = self.controller.get_events_categories(event_id)

        for i, category in enumerate(categories):
            s = '%d%s' % (category['price'], ' €')
            self.cats_tree.insert('', 'end', iid=str(i), text=category['title'], tags=('even' if i % 2 else 'odd',), values=(s,))
            self.cats_tree.change_state(str(i), category['checked'])

    def set_edit_mode(self):
        self.edit_mode = True

    def set_new_mode(self):
        self.edit_mode = False

Classes

class EditEventPage (parent, controller)

Frame to create a new event Upon creation the user is redirected to the events page TODO frame to create AND edit an event

Construct a Ttk Frame with parent master.

STANDARD OPTIONS

class, cursor, style, takefocus

WIDGET-SPECIFIC OPTIONS

borderwidth, relief, padding, width, height
Expand source code
class EditEventPage(ttk.Frame):
    '''
    Frame to create a new event
    Upon creation the user is redirected to the events page
    TODO frame to create AND edit an event
    '''

    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        self.controller = controller

        self.edit_mode = False
        self.event_id = None

        self.error_text = StringVar()
        title = ttk.Label(self, text="Create event", font=("TkDefaultFont", "15"))
        error_label = ttk.Label(self, textvariable=self.error_text, font=("TkDefaultFont", "7"))
        error_label.configure(style="Red.TLabel")
        buttons_frame = ttk.Frame(self)
        back_button = ttk.Button(buttons_frame, text='Back', command=partial(self.controller.show_frame, "EventsPage"))

        # And of course, the button to save it all
        save_button = ttk.Button(buttons_frame, text="Save", command=self.save)

        # Event form
        self.name = StringVar()
        name_label = ttk.Label(self, text="Name")
        self.name_entry = ttk.Entry(self, textvariable=self.name)

        # Variables to get the values after input
        self.begin_text = StringVar()
        self.hour_text = StringVar()
        self.running_time_text = StringVar()

        self.hour_text.set('12')
        self.running_time_text.set('60')

        # Input for the date of the event
        begin = ttk.Label(self, text="Day")
        begin_entry = EntryDate(self, textvariable=self.begin_text)
        # Input for the hour of the event
        hour = ttk.Label(self, text="Hour")
        hour_entry = Spinbox(self, from_=0, to=24, textvariable=self.hour_text)
        # Input for the running time, in minutes
        # TODO actually we can type anything in this s* widget
        # do something to prevent that by using regex
        # When clicking on the save button, there may be a label
        # if the input is wrong
        running_time = ttk.Label(self, text="Running time (minutes)")
        running_time_entry = Spinbox(self, from_=0, to=500, textvariable=self.running_time_text)

        # Dropdown list for the type of the projection (film, docu)
        pj_label = ttk.Label(self, text="Projection type")
        self.projection_type_choosen = StringVar()
        projection_types = ttk.Combobox(self, textvariable=self.projection_type_choosen, state='readonly')
        projection_types['values'] = ["Film", "Documentary"]
        projection_types.current(0)

        pjs = [pj['location'] for pj in controller.get_projection_rooms().dicts()]

        # Dropdown list for the location of the event
        pr_label = ttk.Label(self, text="Projection room")
        self.projection_room_choosen = StringVar()
        projection_rooms = ttk.Combobox(self, textvariable=self.projection_room_choosen, state='readonly')
        projection_rooms['values'] = pjs
        projection_rooms.current(0)

        # Inputs for the event's status to go 'finished'
        self.room_reserved = IntVar()
        self.management = IntVar()
        self.equipment_reserved = IntVar()
        self.guest_attendance = IntVar()

        check_frame = ttk.Frame(self)
        room_chbutton = ttk.Checkbutton(check_frame, text="Room reserved", variable=self.room_reserved)
        equipment_chbutton = ttk.Checkbutton(check_frame, text="Equipment reserved", variable=self.equipment_reserved)
        management_chbutton = ttk.Checkbutton(check_frame, text="Management reserved", variable=self.management)
        guest_attendance_chbutton = ttk.Checkbutton(check_frame, text="Guest attendance confirmed", variable=self.guest_attendance)



        members_frame = ttk.Frame(self)
        members_label = ttk.Label(self, text="Add members")
        members_scrollbar = ttk.Scrollbar(members_frame, orient=VERTICAL)
        # List of users; the responsible has to choose among them
        # members that'll participate in the event's organisation
        self.members_tree = tkw.CheckboxTreeview(members_frame, columns=('Events'), selectmode='browse', yscrollcommand=members_scrollbar.set)
        members_scrollbar.configure(command=self.members_tree.yview)

        self.members_tree.column("Events")#, width=50)
        self.members_tree.heading("#0", text="Name")
        self.members_tree.heading("Events", text="Events")

        self.members_tree.tag_configure('odd', background="#F0F0F0")
        self.members_tree.tag_configure('even', background="#FAFAFA")
        self.display_members(event_id=None)

        # CATEGORIES
        categories_label = ttk.Label(self, text="Add categories")

        cats_frame = ttk.Frame(self)
        cats_scrollbar = ttk.Scrollbar(cats_frame, orient=VERTICAL)
        self.cats_tree = tkw.CheckboxTreeview(cats_frame, columns=('Price'), selectmode='none')
        cats_scrollbar.configure(command=self.cats_tree.yview)
        self.cats_tree.column("#0", width=140)
        self.cats_tree.column("Price", anchor='center')
        self.cats_tree.heading("#0", text="Title")
        self.cats_tree.heading("Price", text="Price")

        self.cats_tree.tag_configure('odd', background="#F0F0F0")
        self.cats_tree.tag_configure('even', background="#FAFAFA")

        self.display_categories(event_id=None)

        # PRESENTATION
        self.presentation = IntVar()
        self.author = StringVar()
        self.context = StringVar()

        presentation_frame = ttk.Frame(self)
        presentation_check = ttk.Checkbutton(presentation_frame,
                                             text="Author presentation",
                                             variable=self.presentation)

        # DEBATE
        self.debate = IntVar()
        self.speaker = StringVar()
        self.contact_details = StringVar()

        debate_frame = ttk.Frame(self)
        debate_check = ttk.Checkbutton(debate_frame,
                                       text="Debate",
                                       variable=self.debate)

        # Placing the components
        # ROW 0
        title.grid(row=0, column=0, sticky=(W+N))
        error_label.grid(row=0, column=1, sticky=W+N+S, columnspan=3, padx=(10, 0))
        buttons_frame.grid(row=0, column=5, sticky=E)
        back_button.grid(row=0, column=2, pady=5, padx=5, sticky=E)
        save_button.grid(row=0, column=3, pady=5, padx=5, sticky=E)

        # ROW 1
        name_label.grid(row=1, column=0, sticky=W, pady=5, padx=5)
        self.name_entry.grid(row=1, column=1, pady=5, padx=5, sticky=E)
        running_time.grid(row=1, column=2, pady=5, padx=5, sticky=W)
        running_time_entry.grid(row=1, column=3, pady=5, padx=5, sticky=E)

        # ROW 2
        begin.grid(row=2, column=0, sticky=W, pady=5, padx=5)
        begin_entry.grid(row=2, column=1, sticky=E, pady=5, padx=5)
        hour.grid(row=2, column=2, sticky=W, pady=5, padx=5)
        hour_entry.grid(row=2, column=3, sticky=E, pady=5, padx=5)

        # ROW 3
        pj_label.grid(row=3, column=0, sticky=W, pady=5, padx=5)
        projection_types.grid(row=3, column=1, sticky=E, pady=5, padx=5)
        pr_label.grid(row=3, column=2, pady=5, sticky=W, padx=5)
        projection_rooms.grid(row=3, column=3, sticky=E, pady=5, padx=5)

        # ROW 0 RIGHT SIDE
        presentation_frame.grid(row=1, column=4, sticky=NSEW, columnspan=2, rowspan=2, pady=5, padx=5)
        presentation_check.grid(row=0, column=0, sticky=W)

        # ROW 3 RIGHT SIDE
        debate_frame.grid(row=3, column=4, sticky=NSEW, rowspan=2, columnspan=2, pady=5, padx=5)
        debate_check.grid(row=0, column=0, sticky=W)

        # ROW 5 RIGHT SIDE
        check_frame.grid(row=5, column=4, rowspan=2, columnspan=2, sticky=N+W, pady=5, padx=5)
        room_chbutton.grid(row=4, column=2, sticky=W)
        equipment_chbutton.grid(row=5, column=2, sticky=W)
        management_chbutton.grid(row=6, column=2, sticky=W)
        guest_attendance_chbutton.grid(row=7, column=2, sticky=W)

        # ROW 6
        members_frame.grid(row=5, column=0, columnspan=2, pady=5, padx=5, sticky=NSEW)
        members_label.grid(row=4, column=0, pady=5, padx=5, sticky=W)
        self.members_tree.pack(side=LEFT)
        members_scrollbar.pack()

        categories_label.grid(row=4, column=2, pady=5, padx=5, sticky=W)
        cats_frame.grid(row=5, column=2, columnspan=2, pady=5, padx=5, sticky=NSEW)
        self.cats_tree.pack(side=LEFT, expand=True)
        cats_scrollbar.pack()

    def check_missing_or_incorrect_input(self) -> str:
        '''
        Name, day, hour, running time, must not be empty
        p = re.compile('^(2[0-4]|1[0-9]|[1-9])$')
        if p.match(self.hour_text.get()) == None:
            print("Wrong hour format")
        '''
        error_msg = []

        if self.name_entry.get() == '':
            error_msg.append('Name')
        if self.begin_text.get() == '':
            error_msg.append('Day')
        if self.hour_text.get() == '':
            error_msg.append('Hour')
        if self.running_time_text.get() == '':
            error_msg.append('Running time')

        if len(self.members_tree.get_checked()) == 0:
            error_msg.append('Members (at least one)')
        if len(self.cats_tree.get_checked()) == 0:
            error_msg.append('Categories (at least one)')

        if len(error_msg) == 0:
            return None
        else:
            return ' '.join(['Missing or incorrect fields :', ', '.join(error_msg)])

    def save(self, event=None):
        '''
        Get all the datas from the form to create an
        event. Redirects to the events page
        '''
        error_msg = self.check_missing_or_incorrect_input()

        if error_msg != None:
            print(error_msg)
            self.error_text.set(error_msg)
            return


        new_event = dict()

        new_event['room_reserved'] = self.room_reserved.get() == 1
        new_event['management'] = self.management.get() == 1
        new_event['equipment_reserved'] = self.equipment_reserved.get() == 1
        new_event['guest_attendance'] = self.guest_attendance.get() == 1

        member_names = [self.members_tree.item(member)['text'] for member in self.members_tree.get_checked()]
        cat_titles = [self.cats_tree.item(title)['text'] for title in self.cats_tree.get_checked()]

        log.info("Name " + self.name_entry.get())
        log.info("Day " + self.begin_text.get())
        log.info("Hour " + self.hour_text.get())
        log.info("Running time " + self.running_time_text.get())

        log.info("Projection type " + self.projection_type_choosen.get())
        log.info("Projection room " + self.projection_room_choosen.get())

        log.info(member_names)
        log.info(cat_titles)

        new_event['name'] = self.name_entry.get()
        new_event['begin'] = self.begin_text.get() + ' ' + self.hour_text.get() + ':00'
        new_event['running_time'] = self.running_time_text.get()
        new_event['projection_type'] = self.projection_type_choosen.get()
        new_event['projection_room'] = self.projection_room_choosen.get()

        new_event['debate'] = self.debate.get() == 1
        new_event['presentation'] = self.presentation.get() == 1

        if self.edit_mode:
            self.controller.update_event(new_event, self.event_id)
            self.controller.update_team(member_names, self.event_id)
            self.controller.update_events_categories(cat_titles, self.event_id)
        else:
            event_id = self.controller.create_event(new_event)
            self.controller.create_team(member_names, event_id)
            self.controller.create_events_categories(cat_titles, event_id)
        self.controller.update_events_page()
        self.controller.show_frame("EventsPage")

    def set_event(self, event: Event):
        self.event = event

    def set_projection_room(self, projection_room):
        self.projection_room = projection_room

    def set_inputs(self):

        self.name.set(self.event.name)
        day = self.event.begin.strftime('%Y-%m-%d')
        hour = self.event.begin.strftime('%H')
        self.begin_text.set(day)
        self.hour_text.set(hour)
        self.running_time_text.set(self.event.running_time)
        self.projection_type_choosen.set(self.event.projection_type)
        self.projection_room_choosen.set(self.projection_room.location)


        if self.event.room_reserved:
            self.room_reserved.set(1)
        else:
            self.room_reserved.set(0)

        if self.event.management:
            self.management.set(1)
        else:
            self.management.set(0)

        if self.event.equipment_reserved:
            self.equipment_reserved.set(1)
        else:
            self.equipment_reserved.set(0)

        if self.event.guest_attendance:
            self.guest_attendance.set(1)
        else:
            self.guest_attendance.set(0)

        self.display_members(event_id=self.event.id)
        self.display_categories(event_id=self.event.id)
        self.event_id = self.event.id

    def display_members(self, event_id: int=None):

        self.members_tree.delete(*self.members_tree.get_children())
        users = self.controller.get_events_per_user(event_id)

        for i in range(len(users)):
            self.members_tree.insert('', 'end', iid=str(i), text=users[i]['user'], tags=('even' if i % 2 else 'odd',), values=(users[i]['events'],))
            self.members_tree.change_state(str(i), users[i]['checked'])

    def display_categories(self, event_id: int=None):

        # The tree is cleaned
        self.cats_tree.delete(*self.cats_tree.get_children())
        # We get the categories realted to the event
        categories = self.controller.get_events_categories(event_id)

        for i, category in enumerate(categories):
            s = '%d%s' % (category['price'], ' €')
            self.cats_tree.insert('', 'end', iid=str(i), text=category['title'], tags=('even' if i % 2 else 'odd',), values=(s,))
            self.cats_tree.change_state(str(i), category['checked'])

    def set_edit_mode(self):
        self.edit_mode = True

    def set_new_mode(self):
        self.edit_mode = False

Ancestors

  • tkinter.ttk.Frame
  • tkinter.ttk.Widget
  • tkinter.Widget
  • tkinter.BaseWidget
  • tkinter.Misc
  • tkinter.Pack
  • tkinter.Place
  • tkinter.Grid

Methods

def check_missing_or_incorrect_input(self)

Name, day, hour, running time, must not be empty p = re.compile('^(2[0-4]|1[0-9]|[1-9])$') if p.match(self.hour_text.get()) == None: print("Wrong hour format")

Expand source code
def check_missing_or_incorrect_input(self) -> str:
    '''
    Name, day, hour, running time, must not be empty
    p = re.compile('^(2[0-4]|1[0-9]|[1-9])$')
    if p.match(self.hour_text.get()) == None:
        print("Wrong hour format")
    '''
    error_msg = []

    if self.name_entry.get() == '':
        error_msg.append('Name')
    if self.begin_text.get() == '':
        error_msg.append('Day')
    if self.hour_text.get() == '':
        error_msg.append('Hour')
    if self.running_time_text.get() == '':
        error_msg.append('Running time')

    if len(self.members_tree.get_checked()) == 0:
        error_msg.append('Members (at least one)')
    if len(self.cats_tree.get_checked()) == 0:
        error_msg.append('Categories (at least one)')

    if len(error_msg) == 0:
        return None
    else:
        return ' '.join(['Missing or incorrect fields :', ', '.join(error_msg)])
def display_categories(self, event_id=None)
Expand source code
def display_categories(self, event_id: int=None):

    # The tree is cleaned
    self.cats_tree.delete(*self.cats_tree.get_children())
    # We get the categories realted to the event
    categories = self.controller.get_events_categories(event_id)

    for i, category in enumerate(categories):
        s = '%d%s' % (category['price'], ' €')
        self.cats_tree.insert('', 'end', iid=str(i), text=category['title'], tags=('even' if i % 2 else 'odd',), values=(s,))
        self.cats_tree.change_state(str(i), category['checked'])
def display_members(self, event_id=None)
Expand source code
def display_members(self, event_id: int=None):

    self.members_tree.delete(*self.members_tree.get_children())
    users = self.controller.get_events_per_user(event_id)

    for i in range(len(users)):
        self.members_tree.insert('', 'end', iid=str(i), text=users[i]['user'], tags=('even' if i % 2 else 'odd',), values=(users[i]['events'],))
        self.members_tree.change_state(str(i), users[i]['checked'])
def save(self, event=None)

Get all the datas from the form to create an event. Redirects to the events page

Expand source code
def save(self, event=None):
    '''
    Get all the datas from the form to create an
    event. Redirects to the events page
    '''
    error_msg = self.check_missing_or_incorrect_input()

    if error_msg != None:
        print(error_msg)
        self.error_text.set(error_msg)
        return


    new_event = dict()

    new_event['room_reserved'] = self.room_reserved.get() == 1
    new_event['management'] = self.management.get() == 1
    new_event['equipment_reserved'] = self.equipment_reserved.get() == 1
    new_event['guest_attendance'] = self.guest_attendance.get() == 1

    member_names = [self.members_tree.item(member)['text'] for member in self.members_tree.get_checked()]
    cat_titles = [self.cats_tree.item(title)['text'] for title in self.cats_tree.get_checked()]

    log.info("Name " + self.name_entry.get())
    log.info("Day " + self.begin_text.get())
    log.info("Hour " + self.hour_text.get())
    log.info("Running time " + self.running_time_text.get())

    log.info("Projection type " + self.projection_type_choosen.get())
    log.info("Projection room " + self.projection_room_choosen.get())

    log.info(member_names)
    log.info(cat_titles)

    new_event['name'] = self.name_entry.get()
    new_event['begin'] = self.begin_text.get() + ' ' + self.hour_text.get() + ':00'
    new_event['running_time'] = self.running_time_text.get()
    new_event['projection_type'] = self.projection_type_choosen.get()
    new_event['projection_room'] = self.projection_room_choosen.get()

    new_event['debate'] = self.debate.get() == 1
    new_event['presentation'] = self.presentation.get() == 1

    if self.edit_mode:
        self.controller.update_event(new_event, self.event_id)
        self.controller.update_team(member_names, self.event_id)
        self.controller.update_events_categories(cat_titles, self.event_id)
    else:
        event_id = self.controller.create_event(new_event)
        self.controller.create_team(member_names, event_id)
        self.controller.create_events_categories(cat_titles, event_id)
    self.controller.update_events_page()
    self.controller.show_frame("EventsPage")
def set_edit_mode(self)
Expand source code
def set_edit_mode(self):
    self.edit_mode = True
def set_event(self, event)
Expand source code
def set_event(self, event: Event):
    self.event = event
def set_inputs(self)
Expand source code
def set_inputs(self):

    self.name.set(self.event.name)
    day = self.event.begin.strftime('%Y-%m-%d')
    hour = self.event.begin.strftime('%H')
    self.begin_text.set(day)
    self.hour_text.set(hour)
    self.running_time_text.set(self.event.running_time)
    self.projection_type_choosen.set(self.event.projection_type)
    self.projection_room_choosen.set(self.projection_room.location)


    if self.event.room_reserved:
        self.room_reserved.set(1)
    else:
        self.room_reserved.set(0)

    if self.event.management:
        self.management.set(1)
    else:
        self.management.set(0)

    if self.event.equipment_reserved:
        self.equipment_reserved.set(1)
    else:
        self.equipment_reserved.set(0)

    if self.event.guest_attendance:
        self.guest_attendance.set(1)
    else:
        self.guest_attendance.set(0)

    self.display_members(event_id=self.event.id)
    self.display_categories(event_id=self.event.id)
    self.event_id = self.event.id
def set_new_mode(self)
Expand source code
def set_new_mode(self):
    self.edit_mode = False
def set_projection_room(self, projection_room)
Expand source code
def set_projection_room(self, projection_room):
    self.projection_room = projection_room