def test_announcement_i18n_title(self):
        locale = 'de'
        announcement = self._add_announcement_and_translation(locale)
        actions.login('*****@*****.**')
        actions.register(self, 'John Doe')

        # Verify that one-off title translation also works.
        try:
            sites.set_path_info('/' + self.COURSE)
            ctx = sites.get_course_for_current_request()
            save_locale = ctx.get_current_locale()
            key = announcements.TranslatableResourceAnnouncement.key_for_entity(
                announcement)

            # Untranslated
            ctx.set_current_locale(None)
            i18n_title = str(
                announcements.TranslatableResourceAnnouncement.get_i18n_title(
                    key))
            self.assertEquals('Test Announcement', i18n_title)

            # Translated
            ctx.set_current_locale(locale)
            i18n_title = str(
                announcements.TranslatableResourceAnnouncement.get_i18n_title(
                    key))
            self.assertEquals('TEST ANNOUNCEMENT', i18n_title)
        finally:
            ctx.set_current_locale(save_locale)
            sites.unset_path_info()
Example #2
0
    def SCHEMA_ANNOTATIONS_DICT(cls):  # pylint: disable-msg=g-bad-name
        """Schema annotations are dynamic and include a list of courses."""

        # Make a list of courses user has the rights to.
        course_list = []
        for acourse in sites.get_all_courses():
            if not roles.Roles.is_course_admin(acourse):
                continue
            if acourse == sites.get_course_for_current_request():
                continue
            course_list.append({
                'value': acourse.raw,
                'label': acourse.get_title()
            })

        if not course_list:
            return None

        # Format annotations.
        return [(['title'], 'Import Course'),
                (['properties', 'course', '_inputex'], {
                    'label': 'Available Courses',
                    '_type': 'select',
                    'choices': course_list
                })]
Example #3
0
def create_and_configure_jinja_environment(dirs,
                                           autoescape=True,
                                           handler=None,
                                           default_locale='en_US'):
    """Sets up an environment and gets jinja template."""

    # Defer to avoid circular import.
    from controllers import sites

    locale = None
    app_context = sites.get_course_for_current_request()
    if app_context:
        locale = app_context.get_current_locale()
        if not locale:
            locale = app_context.default_locale
    if not locale:
        locale = default_locale

    jinja_environment = create_jinja_environment(jinja2.FileSystemLoader(dirs),
                                                 locale=locale,
                                                 autoescape=autoescape)

    jinja_environment.filters['gcb_tags'] = get_gcb_tags_filter(handler)

    return jinja_environment
Example #4
0
    def _get_top_nav(self):
        current_action = self.request.get('action')
        nav = safe_dom.NodeList()

        course = sites.get_course_for_current_request()
       
        for action, title in self.nav_mappings:
            if action == "gDefier":
                if not course.get_slug().split("_")[-1] == "DFR":
                    continue
            class_name = 'selected' if action == current_action else ''
            action_href = 'dashboard?action=%s' % action
            nav.append(safe_dom.Element(
                'a', href=action_href, className=class_name).add_text(
                    title))

        if roles.Roles.is_super_admin():
            nav.append(safe_dom.Element(
                'a', href='/admin').add_text('Admin'))

        nav.append(safe_dom.Element(
            'a',
            href='https://code.google.com/p/course-builder/wiki/Dashboard',
            target='_blank'
        ).add_text('Help'))
        
        """--------------- GDEFIER MODIFICATION ------------------------"""        
        #nav.append(safe_dom.Element(
        #    'a', href='gDefier/home',).add_text('G-Defier'))
        """---------------------- END ---------------------------------"""
        return nav
