示例#1
0
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()))
示例#2
0
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)
示例#3
0
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é")
示例#4
0
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")
示例#5
0
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)
示例#6
0
 def small(self, request):
     return get_activity_type_class(self.activity_type)().small(request, self)
示例#7
0
 def fetch(self):
     a_type = get_activity_type_class(self.activity_type)
     return a_type.fetch(self)
示例#8
0
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()
示例#9
0
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()
示例#10
0
 def small_sd(self):
     return get_activity_type_class(self.activity.activity_type)().small_sd(self.activity, self)