]> git.ipfire.org Git - ipfire.org.git/blob - src/templates/users/show.html
voip: Create an extra page for debugging VoIP stuff
[ipfire.org.git] / src / templates / users / show.html
1 {% extends "../base.html" %}
2
3 {% block title %}{{ account }}{% end block %}
4
5 {% block container %}
6 {% import phonenumbers %}
7
8 <section class="hero {% if account.is_lwl() %}is-lwl{% else %}is-dark{% end %}">
9 <div class="hero-body">
10 <div class="container">
11 <div class="columns is-vcentered">
12 <div class="column">
13 <nav class="breadcrumb is-medium" aria-label="breadcrumbs">
14 <ul>
15 <li>
16 <a href="/">
17 {{ _("Home") }}
18 </a>
19 </li>
20 <li>
21 <a href="/users">
22 {{ _("Users") }}
23 </a>
24 </li>
25 <li class="is-active">
26 <a href="#" aria-current="page">{{ account }}</a>
27 </li>
28 </ul>
29 </nav>
30
31 <h1 class="title is-1">{{ account }}</h1>
32 <h6 class="subtitle is-6">{{ account.uid }}</h6>
33
34 {# Description #}
35 {% if account.description %}
36 <div class="block">
37 <div class="content">
38 {% module Markdown(account.description) %}
39 </div>
40 </div>
41 {% end %}
42 </div>
43
44 <div class="column is-narrow is-hidden-mobile">
45 <figure class="image">
46 <img class="is-rounded" src="{{ account.avatar_url(192) }}">
47 </figure>
48 </div>
49 </div>
50 </div>
51 </div>
52 </section>
53
54 <section class="section">
55 <div class="container">
56 <div class="buttons">
57 <a class="button is-light" href="mailto:{{ account.email }}">
58 <span class="icon-text">
59 <span class="icon">
60 <i class="fas fa-envelope"></i>
61 </span>
62 <span>{{ account.email }}</span>
63 </span>
64 </a>
65
66 <a class="button is-light" href="https://community.ipfire.org/u/{{ account.uid }}">
67 <span class="icon-text">
68 <span class="icon">
69 <i class="fas fa-users"></i>
70 </span>
71 <span>{{ _("Community Profile") }}</span>
72 </span>
73 </a>
74
75 {% if account.has_shell() %}
76 <a class="button is-dark" href="/~{{ account.uid }}/">
77 <span class="icon-text">
78 <span class="icon">
79 <i class="fas fa-home"></i>
80 </span>
81 <span>{{ _("Home Directory") }}</span>
82 </span>
83 </a>
84 {% end %}
85
86 {% if account.can_be_managed_by(current_user) %}
87 {% if account.has_sip() %}
88 <a class="button is-success" href="/users/{{ account.uid }}/calls">
89 <span class="icon-text">
90 <span class="icon">
91 <i class="fas fa-phone"></i>
92 </span>
93 <span>{{ _("Calls") }}</span>
94 </span>
95 </a>
96 {% end %}
97
98 <a class="button is-light" href="/users/{{ account.uid }}/passwd">
99 {{ _("Change Password") }}
100 </a>
101
102 <a class="button is-warning" href="/users/{{ account.uid }}/edit">
103 {{ _("Edit") }}
104 </a>
105
106 <a class="button is-danger" href="/users/{{ account.uid }}/delete"
107 {% if not account.can_be_deleted_by(current_user) %}disabled{% end %}>
108 {{ _("Delete") }}
109 </a>
110 {% end %}
111 </div>
112
113 {% if account == current_user %}
114 {# Suggest adding a description #}
115 {% if not current_user.description %}
116 <div class="notification is-info">
117 <strong>{{ _("Tell Us About Yourself!") }}</strong>
118
119 {{ _("Add a couple of lines about yourself to your profile so that others get to know you better") }}
120
121 <a href="/users/{{ account.uid }}/edit#description">{{ _("Edit Profile") }}</a>
122 </div>
123
124 {# Suggest uploading an avatar if this user does not have one #}
125 {% elif not current_user.has_avatar() %}
126 <div class="notification is-info">
127 <strong>{{ _("Upload An Avatar!") }}</strong>
128
129 {{ _("A picture says more than a thousand words") }}
130
131 <a href="/users/{{ account.uid }}/edit#avatar">{{ _("Upload Avatar") }}</a>
132 </div>
133 {% end %}
134 {% end %}
135 </div>
136 </section>
137
138 {% if current_user == account or current_user.is_staff() %}
139
140 {# SIP Channels #}
141
142 {% if sip_channels %}
143 <section class="section">
144 <div class="container">
145 {% for channel in sip_channels %}
146 <div class="notification
147 {% if channel.is_ringing() %}is-warning
148 {% elif channel.is_connected() %}is-success
149 {% end %}">
150 <span class="icon-text">
151 <span class="icon">
152 <i class="fa-solid fa-phone-volume"></i>
153 </span>
154 <span>{{ channel }}</span>
155 </span>
156
157 {% if channel.duration %}
158 <span class="is-pulled-right">
159 {{ format_time(channel.duration) }}
160 </span>
161 {% end %}
162 </div>
163 {% end %}
164 </div>
165 </section>
166 {% end %}
167
168 <section class="section">
169 <div class="container">
170 <div class="columns">
171 {# Address #}
172 {% if account.address %}
173 <div class="column">
174 <h6 class="title is-6">{{ _("Address") }}</h6>
175
176 <address>
177 {{ account.name }}<br>
178 {% for line in account.address %}
179 {{ line }}<br>
180 {% end %}
181 </address>
182 </div>
183 {% end %}
184
185 {# Phone Numbers #}
186 {% if account.phone_number or account.fax_number %}
187 <div class="column">
188 <h6 class="title is-6">{{ _("Phone Numbers") }}</h6>
189
190 <ul>
191 {% if account.has_sip() %}
192 <li>
193 {% if sip_channels %}
194 <i class="fas fa-phone-volume has-text-warning fa-fw"></i>
195 {% elif account.uses_sip_forwarding() %}
196 <i class="fas fa-phone-square has-text-warning fa-fw"></i>
197 {% else %}
198 <i class="fas fa-phone-square has-text-danger fa-fw"></i>
199 {% end %}
200
201 <a href="sip:{{ account.sip_url }}">{{ account.sip_id }}</a>
202 </li>
203 {% end %}
204
205 {% if account.phone_number %}
206 <li>
207 <i class="fas fa-phone fa-fw"></i>
208
209 <a href="tel:{{ format_phone_number_to_e164(account.phone_number) }}">
210 {{ format_phone_number(account.phone_number) }}
211 </a>
212 </li>
213 {% end %}
214
215 {% if account.fax_number %}
216 <li>
217 <i class="fas fa-fax fa-fw"></i>
218
219 <a href="fax:{{ format_phone_number_to_e164(account.fax_number) }}">
220 {{ format_phone_number(account.fax_number) }}
221 </a>
222 </li>
223 {% end %}
224 </ul>
225 </div>
226 {% end %}
227
228 {% if current_user.is_staff() %}
229 {% if account.groups %}
230 <div class="column is-half">
231 <h6 class="title is-6">{{ _("Groups") }}</h6>
232
233 <nav class="panel">
234 {% for g in account.groups %}
235 <a class="panel-block" href="/users/groups/{{ g.gid }}">
236 <span class="panel-icon">
237 <i class="fas fa-users" aria-hidden="true"></i>
238 </span>
239 {{ g }}
240 </a>
241 {% end %}
242 </nav>
243 </div>
244 {% end %}
245 {% end %}
246 </div>
247 </div>
248 </section>
249
250 <section class="section">
251 <div class="container">
252 <nav class="level">
253 <div class="level-item has-text-centered">
254 <div>
255 <p class="heading">{{ _("Joined") }}</p>
256 <p>
257 {{ locale.format_date(account.created_at, shorter=True) }}
258 </p>
259 </div>
260 </div>
261
262 <div class="level-item has-text-centered">
263 <div>
264 <p class="heading">{{ _("Last Modified") }}</p>
265 <p>
266 {{ locale.format_date(account.modified_at) }}
267 </p>
268 </div>
269 </div>
270
271 {% if account.last_successful_authentication %}
272 <div class="level-item has-text-centered">
273 <div>
274 <p class="heading">{{ _("Last Successful Authentication") }}</p>
275 <p>
276 {{ locale.format_date(account.last_successful_authentication) }}
277 </p>
278 </div>
279 </div>
280 {% end %}
281
282 {% if account.failed_login_count %}
283 <div class="level-item has-text-warning has-text-centered">
284 <div>
285 <p class="heading">{{ _("Failed Authentication Attempts") }}</p>
286 <p>{{ account.failed_login_count }}</p>
287 </div>
288 </div>
289
290 {% if account.last_failed_authentication %}
291 <div class="level-item has-text-warning has-text-centered">
292 <div>
293 <p class="heading">{{ _("Last Failed Authentication Attempt") }}</p>
294 <p>{{ locale.format_date(account.last_failed_authentication) }}</p>
295 </div>
296 </div>
297 {% end %}
298 {% end %}
299 </nav>
300 </div>
301 </section>
302 {% end %}
303 {% end block %}