Exemplo n.º 1
0
    def post(self):

        user_id = int(self.request.get("user_id"))
        user = UserData.get_by_id(user_id)
        user = user or UserData.get_current_user()
        if user is None:
            return

        resource_id = self.request.get("resource_id")
        resource = Resource.get_by_id(int(resource_id))
        content = self.request.get("content")

        new_comment = Comment(parent=resource.key, comment_user=user.key, comment_content=content)
        new_comment.put()
        return
Exemplo n.º 2
0
    def get(self, resource_id):

        user = UserData.get_current_user()
        resource = Resource.get_by_id(int(resource_id))
        if not resource.is_visible_to_user(user):
            return self.render("resource/show-resource-no-auth.html")

        else:
            contents = [key.get() for key in resource.contents]
            admins = [key.get().user_nickname for key in resource.admins]
            is_admin = user and user.key in resource.admins

            comments = Comment.get_by_resource(resource)
            comments.sort(key=lambda x: x.created_time, reverse=False)
            for comment in comments:
                comment.created_time = comment.created_time + timedelta(hours=8)
                comment.user_nickname = comment.comment_user.get().user_nickname

            data = {
                "resource": resource,
                "keywords": ", ".join(resource.keywords),
                "admins": ", ".join(admins),
                "contents": contents,
                "is_admin": is_admin,
                "comments": comments,
            }

            return self.render("resource/show-resource.html", data)
Exemplo n.º 3
0
    def get(self):

        user = UserData.get_current_user()
        keywords = self.request.get("keywords")

        if keywords:
            keywords = keywords.split(",")
            resources = Resource.list_resources_for_user(user, keywords, number=20)
        else:
            resources = Resource.list_resources_for_user(user, number=20)
        resources.sort(key=lambda x: x.get_avg_download_count(), reverse=True)

        keyword_str_list = []
        avg_download_count_list = []
        for resource in resources:
            keyword_str_list.append(", ".join(resource.keywords))
            avg_download_count_list.append(resource.get_avg_download_count())

        keyword_index_list = [i.key_word for i in KeyWordIndex.query().fetch()]
        data = {
            "resources": resources,
            "keyword_str_list": keyword_str_list,
            "keyword_index_list": keyword_index_list,
            "avg_download_count_list": avg_download_count_list,
        }

        return self.render("resource/find-resource.html", data)
Exemplo n.º 4
0
    def post(self):

        # create or update feature bet
        user = UserData.get_current_user()
        if not user.is_server_admin():  # make sure user has an account to create course
            self.redirect('/')

        feature_key = self.request.get('feature_wanted')
        feature = Feature.get_by_id(int(feature_key))

        options = self.request.get('options').split('\n')
        start_time = self.request.get('start-time')
        start_time = datetime.datetime.strptime(start_time, "%Y-%m-%d")
        end_time = self.request.get('end-time')
        end_time = datetime.datetime.strptime(end_time, "%Y-%m-%d")

        billing_time = self.request.get('billing-time')
        billing_time = datetime.datetime.strptime(billing_time, "%Y-%m-%d")

        new_bet = FeatureBet(performance_bet=feature.performances[0],
                            bet_options=options,
                            start_time=start_time,
                            end_time=end_time,
                            billing_time=billing_time
                            )

        new_bet.put()

        self.redirect('/show-feature/%s' % feature.key.id()) # 
Exemplo n.º 5
0
    def get(self, course_id):

        user = UserData.get_current_user()
        course = Resource.get_by_id(int(course_id))
        if not course.is_visible_to_user(user):
            return self.render('course/show-course-no-auth.html')

        else:
            materials = [key.get() for key in course.materials]
            admins = [key.get().user_nickname for key in course.admins]
            is_admin = user and user.key in course.admins

            comments = Comment.get_by_course(course)
            comments.sort(key=lambda x: x.created_time, reverse=False)
            for comment in comments:
                comment.created_time = comment.created_time + timedelta(hours=8)
                comment.user_nickname = comment.comment_user.get().user_nickname

            data = {
                'course': course,
                'keywords': ', '.join(course.keywords),
                'admins': ', '.join(admins),
                'materials': materials,
                'is_admin': is_admin,
                'comments': comments
            }

            return self.render('course/show-course.html', data)
Exemplo n.º 6
0
    def post(self):

        # upload new material on google drive
        user = UserData.get_current_user()
        if not user.is_server_admin():  # make sure user has an account to create course
            self.redirect('/')

        # [TODO]Benny: scheduled_update_date超醜,要改掉
        # [TODO]Benny: new_feature_performance要搬到CreateFeaturePerformance 這個handler
        scheduled_update_date = self.request.get('scheduled_update_date')
        scheduled_update_date = datetime.datetime.strptime(scheduled_update_date, "%Y-%m-%d")
        logging.info('scheduled_update_date: %s' %scheduled_update_date)
        index = self.request.get('performance_index')
        new_feature_performance = FeaturePerformance(
            scheduled_update_date=scheduled_update_date,
            index=index)
        new_feature_performance.put()

        feature_name = self.request.get('feature-name')
        summary = self.request.get('summary')
        KPIs = self.request.get('KPI')
        new_feature = Feature(name=feature_name,
                            summary=summary,
                            KPIs=KPIs.strip().split(','),
                            performances=[new_feature_performance.key]
                            )
        new_feature.put()



        self.redirect('/show-feature/%s' % new_feature.key.id()) # 
Exemplo n.º 7
0
    def get(self):

        user = UserData.get_current_user()
        keywords = self.request.get('keywords')

        if keywords:
            keywords = keywords.split(',')
            courses = Resource.list_courses_for_user(user, keywords, number=20)
        else:
            courses = Resource.list_courses_for_user(user, number=20)
        courses.sort(key=lambda x: x.get_avg_download_count(), reverse=True)

        keyword_str_list = []
        avg_download_count_list = []
        for course in courses:
            keyword_str_list.append(', '.join(course.keywords))
            avg_download_count_list.append(course.get_avg_download_count())

        keyword_index_list = [i.key_word for i in KeyWordIndex.query().fetch()]
        data = {
            'courses': courses,
            'keyword_str_list': keyword_str_list,
            'keyword_index_list': keyword_index_list,
            'avg_download_count_list': avg_download_count_list
        }

        return self.render('course/find-course.html', data)
Exemplo n.º 8
0
    def post(self):

        # upload new content on google drive
        user = UserData.get_current_user()
        if not user:  # make sure user has an account to create resource
            self.redirect("find-resource")

        content_index_list = self.request.get("content-index-list").split(",")
        logging.info("content_index_list: %s" % content_index_list)

        content_list = []
        for i in content_index_list:
            content_name = self.request.get("content-name-%s" % i)
            content_content = io.BytesIO(self.request.get("content-%s" % i))
            content_file = google_drive_api.insert_file(
                service, content_name, content_content, google_drive_api.DOCX_MIME_TYPE
            )

            new_content = Content(content_name=content_name, related_file_id=content_file["id"])
            new_content.put()
            content_list.append(new_content.key)
        # 我們不在這個時候寄邀請信給使用者,請他同意獲得講義的writer權限
        # 因為我認為使用者很可能不會去收信,我們在使用者第一次真的要使用線上編輯功能的時候
        # 再告知他們我們會寄信邀請他們,請他們去收信  -- By EN

        resource_name = self.request.get("resource-name")
        grade_chunk = self.request.get("grade-chunk")
        difficulty = self.request.get("difficulty")
        subject = self.request.get("subject")
        is_public = bool(int(self.request.get("is_public")))
        keywords = self.request.get("keywords")
        keyword_list = []
        if keywords:
            keyword_list = keywords.strip().split(",")
        keyword_list.append(subject)
        keyword_list.append(grade_chunk)
        keyword_list = set(keyword_list)
        new_resource = Resource(
            resource_name=resource_name,
            grade_chunk=grade_chunk,
            difficulty=difficulty,
            subject=subject,
            keywords=keyword_list,
            contents=content_list,
            creator=user.key,
            admins=[user.key],
            is_public=is_public,
        )
        new_resource.put()

        for keyword in keyword_list:
            keywordindex = KeyWordIndex.get_by_keyword_and_subject(keyword, subject)
            if keywordindex:
                keywordindex.resource_count = keywordindex.resource_count + 1
            else:
                keywordindex = KeyWordIndex(key_word=keyword, related_subject=subject)
            keywordindex.put()

        self.redirect("/show-resource/%s" % new_resource.key.id())
Exemplo n.º 9
0
    def post(self):

        user_id = int(self.request.get('user_id'))
        user = UserData.get_by_id(user_id)
        user = user or UserData.get_current_user()
        if user is None:
            return

        comment_parent_key = self.request.get('comment_parent_key')
        parent = "# get by key"
        comment_content = self.request.get('content')

        new_comment = Comment(parent=parent.key,
                              comment_user=user.key,
                              comment_content=content)
        new_comment.put()
        return
Exemplo n.º 10
0
    def post(self):

        # upload new material on google drive
        user = UserData.get_current_user()
        if not user:  # make sure user has an account to create course
            self.redirect('find-course')

        material_index_list = self.request.get('material-index-list').split(',')
        logging.info("material_index_list: %s" % material_index_list)

        material_list = []
        for i in material_index_list:
            material_name = self.request.get('material-name-%s' % i)
            material_content = io.BytesIO(self.request.get('material-content-%s' % i))
            material_file = google_drive_api.insert_file(service, material_name, material_content, google_drive_api.DOCX_MIME_TYPE)
            new_content = Content(material_name=material_name,
                                    related_file_id=material_file['id']
                                    )
            new_content.put()
            material_list.append(new_content.key)
        # 我們不在這個時候寄邀請信給使用者,請他同意獲得講義的writer權限
        # 因為我認為使用者很可能不會去收信,我們在使用者第一次真的要使用線上編輯功能的時候
        # 再告知他們我們會寄信邀請他們,請他們去收信  -- By EN

        course_name = self.request.get('resource-name')
        grade_chunk = self.request.get('grade-chunk')
        difficulty = self.request.get('difficulty')
        subject = self.request.get('subject')
        is_public = bool(int(self.request.get('is_public')))
        keywords = self.request.get('keywords')
        keyword_list = []
        if keywords:
            keyword_list = keywords.strip().split(',')
        keyword_list.append(subject)
        keyword_list.append(grade_chunk)
        keyword_list = set(keyword_list)
        new_course = Resource(course_name=course_name,
                            grade_chunk=grade_chunk,
                            difficulty=difficulty,
                            subject=subject,
                            keywords=keyword_list,
                            materials=material_list,
                            creator=user.key,
                            admins=[user.key],
                            is_public=is_public
                            )
        new_course.put()

        for keyword in keyword_list:
            keywordindex = KeyWordIndex.get_by_keyword_and_subject(keyword, subject)
            if keywordindex:
                keywordindex.course_count = keywordindex.course_count + 1
            else:
                keywordindex = KeyWordIndex(key_word=keyword, related_subject=subject)
            keywordindex.put()

        self.redirect('/show-course/%s' % new_course.key.id())
Exemplo n.º 11
0
    def post(self):

        user_id = int(self.request.get('user_id'))
        user = UserData.get_by_id(user_id)
        user = user or UserData.get_current_user()
        if user is None:
            return

        course_id = self.request.get('course_id')
        course = Resource.get_by_id(int(course_id))
        content = self.request.get('content')

        new_comment = Comment(parent=course.key,
                              comment_user=user.key,
                              comment_content=content
                             )
        new_comment.put()
        return
Exemplo n.º 12
0
    def post(self):

        user_id = int(self.request.get('user_id'))
        user = UserData.get_by_id(user_id)
        user = user or UserData.get_current_user()
        if user is None:
            return

        comment_parent_key = self.request.get('comment_parent_key')
        parent =  "# get by key"
        comment_content = self.request.get('content')

        new_comment = Comment(parent=parent.key,
                              comment_user=user.key,
                              comment_content=content
                             )
        new_comment.put()
        return
Exemplo n.º 13
0
    def get(self):

        user = UserData.get_current_user()
        if user:
            self.redirect('/find-course')

        google_login_url = users.create_login_url('/login')

        data = {'google_login_url': google_login_url}

        return self.render('home_page.html', data)
Exemplo n.º 14
0
    def get(self):

        user = UserData.get_current_user()
        if user:
            # we already have this user in datastore, do nothing at this time
            pass
        else:
            logging.info('into Login handler')
            google_user_property = users.get_current_user()
            user = UserData.get_by_user_email(google_user_property.email())
            if user:
                # 內部已經有一個帳號有此email,目前沒有預備要處理這種問題
                logging.error('Email %s already used by one of our user' % user.user_email)
                raise Exception('Email %s already used by one of our user' % user.user_email)
            else:  # email 也沒有重複,可以新增一個使用者
                new_user = UserData(google_user_id=google_user_property.user_id(),
                                user_email=google_user_property.email(),
                                user_nickname=google_user_property.nickname()
                                )
            new_user.put()
        self.redirect('/find-course')
