Example #1
0
 def create_report_and_update_filename(self, event=None):
     try:
         MIS_Database_Functions.generate_csv_report()
         self.filename = (
             str(os.getcwd())
             + "\\Reports\\"
             + MIS_Database_Functions.get_most_recent_event_date()
             + "_Attendance_Report.csv"
         )
         self.feedback_label.config(style="SuccessLabel.TLabel")
         self.feedback_label["text"] = "Report File Created Successfully.\nReview for accuracy."
     except PermissionError:
         self.feedback_label.config(style="ErrorLabel.TLabel")
         self.feedback_label["text"] = (
             "There is an issue with file permissions.\n"
             "Make sure the file is not open.\n"
             "If the problem persistsContact the Tech Director."
         )
     except OSError:
         self.feedback_label.config(style="ErrorLabel.TLabel")
         self.feedback_label["text"] = (
             "There was an issue with the operating system call.\n" "Try again or contact the Technical Director."
         )
     except TypeError:
         self.feedback_label.config(style="ErrorLabel.TLabel")
         self.feedback_label["text"] = (
             "The file was not created, likely because there was\n" "no data to put into the report."
         )
Example #2
0
 def create_event(self):
     company_to_create = self.create_event_company.get()
     topic_to_create = self.create_event_topic.get()
     date_to_create = self.create_event_date.get()
     try:
         MIS_Database_Functions.create_event(company_to_create, topic_to_create, date_to_create)
     except IOError as e:   # Temporary solution
         print(str(e))
     except Exception as e:
         print(str(e))
     finally:
         self.create_event_company.delete(0, len(company_to_create))
         self.create_event_topic.delete(0, len(topic_to_create))
         self.create_event_date.delete(0, len(date_to_create))
Example #3
0
def get_event_log_file(eventID=None):
    """
    This function selects data from the database and uses it to construct a file path and name.
    :return: The string value representing the directory path to the log file
    """

    working_directory = os.getcwd()
    working_directory += "\\Logs\\EventLogs\\"

    connection = MIS_Database_Functions.get_connection()
    cursor = connection.cursor()
    cursor.execute("SELECT semester_tag FROM Semester WHERE semester_num = (SELECT MAX(semester_num) FROM Semester)")
    file_name = cursor.fetchone()[0]
    if eventID is None:
        cursor.execute("SELECT MAX(eventID) FROM Event")
    else:
        cursor.execute("SELECT eventID FROM Event WHERE eventID = %d" % eventID)
    event_id = cursor.fetchone()[0]
    cursor.execute("SELECT company FROM Event WHERE (eventID = \'" + str(event_id) + "\')")
    company_name = cursor.fetchone()[0]
    file_name += "_ID" + str(event_id) + "_" + company_name
    file_name = file_name.replace(" ", "_")

    log_file = working_directory + file_name
    return log_file
Example #4
0
    def populate_event_label(self):
        semester_tag = MIS_Database_Functions.get_most_recent_semester_tag()
        if semester_tag is None:  # Failure State
            self.current_label.config(style="ErrorLabel.TLabel")
            self.current_label['text'] = 'No semester created yet!\n' \
                                         'Create one first, then\n' \
                                         'restart this system. :)'
            return

        event_id = MIS_Database_Functions.get_most_recent_event_id()
        if event_id is not None:
            event_data = MIS_Database_Functions.get_event_data(event_id)
            self.current_label['text'] = 'Newest Event:\n%s' % (event_data['company'])
        else:
            self.feedback_label.config(style="ErrorLabel.TLabel")
            self.current_label['text'] = 'No event yet.\nCreate one here.'
Example #5
0
 def get_data(self):
     self.member_netID_to_create = self.create_netID_entry.get()
     self.member_major_to_create = self.create_major_entry.get()
     self.member_classification_to_create = self.create_classification_entry.get()
     self.member_name_to_create = self.create_name_entry.get()
     select_sql_string = "SELECT * FROM Member WHERE netID='"+self.member_netID_to_create+"'"
     connection = MIS_Database_Functions.get_connection()
     cursor = connection.cursor()
     cursor.execute(select_sql_string)
     member_data = cursor.fetchone()
     if member_data is None:
         raw_html = Info_IaState_Scraper.get_raw_html(self.member_netID_to_create)
         parsed_data = Info_IaState_Scraper.parse_student_data(raw_html)
         self.create_classification_entry.insert(0, parsed_data['classification'])
         self.create_major_entry.insert(0, parsed_data['major'])
         if 'Individual Search Results' not in parsed_data['name']:
             self.create_name_entry.insert(0, parsed_data['name'])
         self.trial_checkbox.select()
     else:
         self.create_classification_entry.insert(0, member_data[3])
         self.create_major_entry.insert(0, member_data[2])
         self.create_name_entry.insert(0, member_data[4])
         if member_data[5] == 2:
             self.two_semesters_checkbox.select()
         elif member_data[5] == 1:
             self.one_semester_checkbox.select()
         else:
             for i in range(4):
                 self.trial_checkbox.flash()
                 self.one_semester_checkbox.flash()
                 self.two_semesters_checkbox.flash()