Example #5
0
def get_template(template_name, dirs, handler=None, autoescape=True):
    """Sets up an environment and gets jinja template."""

    # Defer to avoid circular import.
    # pylint: disable-msg=g-import-not-at-top
    from controllers import sites

    locale = None
    app_context = sites.get_course_for_current_request()
    if app_context:
        locale = app_context.get_current_locale()
        if not locale:
            locale = app_context.default_locale
    if not locale:
        locale = 'en_US'

    jinja_environment = create_jinja_environment(jinja2.FileSystemLoader(dirs),
                                                 locale=locale,
                                                 autoescape=autoescape)

    jinja_environment.filters['gcb_tags'] = get_gcb_tags_filter(handler)
    jinja_environment.globals[
        'profiler_includes'] = gae_mini_profiler.templatetags.profiler_includes

    return jinja_environment.get_template(template_name)
    def SCHEMA_ANNOTATIONS_DICT(cls):  # pylint: disable-msg=g-bad-name
        """Schema annotations are dynamic and include a list of courses."""

        # Make a list of courses user has the rights to.
        course_list = []
        for acourse in sites.get_all_courses():
            if not roles.Roles.is_course_admin(acourse):
                continue
            if acourse == sites.get_course_for_current_request():
                continue
            course_list.append({
                'value': acourse.raw,
                'label': cgi.escape(acourse.get_title())})

        if not course_list:
            return None

        # Format annotations.
        return [
            (['title'], 'Import Course'),
            (
                ['properties', 'course', '_inputex'],
                {
                    'label': 'Available Courses',
                    '_type': 'select',
                    'choices': course_list})]
    def test_announcement_i18n_title(self):
        locale = 'de'
        announcement = self._add_announcement_and_translation(locale)
        actions.login('*****@*****.**')
        actions.register(self, 'John Doe')

        # Verify that one-off title translation also works.
        try:
            sites.set_path_info('/' + self.COURSE)
            ctx = sites.get_course_for_current_request()
            save_locale = ctx.get_current_locale()
            key = announcements.TranslatableResourceAnnouncement.key_for_entity(
                announcement)

            # Untranslated
            ctx.set_current_locale(None)
            i18n_title = str(
                announcements.TranslatableResourceAnnouncement.get_i18n_title(
                    key))
            self.assertEquals('Test Announcement', i18n_title)

            # Translated
            ctx.set_current_locale(locale)
            i18n_title = str(
                announcements.TranslatableResourceAnnouncement.get_i18n_title(
                    key))
            self.assertEquals('TEST ANNOUNCEMENT', i18n_title)
        finally:
            ctx.set_current_locale(save_locale)
            sites.unset_path_info()
Example #8
0
def create_group(self):
    course = sites.get_course_for_current_request()
    group = GDefierGroup.gql("WHERE name = '" + course.get_namespace_name() + "'").get()
    if not group:
        print "Creating group..." 
        aux_group = GDefierGroup(name=course.get_namespace_name()).put()
        return aux_group
    return group
Example #9
0
    def render(self, node, unused_handler):
        """Embed just a <script> tag that will in turn create an <iframe>."""

        category = node.attrib.get('forum-category')
        course = sites.get_course_for_current_request().get_environ()['course']
        url = course['VANILLA_EMBED_URL']
        return cElementTree.XML("""
<div style='width: 750px;'>
  <script>window.location.hash = '/categories/%s';</script><script type="text/javascript" src="//%s/js/embed.js"></script><noscript>Please enable JavaScript to view discussions.</noscript>
</div>""" % (cgi.escape(category), cgi.escape(url)))
Example #10
0
 def get_i18n_title(cls, resource_key):
     locale = None
     app_context = sites.get_course_for_current_request()
     if (app_context and
         app_context.default_locale != app_context.get_current_locale()):
         locale = app_context.get_current_locale()
     announcements = AnnouncementEntity.get_announcements(locale)
     item = common_utils.find(
         lambda a: a.key().id() == int(resource_key.key), announcements)
     return item.title if item else None
Example #11
0
def create_board(self, blocks):
    course = sites.get_course_for_current_request()
    board = GDefierBoard.gql("WHERE name = '" + course.get_namespace_name() + "'").get()
    if not board:
        print "Creating board..." 
        aux_board = GDefierBoard(name=course.get_namespace_name()).put()
        for b in blocks:
            print "Creating block to board..." 
            GDefierBoardBlock(blockID=b['block_title'], board=[aux_board]).put()        
        return aux_board
    return board
