Metadata-Version: 2.1
Name: ofsc
Version: 2.0.4
Summary: Python wrapper for Oracle Field Service API
Home-page: https://github.com/btoron/pyOFSC
License: MIT
Author: Borja Toron
Author-email: borja.toron@gmail.com
Requires-Python: >=3.11,<4.0
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Dist: cachetools (>=5.3.1,<6.0.0)
Requires-Dist: pydantic (>=2.6.3,<3.0.0)
Requires-Dist: pydantic-settings (>=2.2.1,<3.0.0)
Requires-Dist: pytest (==7.4)
Requires-Dist: requests (>=2.28.1,<3.0.0)
Project-URL: Repository, https://github.com/btoron/pyOFSC
Description-Content-Type: text/markdown

## OFSC

A simple Python wrapper for Oracle OFS REST API

## Models

Starting with OFS 1.17 we added models for the most common entities and metadata. All models should be imported from `ofsc.models`. All existing create functions will be transitioned to models. In OFS 2.0 all functions will use models

The models are based on the Pydantic BaseModel, so it is possible to build an entity using the `model_validate` static methods.

Currently implemented:
- ActivityTypeGroup
- ActivityType
- Property
- Workskill
- WorkSkillCondition
- Workzone


Experimental:
- Resource
- ResourceType
- User

## Functions implemented



### Core / Activities
    get_activities (self, params, response_type=TEXT_RESPONSE)
    get_activity (self, activity_id, response_type=TEXT_RESPONSE):
    update_activity (self, activity_id, data, response_type=TEXT_RESPONSE)
    move_activity (self, activity_id, data, response_type=TEXT_RESPONSE)
    get_file_property(self, activityId, label, mediaType="application/octet-stream", response_type=FULL_RESPONSE)
    get_all_activities( self, root, date_from, date_to, activity_fields, initial_offset=0, limit=5000)
    search_activities(self, params, response_type=TEXT_RESPONSE)
    bulk_update(self, data:BulkUpdateRequest, response_type=JSON_RESPONSE)


### Core / Events
    get_subscriptions(self, response_type=JSON_RESPONSE)
    create_subscription(self, data, response_type=JSON_RESPONSE)
    delete_subscription(self, subscription_id, response_type=JSON_RESPONSE)
    get_subscription_details(self, subscription_id, response_type=JSON_RESPONSE)
    get_events(self, params, response_type=JSON_RESPONSE)

### Core / Resources
    create_resource(self, resourceId, data, response_type=JSON_RESPONSE)
    get_resource(self, resource_id, inventories=False, workSkills=False, workZones=False, workSchedules=False , response_type=JSON_RESPONSE)
    get_position_history(self, resource_id,date,response_type=JSON_RESPONSE)
    get_resource_route(self, resource_id, date, activityFields = None, offset=0, limit=100, response_type=JSON_RESPONSE)
    get_resource_descendants(self, resource_id,  resourceFields=None, offset=0, limit=100, inventories=False, workSkills=False, workZones=False, workSchedules=False, response_type=JSON_RESPONSE)

### Core / Users
    get_users(self, offset=0, limit=100, response_type=JSON_RESPONSE)
    get_user(self, login, response_type=JSON_RESPONSE):
    update_user (self, login, data, response_type=JSON_RESPONSE)
    create_user(self, login, data, response_type=JSON_RESPONSE)
    delete_user(self, login, response_type=JSON_RESPONSE)

### Core / Daily Extract
    get_daily_extract_dates(self, response_type=JSON_RESPONSE)
    get_daily_extract_files(self, date, response_type=JSON_RESPONSE)
    get_daily_extract_file(self, date, filename, response_type=JSON_RESPONSE)
\
### Metadata / Activity Type Groups
    get_activity_type_groups (self, expand="parent", offset=0, limit=100, response_type=JSON_RESPONSE)
    get_activity_type_group (self,label, response_type=JSON_RESPONSE)   

### Metadata / Activity Types
    get_activity_types(self, offset=0, limit=100, response_type=JSON_RESPONSE)
    get_activity_type (self, label, response_type=JSON_RESPONSE)

### Metadata / Capacity
    get_capacity_areas (self, expand="parent", fields=capacityAreasFields, status="active", queryType="area", response_type=JSON_RESPONSE)
    get_capacity_area (self,label, response_type=JSON_RESPONSE)

### Metadata / Inventory
    get_inventory_types (self, offset=0, limit=100, response_type=JSON_RESPONSE)
    get_inventory_type (self, label, response_type=JSON_RESPONSE)
    create_or_replace_inventory_type(self, inventory: InventoryType, response_type=JSON_RESPONSE)

### Metadata / Properties
    get_properties (self, offset=0, limit=100, response_type=JSON_RESPONSE)
    get_property(self, label: str, response_type=JSON_RESPONSE)
    create_or_replace_property(self, property: Property, response_type=JSON_RESPONSE)

### Metadata / Workskills
    get_workskills (self, offset=0, limit=100, response_type=JSON_RESPONSE)
    get_workskill(self, label: str, response_type=JSON_RESPONSE)
    create_or_update_workskill(self, skill: Workskill, response_type=JSON_RESPONSE)
    delete_workskill(self, label: str, response_type=JSON_RESPONSE)
    get_workskill_conditions(self, response_type=JSON_RESPONSE)
    replace_workskill_conditions(self, data: WorskillConditionList, response_type=JSON_RESPONSE)

### Metadata / Plugins
    import_plugin(self, plugin: str)
    import_plugin_file(self, plugin: Path)

### Metadata / Resource Types
    get_resource_types(self, response_type=JSON_RESPONSE):

### Metadata / Workzones
    get_workzones(self, response_type=JSON_RESPONSE)
    
## Test History

OFS REST API Version | PyOFSC
------------ | -------------
20C| 1.7
21A| 1.8, 1.8,1, 1.9
21D| 1.15
22B| 1.16, 1.17
22D| 1.18
24A| 2.0

## Deprecation Warning

Starting in OFSC 2.0  all functions are called using the API name (Core or Metadata). See the examples.

Instead of

    instance = OFSC(..)
    list_of_activities = instance.get_activities(...)

It will be required to use the right API module:

    instance = OFSC(..)
    list_of_activites = instance.core.get_activities(...)

During the transition period a DeprecationWarning will be raised if the functions are used in the old way

## What's new in OFSC 2.0

- All metadata functions now use models, when available
- All functions are now using the API name (Core or Metadata)
- All functions return a python object by default. If there is an available model it will be used, otherwise a dict will be returned (see `response_type` parameter and `auto_model` parameter)
- Errors during API calls can raise exceptions and will by default when returning an object (see `auto_raise` parameter)
- JSON_RESPONSE and TEXT_RESPONSE are now deprecated. Use `response_type` parameter to control the response type