Example #6
0
    def set_focus(self):
        # Populate information in the currency labels
        event_id = MIS_Database_Functions.get_most_recent_event_id()
        if event_id is not None:
            data = MIS_Database_Functions.get_event_data(event_id)
            self.currency_label['text'] = "Current Check In:\n%s" % data['company']
        else:
            self.currency_label['text'] = "Not ready to check in yet.\nPlease create an event."
            self.currency_label.config(style='ErrorLabel.TLabel')

        # Set the tab indexes
        tab_order_tuple = (self.net_id_entry, self.get_data_button, self.submit_data_button, self.clear_all_button,
                           self.verify_button)
        for widget in tab_order_tuple:
            widget.lift()
        tab_order_tuple[0].focus()
Example #7
0
    def check_in_member(self):
        self.member_netID_to_create = self.create_netID_entry.get()
        self.member_major_to_create = self.create_major_entry.get()
        self.member_classification_to_create = self.create_classification_entry.get()
        self.member_name_to_create = self.create_name_entry.get()
        if self.member_netID_to_create is None:
            return
        if self.trial == 0 and self.one_semester == 0 and self.two_semesters == 0:
            return
        select_sql_string = "SELECT * FROM Member WHERE netID='"+self.member_netID_to_create+"'"
        connection = MIS_Database_Functions.get_connection()
        cursor = connection.cursor()
        cursor.execute(select_sql_string)
        member_data = cursor.fetchone()
        cursor.execute("SELECT eventID FROM event WHERE eventID=(SELECT MAX(eventID) FROM event)")
        event_id = cursor.fetchone()
        if member_data is None:
            # Create the new member in the DB
            insert_sql_string = "INSERT INTO Member VALUES('"+str(self.member_netID_to_create)+"', '" + \
                                str(self.member_netID_to_create) + "@iastate.edu', '"\
                                + str(self.member_major_to_create) + \
                                "', '"+str(self.member_classification_to_create)+"', '"\
                                + str(self.member_name_to_create)+"', "
            if self.trial.get() == 1:
                insert_sql_string += "0)"
            elif self.one_semester.get() == 1:
                insert_sql_string += "1)"
            elif self.two_semesters.get() == 1:
                insert_sql_string += "2)"
            else:
                raise Exception("No Check box Marked")
            cursor.execute(insert_sql_string)

        create_ticket_sql_string = "INSERT INTO Ticket VALUES("+str(event_id[0])+", '" + \
                                   self.member_netID_to_create+"')"
        print(create_ticket_sql_string)
        try:
            cursor.execute(create_ticket_sql_string)
            self.notification['text'] = "Welcome to the Event "+self.member_name_to_create+"!"
        except IOError as e:
            self.notification['text'] = "Error "+str(e)
            print(str(e))
        except Exception as e:
            if "UNIQUE" in str(e):
                self.notification['text'] = "Seems you are already checked in. Welcome!"
            else:
                self.notification['text'] = "Error "+str(e)
            print(str(e))
        finally:
            connection.commit()
        self.notification.pack()
        self.create_major_entry.delete(0, len(self.member_major_to_create))
        self.create_classification_entry.delete(0, len(self.member_classification_to_create))
        self.create_name_entry.delete(0, len(self.member_name_to_create))
        self.create_netID_entry.delete(0, len(self.member_netID_to_create))
        self.trial_checkbox.deselect()
        self.one_semester_checkbox.deselect()
        self.two_semesters_checkbox.deselect()
Example #8
0
 def run_end_of_semester(self, event=None):
     verification_code = self.verification_entry.get()
     if verification_code.lower() != "mis exec":
         self.feedback_label.config(style="ErrorLabel.TLabel")
         self.feedback_label['text'] = 'Please remember to enter the verification code.\n' \
                                       'This is to prevent accidental end of semester updates.\n' \
                                       'The verification code is <<mis exec>> without the << >>.'
     else:
         try:
             MIS_Database_Functions.run_end_of_semester()
             self.feedback_label.config(style="SuccessLabel.TLabel")
             self.feedback_label['text'] = 'End of Semester Transaction was run.\n' \
                                           'Please see the logs for more detailed information.'
         except sqlite3.DatabaseError:
             self.feedback_label.config(style="ErrorLabel.TLabel")
             self.feedback_label['text'] = 'There has been an issue with the database.\n' \
                                           'Please try again or consult the technical director.'
         except IOError:
             self.feedback_label.config(style="ErrorLabel.TLabel")
             self.feedback_label['text'] = 'There has been an IO error.\n' \
                                           'Please try again or consult the technical director.'
Example #9
0
    def create_event(self, event=None):
        event_date = self.event_date_entry.get().strip()
        company_name = self.company_name_entry.get().strip()
        event_topic = self.event_topic_entry.get().strip()

        if event_date == '' or company_name == '' or event_topic == '':
            self.feedback_label.config(style="ErrorLabel.TLabel")
            self.feedback_label['text'] = "Please provide at least some\nvalue for each field."
            return
        if len(event_date) != 11 or event_date[2] != '/' or event_date[6] != '/':
            self.feedback_label.config(style="ErrorLabel.TLabel")
            self.feedback_label['text'] = "Provide dates in format DD/MMM/YYYY\nExample: 12/AUG/2015"
            return
        semester_tag = MIS_Database_Functions.get_most_recent_semester_tag()
        month = event_date[3:6]
        if semester_tag[0] == 'F' and month not in fall_months:
            self.feedback_label.config(style="ErrorLabel.TLabel")
            self.feedback_label['text'] = "Check date.\nMonth is incorrect for current semester." \
                                          "\nYou may have forgotten to create a new semester."
            return
        elif semester_tag[0] == 'S' and month not in spring_months:
            self.feedback_label.config(style="ErrorLabel.TLabel")
            self.feedback_label['text'] = "Check date.\nMonth is incorrect for current semester." \
                                          "\nYou may have forgotten to create a new semester."
            return
        results = MIS_Database_Functions.create_event(company_name, event_topic, event_date)
        if results[0]:  # Success state
            self.feedback_label.config(style="SuccessLabel.TLabel")
            self.feedback_label['text'] = "The new event was added.\n Event ID: %s\n" \
                                          "Restart the system before checking in." % str(results[1])
        else:  # Failure state
            self.feedback_label.config(style="ErrorLabel.TLabel")
            self.feedback_label['text'] = "An error occurred:\n" + str(results[1])
        self.company_name_entry.delete(START, len(company_name))
        self.event_date_entry.delete(START, len(event_date))
        self.event_topic_entry.delete(START, len(event_topic))
        self.populate_event_label()
        self.set_focus()
Example #10
0
 def gather_data(self):
     #TODO: Alias MIS_Database_Functions, these lines are way to long
     prev_event_aggregates = MIS_Database_Functions.get_event_aggregates(
         MIS_Database_Functions.get_most_recent_event_id())  # Event that just happened
     curr_event_aggregates = MIS_Database_Functions.get_event_aggregates(
         MIS_Database_Functions.get_most_recent_event_id()-1)  # Event before that
     prev_event_classifications = MIS_Database_Functions.get_event_classification_aggregates(
         MIS_Database_Functions.get_most_recent_event_id())
     curr_event_classifications = MIS_Database_Functions.get_event_classification_aggregates(
         MIS_Database_Functions.get_most_recent_event_id()-1)
     self.target_major = MIS_Database_Functions.select_config_info('target_major')
     for aggregate in prev_event_aggregates:
         self.prev_event_data[aggregate] = prev_event_aggregates[aggregate]
     for aggregate in curr_event_aggregates:
         self.curr_event_data[aggregate] = curr_event_aggregates[aggregate]
     for classification in prev_event_classifications:
         self.prev_event_data['classification'][classification] = prev_event_classifications[classification]
     for classification in curr_event_classifications:
         self.curr_event_data['classification'][classification] = curr_event_classifications[classification]
     return True