Example #12
0
    def _update_global_profile_attributes(
        cls,
        profile,
        email=None,
        legal_name=None,
        nick_name=None,
        date_of_birth=None,
        is_enrolled=None,
        final_grade=None,
        course_info=None,
    ):
        """Modifies various attributes of Student's Global Profile."""
        # TODO(psimakov): update of email does not work for student
        if email is not None:
            profile.email = email

        if legal_name is not None:
            profile.legal_name = legal_name

        if nick_name is not None:
            profile.nick_name = nick_name

        if date_of_birth is not None:
            profile.date_of_birth = date_of_birth

        if not (is_enrolled is None and final_grade is None and course_info is None):

            # Defer to avoid circular import.
            # pylint: disable-msg=g-import-not-at-top
            from controllers import sites

            course = sites.get_course_for_current_request()
            course_namespace = course.get_namespace_name()

            if is_enrolled is not None:
                enrollment_dict = transforms.loads(profile.enrollment_info)
                enrollment_dict[course_namespace] = is_enrolled
                profile.enrollment_info = transforms.dumps(enrollment_dict)

            if final_grade is not None or course_info is not None:
                course_info_dict = {}
                if profile.course_info:
                    course_info_dict = transforms.loads(profile.course_info)
                if course_namespace in course_info_dict.keys():
                    info = course_info_dict[course_namespace]
                else:
                    info = {}
                if final_grade:
                    info["final_grade"] = final_grade
                if course_info:
                    info["info"] = course_info
                course_info_dict[course_namespace] = info
                profile.course_info = transforms.dumps(course_info_dict)
 def _get_course_list(cls):
     # Make a list of courses user has the rights to.
     course_list = []
     for acourse in sites.get_all_courses():
         if not roles.Roles.is_course_admin(acourse):
             continue
         if acourse == sites.get_course_for_current_request():
             continue
         course_list.append({
             'value': acourse.raw,
             'label': cgi.escape(acourse.get_title())})
     return course_list
    def render(self, node, unused_handler):
        """Embed just a <script> tag that will in turn create an <iframe>."""

        category = node.attrib.get('forum-category')
        course = sites.get_course_for_current_request().get_environ()['course']
        url = course['VANILLA_EMBED_URL']
        return cElementTree.XML(
            """
<div id="forum">
  <script>window.location.hash = '/categories/%s';</script><script type="text/javascript" src="//%s/js/embed.js"></script><noscript>Please enable JavaScript to view discussions.</noscript>
</div>""" % (
    cgi.escape(category), cgi.escape(url)))
Example #15
0
 def _get_course_list(cls):
     # Make a list of courses user has the rights to.
     course_list = []
     for acourse in sites.get_all_courses():
         if not roles.Roles.is_course_admin(acourse):
             continue
         if acourse == sites.get_course_for_current_request():
             continue
         course_list.append({
             'value': acourse.raw,
             'label': cgi.escape(acourse.get_title())
         })
     return course_list
    def _get_course_list(cls):
        # Make a list of courses user has the rights to.
        course_list = []
        for acourse in sites.get_all_courses():
            if not roles.Roles.is_course_admin(acourse):
                continue
            if acourse == sites.get_course_for_current_request():
                continue

            atitle = "%s (%s)" % (acourse.get_title(), acourse.get_slug())

            course_list.append({"value": acourse.raw, "label": cgi.escape(atitle)})
        return course_list
Example #17
0
    def get_gDefier(self):
        """Renders course indexing view if G-Defier module is enabled."""
        
        template_values = {}
        mc_template_value = {}
        
        course = sites.get_course_for_current_request()
        template_values['page_title'] = self.format_title('GDefier')

        """ Catching url hackers """
        if not course.get_slug().split("_")[-1] == "DFR":
            mc_template_value['is_dashboard'] = True
            mc_template_value['error_code'] = 'disabled_gDefier_module'
            template_values['main_content'] = jinja2.Markup(self.get_template(
                'templates/gDefier_error.html', [os.path.dirname(__file__)]
                ).render(mc_template_value, autoescape=True))
            self.render_page(template_values)        
            return
        
        gDefier_actions = []

        # Enable editing if supported.
        if filer.is_editable_fs(self.app_context):
            gDefier_actions.append({
                'id': 'edit_gDefier_DB',
                'caption': 'Edit',
                'action': self.get_action_url('edit_gDefier_course_settings'),
                'xsrf_token': self.create_xsrf_token(
                    'edit_gDefier_course_settings')})

        # gDefier.yaml file content.
        gDefier_info = []

        yaml_stream = self.app_context.fs.open(get_gDefier_config_filename(self))
        
        if yaml_stream:
            yaml_lines = yaml_stream.read().decode('utf-8')
            for line in yaml_lines.split('\n'):
                gDefier_info.append(line)
        else:
            gDefier_info.append('< empty file >')

        # Prepare template values.
        template_values['sections'] = [
            {
                'title': 'Contents of DATA table from gDefier DB',
                'description': "General settings for G-Defier Module to this course.",
                'actions': gDefier_actions,
                'children': gDefier_info}]

        self.render_page(template_values)
Example #18
0
    def _update_global_profile_attributes(cls,
                                          profile,
                                          email=None,
                                          legal_name=None,
                                          nick_name=None,
                                          date_of_birth=None,
                                          is_enrolled=None,
                                          final_grade=None,
                                          course_info=None):
        """Modifies various attributes of Student's Global Profile."""
        # TODO(psimakov): update of email does not work for student
        if email is not None:
            profile.email = email

        if legal_name is not None:
            profile.legal_name = legal_name

        if nick_name is not None:
            profile.nick_name = nick_name

        if date_of_birth is not None:
            profile.date_of_birth = date_of_birth

        if not (is_enrolled is None and final_grade is None
                and course_info is None):

            # Defer to avoid circular import.
            # pylint: disable-msg=g-import-not-at-top
            from controllers import sites
            course = sites.get_course_for_current_request()
            course_namespace = course.get_namespace_name()

            if is_enrolled is not None:
                enrollment_dict = transforms.loads(profile.enrollment_info)
                enrollment_dict[course_namespace] = is_enrolled
                profile.enrollment_info = transforms.dumps(enrollment_dict)

            if final_grade is not None or course_info is not None:
                course_info_dict = {}
                if profile.course_info:
                    course_info_dict = transforms.loads(profile.course_info)
                if course_namespace in course_info_dict.keys():
                    info = course_info_dict[course_namespace]
                else:
                    info = {}
                if final_grade:
                    info['final_grade'] = final_grade
                if course_info:
                    info['info'] = course_info
                course_info_dict[course_namespace] = info
                profile.course_info = transforms.dumps(course_info_dict)
Example #19
0
 def _translate_content(cls, items):
     app_context = sites.get_course_for_current_request()
     course = courses.Course.get(app_context)
     key_list = [
         TranslatableResourceAnnouncement.key_for_entity(item)
         for item in items]
     FakeDto = collections.namedtuple('FakeDto', ['dict'])
     fake_items = [
         FakeDto({'title': item.title, 'html': item.html})
         for item in items]
     i18n_dashboard.translate_dto_list(course, fake_items, key_list)
     for item, fake_item in zip(items, fake_items):
         item.title = str(fake_item.dict['title'])
         item.html = str(fake_item.dict['html'])
Example #20
0
def create_player(self):
    nick = self.get_user().nickname()
    alumn = GDefierPlayer.gql("WHERE name = '" + nick +"'").get()
    if not alumn:
        print "user created"
        #Creating and adding to correspondent group
        course = sites.get_course_for_current_request()
        aux_group = GDefierGroup.gql("WHERE name = '" + course.get_namespace_name() + "'").get()
        if not aux_group:
            print "First player..."
            aux_group = create_group(self)
        else:
            aux_group=aux_group.key()
        GDefierPlayer(name=nick, group=[aux_group]).put()
Example #21
0
    def get(self):
        """Handles GET requests."""
        if not self.personalize_page_and_get_enrolled():
            return
        
        path = sites.abspath(self.app_context.get_home_folder(),
                     GCB_GDEFIER_FOLDER_NAME)
        
        course = sites.get_course_for_current_request()

        if not course.get_slug().split("_")[-1] == "DFR":
            page = 'templates/gDefier_error.html'
            self.template_value['error_code'] = 'disabled_gDefier_module'
            self.template_value['is_dashboard'] = False
        else:
            page = 'templates/gDefier.html'
        
        # Patch to double apparition of registration
        registration = None
        if gDefier_model.player_has_blocks(self):
            if self.request.get('registered')=='yes':
                registration = False
            else:
                registration = True
        else:
            registration = False
            
        entity = get_course_dict()
        player = gDefier_model.get_player(self)
        
        prctng = []
        for b in player.blocks:
            n = int(b.wins*100/entity['module']['n_defies'])
            for i in range(entity['module']['blocks'].__len__()):
                if entity['module']['blocks'][i]["block_title"]==b.blockID:
                    prctng.insert(i, "n"+str(n))
                    
        noprctng = prctng
        noprctng = map(lambda s: s.strip('n'), noprctng)
        print noprctng
            
        template = self.get_template(page, additional_dirs=[path])
        self.template_value['gDefier_transient_student'] = registration
        self.template_value['navbar'] = {'gDefier': True}
        self.template_value['entity'] = entity
        self.template_value['player'] = player
        self.template_value['prctng'] = prctng
        self.template_value['noprctng'] = noprctng
        self.render(template)
