Fix user header on circle page
This commit is contained in:
parent
0d64f8fbb6
commit
e197a17f15
|
|
@ -143,30 +143,25 @@ async function uploadDocument(data: DocumentUploadData) {
|
||||||
<Transition mode="out-in">
|
<Transition mode="out-in">
|
||||||
<div>
|
<div>
|
||||||
<div class="circle-container bg-gray-200">
|
<div class="circle-container bg-gray-200">
|
||||||
<div class="circle max-w-9xl">
|
<div v-if="profileUser" class="user-profile">
|
||||||
<div v-if="profileUser" class="user-profile">
|
<header class="flex flex-row items-center p-8 bg-white relative shadow-xl">
|
||||||
<header
|
<img class="w-32 h-32 rounded-full mr-8" :src="profileUser.avatar_url" />
|
||||||
class="flex flex-row items-center p-8 bg-white relative shadow-xl"
|
<div>
|
||||||
>
|
<h1 class="mb-2">
|
||||||
<img
|
{{ profileUser.first_name }} {{ profileUser.last_name }}
|
||||||
class="w-32 h-32 rounded-full mr-8"
|
</h1>
|
||||||
:src="profileUser.avatar_url"
|
|
||||||
/>
|
|
||||||
<div>
|
<div>
|
||||||
<h1 class="mb-2">
|
<router-link
|
||||||
{{ profileUser.first_name }} {{ profileUser.last_name }}
|
class="link"
|
||||||
</h1>
|
:to="`/course/${courseSlug}/cockpit/profile/${profileUser.user_id}`"
|
||||||
<div>
|
>
|
||||||
<router-link
|
Profil anzeigen
|
||||||
class="link"
|
</router-link>
|
||||||
:to="`/course/${courseSlug}/cockpit/profile/${profileUser.user_id}`"
|
|
||||||
>
|
|
||||||
Profil anzeigen
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</div>
|
||||||
</div>
|
</header>
|
||||||
|
</div>
|
||||||
|
<div class="circle max-w-9xl">
|
||||||
<div class="flex flex-col lg:flex-row">
|
<div class="flex flex-col lg:flex-row">
|
||||||
<div class="flex-initial lg:w-128 px-4 py-4 lg:px-8 lg:pt-4 bg-white">
|
<div class="flex-initial lg:w-128 px-4 py-4 lg:px-8 lg:pt-4 bg-white">
|
||||||
<router-link
|
<router-link
|
||||||
|
|
|
||||||
|
|
@ -24,17 +24,6 @@ function loadCourseSessionsData(reload = false) {
|
||||||
log.debug("loadCourseSessionsData called");
|
log.debug("loadCourseSessionsData called");
|
||||||
const courseSessions = ref<CourseSession[]>([]);
|
const courseSessions = ref<CourseSession[]>([]);
|
||||||
|
|
||||||
|
|
||||||
function userExpertCircles(
|
|
||||||
userId: number,
|
|
||||||
courseSessionForRoute: CourseSession | undefined
|
|
||||||
): CircleExpert[] {
|
|
||||||
if (!courseSessionForRoute) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
return courseSessionForRoute.experts.filter((expert) => expert.user_id === userId);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function loadAndUpdate() {
|
async function loadAndUpdate() {
|
||||||
courseSessions.value = await itGetCached(`/api/course/sessions/`, {
|
courseSessions.value = await itGetCached(`/api/course/sessions/`, {
|
||||||
reload: reload,
|
reload: reload,
|
||||||
|
|
@ -50,6 +39,16 @@ function userExpertCircles(
|
||||||
return { courseSessions };
|
return { courseSessions };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function userExpertCircles(
|
||||||
|
userId: number,
|
||||||
|
courseSessionForRoute: CourseSession | undefined
|
||||||
|
): CircleExpert[] {
|
||||||
|
if (!courseSessionForRoute) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return courseSessionForRoute.experts.filter((expert) => expert.user_id === userId);
|
||||||
|
}
|
||||||
|
|
||||||
export const useCourseSessionsStore = defineStore("courseSessions", () => {
|
export const useCourseSessionsStore = defineStore("courseSessions", () => {
|
||||||
// using setup function seems cleaner, see https://pinia.vuejs.org/core-concepts/#setup-stores
|
// using setup function seems cleaner, see https://pinia.vuejs.org/core-concepts/#setup-stores
|
||||||
|
|
||||||
|
|
@ -87,6 +86,7 @@ export const useCourseSessionsStore = defineStore("courseSessions", () => {
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
const circleStore = useCircleStore();
|
const circleStore = useCircleStore();
|
||||||
const expertCircles = userExpertCircles(userStore.id, courseSessionForRoute.value);
|
const expertCircles = userExpertCircles(userStore.id, courseSessionForRoute.value);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
expertCircles.filter(
|
expertCircles.filter(
|
||||||
(c) => c.circle_translation_key === circleStore.circle?.translation_key
|
(c) => c.circle_translation_key === circleStore.circle?.translation_key
|
||||||
|
|
@ -124,7 +124,7 @@ export const useCourseSessionsStore = defineStore("courseSessions", () => {
|
||||||
file_type: "image/png",
|
file_type: "image/png",
|
||||||
file_name: "test.png",
|
file_name: "test.png",
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
async function removeDocument(documentId: number) {
|
async function removeDocument(documentId: number) {
|
||||||
await deleteCircleDocument(documentId);
|
await deleteCircleDocument(documentId);
|
||||||
|
|
@ -148,5 +148,4 @@ export const useCourseSessionsStore = defineStore("courseSessions", () => {
|
||||||
startUpload,
|
startUpload,
|
||||||
removeDocument,
|
removeDocument,
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -432,9 +432,9 @@ else:
|
||||||
|
|
||||||
structlog.configure(
|
structlog.configure(
|
||||||
processors=shared_processors
|
processors=shared_processors
|
||||||
+ [
|
+ [
|
||||||
structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
|
structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
|
||||||
],
|
],
|
||||||
context_class=dict,
|
context_class=dict,
|
||||||
logger_factory=structlog.stdlib.LoggerFactory(),
|
logger_factory=structlog.stdlib.LoggerFactory(),
|
||||||
wrapper_class=structlog.stdlib.BoundLogger,
|
wrapper_class=structlog.stdlib.BoundLogger,
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,8 @@ class Migration(migrations.Migration):
|
||||||
(
|
(
|
||||||
"file",
|
"file",
|
||||||
models.OneToOneField(
|
models.OneToOneField(
|
||||||
on_delete=django.db.models.deletion.CASCADE, to="files.uploadfile"
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="files.uploadfile",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
|
|
||||||
|
|
@ -185,6 +185,7 @@ class DocumentUploadApiTestCase(APITestCase):
|
||||||
response = self.client.delete(f"/api/core/document/{document.id}/")
|
response = self.client.delete(f"/api/core/document/{document.id}/")
|
||||||
self.assertEqual(response.status_code, 403)
|
self.assertEqual(response.status_code, 403)
|
||||||
|
|
||||||
|
|
||||||
# expert cannot upload in other course
|
# expert cannot upload in other course
|
||||||
# expert cannot delete other upload
|
# expert cannot delete other upload
|
||||||
# exper cannot change course
|
# exper cannot change course
|
||||||
|
|
|
||||||
|
|
@ -148,11 +148,11 @@ def get_course_session_users(request, course_slug):
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
"cockpit_user": cockpit_user_csu[0].to_dict()
|
"cockpit_user": cockpit_user_csu[0].to_dict()
|
||||||
| {
|
| {
|
||||||
"circles": cockpit_user_csu[0]
|
"circles": cockpit_user_csu[0]
|
||||||
.expert.all()
|
.expert.all()
|
||||||
.values("id", "title", "slug", "translation_key")
|
.values("id", "title", "slug", "translation_key")
|
||||||
},
|
},
|
||||||
"users": user_data,
|
"users": user_data,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,9 @@ class Command(BaseCommand):
|
||||||
|
|
||||||
num_deleted = 0
|
num_deleted = 0
|
||||||
|
|
||||||
unreferenced_uploads = UploadFile.objects.filter(upload_finished_at__isnull=True)
|
unreferenced_uploads = UploadFile.objects.filter(
|
||||||
|
upload_finished_at__isnull=True
|
||||||
|
)
|
||||||
|
|
||||||
if dry_run:
|
if dry_run:
|
||||||
print("------ DRY RUN -------")
|
print("------ DRY RUN -------")
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,9 @@ class FileStandardUploadService:
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def update(self, file: UploadFile, file_name: str = "", file_type: str = "") -> UploadFile:
|
def update(
|
||||||
|
self, file: UploadFile, file_name: str = "", file_type: str = ""
|
||||||
|
) -> UploadFile:
|
||||||
_validate_file_size(self.file_obj)
|
_validate_file_size(self.file_obj)
|
||||||
|
|
||||||
file_name, file_type = self._infer_file_name_and_type(file_name, file_type)
|
file_name, file_type = self._infer_file_name_and_type(file_name, file_type)
|
||||||
|
|
@ -111,7 +113,9 @@ class FileDirectUploadService:
|
||||||
self.user = user
|
self.user = user
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def start(self, file_name: str, file_type: str) -> Tuple[UploadFile, Dict[str, Any]]:
|
def start(
|
||||||
|
self, file_name: str, file_type: str
|
||||||
|
) -> Tuple[UploadFile, Dict[str, Any]]:
|
||||||
file = UploadFile(
|
file = UploadFile(
|
||||||
original_file_name=file_name,
|
original_file_name=file_name,
|
||||||
file_name=file_generate_name(file_name),
|
file_name=file_generate_name(file_name),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue