def delete_course_update(location, update, passed_id, user): """ Don't delete course update item from db. Delete the given course_info update by settings "status" flag to 'deleted'. Returns the resulting course_updates. """ if not passed_id: return HttpResponseBadRequest() try: course_updates = modulestore().get_item(location) except ItemNotFoundError: return HttpResponseBadRequest() course_update_items = list(reversed(get_course_update_items(course_updates))) passed_index = _get_index(passed_id) # delete update item from given index if 0 < passed_index <= len(course_update_items): course_update_item = course_update_items[passed_index - 1] # soft delete course update item course_update_item["status"] = CourseInfoModule.STATUS_DELETED course_update_items[passed_index - 1] = course_update_item # update db record save_course_update_items(location, course_updates, course_update_items, user) return _get_visible_update(course_update_items) else: return HttpResponseBadRequest(_("Invalid course update id."))
def delete_course_update(location, update, passed_id, user): """ Don't delete course update item from db. Delete the given course_info update by settings "status" flag to 'deleted'. Returns the resulting course_updates. """ if not passed_id: return HttpResponseBadRequest() try: course_updates = modulestore().get_item(location) except ItemNotFoundError: return HttpResponseBadRequest() course_update_items = list( reversed(get_course_update_items(course_updates))) passed_index = _get_index(passed_id) # delete update item from given index if 0 < passed_index <= len(course_update_items): course_update_item = course_update_items[passed_index - 1] # soft delete course update item course_update_item["status"] = CourseInfoModule.STATUS_DELETED course_update_items[passed_index - 1] = course_update_item # update db record save_course_update_items(location, course_updates, course_update_items, user) return _get_visible_update(course_update_items) else: return HttpResponseBadRequest(_("Invalid course update id."))
def update_course_updates(location, update, passed_id=None, user=None): """ Either add or update the given course update. Add: If the passed_id is absent or None, the course update is added. Update: It will update it if it has a passed_id which has a valid value. Until updates have distinct values, the passed_id is the location url + an index into the html structure. """ try: course_updates = modulestore().get_item(location) except ItemNotFoundError: course_updates = modulestore().create_item(user.id, location.course_key, location.block_type, location.block_id) course_update_items = list( reversed(get_course_update_items(course_updates))) course_update_dict = None if passed_id is not None: passed_index = _get_index(passed_id) # if passed_index in course_update_items_ids: for course_update_item in course_update_items: if course_update_item["id"] == passed_index: course_update_dict = course_update_item course_update_item["date"] = update["date"] course_update_item["content"] = update["content"] break if course_update_dict is None: return HttpResponseBadRequest(_("Invalid course update id.")) else: course_update_items_ids = [ course_update_item['id'] for course_update_item in course_update_items ] course_update_dict = { # if no course updates then the id will be 1 otherwise maxid + 1 "id": max(course_update_items_ids) + 1 if course_update_items_ids else 1, "date": update["date"], "content": update["content"], "status": CourseInfoBlock.STATUS_VISIBLE } course_update_items.append(course_update_dict) # update db record save_course_update_items(location, course_updates, course_update_items, user) # remove status key if "status" in course_update_dict: del course_update_dict["status"] return course_update_dict
def get_course_updates(location, provided_id, user_id): """ Retrieve the relevant course_info updates and unpack into the model which the client expects: [{id : index, date : string, content : html string}] """ try: course_updates = modulestore().get_item(location) except ItemNotFoundError: course_updates = modulestore().create_item(user_id, location.course_key, location.block_type, location.block_id) course_update_items = get_course_update_items(course_updates, _get_index(provided_id)) return _get_visible_update(course_update_items)
def get_course_updates(location, provided_id, user_id): """ Retrieve the relevant course_info updates and unpack into the model which the client expects: [{id : index, date : string, content : html string}] """ try: course_updates = modulestore().get_item(location) except ItemNotFoundError: course_updates = modulestore().create_item(user_id, location.course_key, location.block_type, location.block_id) course_update_items = get_course_update_items(course_updates, _get_index(provided_id)) return _get_visible_update(course_update_items)
def list(self, request, course, *args, **kwargs): course_updates_module = get_course_info_section_module(request, request.user, course, "updates") update_items = get_course_update_items(course_updates_module) updates_to_show = [update for update in update_items if update.get("status") != "deleted"] for item in updates_to_show: content = item["content"] content = replace_static_urls(content, course_id=course.id, static_asset_path=course.static_asset_path) item["content"] = make_static_urls_absolute(request, content) return Response(updates_to_show)
def list(self, request, course, *args, **kwargs): # lint-amnesty, pylint: disable=arguments-differ course_updates_module = get_course_info_section_module(request, request.user, course, 'updates') update_items = get_course_update_items(course_updates_module) updates_to_show = [ update for update in update_items if update.get("status") != "deleted" ] for item in updates_to_show: item['content'] = apply_wrappers_to_content(item['content'], course_updates_module, request) return Response(updates_to_show)
def list(self, request, course, *args, **kwargs): course_updates_module = get_course_info_section_module(request, request.user, course, 'updates') update_items = get_course_update_items(course_updates_module) updates_to_show = [ update for update in update_items if update.get("status") != "deleted" ] for item in updates_to_show: item['content'] = apply_wrappers_to_content(item['content'], course_updates_module, request) return Response(updates_to_show)
def update_course_updates(location, update, passed_id=None, user=None): """ Either add or update the given course update. Add: If the passed_id is absent or None, the course update is added. If push_notification_selected is set in the update, a celery task for the push notification is created. Update: It will update it if it has a passed_id which has a valid value. Until updates have distinct values, the passed_id is the location url + an index into the html structure. """ try: course_updates = modulestore().get_item(location) except ItemNotFoundError: course_updates = modulestore().create_item(user.id, location.course_key, location.block_type, location.block_id) course_update_items = list( reversed(get_course_update_items(course_updates))) if passed_id is not None: passed_index = _get_index(passed_id) # oldest update at start of list if 0 < passed_index <= len(course_update_items): course_update_dict = course_update_items[passed_index - 1] course_update_dict["date"] = update["date"] course_update_dict["content"] = update["content"] course_update_items[passed_index - 1] = course_update_dict else: return HttpResponseBadRequest(_("Invalid course update id.")) else: course_update_dict = { "id": len(course_update_items) + 1, "date": update["date"], "content": update["content"], "status": CourseInfoModule.STATUS_VISIBLE } course_update_items.append(course_update_dict) enqueue_push_course_update(update, location.course_key) # update db record save_course_update_items(location, course_updates, course_update_items, user) # remove status key if "status" in course_update_dict: del course_update_dict["status"] return course_update_dict
def test_course_update_id(self): """ Test that a user can successfully update a course update without a sequential ids """ # create two course updates self.post_course_update() self.post_course_update() updates_location = self.course.id.make_usage_key( 'course_info', 'updates') self.assertTrue(isinstance(updates_location, UsageKey)) self.assertEqual(updates_location.block_id, u'updates') course_updates = modulestore().get_item(updates_location) course_update_items = list( reversed(get_course_update_items(course_updates))) # Delete the course update with id 1 course_update_items = [ course_update_item for course_update_item in course_update_items if course_update_item.get('id') != 1 ] course_updates.items = course_update_items course_updates.data = "" # update db record modulestore().update_item(course_updates, self.user.id) update_content = 'Testing' update_date = u"January 23, 2014" course_update_url = self.create_update_url() payload = {'content': update_content, 'date': update_date} resp = self.client.ajax_post(course_update_url + '2', payload, HTTP_X_HTTP_METHOD_OVERRIDE="PUT", REQUEST_METHOD="POST") self.assertHTMLEqual( update_content, json.loads(resp.content.decode('utf-8'))['content']) course_updates = modulestore().get_item(updates_location) del course_updates.items[0]["status"] self.assertEqual(course_updates.items, [{ u'date': update_date, u'content': update_content, u'id': 2 }])
def list(self, request, course, *args, **kwargs): course_updates_module = get_course_info_section_module(request, course, 'updates') update_items = get_course_update_items(course_updates_module) updates_to_show = [ update for update in update_items if update.get("status") != "deleted" ] for item in updates_to_show: content = item['content'] content = replace_static_urls( content, course_id=course.id, static_asset_path=course.static_asset_path) item['content'] = make_static_urls_absolute(request, content) return Response(updates_to_show)
def update_course_updates(location, update, passed_id=None, user=None): """ Either add or update the given course update. Add: If the passed_id is absent or None, the course update is added. If push_notification_selected is set in the update, a celery task for the push notification is created. Update: It will update it if it has a passed_id which has a valid value. Until updates have distinct values, the passed_id is the location url + an index into the html structure. """ try: course_updates = modulestore().get_item(location) except ItemNotFoundError: course_updates = modulestore().create_item(user.id, location.course_key, location.block_type, location.block_id) course_update_items = list(reversed(get_course_update_items(course_updates))) if passed_id is not None: passed_index = _get_index(passed_id) # oldest update at start of list if 0 < passed_index <= len(course_update_items): course_update_dict = course_update_items[passed_index - 1] course_update_dict["date"] = update["date"] course_update_dict["content"] = update["content"] course_update_items[passed_index - 1] = course_update_dict else: return HttpResponseBadRequest(_("Invalid course update id.")) else: course_update_dict = { "id": len(course_update_items) + 1, "date": update["date"], "content": update["content"], "status": CourseInfoModule.STATUS_VISIBLE } course_update_items.append(course_update_dict) enqueue_push_course_update(update, location.course_key) # update db record save_course_update_items(location, course_updates, course_update_items, user) # remove status key if "status" in course_update_dict: del course_update_dict["status"] return course_update_dict