コード例 #1
0
ファイル: util_profile.py プロジェクト: di445/server
    def get(self):
        coach = UserData.current()

        if coach:

            user_override = self.request_user_data("coach_email")
            if user_override and user_override.are_students_visible_to(coach):
                # Only allow looking at a student list other than your own
                # if you are a dev, admin, or coworker.
                coach = user_override

            student_lists = StudentList.get_for_coach(coach.key())

            student_lists_list = [{
                'key': 'allstudents',
                'name': 'כל התלמידים'.decode("utf8"),
            }];
            for student_list in student_lists:
                student_lists_list.append({
                    'key': str(student_list.key()),
                    'name': student_list.name,
                })

            list_id, _ = get_last_student_list(self, student_lists, coach==UserData.current())
            current_list = None
            for student_list in student_lists_list:
                if student_list['key'] == list_id:
                    current_list = student_list

            selected_graph_type = self.request_string("selected_graph_type") or ClassProgressReportGraph.GRAPH_TYPE
            if selected_graph_type == 'progressreport' or selected_graph_type == 'goals': # TomY This is temporary until all the graphs are API calls
                initial_graph_url = "/api/v1/user/students/%s?coach_email=%s&%s" % (selected_graph_type, urllib.quote(coach.email), urllib.unquote(self.request_string("graph_query_params", default="")))
            else:
                initial_graph_url = "/profile/graph/%s?coach_email=%s&%s" % (selected_graph_type, urllib.quote(coach.email), urllib.unquote(self.request_string("graph_query_params", default="")))
            initial_graph_url += 'list_id=%s' % list_id
            
            exercises = models.Exercise.get_all_use_cache()
            exercises.sort(key=lambda ex: ex.display_name)

            template_values = {
                    'user_data_coach': coach,
                    'coach_email': coach.email,
                    'list_id': list_id,
                    'student_list': current_list,
                    'student_lists': student_lists_list,
                    'student_lists_json': json.dumps(student_lists_list),
                    'coach_nickname': coach.nickname,
                    'selected_graph_type': selected_graph_type,
                    'initial_graph_url': initial_graph_url,
                    'exercises': exercises,
                    'is_profile_empty': not coach.has_students(),
                    'selected_nav_link': 'coach',
                    "view": self.request_string("view", default=""),
                    'stats_charts_class': 'coach-view',
                    }
            self.render_jinja2_template('viewclassprofile.html', template_values)
        else:
            self.redirect(util.create_login_url(self.request.uri))
コード例 #2
0
    def get(self):
        coach = UserData.current()

        if coach:

            user_override = self.request_user_data("coach_email")
            if user_override and user_override.are_students_visible_to(coach):
                # Only allow looking at a student list other than your own
                # if you are a dev, admin, or coworker.
                coach = user_override

            student_lists = StudentList.get_for_coach(coach.key())

            student_lists_list = [{
                'key': 'allstudents',
                'name': 'All students',
            }]
            for student_list in student_lists:
                student_lists_list.append({
                    'key': str(student_list.key()),
                    'name': student_list.name,
                })

            list_id, _ = get_last_student_list(self, student_lists,
                                               coach == UserData.current())
            current_list = None
            for student_list in student_lists_list:
                if student_list['key'] == list_id:
                    current_list = student_list

            selected_graph_type = self.request_string(
                "selected_graph_type") or ClassProgressReportGraph.GRAPH_TYPE
            initial_graph_url = "/profile/graph/%s?coach_email=%s&%s" % (
                selected_graph_type, urllib.quote(coach.email),
                urllib.unquote(
                    self.request_string("graph_query_params", default="")))
            initial_graph_url += 'list_id=%s' % list_id

            template_values = {
                'user_data_coach': coach,
                'coach_email': coach.email,
                'list_id': list_id,
                'student_list': current_list,
                'student_lists': student_lists_list,
                'student_lists_json': simplejson.dumps(student_lists_list),
                'coach_nickname': coach.nickname,
                'selected_graph_type': selected_graph_type,
                'initial_graph_url': initial_graph_url,
                'exercises': models.Exercise.get_all_use_cache(),
                'is_profile_empty': not coach.has_students(),
                'selected_nav_link': 'coach',
                "view": self.request_string("view", default=""),
            }
            self.render_jinja2_template('viewclassprofile.html',
                                        template_values)
        else:
            self.redirect(util.create_login_url(self.request.uri))
コード例 #3
0
ファイル: util_profile.py プロジェクト: avh4/khan-academy
    def get(self):
        coach = UserData.current()

        if coach:

            user_override = self.request_user_data("coach_email")
            if user_override and user_override.are_students_visible_to(coach):
                # Only allow looking at a student list other than your own
                # if you are a dev, admin, or coworker.
                coach = user_override

            student_lists = StudentList.get_for_coach(coach.key())

            student_lists_list = [{"key": "allstudents", "name": "All students"}]
            for student_list in student_lists:
                student_lists_list.append({"key": str(student_list.key()), "name": student_list.name})

            list_id, _ = get_last_student_list(self, student_lists, coach == UserData.current())
            current_list = None
            for student_list in student_lists_list:
                if student_list["key"] == list_id:
                    current_list = student_list

            selected_graph_type = self.request_string("selected_graph_type") or ClassProgressReportGraph.GRAPH_TYPE
            initial_graph_url = "/profile/graph/%s?coach_email=%s&%s" % (
                selected_graph_type,
                urllib.quote(coach.email),
                urllib.unquote(self.request_string("graph_query_params", default="")),
            )
            initial_graph_url += "list_id=%s" % list_id

            template_values = {
                "user_data_coach": coach,
                "coach_email": coach.email,
                "list_id": list_id,
                "student_list": current_list,
                "student_lists": student_lists_list,
                "student_lists_json": simplejson.dumps(student_lists_list),
                "coach_nickname": coach.nickname,
                "selected_graph_type": selected_graph_type,
                "initial_graph_url": initial_graph_url,
                "exercises": models.Exercise.get_all_use_cache(),
                "is_profile_empty": not coach.has_students(),
                "selected_nav_link": "coach",
                "view": self.request_string("view", default=""),
            }
            self.render_jinja2_template("viewclassprofile.html", template_values)
        else:
            self.redirect(util.create_login_url(self.request.uri))
コード例 #4
0
ファイル: __init__.py プロジェクト: hebkhan/server
    def post(self):
        template_values = {}
        user_data = UserData.current()

        status_file = StringIO.StringIO(self.request_string("status_file"))
        reader = csv.reader(status_file)
        student_list = []
        for line in reader:
            student_email = line[0]
            student_status = line[1]
            student_comment = line[2]

            student = SummerStudent.all().filter("email =", student_email).get()
            if student is None:
                logging.error("Student %s not found" % student_email)
                continue

            student.application_status = student_status
            student.comment = student_comment
            if student_status == "Accepted":
                student.accepted = True

            student_list.append(student)

        db.put(student_list)

        self.response.out.write("OK")
        self.response.set_status(200)
コード例 #5
0
    def authenticated_response(self):
        user_data = UserData.current()
        user_email = user_data.user_email

        template_values = {
            "authenticated": True,
            "user_email": user_email,
        }

        sio = StringIO.StringIO()
        sw = csv.writer(sio)
        properties = [p for p in SummerStudent().properties()]
        sw.writerow(properties)
        for student in SummerStudent.all().fetch(5000):
            try:
                row = []
                for p in properties:
                    v = getattr(student, p)
                    if isinstance(v, basestring):
                        v = v.encode("utf-8")
                    row.append(v)
                sw.writerow(row)
            except Exception, e:
                logging.error("Unable to write row for student %s" %
                              student.email)
コード例 #6
0
    def post(self):
        template_values = {}
        user_data = UserData.current()

        status_file = StringIO.StringIO(self.request_string('status_file'))
        reader = csv.reader(status_file)
        student_list = []
        for line in reader:
            student_email = line[0]
            student_status = line[1]
            student_comment = line[2]

            student = SummerStudent.all().filter('email =',
                                                 student_email).get()
            if student is None:
                logging.error("Student %s not found" % student_email)
                continue

            student.application_status = student_status
            student.comment = student_comment
            if student_status == "Accepted":
                student.accepted = True

            student_list.append(student)

        db.put(student_list)

        self.response.out.write("OK")
        self.response.set_status(200)
コード例 #7
0
def can_control_gandalf():
    """CUSTOMIZE can_control_gandalf however you want to specify
    whether or not the currently-logged-in user has access
    to Gandalf dashboard."
    """
    user_data = UserData.current(bust_cache=True)
    return users.is_current_user_admin() or (user_data and user_data.developer)
コード例 #8
0
ファイル: config.py プロジェクト: KhanWorld/KhanAcademy
def can_control_gandalf():
    """CUSTOMIZE can_control_gandalf however you want to specify
    whether or not the currently-logged-in user has access
    to Gandalf dashboard."
    """
    user_data = UserData.current(bust_cache=True)
    return users.is_current_user_admin() or (user_data and user_data.developer)
コード例 #9
0
    def get(self):
        user_data = UserData.current()

        if user_data:

            user_data_override = self.request_user_data("coach_email")
            if user_util.is_current_user_developer() and user_data_override:
                user_data = user_data_override

            invalid_student = self.request_bool("invalid_student",
                                                default=False)

            coach_requests = [
                x.student_requested_data.email
                for x in CoachRequest.get_for_coach(user_data)
                if x.student_requested_data
            ]

            student_lists_models = StudentList.get_for_coach(user_data.key())
            student_lists_list = []
            for student_list in student_lists_models:
                student_lists_list.append({
                    'key': str(student_list.key()),
                    'name': student_list.name,
                })
            student_lists_dict = dict(
                (g['key'], g) for g in student_lists_list)

            students_data = user_data.get_students_data()
            students = map(
                lambda s: {
                    'key':
                    str(s.key()),
                    'email':
                    s.email,
                    'nickname':
                    s.nickname,
                    'student_lists': [
                        l for l in [
                            student_lists_dict.get(str(list_id))
                            for list_id in s.student_lists
                        ] if l
                    ],
                }, students_data)
            students.sort(key=lambda s: s['nickname'])

            template_values = {
                "students": students,
                "students_json": json.dumps(students),
                "student_lists": student_lists_list,
                "student_lists_json": json.dumps(student_lists_list),
                "invalid_student": invalid_student,
                "coach_requests": coach_requests,
                "coach_requests_json": json.dumps(coach_requests),
                'selected_nav_link': 'coach'
            }
            self.render_jinja2_template('viewstudentlists.html',
                                        template_values)
        else:
            self.redirect(util.create_login_url(self.request.uri))
コード例 #10
0
ファイル: coaches.py プロジェクト: johnfelipe/server
    def get(self):
        user_data = UserData.current()

        if not user_data:
            self.redirect(util.create_login_url(self.request.uri))
            return

        accept_coach = self.request_bool("accept", default = False)
        user_data_coach = self.request_user_data("coach_email")
        user_data_student = self.request_user_data('student_email')

        if bool(user_data_coach) == bool(user_data_student):
            raise Exception('must provide coach_email xor student_email')

        if user_data_coach:
            user_data_student = user_data
        elif user_data_student:
            user_data_coach = user_data

        if user_data_coach and not user_data_student.is_coached_by(user_data_coach):
            coach_request = CoachRequest.get_for(user_data_coach, user_data_student)
            if coach_request:
                coach_request.delete()

                if user_data.key_email == user_data_student.key_email and accept_coach:
                    user_data_student.coaches.append(user_data_coach.key_email)
                    user_data_student.put()

        if not self.is_ajax_request():
            self.redirect("/coaches")
コード例 #11
0
ファイル: login.py プロジェクト: derekzhang79/khan-website
    def render_login_outer(self):
        """Render the login page.

        Note that part of the contents of this page is hosted on an iframe
        and rendered by this same RequestHandler (render_login_form)
        """
        cont = self.request_continue_url()
        direct = self.request_bool('direct', default=False)

        user_data = UserData.current()
        if user_data and not user_data.is_phantom:
            # Don't let users see the login page if they're already logged in.
            # This avoids dangerous edge cases in which users have conflicting
            # Google/FB cookies, and google.appengine.api.users.get_current_user
            # returns a different user than the actual person logged in.
            self.redirect(cont)
            return

        template_values = {
            'continue': cont,
            'direct': direct,
            'google_url': users.create_login_url(cont),
        }

        self.render_jinja2_template('login.html', template_values)
コード例 #12
0
ファイル: coaches.py プロジェクト: avh4/khan-academy
    def get(self):
        user_data = UserData.current()

        if not user_data:
            self.redirect(util.create_login_url(self.request.uri))
            return

        accept_coach = self.request_bool("accept", default = False)
        user_data_coach = self.request_user_data("coach_email")
        user_data_student = self.request_user_data('student_email')

        if bool(user_data_coach) == bool(user_data_student):
            raise Exception('must provide coach_email xor student_email')

        if user_data_coach:
            user_data_student = user_data
        elif user_data_student:
            user_data_coach = user_data

        if user_data_coach and not user_data_student.is_coached_by(user_data_coach):
            coach_request = CoachRequest.get_for(user_data_coach, user_data_student)
            if coach_request:
                coach_request.delete()

                if user_data.key_email == user_data_student.key_email and accept_coach:
                    user_data_student.coaches.append(user_data_coach.key_email)
                    user_data_student.put()

        if not self.is_ajax_request():
            self.redirect("/coaches")
コード例 #13
0
ファイル: login.py プロジェクト: PaulWagener/khan-website
    def render_login_outer(self):
        """Render the login page.

        Note that part of the contents of this page is hosted on an iframe
        and rendered by this same RequestHandler (render_login_form)
        """
        cont = self.request_continue_url()
        direct = self.request_bool('direct', default=False)

        user_data = UserData.current()
        if user_data and not user_data.is_phantom:
            # Don't let users see the login page if they're already logged in.
            # This avoids dangerous edge cases in which users have conflicting
            # Google/FB cookies, and google.appengine.api.users.get_current_user
            # returns a different user than the actual person logged in.
            self.redirect(cont)
            return

        template_values = {
                           'continue': cont,
                           'direct': direct,
                           'google_url': users.create_login_url(cont),
                           }

        self.render_jinja2_template('login.html', template_values)
コード例 #14
0
    def post(self):
        user_data = UserData.current()

        if user_data:
            expanded = self.request_bool("expanded")

            user_data.expanded_all_exercises = expanded
            user_data.put()
コード例 #15
0
ファイル: knowledgemap.py プロジェクト: di445/server
    def post(self):
        user_data = UserData.current()

        if user_data:
            expanded = self.request_bool("expanded")

            user_data.expanded_all_exercises = expanded
            user_data.put() 
コード例 #16
0
ファイル: util_profile.py プロジェクト: KhanWorld/KhanAcademy
    def get(self):
        student = UserData.current() or UserData.pre_phantom()

        user_override = self.request_student_user_data(legacy=True)
        if user_override and user_override.key_email != student.key_email:
            if not user_override.is_visible_to(student):
                # If current user isn't an admin or student's coach, they can't
                # look at anything other than their own profile.
                self.redirect("/profile")
                return
            else:
                # Allow access to this student's profile
                student = user_override
        user_badges = util_badges.get_user_badges(student)
        selected_graph_type = (self.request_string("selected_graph_type") or
                               ActivityGraph.GRAPH_TYPE)

        # TODO: deal with this one-off hackery. Some graphs use the API
        # to fetch data, instead of the /profile/graph methods.
        if selected_graph_type == "exerciseprogress":
            initial_graph_url = ("/api/v1/user/exercises?email=%s" %
                                 urllib.quote(student.email))
        elif selected_graph_type == "goals":
            initial_graph_url = ("/api/v1/user/goals?email=%s" %
                                 urllib.quote(student.email))
        else:
            initial_graph_url = "/profile/graph/%s?student_email=%s&%s" % (
                    selected_graph_type,
                    urllib.quote(student.email),
                    urllib.unquote(self.request_string("graph_query_params",
                                                       default="")))
        tz_offset = self.request_int("tz_offset", default=0)

        template_values = {
            'student_email': student.email,
            'student_nickname': student.nickname,
            'selected_graph_type': selected_graph_type,
            'initial_graph_url': initial_graph_url,
            'tz_offset': tz_offset,
            'student_points': student.points,
            'count_videos': models.Setting.count_videos(),
            'count_videos_completed': student.get_videos_completed(),
            'count_exercises': models.Exercise.get_count(),
            'count_exercises_proficient': len(student.all_proficient_exercises),
            'badge_collections': user_badges['badge_collections'],
            'user_badges_bronze': user_badges['bronze_badges'],
            'user_badges_silver': user_badges['silver_badges'],
            'user_badges_gold': user_badges['gold_badges'],
            'user_badges_platinum': user_badges['platinum_badges'],
            'user_badges_diamond': user_badges['diamond_badges'],
            'user_badges_master': user_badges['user_badges_master'],
            'user_badges': [user_badges['bronze_badges'], user_badges['silver_badges'], user_badges['gold_badges'], user_badges['platinum_badges'], user_badges['diamond_badges'],user_badges['user_badges_master']],
            'user_data_student': student,
            "show_badge_frequencies": self.request_bool("show_badge_frequencies", default=False),
            "view": self.request_string("view", default=""),
        }

        self.render_jinja2_template('viewprofile.html', template_values)
コード例 #17
0
ファイル: main.py プロジェクト: di445/server
    def get(self, url_id=""):
        url = Url.get_by_id(int(url_id))
        if url is None:
            raise MissingUrlException("Missing url '%s'" % url_id)

        user_data = UserData.current()
        if user_data:
            goals_updated = GoalList.update_goals(user_data, lambda goal: goal.just_visited_url(user_data, url))

        self.redirect(url.url.encode("utf8"))
コード例 #18
0
    def post(self):
        coach_data = UserData.current()

        if not coach_data:
            return

        student_list = util_profile.get_list(coach_data, self)
        student_list.delete()
        if not self.is_ajax_request():
            self.redirect_to('/students')
コード例 #19
0
ファイル: coaches.py プロジェクト: avh4/khan-academy
    def post(self):
        coach_data = UserData.current()

        if not coach_data:
            return

        student_list = util_profile.get_list(coach_data, self)
        student_list.delete()
        if not self.is_ajax_request():
            self.redirect_to('/students')
コード例 #20
0
ファイル: coaches.py プロジェクト: avh4/khan-academy
    def do_request(self, student, coach, redirect_to):
        if not UserData.current():
            self.redirect(util.create_login_url(self.request.uri))
            return

        if student and coach:
            self.remove_student_from_coach(student, coach)

        if not self.is_ajax_request():
            self.redirect(redirect_to)
コード例 #21
0
ファイル: coaches.py プロジェクト: johnfelipe/server
    def do_request(self, student, coach, redirect_to):
        if not UserData.current():
            self.redirect(util.create_login_url(self.request.uri))
            return

        if student and coach:
            self.remove_student_from_coach(student, coach)

        if not self.is_ajax_request():
            self.redirect(redirect_to)
コード例 #22
0
ファイル: handlers.py プロジェクト: di445/server
    def get(self):
        user_data = UserData.current()

        context = {
            'user_data': user_data,
            # Get pregenerated library content from our in-memory/memcache
            # two-layer cache
            'library_content': library_content_html(),
        }
        self.render_jinja2_template("goals/creategoal.html", context)
コード例 #23
0
    def get_profile_target_user_data(self):
        coach = UserData.current()

        if coach:
            user_override = self.request_user_data("coach_email")
            if user_override and user_override.are_students_visible_to(coach):
                # Only allow looking at a student list other than your own
                # if you are a dev, admin, or coworker.
                coach = user_override

        return coach
コード例 #24
0
    def post(self):
        # You have to be logged in to vote
        user_data = UserData.current()
        if not user_data:
            return

        vote_type = self.request_int("vote_type", default=FeedbackVote.ABSTAIN)

        if vote_type == FeedbackVote.UP and not Privileges.can_up_vote(
                user_data):
            self.render_json({
                "error":
                Privileges.need_points_desc(Privileges.UP_VOTE_THRESHOLD,
                                            "up vote")
            })
            return
        elif vote_type == FeedbackVote.DOWN and not Privileges.can_down_vote(
                user_data):
            self.render_json({
                "error":
                Privileges.need_points_desc(Privileges.DOWN_VOTE_THRESHOLD,
                                            "down vote")
            })
            return

        entity_key = self.request_string("entity_key", default="")
        if entity_key:
            entity = db.get(entity_key)
            if entity and entity.authored_by(user_data):
                self.render_json(
                    {"error": "You cannot vote for your own posts."})
                return

        if vote_type != FeedbackVote.ABSTAIN:
            limiter = VoteRateLimiter(user_data)
            if not limiter.increment():
                self.render_json({"error": limiter.denied_desc()})
                return

        # We kick off a taskqueue item to perform the actual vote insertion
        # so we don't have to worry about fast writes to the entity group
        # causing contention problems for the HR datastore, because
        # the taskqueue will just retry w/ exponential backoff.
        taskqueue.add(url='/admin/discussion/finishvoteentity',
                      queue_name='voting-queue',
                      params={
                          "email":
                          user_data.email,
                          "vote_type":
                          self.request_int("vote_type",
                                           default=FeedbackVote.ABSTAIN),
                          "entity_key":
                          entity_key
                      })
コード例 #25
0
ファイル: util_profile.py プロジェクト: johnfelipe/server
    def get_profile_target_user_data(self):
        coach = UserData.current()

        if coach:
            user_override = self.request_user_data("coach_email")
            if user_override and user_override.are_students_visible_to(coach):
                # Only allow looking at a student list other than your own
                # if you are a dev, admin, or coworker.
                coach = user_override

        return coach
コード例 #26
0
ファイル: __init__.py プロジェクト: hebkhan/server
    def get(self):
        template_values = {}
        user_data = UserData.current()

        if user_data is not None:
            return self.authenticated_response()

        else:
            template_values = {"authenticated": False}

        self.add_global_template_values(template_values)
        self.render_jinja2_template("summer/summer_process.html", template_values)