Example #11
0
    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        ##############################################################
        #                      SIDE FRAME                            #
        ##############################################################
        self.logo_border = ttk.Label(self, border=border_default, relief=relief_default, takefocus=False)
        self.logo_border.grid(row=0, column=0, rowspan=4, columnspan=3, sticky="nsew")

        self.logo_label = ttk.Label(self, image=controller.image, takefocus=False)
        self.logo_label.image = controller.image
        self.logo_label.grid(row=0, column=0, rowspan=4, columnspan=3)

        self.side_frame = ttk.Label(self, border=border_default, relief=relief_default, takefocus=False)
        self.side_frame.grid(row=4, column=0, rowspan=6, columnspan=3, sticky="nsew")

        self.frame_title = ttk.Label(self, text="SEMESTER CREATION", font=Superhead, takefocus=False)
        self.frame_title.grid(row=4, column=0, columnspan=3, rowspan=1)

        current_sem_tag = MIS_Database_Functions.get_most_recent_semester_tag()
        if current_sem_tag is not None:
            self.currency_label = ttk.Label(self, text="Current Semester: %s" % current_sem_tag, font=Head)
        else:
            self.currency_label = ttk.Label(self, text="No Semester Created!\n"
                                                       "Create one then restart\n"
                                                       "this system.", font=Head)
            self.currency_label.config(style="ErrorLabel.TLabel")
        self.currency_label.grid(row=5, column=0, columnspan=3, rowspan=2)

        self.instructions = ttk.Label(self, text="At the beginning of each semester\n"
                                                 "come here and create a new entry \n"
                                                 "for the database. This is needed \n"
                                                 "for data verification, and makes \n"
                                                 "aggregating much easier.")
        self.instructions.grid(row=7, column=0, columnspan=3, rowspan=3, sticky="nw", padx=(10, 10))

        self.content_border_label = ttk.Label(self, border=border_default, relief=relief_default)
        self.content_border_label.grid(row=0, column=3, sticky="nsew", rowspan=7, columnspan=7)
        #############################################################
        #                     MAIN CONTENTS                         #
        #############################################################
        self.big_label = ttk.Label(self, text="NEW SEMESTER DATES", font=Head)
        self.big_label.grid(row=0, column=5, columnspan=3)

        self.semester_start_label = ttk.Label(self, text="Semester Start:", font=Subhead)
        self.semester_start_label.grid(row=1, column=3, columnspan=2, sticky="n")
        self.semester_start_entry = ttk.Entry(self)
        self.semester_start_entry.grid(row=1, column=5, sticky="new", columnspan=2)

        self.semester_end_label = ttk.Label(self, text="End of Semester:", font=Subhead)
        self.semester_end_label.grid(row=1, column=3, columnspan=2, sticky="s")
        self.semester_end_entry = ttk.Entry(self)
        self.semester_end_entry.grid(row=1, column=5, sticky="sew", columnspan=2)

        self.feedback_label_border = ttk.Label(self, border=border_default, relief=relief_default)
        self.feedback_label_border.grid(row=7, column=3, rowspan=3, columnspan=7, sticky="nsew")
        self.feedback_label = ttk.Label(self, text="Awaiting new semester entry.",
                                        font=Subhead)
        self.feedback_label.grid(row=7, column=3, rowspan=3, columnspan=7, pady=(5, 5), padx=(5, 5))
        self.semester_submitter_button = ttk.Button(self, text="Submit Semester",
                                                    command=lambda: self.create_semester(),
                                                    style="DataSubmitter.TButton")
        self.semester_submitter_button.bind("<Return>", lambda e: self.create_semester())
        self.semester_submitter_button.grid(row=3, column=5, sticky="ew", columnspan=2)

        # This code only matters for systems whose databases do not have any semesters in them
        if current_sem_tag is None:
            self.semester_tag_label = ttk.Label(self, text="Semester Tag:", font=Subhead)
            self.semester_tag_label.grid(row=2, column=3, sticky="n", columnspan=2, pady=(10, 0))

            self.semester_tag_entry = ttk.Entry(self)
            self.semester_tag_entry.grid(row=2, column=5, sticky="new", columnspan=2, pady=(10, 0))
            self.feedback_label['text'] = 'Only for this semester you will need\n' \
                                          'to provide a semester tag in the format\n' \
                                          'F## where F is either F or S (fall or\n ' \
                                          'spring), and ## is the year. In the \n' \
                                          'future this will be automatic.'
            self.semester_submitter_button.bind("<Return>", lambda e: self.create_semester(
                semester_tag=self.semester_tag_entry.get()))
            self.semester_submitter_button.config(command=lambda: self.create_semester(
                semester_tag=self.semester_tag_entry.get()))
