diff --git a/docs/source/deprecation.rst b/docs/source/deprecation.rst index 3028aa9a00..bc6befc8e9 100644 --- a/docs/source/deprecation.rst +++ b/docs/source/deprecation.rst @@ -1,3 +1,5 @@ +.. _deprecation-notices: + FiftyOne Deprecation Notices ============================ diff --git a/docs/source/images/plugins/panels/dashboard-panel.gif b/docs/source/images/plugins/panels/dashboard-panel.gif new file mode 100644 index 0000000000..d3a5a9ac51 Binary files /dev/null and b/docs/source/images/plugins/panels/dashboard-panel.gif differ diff --git a/docs/source/plugins/developing_plugins.rst b/docs/source/plugins/developing_plugins.rst index 33ad130d6d..d3f58432c3 100644 --- a/docs/source/plugins/developing_plugins.rst +++ b/docs/source/plugins/developing_plugins.rst @@ -2471,12 +2471,12 @@ panel layout based on user input. .. code-block:: python :linenos: - class DropdownMenuPanel(foo.Panel): + class DropdownMenuExample(foo.Panel): @property def config(self): return foo.PanelConfig( name="example_dropdown_menu", - label="Python Panel Example: Dropdown Menu", + label="Examples: Dropdown Menu", ) def on_load(self, ctx): @@ -2492,7 +2492,7 @@ panel layout based on user input. ctx.ops.reload_samples() def say_hi(self, ctx): - ctx.ops.notify("Hi!") + ctx.ops.notify("Hi!", variant="success") def render(self, ctx): panel = types.Object() @@ -2506,7 +2506,7 @@ panel layout based on user input. """, name="header", - width="500px", + width=50, # 50% of current panel width height="200px", ) @@ -2594,18 +2594,20 @@ the App. import fiftyone.operators.types as types from fiftyone import ViewField as F - class InteractiveHistogram(foo.Panel): + class InteractivePlotExample(foo.Panel): @property def config(self): return foo.PanelConfig( - name="interactive_histogram_example", - label="Interactive Histogram Example", + name="example_interactive_plot", + label="Examples: Interactive Plot", icon="bar_chart", ) def on_load(self, ctx): # Get target field - target_field = ctx.panel.state.target_field or "ground_truth.detections.label" + target_field = ( + ctx.panel.state.target_field or "ground_truth.detections.label" + ) ctx.panel.state.target_field = target_field # Compute target histogram for current dataset @@ -2616,7 +2618,7 @@ the App. ctx.panel.data.histogram = {"x": keys, "y": values, "type": "bar"} # Launch panel in a horizontal split view - ctx.ops.split_panel("interactive_histogram_example", layout="horizontal") + ctx.ops.split_panel("example_interactive_plot", layout="horizontal") def on_change_view(self, ctx): # Update histogram when current view changes @@ -2628,10 +2630,11 @@ the App. # Create a view that matches the selected histogram bar field = ctx.panel.state.target_field - view = get_view(ctx.dataset, field, value) + view = _make_matching_view(ctx.dataset, field, value) - if view: - ctx.ops.set_view(view) + # Load view in App + if view is not None: + ctx.ops.set_view(view=view) def reset(self, ctx): ctx.ops.clear_view() @@ -2657,7 +2660,10 @@ the App. ) panel.btn( - "reset", label="Reset Chart", on_click=self.reset, variant="contained" + "reset", + label="Reset Chart", + on_click=self.reset, + variant="contained", ) return types.Property( @@ -2673,7 +2679,7 @@ the App. ), ) - def get_view(dataset, field, value): + def _make_matching_view(dataset, field, value): if field.endswith(".label"): root_field = field.split(".")[0] return dataset.filter_labels(root_field, F("label") == value) @@ -2700,12 +2706,12 @@ guided workflow. .. code-block:: python :linenos: - class WalkthroughTutorialPanel(foo.Panel): + class WalkthroughExample(foo.Panel): @property def config(self): return foo.PanelConfig( - name="example_walkthrough_tutorial", - label="Python Panel Example: Walkthrough Tutorial", + name="example_walkthrough", + label="Examples: Walkthrough", ) def on_load(self, ctx): @@ -2739,7 +2745,9 @@ guided workflow. stack = panel.v_stack( "welcome", gap=2, width=75, align_x="center", align_y="center" ) - button_container = types.GridView(gap=2, align_x="left", align_y="center") + button_container = types.GridView( + gap=2, align_x="left", align_y="center" + ) page = ctx.panel.state.get("page", 1) @@ -2842,11 +2850,12 @@ forms of image and video data. .. code-block:: python :linenos: - class ImagePanel(foo.Panel): + class ImageExample(foo.Panel): @property def config(self): return foo.PanelConfig( - name="example_image", label="Python Panel Example: Image" + name="example_image", + label="Examples: Image", ) def on_load(self, ctx): @@ -2903,12 +2912,12 @@ forms of image and video data. .. code-block:: python :linenos: - class MediaPlayerPanel(foo.Panel): + class MediaPlayerExample(foo.Panel): @property def config(self): return foo.PanelConfig( name="example_media_player", - label="Python Panel Example: Media Player", + label="Examples: Media Player", ) def on_load(self, ctx): diff --git a/docs/source/plugins/index.rst b/docs/source/plugins/index.rst index 1f0c793b16..d70c114fe4 100644 --- a/docs/source/plugins/index.rst +++ b/docs/source/plugins/index.rst @@ -41,6 +41,8 @@ these plugins available in the +-------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------+ | `@voxel51/brain `_ | 🧠 Utilities for working with the FiftyOne Brain | +-------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------+ + | `@voxel51/dashboard `_ | πŸ“Š Create your own custom dashboards from within the App | + +-------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------+ | `@voxel51/evaluation `_ | βœ… Utilities for evaluating models with FiftyOne | +-------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------+ | `@voxel51/io `_ | πŸ“ A collection of import/export utilities | @@ -80,6 +82,13 @@ plugin and proceed with other work while the execution happens in the background .. image:: /images/plugins/operators/examples/embeddings.gif +Want to create a custom dashboard that displays statistics of interest about +the current dataset? Just install the +`@voxel51/dashboard `_ +plugin and build away: + +.. image:: /images/plugins/panels/dashboard-panel.gif + .. note:: When you choose :ref:`delegated execution ` in the diff --git a/docs/source/release-notes.rst b/docs/source/release-notes.rst index de69a59665..d175da6291 100644 --- a/docs/source/release-notes.rst +++ b/docs/source/release-notes.rst @@ -3,6 +3,192 @@ FiftyOne Release Notes .. default-role:: code +FiftyOne Teams 2.0.0 +-------------------- +*Released August 20, 2024* + +Includes all updates from :ref:`FiftyOne 0.25.0 `, plus: + +What's New + +- Added a :ref:`Can tag ` permission to allow users to tag + samples/labels but not otherwise perform edits +- Added support for authorized user credentials and external account + credentials when configuring :ref:`GCP credentials ` +- All :ref:`plugin execution ` is now user-aware and will + respect the executing user’s role and dataset permissions +- All deployments now include a LICENSE file that enforces user quotas +- Guests can no longer access operators/panels in custom plugins + +App + +- Added a caching layer to optimize media serving in the App +- Cloning an entire dataset via the `Clone` button now includes saved views, + saved workspaces, and runs +- Optimized the performance and UX of the `Settings > Users` page +- The users table on the `Settings > Users` page is now sortable +- Fixed a bug when updating the user role of a pending invitation +- Fixed a bug that prevented the Recent views widget from showing all recently + loaded views as intended + +CAS + +- Added an `Audit` page to the :ref:`Super Admin UI ` that + shows current license utilization and RBAC settings +- Super admins can now disable manual group management in the App. This is + useful, for example, if groups are defined via hooks +- Legacy mode deployments now have access to the relevant pages of the Super + Admin UI + +SDK + +- Added a :mod:`user_groups ` module to the + Management SDK for programmatically managing user groups +- The `fiftyone delegated` CLI command is now available to Teams users +- Upgraded the :ref:`upload_media() ` function to + gracefully support fields with missing media paths +- Added an `overwrite` parameter to + :meth:`add_cloud_credentials() ` + to control whether existing cloud credentials with the same prefix for a + provider are overwritten + +.. _release-notes-v0.25.0: + +FiftyOne 0.25.0 +--------------- +*Released August 20, 2024* + +What's New + +- Introducing :ref:`Python panels `, a powerful framework for + building custom App panels via a simple Python interface that includes a + wealth of builtin components to convey information, create tutorials, show + interactive graphs, trigger operations, and more +- Released a + `Dashboard panel `_ + that allows users to build custom no-code dashboards that display statistics + of interest about the current dataset (and beyond) +- Added `Segment Anything 2 `_ to the + :ref:`model zoo `! + `#4671 `_ +- Added an :ref:`Elasticsearch integration ` for + native text and image searches on FiftyOne datasets! +- Added an :ref:`image representativeness ` + method to the Brain that can be used to find the most common/uncommon types + of images in your datasets + +App + +- You can now + :ref:`link directly to a sample or group ` + in the App by copy + pasting URLs into your browser bar or programmatically + via your App `session` + `#4281 `_ +- Added a config option to + :ref:`disable frame filtering ` + in the App globally or on specific datasets + `#4604 `_ +- Added support for dynamically adjusting 3D label linewidths + `#4590 `_ +- Added a status bar when loading large 3D assets in the modal + `#4546 `_ +- Added support for visualizing :ref:`heatmaps ` in `.jpg` format + `#4531 `_ +- Exposed camera position as a recoil atom + `#4535 `_ +- Added anonymous analytics collection on an opt-in basis + `#4559 `_ +- Fixed a bug when viewing :ref:`dynamic groups ` of 3D + scenes in the modal + `#4527 `_ +- Fixed a bug when rendering scenes with relative 3D asset paths on Windows + `#4579 `_ +- Fixed keyboard shortcuts when viewing dynamic groups in the modal + `#4510 `_ + +Annotation + +- Added support for annotating :ref:`frame views ` + `#4477 `_ +- Added support for annotating :ref:`clip views ` + `#4511 `_ +- Added support for preserving existing COCO IDs when exporting in + :ref:`COCO format ` + `#4530 `_ + +Core + +- Added support for :ref:`save contexts ` to generated + views (patches, frames, and clips) + `#4636 `_ +- Added support for downloading plugins from branches that contain slashes `/` + `#4614 `_ +- Added support for including index statistics in + :meth:`Dataset.stats() ` + `#4653 `_ +- Added a source install script for Windows + `#4582 `_ +- Ubuntu 24.04 users no longer have to manually install MongoDB + `#4533 `_ +- Removed Python 3.7 support and marked Python 3.8 as + :ref:`deprecated ` + `#4538 `_ +- Fixed a bug that could cause side effects when creating clip views defined + by expressions + `#4492 `_ +- Fixed a concatenation bug when downloading videos from + :ref:`CVAT ` + `#4674 `_ + +Plugins + +- The actions row now automatically overflows into a `More items` menu as + necessary when there is insufficient horizontal space + `#4595 `_ +- Added a + :meth:`set_active_fields() ` + operator for programmatically controlling the selected fields in the sidebar + `#4482 `_ +- Added a + :meth:`notify() ` + operator for programmatically showing notifications in the App + `#4344 `_ +- Added + :meth:`ctx.extended_selection ` + to retrieve the current extended selection + `#4413 `_ +- Added a + :meth:`set_extended_selection() ` + operator for programmatically setting the extended selection + `#4409 `_ +- Added a + :meth:`track_event() ` + operator for logging plugin events in the App + `#4489 `_ + +Zoo + +- Added :ref:`YOLOv10 and RT-DETR models ` + to the zoo + `#4544 `_ +- Added :ref:`YOLOv8 classification models ` + to the zoo + `#4549 `_ +- Added support for storing object track IDs if present when running + :ref:`Ultralytics models ` from the zoo + `#4569 `_ +- Added support for GPU inference when running + :ref:`Hugging Face Transformers ` models from the + zoo + `#4587 `_ +- Extended support for group datasets, masks, heatmaps, and thumbnails when + uploading FiftyOne datasets to :ref:`Hugging Face Hub ` + `#4566 `_ +- Allow `ragged_batches` to be configured when using Torch models with custom + transforms + `#4509 `_, + `#4512 `_ + FiftyOne Teams 1.7.1 -------------------- *Released June 11, 2024* diff --git a/docs/source/teams/management_sdk.rst b/docs/source/teams/management_sdk.rst index 5cd9c621c6..503c07428c 100644 --- a/docs/source/teams/management_sdk.rst +++ b/docs/source/teams/management_sdk.rst @@ -41,7 +41,7 @@ API keys .. _teams-sdk-cloud-credentials: -Cloud Credentials +Cloud credentials ----------------- .. automodule:: fiftyone.management.cloud_credentials @@ -79,7 +79,7 @@ Plugin management .. _teams-sdk-snapshots: Snapshots ---------------------- +--------- .. automodule:: fiftyone.management.snapshot :members: @@ -93,3 +93,12 @@ User management .. automodule:: fiftyone.management.users :members: :undoc-members: + +.. _teams-sdk-group-management: + +Group management +---------------- + +.. automodule:: fiftyone.management.user_groups + :members: + :undoc-members: