User ==== A ``User`` object represents either a student, a supervisor, or an academic assistant. Since all users of this system have similar basic information, such as username and email, we represented them all as ``User`` object, and restrict their behaviors according to a field ``role``. Each ``User`` object has following attributes: ``username`` : ``string`` A unique name with which the user can refer to one another. It is also the primary key and allows the user to sign in. ``name`` : ``string`` The legal name of the user. This is required for group members to recognize each other, and for the academic assistants to collect their results. ``email`` : ``string`` The email address that is used to contact with the user. ``password`` : ``string`` The password for the user's account, encrypted with a hash function. ``role`` : ``string`` The role of the user in this system. It can be: - ``student``: Students who are participating in a group project or internship. - ``supervisor``: The supervisor of project(s). - ``assistant``: The academic assistant of a department. ``department`` : ``string``, *optional* The department of the user, such as ``ICT``, ``SA``, or ``LS``. Required for students and assistants. ``student-id`` : ``string``, *optional* Only applicable for users with role ``student``: A unique identifier assigned to students to be used outside this system. ``bio`` : ``object``, *optional* A markup text describing the user. This is not necessary, but it can be helpful for a supervisor to have a biography to show their credibility in their respective field.