Example #12
0
    def create_semester(self, event=None, semester_tag=None):
        start = self.semester_start_entry.get().strip()
        end = self.semester_end_entry.get().strip()
        if len(start) != 11 or len(end) != 11 or start[2] != '/' or end[2] != '/':
            self.feedback_label.config(style='ErrorLabel.TLabel')
            self.feedback_label['text'] = "Please enter dates in the format:\n" \
                                          "DD/MMM/YYYY.\n" \
                                          "Example: 12/AUG/2015"
            return  # Failure state

        # Normal Semester Creation with automated Semester Tag generation
        if not hasattr(self, 'semester_tag_entry'):
            start_month = start[3:6]
            end_month = end[3:6]
            previous_semester_tag = MIS_Database_Functions.get_most_recent_semester_tag()
            try:
                previous_semester_tag_year = int(previous_semester_tag[1:])
            except ValueError:
                self.feedback_label.config(style='ErrorLabel.TLabel')
                self.feedback_label['text'] = "The previous semester's tag is incorrect.\n" \
                                              "Have the technical director correct this issue before proceeding."
                return
            if previous_semester_tag[0] == 'F':
                new_semester_tag_year = previous_semester_tag_year + 1
                new_semester_tag = 'S'
            else:
                new_semester_tag = 'F'
                new_semester_tag_year = previous_semester_tag_year
            new_semester_tag += str(new_semester_tag_year)
            # Checks to make sure the start and end dates are in the right months for the new Semester
            if start_month not in months or end_month not in months:
                self.feedback_label.config(style='ErrorLabel.TLabel')
                self.feedback_label['text'] = "The month in at least one of the dates\n" \
                                              "is not correct for semester  %s." % new_semester_tag
            if new_semester_tag[0] == 'F' and (start_month not in fall_months or end_month not in fall_months):
                self.feedback_label.config(style='ErrorLabel.TLabel')
                self.feedback_label['text'] = "The month in at least one of the dates\n" \
                                              "is not correct for semester  %s." % new_semester_tag
                return
            if new_semester_tag[0] == 'S' and (start_month not in spring_months or end_month not in spring_months):
                self.feedback_label.config(style='ErrorLabel.TLabel')
                self.feedback_label['text'] = "The month in at least one of the dates\n" \
                                              "is not correct for semester  %s." % new_semester_tag
                return
            start_year = int(start[9:])
            end_year = int(end[9:])
            if start_year != new_semester_tag_year or end_year != new_semester_tag_year:
                self.feedback_label.config(style='ErrorLabel.TLabel')
                self.feedback_label['text'] = 'Incorrect year. It should be \'%s' \
                                              % str(new_semester_tag_year)
                return
            self.feedback_label.config(style="SuccessLabel.TLabel")
            self.feedback_label['text'] = "Semester created successfully.\n" \
                                          " You are ready to create events and check in members."
            MIS_Database_Functions.create_semester(new_semester_tag, start, end)
            self.semester_end_entry.delete(0, len(self.semester_end_entry.get()))
            self.semester_start_entry.delete(0, len(self.semester_start_entry.get()))

        # Semester Creation from the blank slate
        else:
            MIS_Database_Functions.create_semester(semester_tag, start, end)
            self.feedback_label.config(style="SuccessLabel.TLabel")
            self.feedback_label['text'] = "Semester created successfully.\n" \
                                          "You are ready to create events."
