def play_level(request, level, from_editor=False): """ Loads a level for rendering in the game. **Context** ``RequestContext`` ``level`` Level that is about to be played. An instance of :model:`game.Level`. ``blocks`` Blocks that are available during the game. List of :model:`game.Block`. ``lesson`` Instruction shown at the load of the level. String from `game.messages`. ``hint`` Hint shown after a number of failed attempts. String from `game.messages`. **Template:** :template:`game/game.html` """ night_mode = False if not app_settings.NIGHT_MODE_FEATURE_ENABLED else 'night' in request.GET if not permissions.can_play_level(request.user, level, app_settings.EARLY_ACCESS_FUNCTION(request)): return renderError(request, messages.noPermissionTitle(), messages.notSharedLevel()) # Set default level description/hint lookups lesson = 'description_level_default' hint = 'hint_level_default' # If it's one of our levels, set level description/hint lookups # to point to what they should be if level.default: lesson = 'description_level' + str(level.name) hint = 'hint_level' + str(level.name) # Try to get the relevant message, and fall back on defaults try: lessonCall = getattr(messages, lesson) hintCall = getattr(messages, hint) except AttributeError: lessonCall = messages.description_level_default hintCall = messages.hint_level_default lesson = mark_safe(lessonCall()) hint = mark_safe(hintCall()) house = getDecorElement('house', level.theme).url cfc = getDecorElement('cfc', level.theme).url background = getDecorElement('tile1', level.theme).url character = level.character workspace = None python_workspace = None if not request.user.is_anonymous() and hasattr(request.user.userprofile, 'student'): student = request.user.userprofile.student attempt = Attempt.objects \ .filter(level=level, student=student, finish_time__isnull=True, night_mode=night_mode) \ .order_by('-start_time') \ .first() if not attempt: attempt = Attempt(level=level, student=student, score=None, night_mode=night_mode) fetch_workspace_from_last_attempt(attempt) attempt.save() else: attempt = close_and_reset(attempt) workspace = attempt.workspace python_workspace = attempt.python_workspace decorData = level_management.get_decor(level) character_url = character.top_down character_width = character.width character_height = character.height wreckage_url = 'van_wreckage.svg' if night_mode: block_data = level_management.get_night_blocks(level) night_mode_javascript = "true" lesson = messages.title_night_mode() model_solution = '[]' else: block_data = level_management.get_blocks(level) night_mode_javascript = "false" model_solution = level.model_solution return_view = 'level_editor' if from_editor else 'levels' context = RequestContext(request, { 'level': level, 'lesson': lesson, 'blocks': block_data, 'decor': decorData, 'character': character, 'background': background, 'house': house, 'cfc': cfc, 'hint': hint, 'workspace': workspace, 'python_workspace': python_workspace, 'return_url': reverse(return_view), 'character_url': character_url, 'character_width': character_width, 'character_height': character_height, 'wreckage_url': wreckage_url, 'night_mode': night_mode_javascript, 'night_mode_feature_enabled': str(app_settings.NIGHT_MODE_FEATURE_ENABLED).lower(), 'model_solution': model_solution, 'next_level_url': _next_level_url(level, night_mode), 'flip_night_mode_url': _level_url(level, not night_mode), }) return render(request, 'game/game.html', context_instance=context)
def level_moderation(request): """ Renders a page with students' scores. **Context** ``RequestContext`` ``form`` Form used to choose a class and level to show. Instance of `forms.ScoreboardForm.` ``studentData`` List of lists containing all the data to be stored in the scoreboard table. ``thead`` List of Strings representing the headers of the scoreboard table. **Template:** :template:`game/level_moderation.html` """ # Not showing this part to outsiders. if not permissions.can_see_level_moderation(request.user): return renderError(request, messages.noPermissionLevelModerationTitle(), messages.noPermissionLevelModerationPage()) teacher = request.user.userprofile.teacher classes_taught = Class.objects.filter(teacher=teacher) if len(classes_taught) <= 0: return renderError(request, messages.noPermissionLevelModerationTitle(), messages.noDataToShowLevelModeration()) form = LevelModerationForm(request.POST or None, classes=classes_taught) student_id = None student_dict = None level_data = None table_headers = None if request.method == 'POST': if form.is_valid(): student_id = form.data.get('students') class_id = form.data.get('classes') if not class_id: raise Http404 # check user has permission to look at this class! cl = get_object_or_404(Class, id=class_id) if not permissions.can_see_class(request.user, cl): return renderError(request, messages.noPermissionLevelModerationTitle(), messages.noPermissionLevelModerationClass()) students = Student.objects.filter(class_field=cl) student_dict = {student.id: student.user.user.first_name for student in students} if student_id: # check student is in class student = get_object_or_404(Student, id=student_id) if student.class_field != cl: return renderError(request, messages.noPermissionLevelModerationTitle(), messages.noPermissionLevelModerationStudent()) owners = [student.user] else: owners = [student.user for student in students] table_headers = [ugettext('Student'), ugettext('Level name'), ugettext('Shared with'), ugettext('Play'), ugettext('Delete')] level_data = [] for owner in owners: for level in Level.objects.filter(owner=owner): users_shared_with = [user for user in level.shared_with.all() if permissions.can_share_level_with(user, owner.user) and user != owner.user] if not users_shared_with: shared_str = "-" else: shared_str = ", ".join(app_tags.make_into_username(user) for user in users_shared_with) level_data.append({'student': app_tags.make_into_username(owner.user), 'id': level.id, 'name': level.name, 'shared_with': shared_str}) context = RequestContext(request, { 'student_id': student_id, 'students': student_dict, 'form': form, 'levelData': level_data, 'thead': table_headers, }) return render(request, 'game/level_moderation.html', context_instance=context)
def play_level(request, level, from_editor=False): """ Loads a level for rendering in the game. **Context** ``RequestContext`` ``level`` Level that is about to be played. An instance of :model:`game.Level`. ``blocks`` Blocks that are available during the game. List of :model:`game.Block`. ``lesson`` Instruction shown at the load of the level. String from `game.messages`. ``hint`` Hint shown after a number of failed attempts. String from `game.messages`. **Template:** :template:`game/game.html` """ night_mode = False if not app_settings.NIGHT_MODE_FEATURE_ENABLED else 'night' in request.GET if not permissions.can_play_level( request.user, level, app_settings.EARLY_ACCESS_FUNCTION(request)): return renderError(request, messages.noPermissionTitle(), messages.notSharedLevel()) # Set default level description/hint lookups lesson = 'description_level_default' hint = 'hint_level_default' # If it's one of our levels, set level description/hint lookups # to point to what they should be if level.default: lesson = 'description_level' + str(level.name) hint = 'hint_level' + str(level.name) # Try to get the relevant message, and fall back on defaults try: lessonCall = getattr(messages, lesson) hintCall = getattr(messages, hint) except AttributeError: lessonCall = messages.description_level_default hintCall = messages.hint_level_default lesson = mark_safe(lessonCall()) hint = mark_safe(hintCall()) house = get_decor_element('house', level.theme).url cfc = get_decor_element('cfc', level.theme).url background = get_decor_element('tile1', level.theme).url character = level.character workspace = None python_workspace = None if not request.user.is_anonymous() and hasattr(request.user.userprofile, 'student'): student = request.user.userprofile.student attempt = Attempt.objects \ .filter(level=level, student=student, finish_time__isnull=True, night_mode=night_mode) \ .order_by('-start_time') \ .first() if not attempt: attempt = Attempt(level=level, student=student, score=None, night_mode=night_mode) fetch_workspace_from_last_attempt(attempt) attempt.save() else: attempt = close_and_reset(attempt) workspace = attempt.workspace python_workspace = attempt.python_workspace decor_data = cached_level_decor(level) character_url = character.top_down character_width = character.width character_height = character.height wreckage_url = 'van_wreckage.svg' if night_mode: block_data = level_management.get_night_blocks(level) night_mode_javascript = "true" lesson = messages.title_night_mode() model_solution = '[]' else: block_data = cached_level_blocks(level) night_mode_javascript = "false" model_solution = level.model_solution return_view = 'level_editor' if from_editor else 'levels' context = RequestContext( request, { 'level': level, 'lesson': lesson, 'blocks': block_data, 'decor': decor_data, 'character': character, 'background': background, 'house': house, 'cfc': cfc, 'hint': hint, 'workspace': workspace, 'python_workspace': python_workspace, 'return_url': reverse(return_view), 'character_url': character_url, 'character_width': character_width, 'character_height': character_height, 'wreckage_url': wreckage_url, 'night_mode': night_mode_javascript, 'night_mode_feature_enabled': str(app_settings.NIGHT_MODE_FEATURE_ENABLED).lower(), 'model_solution': model_solution, 'next_level_url': _next_level_url(level, night_mode), 'flip_night_mode_url': _level_url(level, not night_mode), }) return render(request, 'game/game.html', context_instance=context)
def render_no_permission_error(request): return renderError(request, messages.noPermissionTitle(), messages.noPermissionScoreboard())
def play_level(request, level, from_editor=False): """ Loads a level for rendering in the game. **Context** ``RequestContext`` ``level`` Level that is about to be played. An instance of :model:`game.Level`. ``blocks`` Blocks that are available during the game. List of :model:`game.Block`. ``lesson`` Instruction shown at the load of the level. String from `game.messages`. ``hint`` Hint shown after a number of failed attempts. String from `game.messages`. **Template:** :template:`game/game.html` """ night_mode = ( False if not app_settings.NIGHT_MODE_FEATURE_ENABLED else "night" in request.GET ) if not permissions.can_play_level( request.user, level, app_settings.EARLY_ACCESS_FUNCTION(request) ): return renderError( request, messages.noPermissionTitle(), messages.notSharedLevel() ) # Set default level description/hint lookups lesson = "description_level_default" hint = "hint_level_default" # If it's one of our levels, set level description/hint lookups # to point to what they should be if level.default: lesson = "description_level" + str(level.name) hint = "hint_level" + str(level.name) # Try to get the relevant message, and fall back on defaults try: lessonCall = getattr(messages, lesson) hintCall = getattr(messages, hint) except AttributeError: lessonCall = messages.description_level_default hintCall = messages.hint_level_default lesson = mark_safe(lessonCall()) hint = mark_safe(hintCall()) house = get_decor_element("house", level.theme).url cfc = get_decor_element("cfc", level.theme).url background = get_decor_element("tile1", level.theme).url character = level.character workspace = None python_workspace = None if not request.user.is_anonymous() and hasattr(request.user.userprofile, "student"): student = request.user.userprofile.student attempt = ( Attempt.objects.filter( level=level, student=student, finish_time__isnull=True, night_mode=night_mode, ) .order_by("-start_time") .first() ) if not attempt: attempt = Attempt( level=level, student=student, score=None, night_mode=night_mode ) fetch_workspace_from_last_attempt(attempt) attempt.save() else: attempt = close_and_reset(attempt) workspace = attempt.workspace python_workspace = attempt.python_workspace decor_data = cached_level_decor(level) character_url = character.top_down character_width = character.width character_height = character.height wreckage_url = "van_wreckage.svg" if night_mode: block_data = level_management.get_night_blocks(level) night_mode_javascript = "true" lesson = messages.title_night_mode() model_solution = "[]" else: block_data = cached_level_blocks(level) night_mode_javascript = "false" model_solution = level.model_solution return_view = "level_editor" if from_editor else "levels" return render( request, "game/game.html", context={ "level": level, "lesson": lesson, "blocks": block_data, "decor": decor_data, "character": character, "background": background, "house": house, "cfc": cfc, "hint": hint, "workspace": workspace, "python_workspace": python_workspace, "return_url": reverse(return_view), "character_url": character_url, "character_width": character_width, "character_height": character_height, "wreckage_url": wreckage_url, "night_mode": night_mode_javascript, "night_mode_feature_enabled": str( app_settings.NIGHT_MODE_FEATURE_ENABLED ).lower(), "model_solution": model_solution, "next_level_url": _next_level_url(level, night_mode), "flip_night_mode_url": _level_url(level, not night_mode), }, )