Commit Graph

29 Commits

Author SHA1 Message Date
Braden MacDonald
8f47c0b274 fix: whitespace issues in some capa problem index_dictionary content (#35543) 2024-09-26 09:34:58 -07:00
Jillian
5446877a86 Soft delete collections (#35496)
* refactor: use django signals to trigger LIBRARY_COLLECTION events

* refactor: use collection usage_key as search document id

This change standardises the search document "id" to be a meilisearch ID
generated from the usage key, for all types of indexed objects.

This is important for collections so we can locate the collection
document in the search index solely from the data provided by the
LIBRARY_COLLECTION_DELETED event (library_key + collection_key), even if
the collection has been deleted from the database.

* refactor: avoid fetching more data than we have to.

* get_library_collection_usage_key and
  searchable_doc_tags_for_collection do not need a Collection object;
  the usage key can be created from the library_key and collection_key.

* updated searchable_doc_for_collection to require the parts of the
  collection usage key + an optional collection. This allows us to
  identify the collection's search document from its usage key without
  requiring an existing Collection object (in case it's been deleted).
  Also removes the edge case for indexing Collections not associated
  with a ContentLibrary -- this won't ever really happen.

* feat: remove soft- and hard-deleted collections from search index

* feat: adds library_component_usage_key to content_libraries.api

* refactor: send CONTENT_OBJECT_ASSOCIATON_CHANGED on django model signals

so that added/removed collections are removed/re-added to component documents.

Special case: When a collection is soft-deleted/restored, we detect this
in the search index and update the collection's component documents
directly, without a CONTENT_OBJECT_ASSOCIATON_CHANGED signal.


* chore: bumps openedx-learning to 0.13.0
2024-09-25 13:29:18 -05:00
Navin Karkera
c71414a247 feat: add block_id field to filterable attributes of meilisearch (#35493) 2024-09-20 12:12:41 -05:00
Braden MacDonald
00632d9cae feat: When editing a v2 library xblock, update search index synchronously (#35495) 2024-09-18 10:06:36 -07:00
Chris Chávez
5927be7e0e feat: Add collection tags to index [FC-0062] (#35483)
* feat: Add collection tags to index

* feat: Add api functions to update tags in collections

* feat: Update tags on index when tag_object
2024-09-17 11:52:02 -05:00
Jillian
c41fe89918 Store content object collections in search index [FC-0062] (#35469)
* feat: Add Library Collections REST endpoints

* test: Add tests for Collections REST APIs

* chore: Add missing __init__ files

* docs: Add warning about unstable REST APIs

* feat: emit CONTENT_OBJECT_ASSOCIATIONS_CHANGED
whenever a content object's tags or collections have changed,
and handle that event in content/search.

The deprecated CONTENT_OBJECT_TAGS_CHANGED event is still emitted when
tags change; to be removed after Sumac.

* docs: replaces CONTENT_OBJECT_TAGS_CHANGED with CONTENT_OBJECT_ASSOCIATIONS_CHANGED

* chore: updates openedx-events==9.14.0

* chore: updates openedx-learning==0.11.4

Co-authored-by: Yusuf Musleh <yusuf@opencraft.com>
Co-authored-by: Chris Chávez <xnpiochv@gmail.com>
Co-authored-by: Rômulo Penido <romulo@thinkdash.dev>
2024-09-13 08:20:54 -05:00
Yusuf Musleh
7665f13547 feat: Add Library Collections REST endpoints [FC-0062] (#35321)
* feat: Add Library Collections REST endpoints

* test: Add tests for Collections REST APIs

* chore: Add missing __init__ files

* feat: Add events emitting for Collections

* feat: Add REST endpoints to update Components in a Collections (temp) (#674)

* feat: add/remove components to/from a collection

* docs: Add warning about unstable REST APIs

* chore: updates openedx-events==9.14.0

* chore: updates openedx-learning==0.11.4

* fix: assert collection doc have unique id

---------

Co-authored-by: Jillian <jill@opencraft.com>
Co-authored-by: Chris Chávez <xnpiochv@gmail.com>
Co-authored-by: Rômulo Penido <romulo.penido@gmail.com>
2024-09-11 13:21:10 -05:00
Navin Karkera
ec34753043 fix: update library v2 search index synchronously (#35367)
Discarded components need to be removed from index in sync to make sure
that users see the latest updated data.
2024-08-30 12:16:02 -07:00
Navin Karkera
c65478e487 feat: index library collections in studio meilisearch index (#35324) 2024-08-27 10:45:46 -07:00
Chris Chávez
2e77e65d1c feat: Problem types added as filterable attribute [FC-0059] (#35242) 2024-08-27 11:43:29 -05:00
Navin Karkera
c3480b8f0b chore: add comment 2024-08-19 17:01:25 +05:30
Navin Karkera
fed8a803f1 test: delete documents that were never published on discard 2024-08-19 17:01:25 +05:30
Navin Karkera
e1495398e2 refactor: delete documents that were never published on discard 2024-08-19 17:01:25 +05:30
Navin Karkera
140b9bb968 refactor: delete all documents on discard 2024-08-19 17:01:25 +05:30
Navin Karkera
2efff2697b refactor: parallelize content block update on discard 2024-08-19 17:01:25 +05:30
Navin Karkera
65258117d8 fix: delete discarded drafts from meilisearch index 2024-08-19 17:01:25 +05:30
Jillian
6b5d812d38 feat: adds sortable fields to studio content search index (#35103) 2024-07-25 18:18:49 +00:00
Rômulo Penido
238dca732e fix: skip block indexing if it raises an error while loading (#35139)
* fix: skip block indexing if it raises an error while loading
* test: add tests to the issue
2024-07-26 02:15:57 +09:30
Braden MacDonald
e1e3c87a95 fix: searching tag refinement was sometimes not working (#34933) 2024-06-07 09:30:05 +09:30
Braden MacDonald
6bfe08c147 fix: reindex_studio was crashing if instance had too many courses (#34905) 2024-06-07 09:29:01 +09:30
Kyle McCormick
15caa9746f refactor: Completely remove Blockstore (#34739)
Blockstore and all of its (experimental) functionality has been replaced with
openedx-learning, aka "Learning Core". This commit uninstalls the now-unused
openedx-blockstore package and removes all dangling references to it.

Note: This also removes the `copy_library_from_v1_to_v2` management command,
which has been broken ever since we switched from Blockstore to Learning Core.

Part of this DEPR: https://github.com/openedx/public-engineering/issues/238
2024-05-13 09:48:18 -04:00
Chris Chávez
b551a32a49 fix: Stop autotagging nor indexing the course root XBlock (#34627)
* fix: Multiple auto-tagging when creating a course

* Avoid tagging course-block and course-info blocks
* Tests

* feat: Avoid create index for course blocks
2024-05-07 11:14:33 -07:00
Rômulo Penido
7fc6cd6755 feat: add usage_key to breadcrumbs in Studio search index (#34535) 2024-04-25 11:00:50 -07:00
Yusuf Musleh
a31ed929f7 feat: update studio search index when object tags change (#34559)
* feat: Update search index when object tags updated

* feat: Update index when library block tags change

* refactor: Remove extra params

* docs: Add new event to hook events docs

* feat: Add and use upsert_block_tags_index_docs

This takes care of updating tags data in search index for both course and library blocks.

* chore: Update openedx-events

* fix: Update tests + include course block tags in reindex

* feat: Fix static-type issues + adjust tag_object

* fix: bug retrieving the Meilisearch API key UID (first time only)

* docs: Update comments

---------

Co-authored-by: Braden MacDonald <braden@opencraft.com>
2024-04-22 10:53:49 -07:00
Rômulo Penido
90b253a38a feat: update Studio search index when course content is updated (#34391) 2024-04-18 09:53:21 -07:00
Jillian
d67211051b feat: restrict Studio search results based on user permissions (#34471)
* feat: adds SearchAccess model

Stores a numeric ID for each course + library, which will generally be
shorter than the full context_key, so we can pack more of them into the
the Meilisearch search filter.

Also:

* Adds data migration pre-populates the SearchAccess model from the existing
  CourseOverview and ContentLibrary records
* Adds signal handlers to add/remove SearchAccess entries when content
  is created or deleted.
* Adds get_access_ids_for_request() helper method for use in views.
* Adds tests.

* test: can't import content.search in lms tests

* feat: use SearchAccess in documents and views

* Adds an access_id field to the document, which stores the
  SearchAccess.id for the block's context.
* Use the requesting user's allowed access_ids to filter search results
  to documents with those access_ids.
* Since some users have a lot of individual access granted, limit the
  number of access_ids in the filter to a large number (1_000)
* Updates tests to demonstrate.

* test: can't import content.search or content_staging in lms tests

* fix: make access_id field filterable

* fix: use SearchAccess.get_or_create in signal handlers

In theory, we shouldn't have to do this, because the CREATE and DELETE
events should keep the SearchAccess table up-to-date.

But in practice, signals can be missed (or in tests, they may be
disabled). So we assume that it's ok to re-use a SearchAccess.id created
for a given course or library context_key.

* refactor: refactors the view tests to make them clearer

Uses helper methods and decorators to wrap the settings and patches used
by multiple view tests.

* feat: adds org filters to meilisearch filter

* Uses content_tagging.rules.get_user_orgs to fetch the user's
  content-related orgs for use in the meilisearch filter.
* Limits the number of orgs used to 1_000 to keep token size down

* refactor: removes data migration

Users should use the reindex_studio management command to populate SearchAccess.

* refactor: adds functions to common.djangoapps.student.role_helpers

to allow general access to the user's RoleCache without having to access
private attributes of User or RoleCache.

Related changes:

* Moves some functionality from openedx.core.djangoapps.enrollments.data.get_user_roles
  to this new helper method.
* Use these new helper method in content_tagging.rules

* fix: get_access_ids_for_request only returns individual access

instead of all course keys that the user can read.

Org- and GlobalStaff access checks will handle the rest.

* fix: use org-level permissions when generating search filter

Also refactors tests to demonstrate this change for OrgStaff and
OrgInstructor users.

* refactor: remove SearchAccess creation signal handlers

Lets SearchAccess entries be created on demand during search indexing.

* feat: omit access_ids from the search filter that are covered by the user's org roles

---------

Co-authored-by: Rômulo Penido <romulo.penido@gmail.com>
2024-04-17 11:21:34 -07:00
Chris Chávez
ddb407a3f2 feat: handle tags when importing/exporting courses (#34356) 2024-04-08 11:39:46 -07:00
Jillian
7ad225658f feat: don't use OLX for tags when copying/duplicating blocks (#34386) 2024-04-02 09:59:57 -07:00
Braden MacDonald
f663739510 feat: Index Studio content using Meilisearch [experimental] (#34310) 2024-03-22 10:08:31 -07:00