コード例 #27
0
ファイル: util_profile.py プロジェクト: avh4/khan-academy
    def get(self):
        student = UserData.current() or UserData.pre_phantom()

        user_override = self.request_user_data("student_email")
        if user_override and user_override.key_email != student.key_email:
            if not user_override.is_visible_to(student):
                # If current user isn't an admin or student's coach, they can't look at anything other than their own profile.
                self.redirect("/profile?k")
                return
            else:
                # Allow access to this student's profile
                student = user_override
        user_badges = util_badges.get_user_badges(student)
        selected_graph_type = self.request_string("selected_graph_type") or ActivityGraph.GRAPH_TYPE
        initial_graph_url = "/profile/graph/%s?student_email=%s&%s" % (
            selected_graph_type,
            urllib.quote(student.email),
            urllib.unquote(self.request_string("graph_query_params", default="")),
        )
        tz_offset = self.request_int("tz_offset", default=0)

        template_values = {
            "student_nickname": student.nickname,
            "selected_graph_type": selected_graph_type,
            "initial_graph_url": initial_graph_url,
            "tz_offset": tz_offset,
            "student_points": student.points,
            "count_videos": models.Setting.count_videos(),
            "count_videos_completed": student.get_videos_completed(),
            "count_exercises": models.Exercise.get_count(),
            "count_exercises_proficient": len(student.all_proficient_exercises),
            "badge_collections": user_badges["badge_collections"],
            "user_badges_bronze": user_badges["bronze_badges"],
            "user_badges_silver": user_badges["silver_badges"],
            "user_badges_gold": user_badges["gold_badges"],
            "user_badges_platinum": user_badges["platinum_badges"],
            "user_badges_diamond": user_badges["diamond_badges"],
            "user_badges_master": user_badges["user_badges_master"],
            "user_badges": [
                user_badges["bronze_badges"],
                user_badges["silver_badges"],
                user_badges["gold_badges"],
                user_badges["platinum_badges"],
                user_badges["diamond_badges"],
                user_badges["user_badges_master"],
            ],
            "user_data_student": student,
            "show_badge_frequencies": self.request_bool("show_badge_frequencies", default=False),
            "view": self.request_string("view", default=""),
        }

        self.render_jinja2_template("viewprofile.html", template_values)
コード例 #28
0
    def get(self):
        user_data = UserData.current()
        if user_data == None:
            return

        user_video_css = models.UserVideoCss.get_for_user_data(user_data)
        self.response.headers['Content-Type'] = 'text/css'

        if user_video_css.version == user_data.uservideocss_version:
            # Don't cache if there's a version mismatch and update isn't finished
            self.response.headers['Cache-Control'] = 'public,max-age=1000000'

        self.response.out.write(user_video_css.video_css)
コード例 #29
0
    def get_profile_target_user_data(self):
        student = UserData.current() or UserData.pre_phantom()

        if student:
            user_override = self.request_user_data("student_email")
            if user_override and user_override.key_email != student.key_email:
                if not user_override.is_visible_to(student):
                    # If current user isn't an admin or student's coach, they can't look at anything other than their own profile.
                    student = None
                else:
                    # Allow access to this student's profile
                    student = user_override

        return student
コード例 #30
0
ファイル: util_profile.py プロジェクト: avh4/khan-academy
    def get_profile_target_user_data(self):
        student = UserData.current() or UserData.pre_phantom()

        if student:
            user_override = self.request_user_data("student_email")
            if user_override and user_override.key_email != student.key_email:
                if not user_override.is_visible_to(student):
                    # If current user isn't an admin or student's coach, they can't look at anything other than their own profile.
                    student = None
                else:
                    # Allow access to this student's profile
                    student = user_override

        return student
コード例 #31
0
ファイル: config.py プロジェクト: KhanWorld/KhanAcademy
def current_logged_in_identity():
    """This should return one of the following:

        A) a db.Model that identifies the current user, like models.UserData.current()
        B) a unique string that consistently identifies the current user, like users.get_current_user().user_id()

    Ideally, this should be connected to your app's existing identity system.

    Examples:
        return models.UserData.current()
             ...or...
        from google.appengine.api import users
        return users.get_current_user().user_id() if users.get_current_user() else None"""
    return UserData.current(bust_cache=True)
コード例 #32
0
def current_logged_in_identity():
    """This should return one of the following:

        A) a db.Model that identifies the current user, like models.UserData.current()
        B) a unique string that consistently identifies the current user, like users.get_current_user().user_id()

    Ideally, this should be connected to your app's existing identity system.

    Examples:
        return models.UserData.current()
             ...or...
        from google.appengine.api import users
        return users.get_current_user().user_id() if users.get_current_user() else None"""
    return UserData.current(bust_cache=True)
コード例 #33
0
    def get(self):
        user_data = UserData.current()
        video_points_total = 0

        if user_data:

            video = None

            key_str = self.request_string("video_key")
            if key_str:
                key = db.Key(key_str)
                app_id = os.environ['APPLICATION_ID']
                if key.app() != app_id:
                    new_key = db.Key.from_path(key.kind(),
                                               key.id() or key.name(),
                                               _app=app_id)
                    logging.warning(
                        "Key '%s' had invalid app_id '%s'. Changed to new key '%s'",
                        str(key), key.app(), str(new_key))
                    key = new_key
                video = db.get(key)
            else:
                youtube_id = self.request_string("youtube_id")
                if youtube_id:
                    video = Video.all().filter('youtube_id =',
                                               youtube_id).get()

            if video:

                # Seconds watched is restricted by both the scrubber's position
                # and the amount of time spent on the video page
                # so we know how *much* of each video each student has watched
                seconds_watched = int(
                    self.request_float("seconds_watched", default=0))
                last_second_watched = int(
                    self.request_float("last_second_watched", default=0))

                user_video, video_log, video_points_total = VideoLog.add_entry(
                    user_data, video, seconds_watched, last_second_watched)

        user_points_html = self.render_jinja2_template_to_string(
            "user_points_only.html", user_points(user_data))

        json = simplejson.dumps(
            {
                "user_points_html": user_points_html,
                "video_points": video_points_total
            },
            ensure_ascii=False)
        self.response.out.write(json)
