1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
pub mod accounts;
pub mod create;
pub mod delete;
pub mod developers_page;
pub mod discord_whois;
pub mod edit_profile;
pub mod enrollments;
pub mod navbar_auth;
pub mod profile;
pub mod role_lookup;
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Eq, PartialEq, Hash, Display)]
#[serde(rename_all = "snake_case")]
pub enum UserRole {
#[display(fmt = "Student")]
Student,
#[display(fmt = "Faculty")]
Faculty,
#[display(fmt = "Faculty Advisor")]
FacultyAdvisor,
#[display(fmt = "Alum")]
#[serde(rename = "alumn")]
Alum,
#[display(fmt = "External User")]
External,
#[display(fmt = "External Mentor")]
ExternalMentor,
#[display(fmt = "Telescope Admin")]
Sysadmin,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Display, Eq, PartialEq, Hash)]
#[serde(rename_all = "lowercase")]
pub enum UserAccountType {
#[display(fmt = "RCS")]
Rpi,
#[display(fmt = "Discord")]
Discord,
#[display(fmt = "Mattermost")]
Mattermost,
#[display(fmt = "GitHub")]
GitHub,
#[display(fmt = "GitLab")]
GitLab,
#[display(fmt = "BitBucket")]
BitBucket,
}
impl UserRole {
pub const ALL_ROLES: [UserRole; 7] = [
UserRole::Student,
UserRole::Alum,
UserRole::Faculty,
UserRole::FacultyAdvisor,
UserRole::External,
UserRole::ExternalMentor,
UserRole::Sysadmin,
];
pub fn is_admin(self) -> bool {
self == UserRole::Sysadmin || self == UserRole::FacultyAdvisor
}
pub fn is_external(self) -> bool {
self == UserRole::External || self == UserRole::ExternalMentor
}
pub fn can_switch_to(a: Self, b: UserRole) -> bool {
if a == b {
return true;
}
match (a, b) {
(UserRole::Sysadmin | UserRole::FacultyAdvisor, _) => true,
(UserRole::Faculty, b) => !b.is_admin(),
(UserRole::Alum, UserRole::Student | UserRole::External) => true,
(UserRole::Student, UserRole::Alum | UserRole::External) => true,
(UserRole::External, UserRole::Student) => true,
(UserRole::ExternalMentor, UserRole::External) => true,
_ => false,
}
}
}