Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] feat: call python methods from forum v2 #35490

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from edx_django_utils.monitoring import function_trace
from opaque_keys.edx.keys import CourseKey

from forum import api as forum_api
from openedx.core.djangoapps.django_comment_common.comment_client import settings
from openedx.core.djangoapps.django_comment_common.comment_client.utils import perform_request

Expand All @@ -29,17 +30,8 @@ def get_course_commentable_counts(course_key: CourseKey) -> Dict[str, Dict[str,
}

"""
url = f"{settings.PREFIX}/commentables/{course_key}/counts"
response = perform_request(
'get',
url,
metric_tags=[
f"course_key:{course_key}",
"function:get_course_commentable_counts",
],
metric_action='commentable_stats.retrieve',
)
return response
commentable_stats = forum_api.get_commentables_stats(str(course_key))
return commentable_stats


@function_trace("get_course_user_stats")
Expand Down
110 changes: 83 additions & 27 deletions openedx/core/djangoapps/django_comment_common/comment_client/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import logging

from .utils import CommentClientRequestError, extract, perform_request
from forum import api as forum_api

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -69,14 +70,17 @@ def retrieve(self, *args, **kwargs):
return self

def _retrieve(self, *args, **kwargs):
url = self.url(action='get', params=self.attributes)
response = perform_request(
'get',
url,
self.default_retrieve_params,
metric_tags=self._metric_tags,
metric_action='model.retrieve'
)
if self.type=="comment":
response = forum_api.get_parent_comment(self.attributes["id"])
else:
url = self.url(action='get', params=self.attributes)
response = perform_request(
'get',
url,
self.default_retrieve_params,
metric_tags=self._metric_tags,
metric_action='model.retrieve'
)
self._update_from_response(response)

@property
Expand Down Expand Up @@ -154,30 +158,82 @@ def save(self, params=None):
request_params = self.updatable_attributes()
if params:
request_params.update(params)
url = self.url(action='put', params=self.attributes)
response = perform_request(
'put',
url,
request_params,
metric_tags=self._metric_tags,
metric_action='model.update'
)
else: # otherwise, treat this as an insert
url = self.url(action='post', params=self.attributes)
response = perform_request(
'post',
url,
self.initializable_attributes(),
metric_tags=self._metric_tags,
metric_action='model.insert'
)
if self.type=="comment":
try:
body = request_params["body"]
course_id = str(request_params["course_id"])
user_id = request_params["user_id"]
except KeyError as e:
raise e
response = forum_api.update_comment(
self.attributes["id"],
body,
course_id,
user_id,
request_params.get("anonymous", False),
request_params.get("anonymous_to_peers", False),
request_params.get("endorsed", False),
request_params.get("closed", False),
request_params.get("editing_user_id"),
request_params.get("edit_reason_code"),
request_params.get("endorsement_user_id"),
)
else:
url = self.url(action='put', params=self.attributes)
response = perform_request(
'put',
url,
request_params,
metric_tags=self._metric_tags,
metric_action='model.update'
)
else: # otherwise, treat this as an insert
if self.type=="comment":
request_data = self.initializable_attributes()
try:
body = request_data["body"]
user_id = request_data["user_id"]
course_id = str(request_data["course_id"])
except KeyError as e:
raise e
if parent_id := self.attributes.get("parent_id"):
response = forum_api.create_child_comment(
parent_id,
body,
user_id,
course_id,
request_data.get("anonymous", False),
request_data.get("anonymous_to_peers", False),
)
else:
response = forum_api.create_parent_comment(
self.attributes["thread_id"],
body,
user_id,
course_id,
request_data.get("anonymous", False),
request_data.get("anonymous_to_peers", False),
)
else: # otherwise, treat this as an insert
url = self.url(action='post', params=self.attributes)
response = perform_request(
'post',
url,
self.initializable_attributes(),
metric_tags=self._metric_tags,
metric_action='model.insert'
)

self.retrieved = True
self._update_from_response(response)
self.after_save(self)

def delete(self):
url = self.url(action='delete', params=self.attributes)
response = perform_request('delete', url, metric_tags=self._metric_tags, metric_action='model.delete')
if self.type=="comment":
response = forum_api.delete_comment(self.attributes["id"])
else:
url = self.url(action='delete', params=self.attributes)
response = perform_request('delete', url, metric_tags=self._metric_tags, metric_action='model.delete')
self.retrieved = True
self._update_from_response(response)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from eventtracking import tracker

from . import models, settings, utils
from forum import api as forum_api

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -193,28 +194,12 @@ def unFlagAbuse(self, user, voteable, removeAll):
voteable._update_from_response(response)

def pin(self, user, thread_id):
url = _url_for_pin_thread(thread_id)
params = {'user_id': user.id}
response = utils.perform_request(
'put',
url,
params,
metric_tags=self._metric_tags,
metric_action='thread.pin'
)
self._update_from_response(response)
thread_data = forum_api.pin_thread(user.id, thread_id)
self._update_from_response(thread_data)
Faraz32123 marked this conversation as resolved.
Show resolved Hide resolved

def un_pin(self, user, thread_id):
url = _url_for_un_pin_thread(thread_id)
params = {'user_id': user.id}
response = utils.perform_request(
'put',
url,
params,
metric_tags=self._metric_tags,
metric_action='thread.unpin'
)
self._update_from_response(response)
thread_data = forum_api.unpin_thread(user.id, thread_id)
self._update_from_response(thread_data)


def _url_for_flag_abuse_thread(thread_id):
Expand All @@ -223,11 +208,3 @@ def _url_for_flag_abuse_thread(thread_id):

def _url_for_unflag_abuse_thread(thread_id):
return f"{settings.PREFIX}/threads/{thread_id}/abuse_unflag"


def _url_for_pin_thread(thread_id):
return f"{settings.PREFIX}/threads/{thread_id}/pin"


def _url_for_un_pin_thread(thread_id):
return f"{settings.PREFIX}/threads/{thread_id}/unpin"
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@


from . import models, settings, utils
from forum import api as forum_api


class User(models.Model):
Expand Down Expand Up @@ -141,35 +142,13 @@ def subscribed_threads(self, query_params=None):
)

def _retrieve(self, *args, **kwargs):
url = self.url(action='get', params=self.attributes)
retrieve_params = self.default_retrieve_params.copy()
retrieve_params.update(kwargs)
if self.attributes.get('course_id'):
retrieve_params['course_id'] = str(self.course_id)
if self.attributes.get('group_id'):
retrieve_params['group_id'] = self.group_id
try:
response = utils.perform_request(
'get',
url,
retrieve_params,
metric_action='model.retrieve',
metric_tags=self._metric_tags,
)
except utils.CommentClientRequestError as e:
if e.status_code == 404:
# attempt to gracefully recover from a previous failure
# to sync this user to the comments service.
self.save()
response = utils.perform_request(
'get',
url,
retrieve_params,
metric_action='model.retrieve',
metric_tags=self._metric_tags,
)
else:
raise
response = forum_api.get_user(self.attributes["id"], retrieve_params)
self._update_from_response(response)

def retire(self, retired_username):
Expand Down
11 changes: 10 additions & 1 deletion requirements/edx/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ django==4.2.15
# enmerkar
# enmerkar-underscore
# event-tracking
# forum
# help-tokens
# jsonfield
# lti-consumer-xblock
Expand Down Expand Up @@ -382,6 +383,7 @@ djangorestframework==3.14.0
# edx-organizations
# edx-proctoring
# edx-submissions
# forum
# openedx-learning
# ora2
# super-csv
Expand Down Expand Up @@ -549,6 +551,7 @@ elasticsearch==7.13.4
# via
# -c requirements/edx/../common_constraints.txt
# edx-search
# forum
enmerkar==0.7.1
# via enmerkar-underscore
enmerkar-underscore==2.3.1
Expand All @@ -566,6 +569,8 @@ filelock==3.15.4
# via snowflake-connector-python
firebase-admin==6.5.0
# via edx-ace
forum @ git+https://github.com/edly-io/forum.git@feat/migrate_from_http_to_python_call
# via -r requirements/edx/github.in
frozenlist==1.4.1
# via
# aiohttp
Expand Down Expand Up @@ -802,7 +807,9 @@ openai==0.28.1
# -c requirements/edx/../constraints.txt
# edx-enterprise
openedx-atlas==0.6.1
# via -r requirements/edx/kernel.in
# via
# -r requirements/edx/kernel.in
# forum
openedx-calc==3.1.0
# via -r requirements/edx/kernel.in
openedx-django-pyfs==3.6.0
Expand Down Expand Up @@ -956,6 +963,7 @@ pymongo==4.4.0
# -r requirements/edx/paver.txt
# edx-opaque-keys
# event-tracking
# forum
# mongoengine
# openedx-mongodbproxy
pynacl==1.5.0
Expand Down Expand Up @@ -1062,6 +1070,7 @@ requests==2.32.3
# edx-drf-extensions
# edx-enterprise
# edx-rest-api-client
# forum
# geoip2
# google-api-core
# google-cloud-storage
Expand Down
10 changes: 10 additions & 0 deletions requirements/edx/development.txt
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,7 @@ django==4.2.15
# enmerkar
# enmerkar-underscore
# event-tracking
# forum
# help-tokens
# jsonfield
# lti-consumer-xblock
Expand Down Expand Up @@ -615,6 +616,7 @@ djangorestframework==3.14.0
# edx-organizations
# edx-proctoring
# edx-submissions
# forum
# openedx-learning
# ora2
# super-csv
Expand Down Expand Up @@ -857,6 +859,7 @@ elasticsearch==7.13.4
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# edx-search
# forum
enmerkar==0.7.1
# via
# -r requirements/edx/doc.txt
Expand Down Expand Up @@ -905,6 +908,10 @@ firebase-admin==6.5.0
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# edx-ace
forum @ git+https://github.com/edly-io/forum.git@feat/migrate_from_http_to_python_call
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
freezegun==1.5.1
# via -r requirements/edx/testing.txt
frozenlist==1.4.1
Expand Down Expand Up @@ -1341,6 +1348,7 @@ openedx-atlas==0.6.1
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# forum
openedx-calc==3.1.0
# via
# -r requirements/edx/doc.txt
Expand Down Expand Up @@ -1637,6 +1645,7 @@ pymongo==4.4.0
# -r requirements/edx/testing.txt
# edx-opaque-keys
# event-tracking
# forum
# mongoengine
# openedx-mongodbproxy
pynacl==1.5.0
Expand Down Expand Up @@ -1829,6 +1838,7 @@ requests==2.32.3
# edx-drf-extensions
# edx-enterprise
# edx-rest-api-client
# forum
# geoip2
# google-api-core
# google-cloud-storage
Expand Down
Loading
Loading