コード例 #34
0
ファイル: knowledgemap.py プロジェクト: di445/server
    def post(self):
        user_data = UserData.current()

        if user_data:
            try:
                lat = self.request_float("lat")
                lng = self.request_float("lng")
                zoom = self.request_int("zoom")
            except ValueError:
                # If any of the above values aren't present in request, don't try to save.
                return

            user_data.map_coords = serializeMapCoords(lat, lng, zoom)
            user_data.put()
コード例 #35
0
    def post(self):
        user_data = UserData.current()

        if user_data:
            try:
                lat = self.request_float("lat")
                lng = self.request_float("lng")
                zoom = self.request_int("zoom")
            except ValueError:
                # If any of the above values aren't present in request, don't try to save.
                return

            user_data.map_coords = serializeMapCoords(lat, lng, zoom)
            user_data.put()
コード例 #36
0
    def get(self):
        template_values = {}
        user_data = UserData.current()

        if user_data is not None:
            return self.authenticated_response()

        else:
            template_values = {
                "authenticated": False,
            }

        self.add_global_template_values(template_values)
        self.render_jinja2_template('summer/summer_process.html',
                                    template_values)
コード例 #37
0
ファイル: __init__.py プロジェクト: hebkhan/server
    def get(self):
        template_values = {}
        user_data = UserData.current()

        if user_data is not None:
            template_values = self.authenticated_response()
            if template_values is None:
                self.redirect("/summer/application")
                return

        else:
            template_values = {"authenticated": False}

        self.add_global_template_values(template_values)
        self.render_jinja2_template("summer/summer_status.html", template_values)
コード例 #38
0
ファイル: voting.py プロジェクト: johnfelipe/server
    def get(self):
        user_data = UserData.current()
        sort = self.request_int("sort", default=VotingSortOrder.HighestPointsFirst)

        if user_data:
            user_data.question_sort_order = sort
            user_data.put()

        readable_id = self.request_string("readable_id", default="")
        topic_id = self.request_string("topic_id", default="")

        if readable_id and topic_id:
            self.redirect("/video/%s?topic=%s&sort=%s" % (urllib.quote(readable_id), urllib.quote(topic_id), sort))
        else:
            self.redirect("/")
コード例 #39
0
ファイル: handlers.py プロジェクト: johnfelipe/server
    def get(self):
        user_data = UserData.current()

        from exercises import exercise_graph_dict_json

        context = {
            'graph_dict_data': exercise_graph_dict_json(user_data),
            'user_data': user_data,
            'expanded_all_exercises': user_data.expanded_all_exercises,
            'map_coords': json.dumps(deserializeMapCoords(user_data.map_coords)),

            # Get pregenerated library content from our in-memory/memcache
            # two-layer cache
            'library_content': library_content_html(),
        }
        self.render_jinja2_template("goals/creategoal.html", context)
コード例 #40
0
    def get(self):
        user_data = UserData.current()

        from exercises import exercise_graph_dict_json

        context = {
            'graph_dict_data': exercise_graph_dict_json(user_data),
            'user_data': user_data,
            'expanded_all_exercises': user_data.expanded_all_exercises,
            'map_coords': deserializeMapCoords(user_data.map_coords),

            # Get pregenerated library content from our in-memory/memcache
            # two-layer cache
            'library_content': library_content_html(),
        }
        self.render_jinja2_template("goals/creategoal.html", context)
コード例 #41
0
ファイル: coaches.py プロジェクト: di445/server
    def get(self):
        user_data = UserData.current()

        if user_data:

            user_data_override = self.request_user_data("coach_email")
            if user_util.is_current_user_developer() and user_data_override:
                user_data = user_data_override

            invalid_student = self.request_bool("invalid_student", default = False)

            coach_requests = [x.student_requested_data.email for x in CoachRequest.get_for_coach(user_data) if x.student_requested_data]

            student_lists_models = StudentList.get_for_coach(user_data.key())
            student_lists_list = [];
            for student_list in student_lists_models:
                student_lists_list.append({
                    'key': str(student_list.key()),
                    'name': student_list.name,
                })
            student_lists_dict = dict((g['key'], g) for g in student_lists_list)

            students_data = user_data.get_students_data()
            students = map(lambda s: {
                'key': str(s.key()),
                'email': s.email,
                'nickname': s.nickname,
                'profile_root': s.profile_root,
                'studentLists': [l for l in [student_lists_dict.get(str(list_id)) for list_id in s.student_lists] if l],
            }, students_data)
            students.sort(key=lambda s: s['nickname'])

            template_values = {
                "students": students,
                "students_json": json.dumps(students),
                "student_lists": student_lists_list,
                "student_lists_json": json.dumps(student_lists_list),
                "invalid_student": invalid_student,
                "coach_requests": coach_requests,
                "coach_requests_json": json.dumps(coach_requests),
                'selected_nav_link': 'coach'
            }
            self.render_jinja2_template('viewstudentlists.html', template_values)
        else:
            self.redirect(util.create_login_url(self.request.uri))