Example #13
0
    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        event_date = MIS_Database_Functions.get_most_recent_event_date()
        if event_date is not None:
            self.filename = str(os.getcwd()) + "\\Reports\\" + event_date + "_Attendance_Report.csv"
        else:
            self.filename = ""

        #####################################################
        #                  SIDE FRAME                       #
        #####################################################
        self.logo_border = ttk.Label(self, border=border_default, relief=relief_default, takefocus=False)
        self.logo_border.grid(row=0, column=0, rowspan=4, columnspan=3, sticky="nsew")

        self.logo_label = ttk.Label(self, image=controller.image, takefocus=False)
        self.logo_label.image = controller.image
        self.logo_label.grid(row=0, column=0, rowspan=4, columnspan=3)

        self.side_frame = ttk.Label(self, border=border_default, relief=relief_default, takefocus=False)
        self.side_frame.grid(row=4, column=0, rowspan=6, columnspan=3, sticky="nsew")

        self.frame_title = ttk.Label(self, text="REPORTS", font=Superhead, takefocus=False)
        self.frame_title.grid(row=4, column=0, columnspan=3, rowspan=1)

        self.file_label = ttk.Label(self, text="Data Administration", font=Head)
        self.file_label.grid(row=5, column=0, columnspan=3, rowspan=2)

        self.instructions = ttk.Label(
            self,
            text="Use the buttons to manage reports.\n\n"
            "1) Create the report.\n"
            "2) Review it with Excel.\n"
            "3) Email it",
        )
        self.instructions.grid(row=7, column=0, columnspan=3, rowspan=3, sticky="nw", padx=(10, 10))

        #####################################################
        #                  MAIN CONTENTS                    #
        #####################################################
        self.content_border_label = ttk.Label(self, border=border_default, relief=relief_default, takefocus=False)
        self.content_border_label.grid(row=0, column=3, sticky="nsew", rowspan=7, columnspan=7)

        self.generate_label = ttk.Label(self, text="REPORT GENERATION", font=Head, takefocus=False)
        self.generate_label.grid(row=0, column=5, columnspan=3, sticky="n", pady=(10, 0))
        self.generate_report_button = ttk.Button(
            self,
            text="CREATE REPORT",
            command=lambda: self.create_report_and_update_filename(),
            style="DataSubmitter.TButton",
        )
        self.generate_report_button.bind("<Return>", lambda e: self.create_report_and_update_filename())
        self.generate_report_button.grid(row=0, column=5, columnspan=3, sticky="sew")

        self.review_label = ttk.Label(self, text="REVIEW REPORTS", font=Head, takefocus=False)
        self.review_label.grid(row=2, column=5, columnspan=3, sticky="n", pady=(10, 0))
        self.review_button = ttk.Button(
            self, text="REVIEW", command=lambda: self.review_report(), style="DataGetter.TButton"
        )
        self.review_button.bind("<Return>", lambda e: self.review_report())
        self.review_button.grid(row=2, column=5, columnspan=3, sticky="sew")

        self.email_label = ttk.Label(self, text="EMAIL REPORTS", font=Head, takefocus=False)
        self.email_label.grid(row=4, column=5, columnspan=3, sticky="n", pady=(10, 0))
        self.email_button = ttk.Button(
            self, text="EMAIL", command=lambda: self.email_report(), style="DataSubmitter.TButton"
        )
        self.email_button.bind("<Return>", lambda e: self.email_report())
        self.email_button.grid(row=4, column=5, columnspan=3, sticky="sew")

        self.feedback_label_border = ttk.Label(self, border=border_default, relief=relief_default, takefocus=False)
        self.feedback_label_border.grid(row=7, column=3, rowspan=3, columnspan=7, sticky="nsew")
        self.feedback_label = ttk.Label(
            self,
            text="Use the buttons above to\n"
            "generate, open, and email reports.\n"
            "Please note you can also find these\n"
            "CSV files in the Reports directory.",
            font=Subhead,
            takefocus=False,
        )
        self.feedback_label.grid(row=7, column=3, rowspan=3, columnspan=7, pady=(5, 5), padx=(5, 5))
