Skip to content

Commit f72aa34

Browse files
Merge pull request #306 from RSE-Sheffield/feat/object-ids
Add object IDs everywhere
2 parents c177f09 + a13f7fc commit f72aa34

File tree

8 files changed

+64
-21
lines changed

8 files changed

+64
-21
lines changed

home/admin.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,30 @@
33
from .models import Organisation, OrganisationMembership, Project, User
44

55

6-
# Register your models here.
6+
@admin.register(User)
77
class UserAdmin(admin.ModelAdmin):
88
list_display = ("email", "first_name", "last_name", "is_staff", "date_joined")
99
search_fields = ("email", "first_name", "last_name")
1010
list_filter = ("is_staff", "is_superuser", "is_active")
1111
ordering = ("-date_joined",)
1212

1313

14+
@admin.register(Organisation)
1415
class OrganisationAdmin(admin.ModelAdmin):
15-
list_display = ("name", "created_at")
16-
search_fields = ("name",)
16+
list_display = ("pk", "name", "created_at")
17+
search_fields = ("name", "description",)
1718
ordering = ("name",)
1819

1920

21+
@admin.register(OrganisationMembership)
2022
class OrganisationMembershipAdmin(admin.ModelAdmin):
2123
list_display = ("user", "organisation", "role", "joined_at")
2224
list_filter = ("role",)
2325
search_fields = ("user__email", "organisation__name")
2426

2527

28+
@admin.register(Project)
2629
class ProjectAdmin(admin.ModelAdmin):
27-
list_display = ("name", "created_by", "created_at")
28-
search_fields = ("name",)
29-
list_filter = ("created_at",)
30-
31-
32-
admin.site.register(User, UserAdmin)
33-
admin.site.register(Organisation, OrganisationAdmin)
34-
admin.site.register(Project, ProjectAdmin)
35-
admin.site.register(OrganisationMembership, OrganisationMembershipAdmin)
30+
list_display = ("pk", "name", "created_by", "created_at", "organisation")
31+
search_fields = ("name", "description",)
32+
list_filter = ("organisation",)

home/templates/organisation/organisation.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ <h2 class="text-2xl font-bold d-inline-block">Projects</h2>
4646
{% for project in projects %}
4747
<div class="card w-100">
4848
<div class="card-body">
49-
<p class="h5 card-title">{{ project.name }}</p>
49+
<p class="h5 card-title" title="Project identifier {{ project.pk }}">{{ project.name }}</p>
5050
<p class="h6 card-subtitle text-muted mb-2">{{ project.description|default_if_none:"No description provided." }}</p>
5151
<p class="h7 card-text">Surveys: {{ project.survey_count }}</p>
5252

home/templates/projects/list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ <h1 class="text-2xl font-bold d-inline-block">Projects</h1>
1414
{% for project in projects %}
1515
<div class="card w-100">
1616
<div class="card-body">
17-
<h2 class="card-title">{{ project.name }}</h2>
17+
<h2 class="card-title" title="Project identifier {{ project.pk }}">{{ project.name }}</h2>
1818
<div class="card-text">
1919
<div class="flex flex-wrap gap-2 mb-3">
2020
{% for org in project_orgs|get_item:project.id %}<span class="badge text-bg-primary">{{ org.name }}</span>{% endfor %}

home/templates/projects/project.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ <h2 class="text-2xl font-bold d-inline-block">Surveys</h2>
5353
{% for survey in surveys %}
5454
<div class="card w-100">
5555
<div class="card-body">
56-
<h3 class="card-title">{{ survey.name }}</h3>
56+
<h3 class="card-title" title="Survey identifier {{ survey.pk }}">{{ survey.name }}</h3>
5757
<div class="card-text">
5858
<span>Responses: {{ survey.survey_response.count | default:0 }}</span>
5959
</div>

survey/admin.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,29 @@
1010
)
1111

1212

13+
@admin.register(Invitation)
1314
class InvitationAdmin(admin.ModelAdmin):
1415
list_display = ("survey", "token", "created_at", "used")
1516
search_fields = ("token",)
1617
ordering = ("created_at",)
1718

1819

19-
admin.site.register(Survey)
20-
admin.site.register(SurveyResponse)
20+
@admin.register(Survey)
21+
class SurveyAdmin(admin.ModelAdmin):
22+
list_display = ("pk", "name", "created_at", "project", "project__organisation")
23+
search_fields = ("name", "description",)
24+
ordering = ("created_at",)
25+
list_filter = ("project", "project__organisation",)
26+
27+
28+
@admin.register(SurveyResponse)
29+
class SurveyResponseAdmin(admin.ModelAdmin):
30+
list_display = ("pk", "survey", "created_at", "survey__project", "survey__project__organisation",)
31+
ordering = ("created_at",)
32+
date_hierarchy = "created_at"
33+
list_filter = ("survey__project", "survey__project__organisation", "created_at")
34+
35+
2136
admin.site.register(SurveyEvidenceSection)
2237
admin.site.register(SurveyFile)
2338
admin.site.register(SurveyEvidenceFile)
24-
admin.site.register(Invitation, InvitationAdmin)

survey/models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ def get_invite_link(self, request: HttpRequest):
4949

5050
return None
5151

52+
@property
53+
def reference_number(self) -> str:
54+
"""
55+
Unique identifier e.g. "SURVEY-000001"
56+
"""
57+
return f"{self.__class__.__name__.upper()}-{str(self.pk).zfill(6)}"
58+
5259

5360
class SurveyEvidenceSection(models.Model):
5461
"""
@@ -123,6 +130,9 @@ class SurveyResponse(models.Model):
123130
answers = models.JSONField()
124131
created_at = models.DateTimeField(auto_now_add=True)
125132

133+
def __str__(self):
134+
return f"Survey {self.survey.pk} response {self.pk}"
135+
126136
def get_absolute_url(self, token):
127137
return reverse("survey", kwargs={"pk": self.survey.pk})
128138

survey/templates/survey/survey.html

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
{% extends 'base_manager.html' %}
22
{% load qr_code %}
33
{% block content %}
4+
<script lang="js">
5+
const copyToClipboard = async (selectors = ".user-select-all") => {
6+
try {
7+
const element = document.querySelector(selectors);
8+
await navigator.clipboard.writeText(element.textContent);
9+
} catch (error) {
10+
console.error("Failed to copy to clipboard:", error);
11+
throw error;
12+
}
13+
};
14+
</script>
415
{% load project_filters %}
516
<div class="container mx-auto px-4 py-8 mt-4">
617
<nav aria-label="breadcrumb">
@@ -21,12 +32,19 @@
2132
<div class="container mx-auto px-4 py-8">
2233
<div class="card mb-3">
2334
<div class="card-header">
24-
<h1>{{ survey.name }}</h1>
35+
<h1 title="Reference number {{ survey.reference_number }}">{{ survey.name }}</h1>
2536
</div>
2637
<div class="card-body">
2738
<p><strong>Survey description:</strong></p>
2839
<p>{{ survey.description }}</p>
2940
<p><strong>Created on:</strong> {{ survey.created_at }}</p>
41+
<p>
42+
<strong>Reference number:</strong>
43+
<span id="reference-number" class="user-select-all">{{ survey.reference_number }}</span>
44+
<button class="btn btn-secondary p-1" onclick="copyToClipboard()" title="Copy to clipboard">
45+
<i class="bx bx-copy"></i>
46+
</button>
47+
</p>
3048
<div class="d-flex justify-content-between mt-3">
3149
<div></div>
3250
<div></div>
@@ -35,7 +53,6 @@ <h1>{{ survey.name }}</h1>
3553
<div>
3654
<a href="{% url 'survey_duplicate_config' survey.pk %}" class="btn btn-primary"><i class='bx bxs-copy' ></i> Create a new survey using current configurations.</a>
3755
</div>
38-
3956
</div>
4057
</div>
4158
</div>

survey/templates/survey/survey_response.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
{% load static %}
33
{% load vite_integration %}
44
{% block content %}
5-
65
<div class="container mx-auto px-4 py-8 m-3">
76
<div class="sort-survey-response" data-json-config-id="configData"></div>
87
</div>
@@ -11,4 +10,10 @@
1110
{{ survey.survey_config | json_script:"configData" }}
1211
{% vite_client %}
1312
{% vite_asset 'src/main.ts' %}
13+
<div class="container">
14+
<p class="text-secondary text-sm-center">
15+
<strong>Survey reference number:</strong>
16+
<span class="user-select-all">{{ survey.reference_number }}</span>
17+
</p>
18+
</div>
1419
{% endblock %}

0 commit comments

Comments
 (0)