コード例 #42
0
    def get(self):
        user_data = UserData.current()
        sort = self.request_int("sort",
                                default=VotingSortOrder.HighestPointsFirst)

        if user_data:
            user_data.question_sort_order = sort
            user_data.put()

        readable_id = self.request_string("readable_id", default="")
        playlist_title = self.request_string("playlist_title", default="")

        if readable_id and playlist_title:
            self.redirect("/video/%s?playlist=%s&sort=%s" %
                          (urllib.quote(readable_id),
                           urllib.quote(playlist_title), sort))
        else:
            self.redirect("/")
コード例 #43
0
    def get(self):
        template_values = {}
        user_data = UserData.current()

        if user_data is not None:
            template_values = self.authenticated_response()
            if template_values is None:
                self.redirect("/summer/application")
                return

        else:
            template_values = {
                "authenticated": False,
            }

        self.add_global_template_values(template_values)
        self.render_jinja2_template('summer/summer_status.html',
                                    template_values)
コード例 #44
0
    def authenticated_response(self):
        user_data = UserData.current()
        user_email = user_data.user_email
        nickname = ""
        if facebook_util.is_facebook_user_id(user_email):
            nickname = facebook_util.get_facebook_nickname(user_email)

        query = SummerStudent.all()
        query.filter('email = ', user_email)
        student = query.get()

        students = []
        is_parent = False

        if student is None:
            query = SummerParentData.all()
            query.filter('email = ', user_email)
            parent = query.get()
            if parent is None:
                return None

            is_parent = True
            number_of_students = 0
            for student_key in parent.students:
                student = SummerStudent.get(student_key)
                students.append(student)
                if student.accepted and not student.tuition_paid:
                    number_of_students += 1

        else:
            number_of_students = 1
            students.append(student)

        template_values = {
            "authenticated": True,
            "is_parent": is_parent,
            "students": students,
            "number_of_students": json.dumps(number_of_students),
            "student": students[0],
            "user_email": user_email,
            "nickname": nickname,
        }

        return template_values
コード例 #45
0
ファイル: __init__.py プロジェクト: hebkhan/server
    def authenticated_response(self):
        user_data = UserData.current()
        user_email = user_data.user_email
        nickname = ""
        if facebook_util.is_facebook_user_id(user_email):
            nickname = facebook_util.get_facebook_nickname(user_email)

        query = SummerStudent.all()
        query.filter("email = ", user_email)
        student = query.get()

        students = []
        is_parent = False

        if student is None:
            query = SummerParentData.all()
            query.filter("email = ", user_email)
            parent = query.get()
            if parent is None:
                return None

            is_parent = True
            number_of_students = 0
            for student_key in parent.students:
                student = SummerStudent.get(student_key)
                students.append(student)
                if student.accepted and not student.tuition_paid:
                    number_of_students += 1

        else:
            number_of_students = 1
            students.append(student)

        template_values = {
            "authenticated": True,
            "is_parent": is_parent,
            "students": students,
            "number_of_students": json.dumps(number_of_students),
            "student": students[0],
            "user_email": user_email,
            "nickname": nickname,
        }

        return template_values
コード例 #46
0
    def post(self):
        coach_data = UserData.current()

        if not coach_data:
            return

        list_name = self.request_string('list_name')
        if not list_name:
            raise Exception('Invalid list name')

        student_list = StudentList(coaches=[coach_data.key()], name=list_name)
        student_list.put()

        student_list_json = {
            'name': student_list.name,
            'key': str(student_list.key())
        }

        self.render_json(student_list_json)
コード例 #47
0
ファイル: coaches.py プロジェクト: johnfelipe/server
    def post(self):
        user_data = UserData.current()

        if not user_data:
            self.redirect(util.create_login_url(self.request.uri))
            return
        user_data_student = self.request_user_data("student_email")
        if user_data_student:
            if not user_data_student.is_coached_by(user_data):
                coach_request = CoachRequest.get_or_insert_for(user_data, user_data_student)
                if coach_request:
                    if not self.is_ajax_request():
                        self.redirect("/students")
                    return

        if self.is_ajax_request():
            self.response.set_status(404)
        else:
            self.redirect("/students?invalid_student=1")
コード例 #48
0
ファイル: coaches.py プロジェクト: avh4/khan-academy
    def post(self):
        user_data = UserData.current()

        if not user_data:
            self.redirect(util.create_login_url(self.request.uri))
            return
        user_data_student = self.request_user_data("student_email")
        if user_data_student:
            if not user_data_student.is_coached_by(user_data):
                coach_request = CoachRequest.get_or_insert_for(user_data, user_data_student)
                if coach_request:
                    if not self.is_ajax_request():
                        self.redirect("/students")
                    return

        if self.is_ajax_request():
            self.response.set_status(404)
        else:
            self.redirect("/students?invalid_student=1")
コード例 #49
0
ファイル: coaches.py プロジェクト: avh4/khan-academy
    def post(self):
        coach_data = UserData.current()

        if not coach_data:
            return

        list_name = self.request_string('list_name')
        if not list_name:
            raise Exception('Invalid list name')

        student_list = StudentList(coaches=[coach_data.key()], name=list_name)
        student_list.put()

        student_list_json = {
            'name': student_list.name,
            'key': str(student_list.key())
        }

        self.render_json(student_list_json)
