def reload_pla(directory, rel_path, original): """Reload the given file as a PLTP. Also reload its PL, but without modyfing their ID. original is a pltp returned by load_pltp or reload_pltp Return: - (PLTP, []) if the PLTP was loaded successfully - (PLTP, warning_list) if the PLTP was loaded with warnings """ try: dic, warnings = parse_file(directory, rel_path) original_type = get_activity_type_class(original.activity_type)() if "type" in dic and original.activity_type != dic["type"]: return None, f"Activity type must remain '{original.activity_type}'" original.activity_data = { **dic, **original_type.install(original), "__reload_path": os.path.join(directory.name, rel_path) } pl_list = list() for item in dic['__pl']: pl_directory = Directory.objects.get(name=item['directory_name']) pl, pl_warnings = load_pl(pl_directory, item['path']) if pl is None: return None, pl_warnings warnings += pl_warnings pl_list.append(pl) originals = list(original.indexed_pl()) original.pl.clear() for pl in pl_list: correspond = list( filter( lambda i: i.directory == pl.directory and i.rel_path == pl. rel_path, originals)) if correspond: correspond = correspond[0] correspond.json = pl.json correspond.save() logger.info("PL '" + str(correspond.id) + " (" + correspond.name + ")' has been updated.") PLPosition.objects.create(parent=original, pl=correspond) else: pl.save() logger.info("PL '" + str(pl.id) + " (" + pl.name + ")' has been created.") PLPosition.objects.create(parent=original, pl=pl) original.save() logger.info("Activity '" + original.name + "' has been reloaded.") return original, [htmlprint.code(warning) for warning in warnings] except Exception as e: # pragma: no cover if not settings.DEBUG: return None, htmlprint.code(str(e)) return (None, (htmlprint.code(str(e)) + '<br>DEBUG set to True - Showing Traceback :<br>' + htmlprint.html_exc()))
def notes(request, activity_id): activity = get_object_or_404(Activity, id=activity_id) if not activity.is_teacher(request.user): raise PermissionDenied( "Vous devez être professeur pour récupérer les notes") session, _ = SessionActivity.objects.get_or_create(user=request.user, activity=activity) a_type = get_activity_type_class(activity.activity_type)() return a_type.notes(activity, request)
def dashboard(request, activity_id): activity = get_object_or_404(Activity, id=activity_id) session, _ = SessionActivity.objects.get_or_create(user=request.user, activity=activity) a_type = get_activity_type_class(activity.activity_type)() if activity.teacher.filter(username=request.user.username): return a_type.teacher_dashboard(request, activity, session) if activity.student.filter(username=request.user.username): return a_type.student_dashboard(request, activity, session) raise PermissionDenied("Vous n'appartenez pas à cette activité")
def evaluate(request, activity_id, pl_id): status = json.loads(request.body.decode()) activity = get_object_or_404(Activity, id=activity_id) session = get_object_or_404(SessionActivity, user=request.user, activity=activity) pl = get_object_or_404(PL, id=pl_id) exercise = session.session_exercise(pl) a_type = get_activity_type_class(activity.activity_type)() if not activity.open: raise PermissionDenied("Cette activité est fermée") if not activity.is_member(request.user): raise PermissionDenied("Vous n'appartenez pas à cette activité") if 'requested_action' in status: if status['requested_action'] == 'save': Answer.objects.create(answers=status['inputs'], user=request.user, pl=pl, seed=exercise.context['seed']) return HttpResponse(json.dumps({ "exercise": None, "navigation": None, "feedback": "Réponse(s) sauvegardé.", }), content_type='application/json') elif status['requested_action'] == 'submit': # Validate answer, feedback = exercise.evaluate(request, status['inputs']) answer['activity'] = session.activity feedback, to_be_saved = a_type.validate(activity, session, answer, feedback, action="submit") if to_be_saved: Answer.objects.create(**answer) return HttpResponse(json.dumps({ "navigation": a_type.navigation(activity, session, request), "exercise": session.current_pl_template(request), "feedback": render_feedback(feedback), }), content_type='application/json') return HttpResponseBadRequest("Unknown action") else: return HttpResponseBadRequest("Missing action")
def next(request, activity_id): activity = get_object_or_404(Activity, id=activity_id) session, _ = SessionActivity.objects.get_or_create(user=request.user, activity=activity) a_type = get_activity_type_class(activity.activity_type)() if not activity.open: raise PermissionDenied("Cette activité est fermée") if not activity.is_member(request.user): raise PermissionDenied("Vous n'appartenez pas à cette activité") return a_type.next(activity, session)
def small(self, request): return get_activity_type_class(self.activity_type)().small(request, self)
def fetch(self): a_type = get_activity_type_class(self.activity_type) return a_type.fetch(self)
def install_activity(sender, instance, created, *args, **kwargs): if created: activity_type = get_activity_type_class(instance.activity_type)() instance.activity_data = {**instance.activity_data, **activity_type.install(instance)} instance.parent = Activity.objects.get(pk=0) instance.save()
def init_session(sender, instance, created, *args, **kwargs): if created: activity = instance.activity activity_type = get_activity_type_class(activity.activity_type)() instance.session_data = {**instance.session_data, **activity_type.init(activity, instance)} instance.save()
def small_sd(self): return get_activity_type_class(self.activity.activity_type)().small_sd(self.activity, self)