Example #22
0
def check_personalization(browser, response):
    """Checks that the login/logout text is correct."""
    sites.set_path_info(browser.last_request_url)
    app_context = sites.get_course_for_current_request()
    sites.unset_path_info()

    browsable = app_context.get_environ()['course']['browsable']

    if browsable:
        callbacks = [
            functools.partial(check_login_link, response.body),
            functools.partial(check_logout_link, response.body)
        ]
        assert_at_least_one_succeeds(callbacks)
    else:
        check_logout_link(response.body)
Example #23
0
    def __init__(self, request, response):  # pylint: disable=super-init-not-called
        self.initialize(request, response)
        # Check to see if the current user is admin
        self.is_admin = users.is_current_user_admin()

        # Store the original namespace, before setting the course specific one.
        self.old_namespace = namespace_manager.get_namespace()

        # Set the active namespace to the course domain namespace
        try:
            sites.set_path_info(self.request.path, self.request.server_name)
        except AttributeError as e:
            logging.error(e)

        namespace = namespace_manager.get_namespace()

        if namespace:
            self.app_context = sites.get_course_for_current_request()
            self.is_admin = roles.Roles.is_course_admin(self.app_context)
            is_public = self.app_context.now_available

            if self.is_admin is False and is_public is False:
                # if course is private, and user has not logged in, redirect to login
                # else if user is logged in and not admin, 404
                if not users.get_current_user():
                    self.redirect(users.create_login_url(self.request.path))
                else:
                    self.abort(404)

            # Set the current user with their preferences
            self.student = StudentSvc.get_current_student()
            if self.student:
                self.student.prefs = StudentSvc.get_current_user_preferences()

        if self.current_user:
            self._xsrf_token = xsrf.GenerateToken(_GetXsrfKey(),
                                                  self.current_user.email())
            self.response.set_cookie('XSRF-TOKEN', self._xsrf_token, httponly=False)
        else:
            self._xsrf_token = None
        self._RawWrite = self.response.out.write

        # Get a session store for this request.
        self.session_store = sessions.get_store(request=self.request)

        # Set the active locale
        self.locale_key = LocaleSvc.get_locale_key('en_GB')
Example #24
0
    def get_course_picker(self, destination=None):
        destination = destination or '/dashboard'
        action = self.request.get('action') or self._default_get_action

        # disable picker if we are on the well known page; we dont want picked
        # on pages where edits or creation of new object can get triggered
        safe_action = action and action in [
            a for a, _ in self.get_nav_mappings()
        ] + ['admin']

        tab = self.request.get('tab')
        if action in self.get_actions:
            tab_group = tabs.Registry.get_tab_group(action)
            if tab_group and tab in tab_group:
                tab = '&tab=%s' % tab
            else:
                tab = ''
            destination = '%s?action=%s%s' % (destination, action, tab)

        current_course = sites.get_course_for_current_request()
        options = []
        for course in sorted(sites.get_all_courses()):
            with Namespace(course.namespace):
                if self.current_user_has_access(course):
                    url = (course.canonicalize_url(destination)
                           if safe_action else 'javascript:void(0)')
                    title = '%s (%s)' % (course.get_title(), course.get_slug())
                    option = safe_dom.Element('li')
                    link = safe_dom.A(url).add_text(title)
                    if current_course == course:
                        link.set_attribute('class', 'selected')
                    option.add_child(link)
                    options.append((course.get_title(), option))

        picker_class_name = 'hidden'
        if not safe_action:
            picker_class_name += ' disabled'

        picker = safe_dom.Element('ol',
                                  id='gcb-course-picker-menu',
                                  className=picker_class_name)

        for title, option in sorted(options, key=lambda item: item[0].lower()):
            picker.append(option)
        return picker