コード例 #50
0
ファイル: coaches.py プロジェクト: johnfelipe/server
    def get(self):
        user_data = UserData.current()

        if user_data:
            invalid_coach = self.request_bool("invalid_coach", default = False)

            coach_requests = CoachRequest.get_for_student(user_data).fetch(1000)

            template_values = {
                        "coach_emails": user_data.coach_emails(),
                        "invalid_coach": invalid_coach,
                        "coach_requests": coach_requests,
                        "student_id": user_data.email,
                        'selected_nav_link': 'coach'
                    }

            self.render_jinja2_template('viewcoaches.html', template_values)
        else:
            self.redirect(util.create_login_url(self.request.uri))
コード例 #51
0
ファイル: coaches.py プロジェクト: avh4/khan-academy
    def get(self):
        user_data = UserData.current()

        if user_data:
            invalid_coach = self.request_bool("invalid_coach", default = False)

            coach_requests = CoachRequest.get_for_student(user_data).fetch(1000)

            template_values = {
                        "coach_emails": user_data.coach_emails(),
                        "invalid_coach": invalid_coach,
                        "coach_requests": coach_requests,
                        "student_id": user_data.email,
                        'selected_nav_link': 'coach'
                    }

            self.render_jinja2_template('viewcoaches.html', template_values)
        else:
            self.redirect(util.create_login_url(self.request.uri))
コード例 #52
0
ファイル: login.py プロジェクト: PaulWagener/khan-website
def _resolve_user_in_https_frame(handler):
    """Determine the current logged in user for the HTTPS request.

    This has logic in additional to UserData.current(), since it should also
    accept TransferAuthTokens, since HTTPS requests may not have normal HTTP
    cookies sent.
    """

    user_data = UserData.current()
    if user_data:
        return user_data

    if not App.is_dev_server and not handler.request.uri.startswith('https'):
        return None

    # On https, users aren't recognized through the normal means of cookie auth
    # since their cookies were set on HTTP domains.
    token_value = handler.request_string("transfer_token", default=None)
    return TransferAuthToken.get_user_for_value(
        token_value, UserData.get_from_user_id)
コード例 #53
0
ファイル: login.py プロジェクト: derekzhang79/khan-website
def _resolve_user_in_https_frame(handler):
    """Determine the current logged in user for the HTTPS request.

    This has logic in additional to UserData.current(), since it should also
    accept TransferAuthTokens, since HTTPS requests may not have normal HTTP
    cookies sent.
    """

    user_data = UserData.current()
    if user_data:
        return user_data

    if not App.is_dev_server and not handler.request.uri.startswith('https'):
        return None

    # On https, users aren't recognized through the normal means of cookie auth
    # since their cookies were set on HTTP domains.
    token_value = handler.request_string("transfer_token", default=None)
    return TransferAuthToken.get_user_for_value(token_value,
                                                UserData.get_from_user_id)
コード例 #54
0
ファイル: __init__.py プロジェクト: hebkhan/server
    def authenticated_response(self):
        user_data = UserData.current()
        user_email = user_data.user_email

        template_values = {"authenticated": True, "user_email": user_email}

        sio = StringIO.StringIO()
        sw = csv.writer(sio)
        properties = [p for p in SummerStudent().properties()]
        sw.writerow(properties)
        for student in SummerStudent.all().fetch(5000):
            try:
                row = []
                for p in properties:
                    v = getattr(student, p)
                    if isinstance(v, basestring):
                        v = v.encode("utf-8")
                    row.append(v)
                sw.writerow(row)
            except Exception, e:
                logging.error("Unable to write row for student %s" % student.email)
コード例 #55
0
ファイル: coaches.py プロジェクト: johnfelipe/server
    def post(self):
        user_data = UserData.current()

        if not user_data:
            self.redirect(util.create_login_url(self.request.uri))
            return

        user_data_coach = self.request_user_data("coach")
        if user_data_coach:
            if not user_data.is_coached_by(user_data_coach):
                user_data.coaches.append(user_data_coach.key_email)
                user_data.put()

            if not self.is_ajax_request():
                self.redirect("/coaches")
            return

        if self.is_ajax_request():
            self.response.set_status(400)
        else:
            self.redirect("/coaches?invalid_coach=1")
コード例 #56
0
ファイル: coaches.py プロジェクト: avh4/khan-academy
    def post(self):
        user_data = UserData.current()

        if not user_data:
            self.redirect(util.create_login_url(self.request.uri))
            return

        user_data_coach = self.request_user_data("coach")
        if user_data_coach:
            if not user_data.is_coached_by(user_data_coach):
                user_data.coaches.append(user_data_coach.key_email)
                user_data.put()

            if not self.is_ajax_request():
                self.redirect("/coaches")
            return

        if self.is_ajax_request():
            self.response.set_status(400)
        else:
            self.redirect("/coaches?invalid_coach=1")
コード例 #57
0
    def authenticated_response(self):
        user_data = UserData.current()
        user_email = user_data.user_email
        nickname = ""
        if facebook_util.is_facebook_user_id(user_email):
            nickname = facebook_util.get_facebook_nickname(user_email)

        query = SummerStudent.all()
        query.filter('email = ', user_email)
        student = query.get()

        students = []
        is_parent = False

        if student is None:
            query = SummerParentData.all()
            query.filter('email = ', user_email)
            parent = query.get()
            if parent is None:
                return None

            is_parent = True
            for student_key in parent.students:
                students.append(SummerStudent.get(student_key))

        else:
            students.append(student)

        template_values = {
            "authenticated": True,
            "is_parent": is_parent,
            "students": students,
            "user_email": user_email,
            "nickname": nickname,
        }

        return template_values
コード例 #58
0
def current_logged_in_identity():
    from models import UserData
    return UserData.current(bust_cache=True)
コード例 #59
0
def can_control_experiments():
    from models import UserData
    user_data = UserData.current(bust_cache=True)
    return users.is_current_user_admin() or (user_data and user_data.developer)