microsoft / microsoft/PowerPlatform-DataverseClient-Python

tables.create / add_columns cannot set column constraints (MaxLength, MinValue/MaxValue, Format, RequiredLevel, DisplayName)

Ouverte
#194 0 commentaires 0 réactions 1 personne assignée Voir sur GitHub

@vrathee-msft y travaille déjà.

Depuis le 17/8/2026.

enhancement
Langage dominant
Python
Étoiles
60
Forks
23
Merge moyen
13 h 53 min
PR mergées (30 j)
3

Description

Summary

client.tables.create(...) and client.tables.add_columns(...) accept a column spec of {schema_name: type} where the value is only a type string (or an Enum subclass for optionsets). There is no way to set per-column constraints -- MaxLength, MinValue/MaxValue, Format/FormatName, Precision, RequiredLevel, or a custom DisplayName. Every constraint is hardcoded per type.

Evidence (main @ 5601657)

src/PowerPlatform/Dataverse/data/_odata_base.py::_attribute_payload:

  • Rejects any non-str / non-Enum spec: raise ValueError("... expected str or Enum subclass").
  • Hardcodes constraints per type: string -> MaxLength: 200; memo -> MaxLength: 4000; int -> MinValue: -2147483648, MaxValue: 2147483647; decimal/double -> fixed Min/Max + Precision; RequiredLevel: {"Value": "None"} on all branches; DisplayName derived from the schema-name suffix.

No public create_attribute / raw-metadata / generic-request method exists in the tables API (only create, add_columns, remove_columns, create_alternate_key), so there is no managed escape hatch either.

Impact

To create, for example, a Rating column limited to 1-5 or a Comment column with MaxLength=2000, callers must drop to the raw Web API EntityDefinitions({id})/Attributes endpoint and hand-build the payload -- including the @odata.type derived-type discriminator and using PUT (not PATCH) for updates. On hosts where the Dataverse CLI cannot run (ChatGPT web / Codex sandbox -- no .NET runtime), the SDK is the primary path, so this gap forces error-prone hand-rolled metadata calls for a very common ask ("create a table with a bounded rating and a sized text field").

Proposed change (backward-compatible)

Extend the column-spec value to also accept a dict, keeping str / Enum working exactly as today:

client.tables.create("cfb_CustomerFeedback", {
    "cfb_Name": "string",                                         # unchanged
    "cfb_Rating":  {"type": "int",  "min_value": 1, "max_value": 5},
    "cfb_Comment": {"type": "memo", "max_length": 2000, "display_name": "Comment"},
})

_attribute_payload builds the base payload for type, then applies the provided overrides:

  • max_length -> MaxLength
  • min_value / max_value -> MinValue / MaxValue
  • precision -> Precision
  • format -> Format (int/date) or FormatName.Value (string/memo)
  • required -> RequiredLevel.Value (None / ApplicationRequired / Recommended)
  • display_name -> DisplayName label

The @odata.type discriminator is already stamped correctly, so this needs no endpoint changes.

Touchpoints

  • data/_odata_base.py::_attribute_payload (core -- shared by the sync + async paths).
  • Docstrings / typing for operations/tables.py + aio/operations/async_tables.py (create, add_columns) and operations/batch.py.
  • Unit tests mirroring the existing _attribute_payload type tests (add override cases).
  • README + CHANGELOG per the repo maintenance rules.

Acceptance

  • {"type": "memo", "max_length": 2000} produces a MemoAttributeMetadata payload with MaxLength: 2000.
  • {"type": "int", "min_value": 1, "max_value": 5} produces an IntegerAttributeMetadata payload with those bounds.
  • str and Enum specs behave exactly as before (no breaking change).
  • Unit tests cover the overrides and the unchanged str/Enum paths.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.