Skip to content

Commit 2296dd0

Browse files
Assignments: LP integration, link fixes, route context & metadata improvements - refs BT#22568
1 parent 68f6de8 commit 2296dd0

File tree

8 files changed

+108
-40
lines changed

8 files changed

+108
-40
lines changed

assets/vue/router/index.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,26 @@ router.beforeEach(async (to, from, next) => {
257257
sessionStorage.clear()
258258
}
259259

260+
const preservedParams = ['origin', 'isStudentView']
261+
const mergedQuery = { ...to.query }
262+
263+
let shouldRedirect = false
264+
265+
for (const key of preservedParams) {
266+
if (from.query[key] && !to.query[key]) {
267+
mergedQuery[key] = from.query[key]
268+
shouldRedirect = true
269+
}
270+
}
271+
272+
if (shouldRedirect) {
273+
next({
274+
...to,
275+
query: mergedQuery,
276+
})
277+
return
278+
}
279+
260280
let cid = parseInt(to.query?.cid ?? 0)
261281

262282
if ("CourseHome" === to.name) {

assets/vue/views/assignments/AssignmentAddDocument.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ async function loadPublicationMetadata() {
103103
})
104104
const data = response.data
105105
publicationTitle.value = data.title
106-
parentResourceNodeId.value = extractIdFromIri(data.resourceNode?.parent?.["@id"])
106+
parentResourceNodeId.value = extractIdFromIri(
107+
data.resourceLinkListFromEntity?.[0]?.course?.resourceNode?.["@id"]
108+
)
107109
if (parentResourceNodeId.value) {
108110
await loadAvailableDocuments()
109111
}
@@ -115,7 +117,7 @@ async function loadPublicationMetadata() {
115117
async function loadAddedDocuments() {
116118
try {
117119
const response = await axios.get(`${ENTRYPOINT}c_student_publication_rel_documents`, {
118-
params: { "publication.id": publicationId },
120+
params: { publication: `/api/c_student_publications/${publicationId}` },
119121
})
120122
addedDocuments.value = response.data["hydra:member"]
121123
} catch (e) {

assets/vue/views/assignments/AssignmentDetail.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ const submissionListKey = ref(0)
145145
async function loadAddedDocuments() {
146146
try {
147147
const response = await axios.get(`${ENTRYPOINT}c_student_publication_rel_documents`, {
148-
params: { "publication.id": assignmentId },
148+
params: { publication: `/api/c_student_publications/${assignmentId}` }
149149
})
150150
addedDocuments.value = response.data["hydra:member"]
151151
} catch (e) {

assets/vue/views/assignments/AssignmentsCreate.vue

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
<template>
2-
<div class="field">
3-
<h3 v-t="'Create assignment'" />
2+
<div class="field space-y-2">
3+
<BaseIcon
4+
icon="back"
5+
size="big"
6+
@click="goBack"
7+
/>
8+
<div class="field">
9+
<h3 v-t="'Create assignment'" />
10+
</div>
11+
12+
<AssignmentsForm
13+
:is-form-loading="isFormLoading"
14+
@submit="onSubmit"
15+
/>
416
</div>
5-
6-
<AssignmentsForm
7-
:is-form-loading="isFormLoading"
8-
@submit="onSubmit"
9-
/>
1017
</template>
1118

1219
<script setup>
@@ -18,6 +25,7 @@ import { ENTRYPOINT } from "../../config/entrypoint"
1825
import { useCidReq } from "../../composables/cidReq"
1926
import { useNotification } from "../../composables/notification"
2027
import { useRouter } from "vue-router"
28+
import BaseIcon from "../../components/basecomponents/BaseIcon.vue"
2129
2230
const { t } = useI18n()
2331
const { cid, sid, gid } = useCidReq()
@@ -37,9 +45,16 @@ function onSubmit(publicationStudent) {
3745
3846
showSuccessNotification(t("Assignment created"))
3947
40-
router.push({ name: "AssignmentsList", query: { cid, sid, gid } })
48+
goBack()
4149
})
4250
.catch((error) => showErrorNotification(error))
4351
.finally(() => (isFormLoading.value = false))
4452
}
53+
54+
function goBack() {
55+
router.push({
56+
name: "AssignmentsList",
57+
query: { cid, sid, gid },
58+
})
59+
}
4560
</script>

public/main/inc/lib/sessionmanager.lib.php

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Chamilo\CoreBundle\Entity\SessionRelUser;
1414
use Chamilo\CoreBundle\Entity\User;
1515
use Chamilo\CoreBundle\Framework\Container;
16+
use Chamilo\CourseBundle\Entity\CStudentPublication;
1617
use Chamilo\CourseBundle\Entity\CSurvey;
1718
use ExtraField as ExtraFieldModel;
1819
use Monolog\Logger;
@@ -2948,31 +2949,42 @@ public static function add_courses_to_session(
29482949
}
29492950

29502951
if ($importAssignments) {
2951-
$workTable = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
2952-
$sql = " SELECT * FROM $workTable
2953-
WHERE active = 1 AND
2954-
c_id = $courseId AND
2955-
parent_id = 0 AND
2956-
(session_id IS NULL OR session_id = 0)";
2957-
$result = Database::query($sql);
2958-
$workList = Database::store_result($result, 'ASSOC');
2959-
2960-
foreach ($workList as $work) {
2961-
$values = [
2962-
'work_title' => $work['title'],
2963-
'new_dir' => $work['url'].'_session_'.$sessionId,
2964-
'description' => $work['description'],
2965-
'qualification' => $work['qualification'],
2966-
'allow_text_assignment' => $work['allow_text_assignment'],
2967-
];
2968-
// @todo add addDir with resources
2969-
/*addDir(
2970-
$values,
2971-
api_get_user_id(),
2972-
$courseInfo,
2973-
0,
2974-
$sessionId
2975-
);*/
2952+
$repo = Container::getStudentPublicationRepository();
2953+
$course = api_get_course_entity($courseId);
2954+
$session = api_get_session_entity($sessionId);
2955+
$user = api_get_user_entity();
2956+
2957+
$qb = $repo->getResourcesByCourse($course, null);
2958+
$qb
2959+
->andWhere('resource.active = 1')
2960+
->andWhere('resource.filetype = :filetype')
2961+
->andWhere('resource.publicationParent IS NULL')
2962+
->setParameter('filetype', 'folder');
2963+
2964+
$baseAssignments = $qb->getQuery()->getResult();
2965+
2966+
foreach ($baseAssignments as $originalAssignment) {
2967+
if (!$originalAssignment instanceof CStudentPublication) {
2968+
continue;
2969+
}
2970+
2971+
$newAssignment = new CStudentPublication();
2972+
$newAssignment
2973+
->setTitle($originalAssignment->getTitle())
2974+
->setDescription($originalAssignment->getDescription() ?? '')
2975+
->setActive(1)
2976+
->setAccepted(true)
2977+
->setFiletype('folder')
2978+
->setPostGroupId(0)
2979+
->setSentDate(new \DateTime())
2980+
->setQualification($originalAssignment->getQualification())
2981+
->setWeight($originalAssignment->getWeight())
2982+
->setAllowTextAssignment($originalAssignment->getAllowTextAssignment())
2983+
->setUser($user)
2984+
->setParent($course)
2985+
->addCourseLink($course, $session, null);
2986+
2987+
$repo->create($newAssignment);
29762988
}
29772989
}
29782990
// If the course isn't subscribed yet

public/main/lp/learnpath.class.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8026,11 +8026,23 @@ public static function rl_get_resource_link_for_learnpath(
80268026
case TOOL_USER:
80278027
return $main_dir_path.'user/user.php?'.$extraParams;
80288028
case TOOL_STUDENTPUBLICATION:
8029-
if (!empty($rowItem->getPath())) {
8030-
return $main_dir_path.'work/work_list.php?id='.$rowItem->getPath().'&'.$extraParams;
8029+
$repo = Container::getStudentPublicationRepository();
8030+
$publication = $repo->find($rowItem->getPath());
8031+
if ($publication && $publication->hasResourceNode()) {
8032+
$nodeId = $publication->getResourceNode()->getId();
8033+
$assignmentId = $publication->getIid();
8034+
8035+
return api_get_path(WEB_PATH) .
8036+
"resources/assignment/$nodeId/submission/$assignmentId?" .
8037+
http_build_query([
8038+
'cid' => $course_id,
8039+
'sid' => $session_id,
8040+
'gid' => 0,
8041+
'origin' => 'learnpath',
8042+
'isStudentView' => 'true',
8043+
]);
80318044
}
8032-
8033-
return $main_dir_path.'work/work.php?'.api_get_cidreq().'&id='.$rowItem->getPath().'&'.$extraParams;
8045+
return '';
80348046
case TOOL_SURVEY:
80358047

80368048
$surveyId = (int) $id;

src/CoreBundle/Entity/SessionRelCourseRelUser.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class SessionRelCourseRelUser
7878
'user_subscriptions:sessions',
7979
'session:basic',
8080
])]
81+
#[MaxDepth(1)]
8182
#[ORM\ManyToOne(targetEntity: User::class, cascade: ['persist'], inversedBy: 'sessionRelCourseRelUsers')]
8283
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')]
8384
protected User $user;

src/CourseBundle/Entity/CStudentPublicationRelDocument.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
namespace Chamilo\CourseBundle\Entity;
88

9+
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
10+
use ApiPlatform\Metadata\ApiFilter;
911
use Doctrine\ORM\Mapping as ORM;
1012
use ApiPlatform\Metadata\ApiResource;
1113
use ApiPlatform\Metadata\GetCollection;
@@ -25,6 +27,10 @@
2527
normalizationContext: ['groups' => ['student_publication_rel_document:read']],
2628
denormalizationContext: ['groups' => ['student_publication_rel_document:write']]
2729
)]
30+
#[ApiFilter(SearchFilter::class, properties: [
31+
'publication' => 'exact',
32+
'publication.id' => 'exact',
33+
])]
2834
#[ORM\Table(name: 'c_student_publication_rel_document')]
2935
#[ORM\Entity]
3036
class CStudentPublicationRelDocument

0 commit comments

Comments
 (0)