def addUser(self, form):

        db = self.__db
        cursor = self.__cursor
        hostname = self.__hostname
        mail_server = self.__mail_server  # August 19, 2011

        mail_programmer = self.__mail_programmer  # July 30, 2010
        mail_biologist = self.__mail_biologist
        mail_admin = self.__mail_admin

        # print "Content-type:text/html"		# TEMPORARY, REMOVE AFTER DEBUGGING TO HAVE SCRIPT REDIRECT PROPERLY!!!!!!
        # print					# DITTO
        # print `form`

        uHandler = UserHandler(db, cursor)
        lHandler = LabHandler(db, cursor)
        pHandler = ProjectDatabaseHandler(db, cursor)

        ucMapper = UserCategoryMapper(db, cursor)
        category_Name_ID_Map = ucMapper.mapCategoryNameToID()

        # Get form values
        labID = int(form.getvalue("labs"))
        username = form.getvalue("username")

        firstName = form.getvalue("firstName")
        lastName = form.getvalue("lastName")
        description = firstName + " " + lastName

        to_email = form.getvalue("email")

        from_email = mail_admin

        # Change July 30, 2010 - random password generator
        # passwd = form.getvalue("password")

        chars = string.letters + string.digits
        passwd = ""

        for i in range(10):
            passwd += choice(chars)

            # System access level: Lab default or override?
            # if form.getvalue("privChoiceRadio") == 'override':
        accessLevel = category_Name_ID_Map[form.getvalue("system_access_level")]
        # else:
        # accessLevel = lHandler.findDefaultAccessLevel(labID)

        newProps = {}

        try:
            # Insert User information
            userID = uHandler.insertUser(
                username, firstName, lastName, description, accessLevel, to_email, passwd, labID
            )
            # newUser = uHandler.getUserByID(userID)
            tmpLab = lHandler.findLabByID(labID)
            # print tmpLab.getName()

            # Insert Project info
            # Sept. 11/07: Differentiate between user categories Reader and Writer - different field names
            if form.has_key("userProjectsReadonly"):
                # list of IDs
                readonlyProjects = utils.unique(form.getlist("userProjectsReadonly"))
                # print `readonlyProjects`
                pHandler.insertMemberProjects(userID, readonlyProjects, "Reader")

            elif form.has_key("userProjectsReadonlyWrite"):
                # list of IDs
                readonlyProjects = utils.unique(form.getlist("userProjectsReadonlyWrite"))
                # print `readonlyProjects`
                pHandler.insertMemberProjects(userID, readonlyProjects, "Reader")

                # Write projects exist only for Writers
            if form.has_key("userProjectsWrite"):
                writeProjects = utils.unique(form.getlist("userProjectsWrite"))
                pHandler.insertMemberProjects(userID, writeProjects, "Writer")

                # don't assign projects to a User instance - will retrieve them from db in output function
            newUser = User(
                userID,
                username,
                firstName,
                lastName,
                description,
                tmpLab,
                form.getvalue("system_access_level"),
                to_email,
                passwd,
                [],
                [],
            )

            email_subject = "OpenFreezer User Account"

            msg = email.MIMEMultipart.MIMEMultipart("alternative")

            msg["Subject"] = email_subject
            msg["To"] = to_email

            msgText = (
                "Hi "
                + firstName
                + ",<BR><BR>An OpenFreezer account has been created for you.&nbsp;&nbsp;Your access level is "
                + form.getvalue("system_access_level")
                + ", so you can "
            )

            if form.getvalue("system_access_level") == "Reader":
                msgText += "search for clones.&nbsp;&nbsp;If you wish to add/modify reagents or create projects, please contact the administrator to upgrade your access level.<BR>"

            elif form.getvalue("system_access_level") == "Writer":
                msgText += "search, add, and modify reagents.&nbsp;&nbsp;If you wish to create projects, please contact the administrator to upgrade your access level.<BR>"

            elif form.getvalue("system_access_level") == "Creator":
                msgText += "search for clones, add and modify reagents, as well as create your own projects.<BR>"

                #####################################################
                # CHANGE TEXT AS NEEDED
                #####################################################

            msgText += (
                "<BR>The URL to access the system is <a href='"
                + hostname
                + "'>"
                + hostname
                + "</a>.&nbsp;&nbsp;Your username is <b>"
                + username
                + "</b>, and your temporary password is <b>"
                + passwd
                + "</b>.&nbsp;&nbsp;Please <u>change the temporary password as soon as you log into the website</u> - you can do it through the 'Change your password' link under the 'User Management' menu section.<BR><BR>Please refer to http://openfreezer.org for additional support.<BR><BR>Sincerely,<BR>OpenFreezer  support team.<BR><BR><span style='font-family:Courier; font-size:10pt;'><HR>This is an automatically generated e-mail message.&nbsp;&nbsp;Please do not reply to this e-mail.&nbsp;&nbsp;All questions should be directed to your local administrator.</span>"
            )

            msgText = email.MIMEText.MIMEText(msgText, "html")
            msg.attach(msgText)

            server = smtplib.SMTP(mail_server)
            server.set_debuglevel(1)

            server.sendmail(from_email, [to_email], msg.as_string())
            server.quit()

            self.printUserInfo("view", newUser)

        except DeletedUserException:

            # Without asking too many questions, reactivate the deleted user and overwrite his/her attributes with the form input values
            userID = uHandler.findUserIDByUsername(username)

            newProps["firstname"] = firstName
            newProps["lastname"] = lastName
            newProps["description"] = description
            newProps["email"] = email
            newProps["status"] = "ACTIVE"
            newProps["password"] = passwd

            # Insert new database values and create new object
            uHandler.updateUserProperties(userID, newProps)  # database update
            newUser = uHandler.getUserByID(userID)

            # Insert Project info
            readProjects = []
            writeProjects = []

            if form.has_key("userProjectsReadonly"):
                # list of IDs
                readonlyProjects = form.getlist("userProjectsReadonly")

                for r in readonlyProjects:
                    pHandler.addProjectMember(r, userID, "Reader")

                    # tmpReadProject = pHandler.findPacket(r)
                    # readProjects.append(tmpReadProject)
                    # newUser.addProject(tmpReadProject, 'read')

            if form.has_key("userProjectsWrite"):
                writeProjects = form.getlist("userProjectsWrite")

                for w in writeProjects:
                    pHandler.addProjectMember(w, userID, "Writer")

                    # tmpWriteProject = pHandler.findPacket(w)
                    # writeProjects.append(tmpWriteProject)
                    # newUser.addProject(tmpWriteProject, 'write')

                    # newUser.setReadProjects(readProjects)
                    # newUser.setWriteProjects(writeProjects)

            self.printUserInfo("view", newUser)
            # utils.redirect(hostname + "User.php?View=3&fd=" + filename)

        except DuplicateUsernameException:

            # return to the view with input values and error message
            # Need to construct a dummy User instance to save form values for error output on the next page (otherwise they're lost as soon as Submit is pressed and creation view is exited)
            newLab = lHandler.findLabByID(labID)
            newUser = User(0, username, firstName, lastName, description, newLab, "", email, passwd)

            self.printUserInfo("create", newUser)
    def addUser(self, form):

        db = self.__db
        cursor = self.__cursor
        hostname = self.__hostname
        mail_server = self.__mail_server  # August 19, 2011

        mail_programmer = self.__mail_programmer  # July 30, 2010
        mail_biologist = self.__mail_biologist
        mail_admin = self.__mail_admin

        #print "Content-type:text/html"		# TEMPORARY, REMOVE AFTER DEBUGGING TO HAVE SCRIPT REDIRECT PROPERLY!!!!!!
        #print					# DITTO
        #print `form`

        uHandler = UserHandler(db, cursor)
        lHandler = LabHandler(db, cursor)
        pHandler = ProjectDatabaseHandler(db, cursor)

        ucMapper = UserCategoryMapper(db, cursor)
        category_Name_ID_Map = ucMapper.mapCategoryNameToID()

        # Get form values
        labID = int(form.getvalue("labs"))
        username = form.getvalue("username")

        firstName = form.getvalue("firstName")
        lastName = form.getvalue("lastName")
        description = firstName + " " + lastName

        to_email = form.getvalue("email")

        from_email = mail_admin

        # Change July 30, 2010 - random password generator
        #passwd = form.getvalue("password")

        chars = string.letters + string.digits
        passwd = ""

        for i in range(10):
            passwd += choice(chars)

        # System access level: Lab default or override?
        #if form.getvalue("privChoiceRadio") == 'override':
        accessLevel = category_Name_ID_Map[form.getvalue(
            "system_access_level")]
        #else:
        #accessLevel = lHandler.findDefaultAccessLevel(labID)

        newProps = {}

        try:
            # Insert User information
            userID = uHandler.insertUser(username, firstName, lastName,
                                         description, accessLevel, to_email,
                                         passwd, labID)
            #newUser = uHandler.getUserByID(userID)
            tmpLab = lHandler.findLabByID(labID)
            #print tmpLab.getName()

            # Insert Project info
            # Sept. 11/07: Differentiate between user categories Reader and Writer - different field names
            if form.has_key("userProjectsReadonly"):
                # list of IDs
                readonlyProjects = utils.unique(
                    form.getlist("userProjectsReadonly"))
                #print `readonlyProjects`
                pHandler.insertMemberProjects(userID, readonlyProjects,
                                              'Reader')

            elif form.has_key("userProjectsReadonlyWrite"):
                # list of IDs
                readonlyProjects = utils.unique(
                    form.getlist("userProjectsReadonlyWrite"))
                #print `readonlyProjects`
                pHandler.insertMemberProjects(userID, readonlyProjects,
                                              'Reader')

            # Write projects exist only for Writers
            if form.has_key("userProjectsWrite"):
                writeProjects = utils.unique(form.getlist("userProjectsWrite"))
                pHandler.insertMemberProjects(userID, writeProjects, 'Writer')

            # don't assign projects to a User instance - will retrieve them from db in output function
            newUser = User(userID, username, firstName, lastName,
                           description, tmpLab,
                           form.getvalue("system_access_level"), to_email,
                           passwd, [], [])

            email_subject = "OpenFreezer User Account"

            msg = email.MIMEMultipart.MIMEMultipart('alternative')

            msg['Subject'] = email_subject
            msg['To'] = to_email

            msgText = "Hi " + firstName + ",<BR><BR>An OpenFreezer account has been created for you.&nbsp;&nbsp;Your access level is " + form.getvalue(
                "system_access_level") + ", so you can "

            if form.getvalue("system_access_level") == 'Reader':
                msgText += "search for clones.&nbsp;&nbsp;If you wish to add/modify reagents or create projects, please contact the administrator to upgrade your access level.<BR>"

            elif form.getvalue("system_access_level") == 'Writer':
                msgText += "search, add, and modify reagents.&nbsp;&nbsp;If you wish to create projects, please contact the administrator to upgrade your access level.<BR>"

            elif form.getvalue("system_access_level") == 'Creator':
                msgText += "search for clones, add and modify reagents, as well as create your own projects.<BR>"

            #####################################################
            # CHANGE TEXT AS NEEDED
            #####################################################

            msgText += "<BR>The URL to access the system is <a href='" + hostname + "'>" + hostname + "</a>.&nbsp;&nbsp;Your username is <b>" + username + "</b>, and your temporary password is <b>" + passwd + "</b>.&nbsp;&nbsp;Please <u>change the temporary password as soon as you log into the website</u> - you can do it through the 'Change your password' link under the 'User Management' menu section.<BR><BR>Please refer to http://openfreezer.org for additional support.<BR><BR>Sincerely,<BR>OpenFreezer  support team.<BR><BR><span style='font-family:Courier; font-size:10pt;'><HR>This is an automatically generated e-mail message.&nbsp;&nbsp;Please do not reply to this e-mail.&nbsp;&nbsp;All questions should be directed to your local administrator.</span>"

            msgText = email.MIMEText.MIMEText(msgText, 'html')
            msg.attach(msgText)

            server = smtplib.SMTP(mail_server)
            server.set_debuglevel(1)

            server.sendmail(from_email, [to_email], msg.as_string())
            server.quit()

            self.printUserInfo('view', newUser)

        except DeletedUserException:

            # Without asking too many questions, reactivate the deleted user and overwrite his/her attributes with the form input values
            userID = uHandler.findUserIDByUsername(username)

            newProps["firstname"] = firstName
            newProps["lastname"] = lastName
            newProps["description"] = description
            newProps["email"] = email
            newProps["status"] = "ACTIVE"
            newProps["password"] = passwd

            # Insert new database values and create new object
            uHandler.updateUserProperties(userID, newProps)  # database update
            newUser = uHandler.getUserByID(userID)

            # Insert Project info
            readProjects = []
            writeProjects = []

            if form.has_key("userProjectsReadonly"):
                # list of IDs
                readonlyProjects = form.getlist("userProjectsReadonly")

                for r in readonlyProjects:
                    pHandler.addProjectMember(r, userID, 'Reader')

                    #tmpReadProject = pHandler.findPacket(r)
                    #readProjects.append(tmpReadProject)
                    #newUser.addProject(tmpReadProject, 'read')

            if form.has_key("userProjectsWrite"):
                writeProjects = form.getlist("userProjectsWrite")

                for w in writeProjects:
                    pHandler.addProjectMember(w, userID, 'Writer')

                    #tmpWriteProject = pHandler.findPacket(w)
                    #writeProjects.append(tmpWriteProject)
                    #newUser.addProject(tmpWriteProject, 'write')

            #newUser.setReadProjects(readProjects)
            #newUser.setWriteProjects(writeProjects)

            self.printUserInfo('view', newUser)
            #utils.redirect(hostname + "User.php?View=3&fd=" + filename)

        except DuplicateUsernameException:

            # return to the view with input values and error message
            # Need to construct a dummy User instance to save form values for error output on the next page (otherwise they're lost as soon as Submit is pressed and creation view is exited)
            newLab = lHandler.findLabByID(labID)
            newUser = User(0, username, firstName, lastName, description,
                           newLab, "", email, passwd)

            self.printUserInfo('create', newUser)