Exemplo n.º 15
0
    def get(self):

        user = UserData.get_current_user()
        if not user.is_server_admin():
            self.redirect('find-resource')

        root_subjects = Subject.getSubjectByLevel(0)
        data = {
            'root_subjects': root_subjects
        }

        self.render('admin/upload-subject-tree.html', data)
Exemplo n.º 16
0
    def get(self):

        user = UserData.get_current_user()
        if user:
            self.redirect('/find-course')

        google_login_url = users.create_login_url('/login')

        data = {
            'google_login_url': google_login_url
        }

        return self.render('home_page.html', data)
Exemplo n.º 17
0
    def post(self, resource_id):

        # add new admins...
        user = UserData.get_current_user()
        resource = Resource.get_by_id(int(resource_id))
        if not (user.key in resource.admins):  # only admin can edit the resource
            self.redirect("resource/show-resource/%s" % resource_id)

        admins_email = self.request.get("admins-email")
        if admins_email:  # we will need to update the admin list
            admin_key_list = resource.admins
            email_list = admins_email.strip().split(",")

            for email in email_list:
                user = UserData.get_by_user_email(email)
                if user and not (user.key in admin_key_list):
                    admin_key_list.append(user.key)

            # 我們不在這個時候寄邀請信給使用者,請他同意獲得講義的writer權限
            # 因為我認為使用者很可能不會去收信,我們在使用者第一次真的要使用線上編輯功能的時候
            # 再告知他們我們會寄信邀請他們,請他們去收信  -- By EN

            admin_key_list = set(admin_key_list)
            resource.admins = admin_key_list

        change_public_state = self.request.get("change_public_state")
        if change_public_state:
            resource.is_public = not resource.is_public

        resource.put()

        content_uploaded = self.request.get("content_uploaded")
        if content_uploaded:
            new_content_content = io.BytesIO(content_uploaded)
            content_file_id = self.request.get("content-related-file-id")
            google_drive_api.update_file(service, content_file_id, new_content_content, google_drive_api.DOCX_MIME_TYPE)
            logging.info("%s is uploaded" % content_file_id)

        self.redirect("/show-resource/%s" % resource_id)
Exemplo n.º 18
0
 def get(self):
     logging.info('ShowPerformance')
     user = UserData.get_current_user()
     features = Feature.query().fetch()
     feature_performances = []
     for feature in features:
         performance = feature.performances[0].get()
         feature_performances.append({
             'name': feature.name,
             'index': performance.index,
             'scheduled_update_date': performance.scheduled_update_date,
             'key': performance.key.id()
         })
     logging.info('feature_performances: %s' %feature_performances)
     data = {
         'feature_performances': feature_performances
     }
     return self.render('feature/show-performance.html', data)
Exemplo n.º 19
0
    def get(self):
        user = UserData.get_current_user()
        if user is None:
            self.redirect("resource/find-resource")
        resources = Resource.query(Resource.admins == user.key).fetch()
        resources.sort(key=lambda x: x.get_avg_download_count(), reverse=True)
        keyword_str_list = []
        avg_download_count_list = []
        for resource in resources:
            keyword_str_list.append(", ".join(resource.keywords))
            avg_download_count_list.append(resource.get_avg_download_count())

        data = {
            "resources": resources,
            "keyword_str_list": keyword_str_list,
            "avg_download_count_list": avg_download_count_list,
        }

        return self.render("resource/my-resource.html", data)
Exemplo n.º 20
0
    def get(self):
        user = UserData.get_current_user()
        if user is None:
            self.redirect('course/find-course')
        courses = Resource.query(Resource.admins == user.key).fetch()
        courses.sort(key=lambda x: x.get_avg_download_count(), reverse=True)
        keyword_str_list = []
        avg_download_count_list = []
        for course in courses:
            keyword_str_list.append(', '.join(course.keywords))
            avg_download_count_list.append(course.get_avg_download_count())

        data = {
            'courses': courses,
            'keyword_str_list': keyword_str_list,
            'avg_download_count_list': avg_download_count_list
        }

        return self.render('course/my-course.html', data)
