## OFSC

A simple Python wrapper for Oracle OFS REST API

## Models

Starting with OFS 1.17 we are adding models for the most common entities. 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 `parse_obj` or `parse_file` static methods.

Currently implemented:
- Workskill
- WorkSkillCondition
- Workzone
- Property

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)


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

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

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

### Core / Daily Extract
    get_daily_extract_dates(self, response_type=FULL_RESPONSE)
    get_daily_extract_files(self, date, response_type=FULL_RESPONSE)
    get_daily_extract_file(self, date, filename, response_type=FULL_RESPONSE)

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

### Metadata / Activity Types
    get_activity_type_groups (self, expand="parent", offset=0, limit=100, response_type=FULL_RESPONSE)
    get_activity_type_group (self,label, response_type=FULL_RESPONSE)   
    get_activity_types(self, offset=0, limit=100, response_type=FULL_RESPONSE)
    get_activity_type (self, label, response_type=FULL_RESPONSE)

### Metadata / Properties
    get_properties (self, offset=0, limit=100, response_type=FULL_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=FULL_RESPONSE)
    get_workskill(self, label: str, response_type=FULL_RESPONSE)
    create_or_update_workskill(self, skill: Workskill, response_type=FULL_RESPONSE)
    delete_workskill(self, label: str, response_type=FULL_RESPONSE)
    get_workskill_conditions(self, response_type=FULL_RESPONSE)
    replace_workskill_conditions(self, data: WorskillConditionList, response_type=FULL_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=FULL_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

## Deprecation Warning

Starting in OFSC 2.0  (estimated for December 2022) all functions will have to be 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