1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% extends "base.html" %}
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% block title %}Profile — Fossilrepo{% endblock %}
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% block content %}
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<!-- Profile Header -->
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="sm:flex sm:items-center gap-5 mb-8">
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="flex items-center gap-4 sm:gap-5 flex-1 min-w-0">
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="flex-shrink-0 h-16 w-16 rounded-full bg-brand flex items-center justify-center text-white text-2xl font-bold">
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{{ user.username|make_list|first|upper }}
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="min-w-0">
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<h1 class="text-2xl font-bold text-gray-100 truncate">
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if user.get_full_name %}{{ user.get_full_name }}{% else %}{{ user.username }}{% endif %}
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</h1>
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="flex items-center gap-3 mt-1 text-sm text-gray-400">
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if user_profile.handle %}
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<span>@{{ user_profile.handle }}</span>
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endif %}
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<span>{{ user.email }}</span>
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="flex flex-wrap items-center gap-2 mt-4 sm:mt-0">
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<a href="{% url 'accounts:profile_edit' %}"
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-200 hover:bg-gray-600 border border-gray-600 transition-colors">
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Edit Profile
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</a>
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<a href="{% url 'organization:user_password' username=user.username %}"
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class="rounded-md bg-gray-800 px-4 py-2 text-sm font-medium text-gray-400 hover:text-gray-200 hover:bg-gray-700 ring-1 ring-gray-700 transition-colors">
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Change Password
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</a>
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<!-- Profile Info Card -->
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="rounded-lg bg-gray-800 border border-gray-700 p-6 mb-6 shadow-sm">
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<h2 class="text-lg font-semibold text-gray-200 mb-4">Profile Info</h2>
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dl class="grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-3 text-sm">
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div>
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dt class="text-gray-500">Full Name</dt>
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dd class="text-gray-200 mt-0.5">{{ user.get_full_name|default:"Not set" }}</dd>
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div>
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dt class="text-gray-500">Handle</dt>
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dd class="text-gray-200 mt-0.5">{% if user_profile.handle %}@{{ user_profile.handle }}{% else %}Not set{% endif %}</dd>
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div>
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dt class="text-gray-500">Email</dt>
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dd class="text-gray-200 mt-0.5">{{ user.email|default:"Not set" }}</dd>
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div>
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dt class="text-gray-500">Location</dt>
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dd class="text-gray-200 mt-0.5">{{ user_profile.location|default:"Not set" }}</dd>
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div>
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dt class="text-gray-500">Website</dt>
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dd class="text-gray-200 mt-0.5">
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if user_profile.website %}
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<a href="{{ user_profile.website }}" class="text-brand-light hover:text-brand" target="_blank" rel="noopener">{{ user_profile.website }}</a>
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% else %}Not set{% endif %}
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</dd>
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="sm:col-span-2">
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dt class="text-gray-500">Bio</dt>
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dd class="text-gray-200 mt-0.5">{{ user_profile.bio|default:"Not set"|linebreaksbr }}</dd>
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</dl>
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<!-- SSH Keys Card -->
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="rounded-lg bg-gray-800 border border-gray-700 mb-6 shadow-sm">
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="p-4 border-b border-gray-700 flex items-center justify-between">
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<h2 class="text-lg font-semibold text-gray-200">SSH Keys</h2>
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<a href="{% url 'accounts:ssh_keys' %}" class="text-sm text-brand-light hover:text-brand">Manage Keys</a>
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if ssh_keys %}
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="divide-y divide-gray-700">
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% for key in ssh_keys %}
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="p-4 flex flex-wrap items-center justify-between gap-3">
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="min-w-0">
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="text-sm font-medium text-gray-200">{{ key.title }}</div>
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="text-xs text-gray-500 font-mono mt-1 truncate">{{ key.fingerprint }}</div>
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="text-xs text-gray-500 mt-1">
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{{ key.key_type|upper }} · Added {{ key.created_at|timesince }} ago
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if key.last_used_at %}· Last used {{ key.last_used_at|timesince }} ago{% endif %}
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endfor %}
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% else %}
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="p-6 text-center text-sm text-gray-500">
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
No SSH keys added yet. <a href="{% url 'accounts:ssh_keys' %}" class="text-brand-light hover:text-brand">Add one</a> to clone and push over SSH.
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endif %}
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<!-- Notification Preferences Card -->
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="rounded-lg bg-gray-800 border border-gray-700 mb-6 shadow-sm">
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="p-4 border-b border-gray-700 flex items-center justify-between">
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<h2 class="text-lg font-semibold text-gray-200">Notification Preferences</h2>
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<a href="{% url 'accounts:notification_prefs' %}" class="text-sm text-brand-light hover:text-brand">Edit Preferences</a>
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="p-4">
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dl class="grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-3 text-sm">
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div>
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dt class="text-gray-500">Delivery Mode</dt>
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dd class="text-gray-200 mt-0.5 capitalize">{{ notif_prefs.delivery_mode }}</dd>
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div>
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dt class="text-gray-500">Events</dt>
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<dd class="text-gray-200 mt-0.5">
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if notif_prefs.notify_checkins %}Checkins{% endif %}
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if notif_prefs.notify_tickets %}{% if notif_prefs.notify_checkins %}, {% endif %}Tickets{% endif %}
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if notif_prefs.notify_wiki %}{% if notif_prefs.notify_checkins or notif_prefs.notify_tickets %}, {% endif %}Wiki{% endif %}
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if notif_prefs.notify_releases %}{% if notif_prefs.notify_checkins or notif_prefs.notify_tickets or notif_prefs.notify_wiki %}, {% endif %}Releases{% endif %}
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if notif_prefs.notify_forum %}{% if notif_prefs.notify_checkins or notif_prefs.notify_tickets or notif_prefs.notify_wiki or notif_prefs.notify_releases %}, {% endif %}Forum{% endif %}
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if not notif_prefs.notify_checkins and not notif_prefs.notify_tickets and not notif_prefs.notify_wiki and not notif_prefs.notify_releases and not notif_prefs.notify_forum %}None{% endif %}
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</dd>
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</dl>
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<!-- Personal Access Tokens Card -->
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="rounded-lg bg-gray-800 border border-gray-700 mb-6 shadow-sm">
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="p-4 border-b border-gray-700 flex items-center justify-between">
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<h2 class="text-lg font-semibold text-gray-200">Personal Access Tokens</h2>
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<a href="{% url 'accounts:profile_token_create' %}"
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class="rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Generate Token
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</a>
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if tokens %}
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="divide-y divide-gray-700">
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% for token in tokens %}
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="p-4 flex flex-wrap items-center justify-between gap-3">
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="min-w-0">
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="text-sm font-medium text-gray-200">{{ token.name }}</div>
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="text-xs text-gray-500 font-mono mt-1 truncate">{{ token.token_prefix }}...</div>
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="text-xs text-gray-500 mt-1 break-words">
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Scopes: {{ token.scopes }} · Created {{ token.created_at|timesince }} ago
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if token.last_used_at %}· Last used {{ token.last_used_at|timesince }} ago{% endif %}
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if token.expires_at %}· Expires {{ token.expires_at|date:"M j, Y" }}{% endif %}
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<form hx-post="{% url 'accounts:profile_token_revoke' guid=token.token_prefix %}"
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
hx-confirm="Revoke token '{{ token.name }}'? This cannot be undone.">
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% csrf_token %}
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<button type="submit" class="text-sm text-red-400 hover:text-red-300">Revoke</button>
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</form>
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endfor %}
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% else %}
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="p-6 text-center text-sm text-gray-500">
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
No personal access tokens. Generate one to authenticate with the API or CLI.
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endif %}
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endblock %}
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!