Exemplo n.º 21
0
    def get(self, feature_id):

        user = UserData.get_current_user()
        feature = Feature.get_by_id(int(feature_id))
        feature_KPIs = ','.join(feature.KPIs)
        feature_performance = feature.performances[0].get()
        feature_bets = FeatureBet.get_by_feature_performance(feature_performance)

        # get feature bets by feature
        # get user_feature bets by feature bets
        # get feature performance by feature

        # show all these data in the proper way
        data = {
            'user': user,
            'feature': feature,
            'feature_KPIs': feature_KPIs,
            'feature_bets': feature_bets,
            'feature_performance': feature_performance
        }

        return self.render('feature/show-feature.html', data)
Exemplo n.º 22
0
    def post(self):

        user = UserData.get_current_user()
        feature_bet_id = self.request.get('feature-bet-id')
        bet_option_index = self.request.get('bet-option')
        bet_capital = self.request.get('bet-capital')

        feature_bet = FeatureBet.get_by_id(int(feature_bet_id))
        if user.capital < float(bet_capital):
            self.render_json(({"error_msg": "你根本沒有那麼多錢!您太貪心了!!"}))
            return

        user_bet = UserFeatureBet(user=user.key,
                                 feature_bet=feature_bet.key,
                                 option_index_bet=int(bet_option_index),
                                 bet_capital=float(bet_capital),
                                 bet_state='can change')
        user_bet.put()
        user.capital = user.capital - float(bet_capital)
        user.put()

        logging.info("finish final result")
        self.render_json({"success_msg": "投注成功!!"})
        return
Exemplo n.º 23
0
    def post(self):

        def append_node_to_tree(node_list, tree):  # tree is empty list at first
            cursor = tree
            for index, value in enumerate(node_list):
                if value in [c['name'] for c in cursor]:
                    cursor = cursor[[c['name'] for c in cursor].index(value)]['children']
                else:
                    if index+1 != len(node_list):
                        cursor.append({'name': value, 'children': []})
                        cursor = cursor[-1]['children']
                    else:
                        cursor.append({'name': value})

        user = UserData.get_current_user()
        if not user.is_server_admin():
            self.redirect('find-resource')

        csv_file = self.request.get("subject-tree-csv")
        logging.info('csv file : %s' % csv_file)

        tree = []
        if csv_file:
            for line in csv_file.splitlines():
                append_node_to_tree(line.split(','), tree)

        logging.info("tree: %s" % tree)
        if len(tree) > 1:
            self.render_json({"error": "系統目前不支援同時上傳多個科目,換句話說,您上傳的csv的第一行名稱需要全部相同。"})
            return

        root_subject = Subject.buildSubjectTree(tree[0])
        tree[0]['root_subject_id'] = root_subject.key.id()
        self.render_json(tree[0])

        return
Exemplo n.º 24
0
    def get(self):

        user = UserData.get_current_user()
        if user:
            # we already have this user in datastore, do nothing at this time
            pass
        else:
            logging.info('into Login handler')
            google_user_property = users.get_current_user()
            user = UserData.get_by_user_email(google_user_property.email())
            if user:
                # 內部已經有一個帳號有此email,目前沒有預備要處理這種問題
                logging.error('Email %s already used by one of our user' %
                              user.user_email)
                raise Exception('Email %s already used by one of our user' %
                                user.user_email)
            else:  # email 也沒有重複,可以新增一個使用者
                new_user = UserData(
                    google_user_id=google_user_property.user_id(),
                    user_email=google_user_property.email(),
                    user_nickname=google_user_property.nickname())
            new_user.put()
        self.redirect('/')
Exemplo n.º 25
0
 def get(self):
     user = UserData.get_current_user()
     if not user:  # make sure user has an account to create course
         self.render('course/create-course-no-auth.html')
     else:
         return self.render('course/create-course.html')
Exemplo n.º 26
0
 def render(self, template_name, data={}):
     user = UserData.get_current_user()
     data['user'] = user
     template = JINJA_ENVIRONMENT.get_template(template_name)
     self.response.write(template.render(data))
Exemplo n.º 27
0
 def render(self, template_name, data={}):
     user = UserData.get_current_user()
     data['user'] = user
     template = JINJA_ENVIRONMENT.get_template(template_name)
     self.response.write(template.render(data))
Exemplo n.º 28
0
 def get(self):
     user = UserData.get_current_user()
     if not user:  # make sure user has an account to create resource
         self.render("resource/create-resource-no-auth.html")
     else:
         return self.render("resource/create-resource.html")