Example #14
0
    def __init__(self):
        tk.Tk.__init__(self)
        #tk.Tk.iconbitmap(self, default="Images/mis_logo.ico") ==> this was making Linux cry,
        #                                                          if you can get it to work go ahead
        tk.Tk.wm_title(self, "Club Check In")

        image_location = MIS_Database_Functions.select_config_info('logo_location')
        self.image = PhotoImage(file=image_location)

        # This container will contain all the other frames.
        container = ttk.Frame(self)
        container.pack(expand=True, fill="both")
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.container = container

        # Menu bar => contains the drop down menus
        menu_bar = tk.Menu(container, font=Body)
        # Other menu variables are the actual content of the drop down menus
        # Check in menu contains the systems primary functions (i.e. event creation and checking in members)
        check_in_menu = tk.Menu(menu_bar, tearoff=0, font=Body)
        check_in_menu.add_command(label="Home", command=lambda: self.show_frame(StartPageAlt))
        check_in_menu.add_separator()
        check_in_menu.add_command(label="Check In Members", command=lambda: self.show_frame(CheckInFrameAlt))
        check_in_menu.add_separator()
        check_in_menu.add_command(label="Create An Event", command=lambda: self.show_frame(CreateEventFrameAlt))
        check_in_menu.add_separator()
        check_in_menu.add_command(label="Quit", command=quit)
        check_in_menu.add_separator()
        menu_bar.add_cascade(menu=check_in_menu, label="Main")

        # Data menu contains functions for viewing data and sending it to those who need it.
        data_menu = tk.Menu(menu_bar, tearoff=0, font=Body)
        data_menu.add_command(label="Generate Report", command=lambda: self.show_frame(ReportGeneratorFrameAlt))
        data_menu.add_separator()
        data_menu.add_command(label="Analysis", command=lambda: self.show_frame(AnalyzeFrameAlt))
        menu_bar.add_cascade(menu=data_menu, label="Data")

        # Admin menu contains information
        admin_menu = tk.Menu(menu_bar, tearoff=0, font=Body)
        admin_menu.add_command(label="Manage Email Recipients", command=lambda: self.show_frame(EmailManagerFrameAlt))
        admin_menu.add_separator()
        admin_menu.add_command(label="New Semester", command=lambda: self.show_frame(SemesterCreatorAlt))
        admin_menu.add_separator()
        admin_menu.add_command(label="End of Semester", command=lambda: self.show_frame(EndOfSemesterAlt))
        menu_bar.add_cascade(menu=admin_menu, label="Admin")
        tk.Tk.config(self, menu=menu_bar)

        # Universal Style to be used by SOMMS
        data_getter_style = ttk.Style()
        data_getter_style.configure('DataGetter.TButton', foreground='#006600')
        data_remover_style = ttk.Style()
        data_remover_style.configure('DataRemover.TButton', foreground='#CC0000')
        data_submitter_style = ttk.Style()
        data_submitter_style.configure('DataSubmitter.TButton', foreground='#000066')

        error_label = ttk.Style()
        error_label.configure('ErrorLabel.TLabel', foreground='#CC0000')
        success_label = ttk.Style()
        success_label.configure('SuccessLabel.TLabel', foreground='#000066')

        # Set the size of the primary window
        self.geometry(newGeometry="800x600")

        # This dictionary will hold all the frames for the GUI, call show_frame with the name of the class
        # to bring them to the front of the primary window
        self.frames = {}
        # If new frames need to be added remember to add them to the END of the tuple to protect the key bindings.
        self.frame_set = (StartPageAlt, CheckInFrameAlt, CreateEventFrameAlt,
                          ReportGeneratorFrameAlt,
                          AnalyzeFrameAlt, EmailManagerFrameAlt, SemesterCreatorAlt, EndOfSemesterAlt)
        for f in self.frame_set:
            frame = f(container, self)
            for x in range(10):
                frame.rowconfigure(x, minsize=600/10)
                frame.columnconfigure(x, minsize=800/10)
            self.frames[f] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        for f in self.container.children:
            bind_keys(self, self.container.children[f])
        self.show_frame(StartPageAlt)
Example #15
0
    def submit_data(self, event=None):
        major = self.major_entry.get().strip()
        classification = self.classification_entry.get().strip()
        name = self.name_entry.get().strip()
        netid = self.net_id_entry.get().strip()

        for x in (major, classification, name, netid):
            if x == "":
                self.feedback_label.config(style="ErrorLabel.TLabel")
                self.feedback_label['text'] = 'Make sure there is an entry for every field.'
                return
        if self.dues.get() == "two":
            dues = 2
        elif self.dues.get() == "one":
            dues = 1
        else:
            dues = 0
        data = MIS_Database_Functions.check_member(netid)
        if data is not None:
            if data['major'] != major:
                MIS_Database_Functions.set_major(netid, major)
                Logger.write_to_log(Logger.get_event_log_file(), "Major updated to %s for net id %s\n" % (major, netid))
            if data['classification'] != classification:
                MIS_Database_Functions.set_classification(netid, classification)
                Logger.write_to_log(Logger.get_event_log_file(), "Classification updated to '%s' for net id '%s'\n" %
                                    (classification, netid))
            if data['name'] != name:
                MIS_Database_Functions.set_name(netid, name)
                Logger.write_to_log(Logger.get_event_log_file(), "Name updated to %s for net id %s\n" % (name, netid))
            if data['dues_paid'] != dues and dues > 0:
                MIS_Database_Functions.update_payment(netid, dues)
                Logger.write_to_log(Logger.get_event_log_file(), "Payment made for %s, %d semesters paid for\n"
                                    % (netid, dues))
                if self.payment_made.get() == 0:
                    Logger.write_to_log(Logger.get_event_log_file(), "Payment above NOT collected\n")
        else:
            MIS_Database_Functions.create_member(netid, name, major, classification, dues)
            Logger.write_to_log(Logger.get_event_log_file(),
                                'New Member: (%s, %s, %s, %s, %d)\n' % (netid, name, major, classification, dues))
            if dues > 0:
                Logger.write_to_log(Logger.get_event_log_file(), "Payment made for %s semesters for net id %s\n"
                                    % (str(dues), netid))
                if self.payment_made.get() == 0:
                    Logger.write_to_log(Logger.get_event_log_file(), "Payment above NOT collected\n")
        event_id = MIS_Database_Functions.get_most_recent_event_id()

        # Weird edge case: when user accidentally presses trial button, may end up recording a trial meeting for a
        # a user who has already paid for the semester. Code is corrected to make sure the users payment information is
        # not affected, this just makes sure the logs don't falsely record a trial meeting.
        if data is None and dues == 0:
            Logger.write_to_log(Logger.get_event_log_file(), "Trial Meeting for %s\n" % netid)
        elif hasattr(data, 'dues_paid'):
            if data['dues_paid'] == 0:
                Logger.write_to_log(Logger.get_event_log_file(), "Trial Meeting for %s\n" % netid)

        MIS_Database_Functions.create_ticket(event_id, netid)
        Logger.write_to_log(Logger.get_event_log_file(), "\n\n")
        self.clear_all()
        self.feedback_label.config(style="SuccessLabel.TLabel")
        self.feedback_label['text'] = name.split(" ")[1] + " was checked in successfully!\n" \
                                                                            "Welcome them to the meeting!"