Example #25
0
    def get_course_picker(self, destination=None):
        destination = destination or '/dashboard'
        action = self.request.get('action') or self._default_get_action

        # disable picker if we are on the well known page; we dont want picked
        # on pages where edits or creation of new object can get triggered
        safe_action = action and action in [
            a for a, _ in self.get_nav_mappings()] + ['admin']

        tab = self.request.get('tab')
        if action in self.get_actions:
            tab_group = tabs.Registry.get_tab_group(action)
            if tab_group and tab in tab_group:
                tab = '&tab=%s' % tab
            else:
                tab = ''
            destination = '%s?action=%s%s' % (destination, action, tab)

        current_course = sites.get_course_for_current_request()
        options = []
        for course in sorted(sites.get_all_courses()):
            with Namespace(course.namespace):
                if self.current_user_has_access(course):
                    url = (
                        course.canonicalize_url(destination) if safe_action
                        else 'javascript:void(0)')
                    title = '%s (%s)' % (course.get_title(), course.get_slug())
                    option = safe_dom.Element('li')
                    link = safe_dom.A(url).add_text(title)
                    if current_course == course:
                        link.set_attribute('class', 'selected')
                    option.add_child(link)
                    options.append((course.get_title(), option))

        picker_class_name = 'hidden'
        if not safe_action:
            picker_class_name += ' disabled'

        picker = safe_dom.Element(
            'ol', id='gcb-course-picker-menu', className=picker_class_name)

        for title, option in sorted(
            options, key=lambda item: item[0].lower()):
            picker.append(option)
        return picker
    def render(self, node, handler):
        """Embed just a <script> tag that will in turn create an <iframe>."""
        userinfo = users.get_current_user()
        if not userinfo:
            return ""
        url = node.attrib.get('url')
        user = users.get_current_user()
        info = sites.get_course_for_current_request().get_environ()
        course = info['course']['MOOC_ADMIN_COURSE_ID']
        salt = utils.XSRF_SECRET.value
        hashed_user = hashlib.sha1( salt + user.user_id() ).hexdigest()
        lessonid = handler.lesson_id

        height = node.attrib.get('height')

        query = node.attrib.get('query')
        return cElementTree.XML(
            """
<div style='width: 775px;'>
  <iframe src="%s?%s&amp;user=%s&amp;hashed_user=%s&amp;lessonid=%s&amp;course=%s" frameborder="0" width="775" height="%s" style="overflow:hidden"></iframe>
</div>""" % (
    cgi.escape(url), cgi.escape(query), cgi.escape(user.user_id()),  cgi.escape(hashed_user),  lessonid, course, cgi.escape(height)))
def get_template(
    template_name, dirs, autoescape=True, handler=None, default_locale='en_US'):
    """Sets up an environment and gets jinja template."""

    # Defer to avoid circular import.
    from controllers import sites

    locale = None
    app_context = sites.get_course_for_current_request()
    if app_context:
        locale = app_context.get_current_locale()
        if not locale:
            locale = app_context.default_locale
    if not locale:
        locale = default_locale

    jinja_environment = create_jinja_environment(
        jinja2.FileSystemLoader(dirs), locale=locale, autoescape=autoescape)

    jinja_environment.filters['gcb_tags'] = get_gcb_tags_filter(handler)

    return jinja_environment.get_template(template_name)
    def SCHEMA_ANNOTATIONS_DICT(cls):  # pylint: disable-msg=g-bad-name
        """Schema annotations are dynamic and include a list of courses."""

        # Make a list of courses user has the rights to.
        course_list = []
        for acourse in sites.get_all_courses():
            if not roles.Roles.is_course_admin(acourse):
                continue
            if acourse == sites.get_course_for_current_request():
                continue
            course_list.append({"value": acourse.raw, "label": acourse.get_title()})

        if not course_list:
            return None

        # Format annotations.
        return [
            (["title"], "Import Course"),
            (
                ["properties", "course", "_inputex"],
                {"label": "Available Courses", "_type": "select", "choices": course_list},
            ),
        ]
Example #29
0
def get_players(self):
    course = sites.get_course_for_current_request().get_namespace_name()
    results = db.GqlQuery("SELECT * FROM GDefierGroup WHERE name ='"+course+"'")
    for x in results:
        players = x.members
        return players