Example #16
0
    def get_data(self, net_id, event=None):
        if net_id is None or net_id.strip() == "":
            self.feedback_label.config(style="ErrorLabel.TLabel")
            self.feedback_label['text'] = "No net ID entered yet."
            return  # Failure state

        if self.major_entry.get() and self.classification_entry.get():
            self.feedback_label.config(style="ErrorLabel.TLabel")
            self.feedback_label['text'] = "Make sure to clear the entries\n" \
                                          "before trying to gather data."
            return  # Failure State

        data = MIS_Database_Functions.check_member(net_id)
        if data is not None:
            self.name_entry.insert(START, data['name'])
            self.major_entry.insert(START, data['major'])
            self.classification_entry.insert(START, data['classification'])
            if data['dues_paid'] == 2:
                self.two_semesters.invoke()
            elif data['dues_paid'] == 1:
                self.one_semester.invoke()
            else:
                self.dues.set("trial")
            attendance_data = \
                MIS_Database_Functions.get_attendance_data(net_id,
                                                           MIS_Database_Functions.get_most_recent_semester_tag())
            if attendance_data is not None:
                if attendance_data['meetings_attended'] > 0 and attendance_data['dues'] < 1:
                    self.feedback_label.config(style="ErrorLabel.TLabel")
                    self.feedback_label['text'] = "Member %s has already used their trial meeting.\n" \
                                                  "They have not yet paid dues.\n" \
                                                  "Collect payment as necessary." % net_id
                else:
                    self.feedback_label.config(style="SuccessLabel.TLabel")
                    self.feedback_label['text'] = "Member %s is paid for %d more semester(s).\n" \
                                                  "They have attended %d meetings this semester." % \
                                                  (net_id, attendance_data['dues'],
                                                   attendance_data['meetings_attended'])
            else:
                self.feedback_label.config(style="SuccessLabel.TLabel")
                self.feedback_label['text'] = "This member has not yet used their trial meeting.\n" \
                                              "They are good to go.\n" \
                                              "Collect payment only if they want to pay now."
        else:
            try:
                data = Info_IaState_Scraper.get_raw_html(net_id)
                data = Info_IaState_Scraper.parse_student_data(data)
                if data is not None:
                    self.name_entry.insert(START, data['name'])
                    self.major_entry.insert(START, data['major'])
                    self.classification_entry.insert(START, data['classification'])
                    self.feedback_label.config(style="SuccessLabel.TLabel")
                    self.feedback_label['text'] = "No current data on %s.\n" \
                                                  "Found data in the directory.\n" \
                                                  "New members receive 1 trial meeting." % net_id
                else:
                    self.feedback_label.config(style="SuccessLabel.TLabel")
                    self.feedback_label['text'] = "No current data on  this net id: %s.\n" \
                                                  "Nothing found on the directory either.  \n" \
                                                  "Make sure their net ID is correct.\n" \
                                                  "If it is then ask them to type in data " \
                                                  "for the other fields.\n" \
                                                  "New members receive 1 trial meeting." % net_id
            except URLError:
                self.feedback_label.config(style="ErrorLabel.TLabel")
                self.feedback_label['text'] = 'No current data on net id: %s.\n' \
                                              'Directory request failed.\n' \
                                              'Check internet connection then try again.\n' \
                                              'If all else fails, enter data manually.' % net_id