datacontract-cli 0.10.0__py3-none-any.whl → 0.10.37__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. datacontract/__init__.py +13 -0
  2. datacontract/api.py +260 -0
  3. datacontract/breaking/breaking.py +242 -12
  4. datacontract/breaking/breaking_rules.py +37 -1
  5. datacontract/catalog/catalog.py +80 -0
  6. datacontract/cli.py +387 -117
  7. datacontract/data_contract.py +216 -353
  8. datacontract/engines/data_contract_checks.py +1041 -0
  9. datacontract/engines/data_contract_test.py +113 -0
  10. datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +2 -3
  11. datacontract/engines/datacontract/check_that_datacontract_file_exists.py +1 -1
  12. datacontract/engines/fastjsonschema/check_jsonschema.py +176 -42
  13. datacontract/engines/fastjsonschema/s3/s3_read_files.py +16 -1
  14. datacontract/engines/soda/check_soda_execute.py +100 -56
  15. datacontract/engines/soda/connections/athena.py +79 -0
  16. datacontract/engines/soda/connections/bigquery.py +8 -1
  17. datacontract/engines/soda/connections/databricks.py +12 -3
  18. datacontract/engines/soda/connections/duckdb_connection.py +241 -0
  19. datacontract/engines/soda/connections/kafka.py +206 -113
  20. datacontract/engines/soda/connections/snowflake.py +8 -5
  21. datacontract/engines/soda/connections/sqlserver.py +43 -0
  22. datacontract/engines/soda/connections/trino.py +26 -0
  23. datacontract/export/avro_converter.py +72 -8
  24. datacontract/export/avro_idl_converter.py +31 -25
  25. datacontract/export/bigquery_converter.py +130 -0
  26. datacontract/export/custom_converter.py +40 -0
  27. datacontract/export/data_caterer_converter.py +161 -0
  28. datacontract/export/dbml_converter.py +148 -0
  29. datacontract/export/dbt_converter.py +141 -54
  30. datacontract/export/dcs_exporter.py +6 -0
  31. datacontract/export/dqx_converter.py +126 -0
  32. datacontract/export/duckdb_type_converter.py +57 -0
  33. datacontract/export/excel_exporter.py +923 -0
  34. datacontract/export/exporter.py +100 -0
  35. datacontract/export/exporter_factory.py +216 -0
  36. datacontract/export/go_converter.py +105 -0
  37. datacontract/export/great_expectations_converter.py +257 -36
  38. datacontract/export/html_exporter.py +86 -0
  39. datacontract/export/iceberg_converter.py +188 -0
  40. datacontract/export/jsonschema_converter.py +71 -16
  41. datacontract/export/markdown_converter.py +337 -0
  42. datacontract/export/mermaid_exporter.py +110 -0
  43. datacontract/export/odcs_v3_exporter.py +375 -0
  44. datacontract/export/pandas_type_converter.py +40 -0
  45. datacontract/export/protobuf_converter.py +168 -68
  46. datacontract/export/pydantic_converter.py +6 -0
  47. datacontract/export/rdf_converter.py +13 -6
  48. datacontract/export/sodacl_converter.py +36 -188
  49. datacontract/export/spark_converter.py +245 -0
  50. datacontract/export/sql_converter.py +37 -3
  51. datacontract/export/sql_type_converter.py +269 -8
  52. datacontract/export/sqlalchemy_converter.py +170 -0
  53. datacontract/export/terraform_converter.py +7 -2
  54. datacontract/imports/avro_importer.py +246 -26
  55. datacontract/imports/bigquery_importer.py +221 -0
  56. datacontract/imports/csv_importer.py +143 -0
  57. datacontract/imports/dbml_importer.py +112 -0
  58. datacontract/imports/dbt_importer.py +240 -0
  59. datacontract/imports/excel_importer.py +1111 -0
  60. datacontract/imports/glue_importer.py +288 -0
  61. datacontract/imports/iceberg_importer.py +172 -0
  62. datacontract/imports/importer.py +51 -0
  63. datacontract/imports/importer_factory.py +128 -0
  64. datacontract/imports/json_importer.py +325 -0
  65. datacontract/imports/jsonschema_importer.py +146 -0
  66. datacontract/imports/odcs_importer.py +60 -0
  67. datacontract/imports/odcs_v3_importer.py +516 -0
  68. datacontract/imports/parquet_importer.py +81 -0
  69. datacontract/imports/protobuf_importer.py +264 -0
  70. datacontract/imports/spark_importer.py +262 -0
  71. datacontract/imports/sql_importer.py +274 -35
  72. datacontract/imports/unity_importer.py +219 -0
  73. datacontract/init/init_template.py +20 -0
  74. datacontract/integration/datamesh_manager.py +86 -0
  75. datacontract/lint/resolve.py +271 -49
  76. datacontract/lint/resources.py +21 -0
  77. datacontract/lint/schema.py +53 -17
  78. datacontract/lint/urls.py +32 -12
  79. datacontract/model/data_contract_specification/__init__.py +1 -0
  80. datacontract/model/exceptions.py +4 -1
  81. datacontract/model/odcs.py +24 -0
  82. datacontract/model/run.py +49 -29
  83. datacontract/output/__init__.py +0 -0
  84. datacontract/output/junit_test_results.py +135 -0
  85. datacontract/output/output_format.py +10 -0
  86. datacontract/output/test_results_writer.py +79 -0
  87. datacontract/py.typed +0 -0
  88. datacontract/schemas/datacontract-1.1.0.init.yaml +91 -0
  89. datacontract/schemas/datacontract-1.1.0.schema.json +1975 -0
  90. datacontract/schemas/datacontract-1.2.0.init.yaml +91 -0
  91. datacontract/schemas/datacontract-1.2.0.schema.json +2029 -0
  92. datacontract/schemas/datacontract-1.2.1.init.yaml +91 -0
  93. datacontract/schemas/datacontract-1.2.1.schema.json +2058 -0
  94. datacontract/schemas/odcs-3.0.1.schema.json +2634 -0
  95. datacontract/schemas/odcs-3.0.2.schema.json +2382 -0
  96. datacontract/templates/datacontract.html +139 -294
  97. datacontract/templates/datacontract_odcs.html +685 -0
  98. datacontract/templates/index.html +236 -0
  99. datacontract/templates/partials/datacontract_information.html +86 -0
  100. datacontract/templates/partials/datacontract_servicelevels.html +253 -0
  101. datacontract/templates/partials/datacontract_terms.html +51 -0
  102. datacontract/templates/partials/definition.html +25 -0
  103. datacontract/templates/partials/example.html +27 -0
  104. datacontract/templates/partials/model_field.html +144 -0
  105. datacontract/templates/partials/quality.html +49 -0
  106. datacontract/templates/partials/server.html +211 -0
  107. datacontract/templates/style/output.css +491 -72
  108. datacontract_cli-0.10.37.dist-info/METADATA +2235 -0
  109. datacontract_cli-0.10.37.dist-info/RECORD +119 -0
  110. {datacontract_cli-0.10.0.dist-info → datacontract_cli-0.10.37.dist-info}/WHEEL +1 -1
  111. {datacontract_cli-0.10.0.dist-info → datacontract_cli-0.10.37.dist-info/licenses}/LICENSE +1 -1
  112. datacontract/engines/datacontract/check_that_datacontract_str_is_valid.py +0 -48
  113. datacontract/engines/soda/connections/dask.py +0 -28
  114. datacontract/engines/soda/connections/duckdb.py +0 -76
  115. datacontract/export/csv_type_converter.py +0 -36
  116. datacontract/export/html_export.py +0 -66
  117. datacontract/export/odcs_converter.py +0 -102
  118. datacontract/init/download_datacontract_file.py +0 -17
  119. datacontract/integration/publish_datamesh_manager.py +0 -33
  120. datacontract/integration/publish_opentelemetry.py +0 -107
  121. datacontract/lint/lint.py +0 -141
  122. datacontract/lint/linters/description_linter.py +0 -34
  123. datacontract/lint/linters/example_model_linter.py +0 -91
  124. datacontract/lint/linters/field_pattern_linter.py +0 -34
  125. datacontract/lint/linters/field_reference_linter.py +0 -38
  126. datacontract/lint/linters/notice_period_linter.py +0 -55
  127. datacontract/lint/linters/quality_schema_linter.py +0 -52
  128. datacontract/lint/linters/valid_constraints_linter.py +0 -99
  129. datacontract/model/data_contract_specification.py +0 -141
  130. datacontract/web.py +0 -14
  131. datacontract_cli-0.10.0.dist-info/METADATA +0 -951
  132. datacontract_cli-0.10.0.dist-info/RECORD +0 -66
  133. /datacontract/{model → breaking}/breaking_change.py +0 -0
  134. /datacontract/{lint/linters → export}/__init__.py +0 -0
  135. {datacontract_cli-0.10.0.dist-info → datacontract_cli-0.10.37.dist-info}/entry_points.txt +0 -0
  136. {datacontract_cli-0.10.0.dist-info → datacontract_cli-0.10.37.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,236 @@
1
+ <!doctype html>
2
+ <html class="h-full bg-gray-100" lang="en">
3
+ <head>
4
+ <title>Data Contract</title>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ {# <script src="https://cdn.tailwindcss.com"></script> #}
8
+ <style>
9
+ {{style | safe }}
10
+ </style>
11
+ </head>
12
+ <body class="h-full">
13
+
14
+ <div class="min-h-full flex flex-col">
15
+
16
+ <nav class="bg-white shadow-sm">
17
+ <div class="mx-auto max-w-7xl px-6 lg:px-8">
18
+ <div class="flex h-16 justify-between">
19
+ <div class="flex">
20
+ <div class="flex flex-shrink-0 items-center mr-6">
21
+ <a class="text-xl text-gray-900 font-semibold" href="/">
22
+ Data Contracts
23
+ </a>
24
+ </div>
25
+ </div>
26
+ <div class="hidden sm:ml-6 sm:flex sm:items-center">
27
+ <a href="https://datacontract.com" class="text-sky-500 hover:text-gray-700 text-sm font-semibold" target="_blank">datacontract.com</a>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </nav>
32
+
33
+ <main class="pb-7">
34
+
35
+ <div class="pt-5 mx-auto max-w-7xl px-6 lg:px-8">
36
+ <div>
37
+ <div class="lg:flex lg:items-center lg:justify-between px-0">
38
+ <div class="min-w-0 flex-1">
39
+ <h2 class="text-2xl font-bold leading-7 text-gray-900 sm:truncate sm:text-3xl sm:tracking-tight">
40
+ Data Contract Catalog</h2>
41
+ </div>
42
+ </div>
43
+
44
+
45
+ </div>
46
+
47
+ <div>
48
+
49
+ <div class="space-y-6 mt-6">
50
+
51
+ <section id="catalog">
52
+
53
+ {% if contracts_size > 0 %}
54
+
55
+ <form aria-labelledby="filter-heading" class="pb-4" >
56
+ <h2 id="filter-heading" class="sr-only">Filters</h2>
57
+ <div class="sm:flex items-center justify-between">
58
+ <div class="sm:flex items-baseline space-x-8">
59
+ <div>
60
+ <div class="relative rounded-md shadow-sm">
61
+ <div class="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3">
62
+ <svg class="pointer-events-none absolute h-5 w-5 text-gray-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
63
+ <path fill-rule="evenodd" d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z" clip-rule="evenodd" />
64
+ </svg>
65
+ </div>
66
+ <input type="text" name="q" id="search" class="block w-full sm:w-72 rounded-md border-0 py-1.5 pl-10 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6" placeholder="Search">
67
+ </div>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </form>
72
+ {% endif %}
73
+
74
+
75
+ <ul role="list" class="grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 ">
76
+
77
+ {% for contract in contracts %}
78
+
79
+ <li class="col-span-1 rounded-lg bg-white shadow hover:bg-gray-50"
80
+ data-search="{{
81
+ contract.spec.info.title|lower|e }} {{
82
+ contract.spec.info.owner|lower|e if contract.spec.info.owner else '' }} {{
83
+ contract.spec.info.version|lower|e if contract.spec.info.version else '' }} {{
84
+ contract.spec.info.description|lower|e }} {%
85
+ for model_name, model in contract.spec.models.items() %}
86
+ {{ model.description|lower|e }} {%
87
+ for field_name, field in model.fields.items() %}
88
+ {{ field_name|lower|e }} {{ field.description|lower|e if field.description else '' }} {%
89
+ endfor %}
90
+ {% endfor %}
91
+ ">
92
+ <a href="{{contract.html_link|e}}" >
93
+ <div class="flex w-full justify-between space-x-1 p-6 pb-4">
94
+ <div class="flex-1 truncate">
95
+ <div class="flex items-center space-x-3">
96
+ <h3 class="truncate text-sm font-medium text-gray-900">{{contract.spec.info.title}}</h3>
97
+ </div>
98
+ <p class="mt-1 text-sm text-gray-400">{{ contract.spec.info.version }}</p>
99
+ <div class="flex flex-wrap mt-1 text-sm text-gray-500 gap-1">
100
+ {% if contract.spec.info.owner %}
101
+ <div class="flex items-center text-sm text-gray-500">
102
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.25" stroke="currentColor" class="w-4 h-4 mr-1.5">
103
+ <path stroke-linecap="round" stroke-linejoin="round" d="M18 18.72a9.094 9.094 0 003.741-.479 3 3 0 00-4.682-2.72m.94 3.198l.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0112 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 016 18.719m12 0a5.971 5.971 0 00-.941-3.197m0 0A5.995 5.995 0 0012 12.75a5.995 5.995 0 00-5.058 2.772m0 0a3 3 0 00-4.681 2.72 8.986 8.986 0 003.74.477m.94-3.197a5.971 5.971 0 00-.94 3.197M15 6.75a3 3 0 11-6 0 3 3 0 016 0zm6 3a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0zm-13.5 0a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0z" />
104
+ </svg>
105
+ <span>{{contract.spec.info.owner}}</span>
106
+ </div>
107
+ {% endif %}
108
+ </div>
109
+
110
+ </div>
111
+ <div class="h-10 w-10 flex-shrink-0 rounded-full">
112
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M21.14 6.94a.77.77 0 0 0-.48.2c-1-.8-2.14-.25-3 .72A16.12 16.12 0 0 0 16.15 10a.28.28 0 0 0 .4.32c.08 0 1.39-1.21 1.47-1.28.73-.68 1.35-1.42 1.81-1.48s.32 0 .41.09a19 19 0 0 0-2.07 2.81c0 .12-.31 0 1.53 1.71l.27.24C19 13.57 16 16.73 15.74 17a2.66 2.66 0 0 1-1 .43 3.72 3.72 0 0 1-.22-1.52L17.7 12a.3.3 0 0 0-.47-.37c-.72.88-3.45 3.39-3.69 3.91a4 4 0 0 0 .28 2.62 1 1 0 0 0 .93.32 4.26 4.26 0 0 0 1.76-.65c.6-.62 3.86-4.79 4.65-5.31a20 20 0 0 0 1.77-1.64 4.67 4.67 0 0 0 1-1.37c.5-1.57-1.82-2.66-2.79-2.57Zm1.66 2.33a12.9 12.9 0 0 1-1.58 1.88c-.91 1-.65.74-1 .46-1.52-1.26-1.33-1-1.27-1.21l2-2.16c.34-.38-.06-.45.7-.15.44.16 1.43.63 1.15 1.18Z" fill="#020202" fill-rule="evenodd"></path><path d="M7.2 22.53c-1.48-.25-1.48-2.11-1.61-3.53a40 40 0 0 1 .15-6.57c.18-2.46.6-2.25.59-5.51 0-1.73-.33-4.06-1.79-5a40.29 40.29 0 0 1 6.24.08c2.64.18 5.71-.14 6.91.63C19.23 3.63 18.12 6 19 6a.32.32 0 0 0 .31-.36c-.06-1.31.24-2.44-.81-3.44A5.82 5.82 0 0 0 14.76 1a75.46 75.46 0 0 0-8.57 0C5.77 1 1.6 1.5 1 2.08A3.17 3.17 0 0 0 0 4.5 4.61 4.61 0 0 0 .72 7a1.92 1.92 0 0 0 .93.62c1 .31 3.24.25 2.86-.55C4.4 6.8 3.19 7 3.11 7a2.35 2.35 0 0 1-1.77-.56 3.77 3.77 0 0 1-.48-2 2.31 2.31 0 0 1 .76-1.73 3.54 3.54 0 0 1 1.27-.31c1.11 0 1.64.66 2 1.73a14.13 14.13 0 0 1 .3 4.46 33 33 0 0 0-.55 7c0 1.43.19 5 .84 6.22a2.1 2.1 0 0 0 1.67 1.24.3.3 0 0 0 .05-.52Z" fill="#020202" fill-rule="evenodd"></path><path d="M21.85 19.54a8 8 0 0 1-1.71-3.19.29.29 0 1 0-.57.15c.75 3.33 2.18 4 2.79 4.79-.34.08-13.26 1.1-14 1a.33.33 0 1 0-.09.66c1.61.26 10.59-.22 13.1-.49a3 3 0 0 0 2-.65c.63-.67-.71-1.47-1.52-2.27Z" fill="#020202" fill-rule="evenodd"></path><path d="M9.67 16.86c.39 0 .46.84.5 1.26 0 .13-.07.78.35.95a.51.51 0 0 0 .45 0c1.63-.85.93-.18 1.46-.18.68 0 .56-1.39-1.25-1 0-1.24-.34-2.29-1.59-2.2a2.75 2.75 0 0 0-2.18 1.81 3.92 3.92 0 0 0-.34 1.05c.11 1.84.86-1.68 2.6-1.69Z" fill="#0c6fff" fill-rule="evenodd"></path><path d="M8.57 8.41c5.28.19 2.32 0 6.08 0a.34.34 0 0 0 .35-.35.47.47 0 0 0-.39-.37c-.28-.06-2.1-.3-2.94-.33a17.84 17.84 0 0 0-3.84.48.31.31 0 0 0 .2.53c.09.02.48.04.54.04Z" fill="#0c6fff" fill-rule="evenodd"></path><path d="M13.22 11.64c-5.2-.15-5.49.12-5.57.34a.3.3 0 0 0 .17.38 1.23 1.23 0 0 0 .44.1c.84.06 7.28.38 7.24-.42-.03-.58-1.37-.33-2.28-.4Z" fill="#0c6fff" fill-rule="evenodd"></path></g></svg>
113
+ </div>
114
+ </div>
115
+ <div class="flex w-full items-center justify-between px-6 pb-6">
116
+ <p class="text-sm text-gray-500 line-clamp-3">
117
+ {{contract.spec.info.description}}
118
+ </p>
119
+ </div>
120
+
121
+ </a>
122
+ </li>
123
+ {% endfor %}
124
+ </ul>
125
+
126
+ {% if contracts_size == 0 %}
127
+ <p>The data contract catalog is empty.</p>
128
+ <p>
129
+ Learn more on data contracts on <a href="http://datacontract.com" class="text-sky-500 hover:text-gray-700 text-sm font-semibold">http://datacontract.com</a>.
130
+ </p>
131
+ {% endif %}
132
+
133
+
134
+ <div id="no-results" class="hidden text-sm text-gray-500">
135
+ No results found.
136
+ </div>
137
+
138
+ </section>
139
+
140
+ </div>
141
+
142
+ </div>
143
+
144
+ <div class="mt-6 text-sm text-gray-400">
145
+ Created at {{formatted_date}} with <a href="https://cli.datacontract.com" class="text-gray-400 hover:text-gray-500">Data Contract CLI</a> v{{datacontract_cli_version}}
146
+ </div>
147
+
148
+ </div>
149
+ </main>
150
+
151
+ <dialog id="dialog-datacontract-yaml" class="relative z-10" aria-labelledby="modal-title" aria-modal="true">
152
+ <div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div>
153
+
154
+ <div class="fixed inset-0 z-10 w-screen overflow-y-auto">
155
+ <div class="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
156
+ <div class="relative transform rounded-lg bg-white px-4 pb-4 pt-5 text-left shadow-xl transition-all sm:my-8 sm:w-4/5 sm:p-6">
157
+ <div class="absolute right-0 top-0 pr-4 pt-4">
158
+ <button type="button" onclick="document.getElementById('dialog-datacontract-yaml').close()" class="rounded-md bg-white text-gray-400 hover:text-gray-500">
159
+ <span class="sr-only">Close</span>
160
+ <svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
161
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
162
+ </svg>
163
+ </button>
164
+ </div>
165
+ <div>
166
+ <div class="mt-3 mb-3 text-center sm:mt-5">
167
+
168
+ <h3 class="text-base font-semibold leading-6 text-gray-900" id="modal-title">Data Contract YAML</h3>
169
+ </div>
170
+ <pre class="overflow-x-auto text-sm bg-gray-50 p-4"><code>{{datacontract_yaml}}</code></pre>
171
+ </div>
172
+ <div class="mt-5 sm:mt-6">
173
+ <button type="button" onclick="document.getElementById('dialog-datacontract-yaml').close()"
174
+ class="inline-flex w-full justify-center rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Close</button>
175
+ </div>
176
+ </div>
177
+ </div>
178
+ </div>
179
+ </dialog>
180
+
181
+
182
+ <footer class="bg-white mt-auto text-sm text-gray-400">
183
+ <div class="mx-auto max-w-7xl py-5 px-6 md:flex md:items-center md:justify-between lg:px-8">
184
+ <div class="flex justify-center space-x-6 md:order-2">
185
+ <div>
186
+ <a href="https://cli.datacontract.com" class="text-gray-400 hover:text-gray-500 px-2">Data Contract CLI</a>
187
+
188
+ <a href="https://datacontract.com" class="text-gray-400 hover:text-gray-500 px-2">datacontract.com</a>
189
+ </div>
190
+
191
+
192
+ </div>
193
+ <div class="mt-8 md:order-1 md:mt-0">
194
+ <p class="text-center leading-5 text-gray-400">
195
+ Supported by <a href="https://entropy-data.com"
196
+ class="text-gray-400 hover:text-gray-500">Entropy Data</a>
197
+ </p>
198
+ </div>
199
+ </div>
200
+
201
+ </footer>
202
+
203
+ </div>
204
+
205
+ <script>
206
+ document.addEventListener('DOMContentLoaded', function() {
207
+ const searchInput = document.getElementById('search');
208
+ const contractsList = document.querySelectorAll('#catalog li');
209
+ const noResults = document.getElementById('no-results');
210
+
211
+ searchInput.addEventListener('keyup', function() {
212
+ let visibleCount = 0; // Counter to track the number of visible items
213
+ const searchText = searchInput.value.toLowerCase();
214
+
215
+ contractsList.forEach(contract => {
216
+ const searchData = contract.getAttribute('data-search');
217
+ if (searchData && searchData.includes(searchText)) {
218
+ contract.style.display = '';
219
+ visibleCount++;
220
+ } else {
221
+ contract.style.display = 'none';
222
+ }
223
+ });
224
+
225
+ // Manage the visibility of the no results message
226
+ if (visibleCount === 0) {
227
+ noResults.classList.remove('hidden'); // Show the message if no items are visible
228
+ } else {
229
+ noResults.classList.add('hidden'); // Hide the message if there are visible items
230
+ }
231
+ });
232
+ });
233
+ </script>
234
+
235
+ </body>
236
+ </html>
@@ -0,0 +1,86 @@
1
+ <div class=" px-4 sm:px-0">
2
+ <h1 class="text-base font-semibold leading-6 text-gray-900" id="info">Info</h1>
3
+ <p class="text-sm text-gray-500">Information about the data contract</p>
4
+ </div>
5
+ <div class="mt-2 overflow-hidden shadow sm:rounded-lg bg-white">
6
+
7
+ <div class="px-4 py-5 sm:px-6">
8
+
9
+ {% if datacontract.links %}
10
+ <div class="flex flex-wrap gap-3">
11
+ {% for name, href in datacontract.links.items() %}
12
+ <a href="{{ href }}" class="flex flex-col text-center rounded-md bg-white px-2 py-2 text-sm font-medium text-gray-500 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 mb-6" target="_blank" style="min-width: 100px">
13
+ <div class="mx-auto w-8 h-8 my-2">
14
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M23.91,5.29a3.13,3.13,0,0,0-.72-1.23.35.35,0,0,0-.49,0,.34.34,0,0,0,0,.48,2.66,2.66,0,0,1,.54,1,1.56,1.56,0,0,1-.1,1,19.42,19.42,0,0,1-3.49,3.64,9.62,9.62,0,0,1-2.74,1.8,5.51,5.51,0,0,1-1.71.45.91.91,0,0,1-.73-.3c-.2-.22-.52-.52-.82-.83.66-.65,1.32-1.35,2.08-2.09a.3.3,0,0,0,0-.43.31.31,0,0,0-.43,0c-.84.6-1.6,1.14-2.32,1.69a7.18,7.18,0,0,1-.32-.81,5.23,5.23,0,0,1-.23-1,3.23,3.23,0,0,1,.94-2.5,31.64,31.64,0,0,1,3.65-3,5.24,5.24,0,0,1,1.63-1,2.56,2.56,0,0,1,1.77,0,2.08,2.08,0,0,1,.65.41,2.31,2.31,0,0,1,.49.61.3.3,0,0,0,.54-.26A2.78,2.78,0,0,0,21.52,2a2.91,2.91,0,0,0-.84-.57,3.23,3.23,0,0,0-1.81-.18,5.64,5.64,0,0,0-2.38,1.13,30.94,30.94,0,0,0-3.91,3,4.26,4.26,0,0,0-1.29,3.34,6.18,6.18,0,0,0,.27,1.23A11.36,11.36,0,0,0,12,11.06l0,.07-1.21,1c-.76.67-1.5,1.37-2.38,2.07a.34.34,0,0,0-.09.48.35.35,0,0,0,.48.09c1-.58,1.81-1.14,2.62-1.74.36-.26.71-.54,1-.83l.24-.21.82.82a2,2,0,0,0,1.6.67,6.72,6.72,0,0,0,2-.57,10.52,10.52,0,0,0,3-2.1,19.88,19.88,0,0,0,3.58-4.07A2.3,2.3,0,0,0,23.91,5.29Z" fill="#191919" fill-rule="evenodd"></path><path d="M11.86,14.07a.34.34,0,0,0,0,.48.81.81,0,0,1,.29.57,1.28,1.28,0,0,1-.27.65,29.38,29.38,0,0,1-3.6,3.65,9.07,9.07,0,0,1-2.73,1.79,5.43,5.43,0,0,1-1.71.45,1,1,0,0,1-.73-.31c-.22-.25-.6-.61-.93-1a2.71,2.71,0,0,1-.43-.56,9.71,9.71,0,0,1-.39-1,4.53,4.53,0,0,1-.22-1,3.21,3.21,0,0,1,1-2.51,30.47,30.47,0,0,1,3.66-3,5.14,5.14,0,0,1,1.65-1,2.62,2.62,0,0,1,1.79,0,.3.3,0,0,0,.4-.16.31.31,0,0,0-.17-.4,3.16,3.16,0,0,0-1.79-.19A5.63,5.63,0,0,0,5.27,11.7a30.41,30.41,0,0,0-3.93,2.94A4.21,4.21,0,0,0,0,18a6,6,0,0,0,.19,1A9.53,9.53,0,0,0,.7,20.3a3.53,3.53,0,0,0,.47.69c.36.41.83.84,1.09,1.13a2,2,0,0,0,1.59.68,6.21,6.21,0,0,0,2.05-.56,10,10,0,0,0,3-2.1,30.27,30.27,0,0,0,3.6-4,2,2,0,0,0,.36-1.07,1.46,1.46,0,0,0-.53-1A.35.35,0,0,0,11.86,14.07Z" fill="#191919" fill-rule="evenodd"></path><path d="M6.43,15.15l1.16-.79A.31.31,0,0,0,7.73,14a.3.3,0,0,0-.41-.13L6,14.49a7.39,7.39,0,0,0-2.3,1.83,2.35,2.35,0,0,0-.38,2.26,1,1,0,0,0,1,.68,2.41,2.41,0,0,0,1.17-.43,9.29,9.29,0,0,0,.91-.75c.66-.6,1.25-1.26,1.86-1.85a.35.35,0,0,0,0-.49.36.36,0,0,0-.49,0c-.57.45-1.13.95-1.73,1.42a10.58,10.58,0,0,1-1.17.81c-1.23.74-.36-.89-.3-1A7.43,7.43,0,0,1,6.43,15.15Z" fill="#0c6fff" fill-rule="evenodd"></path><path d="M19,7a6.13,6.13,0,0,1-1.26,1.28c-.21.15-.5.38-.78.56a1.9,1.9,0,0,1-.49.25.34.34,0,0,0-.25.41.34.34,0,0,0,.41.26,2.47,2.47,0,0,0,.55-.2c.35-.18.73-.44,1-.61a6.9,6.9,0,0,0,1.57-1.33A8.69,8.69,0,0,0,20.9,6a3.7,3.7,0,0,0,.43-1.13A1,1,0,0,0,21,4a1.36,1.36,0,0,0-.89-.39,3,3,0,0,0-1.08.17,6.4,6.4,0,0,0-1.63.82,15.32,15.32,0,0,0-2,1.7,4.54,4.54,0,0,0-.65.74,2.69,2.69,0,0,0-.31.61,3.5,3.5,0,0,0-.07.9.33.33,0,0,0,.17.24A.31.31,0,0,0,15,8.63c.18-.26-.17-.6.47-1.3A5.64,5.64,0,0,1,16,6.88a19,19,0,0,1,2-1.42,5.88,5.88,0,0,1,1.39-.61A1.87,1.87,0,0,1,20,4.73c.54,0,.12.31-.08.76A7.29,7.29,0,0,1,19,7Z" fill="#0c6fff" fill-rule="evenodd"></path></g></svg>
15
+ </div>
16
+ <div>{{ name }}</div>
17
+ </a>
18
+ {% endfor %}
19
+ </div>
20
+ {% endif %}
21
+
22
+ <dl class="grid grid-cols-1 gap-x-4 gap-y-6 sm:grid-cols-2">
23
+ <div class="sm:col-span-1">
24
+ <dt class="text-sm font-medium text-gray-500">Title</dt>
25
+ <dd class="mt-1 text-sm text-gray-900">{{ datacontract.info.title }}</dd>
26
+ </div>
27
+
28
+ <div class="sm:col-span-1">
29
+ <dt class="text-sm font-medium text-gray-500">Version</dt>
30
+ <dd class="mt-1 text-sm text-gray-900">{{ datacontract.info.version }}</dd>
31
+ </div>
32
+
33
+ {% if datacontract.info.status %}
34
+ <div class="sm:col-span-1">
35
+ <dt class="text-sm font-medium text-gray-500">Status</dt>
36
+ <dd class="mt-1 text-sm text-gray-900">{{ datacontract.info.status }}</dd>
37
+ </div>
38
+ {% endif %}
39
+
40
+ {% if datacontract.info.description %}
41
+ <div class="sm:col-span-2">
42
+ <dt class="text-sm font-medium text-gray-500">Description</dt>
43
+ <dd class="mt-1 text-sm text-gray-900" >
44
+ <span class="whitespace-pre-wrap">{{ datacontract.info.description }}</span>
45
+ </dd>
46
+ </div>
47
+ {% endif %}
48
+
49
+ {% if datacontract.info.owner %}
50
+ <div class="sm:col-span-1">
51
+ <dt class="text-sm font-medium text-gray-500">Owner</dt>
52
+ <dd class="mt-1 text-sm text-gray-900">
53
+ <span>{{ datacontract.info.owner }}</span>
54
+ </dd>
55
+ </div>
56
+ {% endif %}
57
+
58
+ {% for key, value in datacontract.info.model_extra.items() %}
59
+ <div class="sm:col-span-1">
60
+ <dt class="text-sm font-medium text-gray-500">{{ key }}</dt>
61
+ <dd class="mt-1 text-sm text-gray-900">{{ value }}</dd>
62
+ </div>
63
+ {% endfor %}
64
+
65
+ {% if datacontract.info.contact %}
66
+ <div class="sm:col-span-1">
67
+ <dt class="text-sm font-medium text-gray-500">Contact</dt>
68
+ <dd class="mt-1 text-sm text-gray-900">
69
+ {% if datacontract.info.contact.name %}
70
+ {{ datacontract.info.contact.name }}
71
+ {% endif %}
72
+ {% if datacontract.info.contact.email %}
73
+ <a href="mailto:{{ datacontract.info.contact.email }}" class="text-sky-500 hover:text-gray-700">{{ datacontract.info.contact.email }}</a>
74
+ {% endif %}
75
+ {% if datacontract.info.contact.url %}
76
+ <div>
77
+ <a href="{{ datacontract.info.contact.url }}" class="text-sky-500 hover:text-gray-700">{{ datacontract.info.contact.url }}</a>
78
+ </div>
79
+ {% endif %}
80
+ </dd>
81
+ </div>
82
+ {% endif %}
83
+
84
+ </dl>
85
+ </div>
86
+ </div>
@@ -0,0 +1,253 @@
1
+ <div class="px-4 sm:px-0">
2
+ <h1 class="text-base font-semibold leading-6 text-gray-900">Service Levels</h1>
3
+ <p class="text-sm text-gray-500">Service levels of the data contract</p>
4
+ </div>
5
+ <div class="mt-2 overflow-hidden shadow sm:rounded-lg bg-white">
6
+ <div class="px-4 py-5 sm:px-6">
7
+ <dl class="grid grid-cols-1 gap-x-4 gap-y-6 divide-y">
8
+ {% if datacontract.servicelevels.availability %}
9
+ <div class="grid sm:grid-cols-2" >
10
+ <h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="availability">
11
+ Availability
12
+ </h2>
13
+ {% if datacontract.servicelevels.availability.description %}
14
+ <div class="sm:col-span-1">
15
+ <dt class="text-sm font-medium text-gray-500">Description</dt>
16
+ <dd class="mt-1 text-sm text-gray-900">
17
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.availability.description }}</span>
18
+ </dd>
19
+ </div>
20
+ {% endif %}
21
+ {% if datacontract.servicelevels.availability.percentage %}
22
+ <div class="sm:col-span-1">
23
+ <dt class="text-sm font-medium text-gray-500">Percentage</dt>
24
+ <dd class="mt-1 text-sm text-gray-900">
25
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.availability.percentage }}</span>
26
+ </dd>
27
+ </div>
28
+ {% endif %}
29
+ </div>
30
+ {% endif %}
31
+ {% if datacontract.servicelevels.retention %}
32
+ <div class="grid sm:grid-cols-2" >
33
+ <h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="retention">
34
+ Retention
35
+ </h2>
36
+ {% if datacontract.servicelevels.retention.description %}
37
+ <div class="sm:col-span-1">
38
+ <dt class="text-sm font-medium text-gray-500">Description</dt>
39
+ <dd class="mt-1 text-sm text-gray-900">
40
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.retention.description }}</span>
41
+ </dd>
42
+ </div>
43
+ {% endif %}
44
+ {% if datacontract.servicelevels.retention.period %}
45
+ <div class="sm:col-span-1">
46
+ <dt class="text-sm font-medium text-gray-500">Period</dt>
47
+ <dd class="mt-1 text-sm text-gray-900">
48
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.retention.period }}</span>
49
+ </dd>
50
+ </div>
51
+ {% endif %}
52
+ {% if datacontract.servicelevels.retention.unlimited %}
53
+ <div class="sm:col-span-1">
54
+ <dt class="text-sm font-medium text-gray-500">Unlimited</dt>
55
+ <dd class="mt-1 text-sm text-gray-900">
56
+ <span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.retention.unlimited }}</span>
57
+ </dd>
58
+ </div>
59
+ {% endif %}
60
+ </div>
61
+ {% endif %}
62
+ {% if datacontract.servicelevels.latency %}
63
+ <div class="grid sm:grid-cols-2" >
64
+ <h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="latency">
65
+ Latency
66
+ </h2>
67
+ {% if datacontract.servicelevels.latency.description %}
68
+ <div class="sm:col-span-1">
69
+ <dt class="text-sm font-medium text-gray-500">Description</dt>
70
+ <dd class="mt-1 text-sm text-gray-900">
71
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.latency.description }}</span>
72
+ </dd>
73
+ </div>
74
+ {% endif %}
75
+ {% if datacontract.servicelevels.latency.threshold %}
76
+ <div class="sm:col-span-1">
77
+ <dt class="text-sm font-medium text-gray-500">Threshold</dt>
78
+ <dd class="mt-1 text-sm text-gray-900">
79
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.latency.threshold }}</span>
80
+ </dd>
81
+ </div>
82
+ {% endif %}
83
+ {% if datacontract.servicelevels.latency.sourceTimestampField %}
84
+ <div class="sm:col-span-1">
85
+ <dt class="text-sm font-medium text-gray-500">Source Timestamp field</dt>
86
+ <dd class="mt-1 text-sm text-gray-900">
87
+ <span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.latency.sourceTimestampField
88
+ }}</span>
89
+ </dd>
90
+ </div>
91
+ {% endif %}
92
+ {% if datacontract.servicelevels.latency.processedTimestampField %}
93
+ <div class="sm:col-span-1">
94
+ <dt class="text-sm font-medium text-gray-500">Processed Timestamp field</dt>
95
+ <dd class="mt-1 text-sm text-gray-900">
96
+ <span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.latency.processedTimestampField
97
+ }}</span>
98
+ </dd>
99
+ </div>
100
+ {% endif %}
101
+ </div>
102
+ {% endif %}
103
+ {% if datacontract.servicelevels.freshness %}
104
+ <div class="grid sm:grid-cols-2" >
105
+ <h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="freshness">
106
+ Freshness
107
+ </h2>
108
+ {% if datacontract.servicelevels.freshness.description %}
109
+ <div class="sm:col-span-1">
110
+ <dt class="text-sm font-medium text-gray-500">Description</dt>
111
+ <dd class="mt-1 text-sm text-gray-900">
112
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.freshness.description }}</span>
113
+ </dd>
114
+ </div>
115
+ {% endif %}
116
+ {% if datacontract.servicelevels.freshness.threshold %}
117
+ <div class="sm:col-span-1">
118
+ <dt class="text-sm font-medium text-gray-500">Threshold</dt>
119
+ <dd class="mt-1 text-sm text-gray-900">
120
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.freshness.threshold }}</span>
121
+ </dd>
122
+ </div>
123
+ {% endif %}
124
+ {% if datacontract.servicelevels.freshness.timestampField %}
125
+ <div class="sm:col-span-1">
126
+ <dt class="text-sm font-medium text-gray-500">Timestamp field</dt>
127
+ <dd class="mt-1 text-sm text-gray-900">
128
+ <span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.freshness.timestampField }}</span>
129
+ </dd>
130
+ </div>
131
+ {% endif %}
132
+ </div>
133
+ {% endif %}
134
+ {% if datacontract.servicelevels.frequency %}
135
+ <div class="grid sm:grid-cols-2" >
136
+ <h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="frequency">
137
+ Frequency
138
+ </h2>
139
+ {% if datacontract.servicelevels.frequency.description %}
140
+ <div class="sm:col-span-1">
141
+ <dt class="text-sm font-medium text-gray-500">Description</dt>
142
+ <dd class="mt-1 text-sm text-gray-900">
143
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.frequency.description }}</span>
144
+ </dd>
145
+ </div>
146
+ {% endif %}
147
+ {% if datacontract.servicelevels.frequency.type %}
148
+ <div class="sm:col-span-1">
149
+ <dt class="text-sm font-medium text-gray-500">Type</dt>
150
+ <dd class="mt-1 text-sm text-gray-900">
151
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.frequency.type }}</span>
152
+ </dd>
153
+ </div>
154
+ {% endif %}
155
+ {% if datacontract.servicelevels.frequency.interval %}
156
+ <div class="sm:col-span-1">
157
+ <dt class="text-sm font-medium text-gray-500">Interval</dt>
158
+ <dd class="mt-1 text-sm text-gray-900">
159
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.frequency.interval }}</span>
160
+ </dd>
161
+ </div>
162
+ {% endif %}
163
+ {% if datacontract.servicelevels.frequency.cron %}
164
+ <div class="sm:col-span-1">
165
+ <dt class="text-sm font-medium text-gray-500">Cron</dt>
166
+ <dd class="mt-1 text-sm text-gray-900">
167
+ <span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.frequency.cron }}</span>
168
+ </dd>
169
+ </div>
170
+ {% endif %}
171
+ </div>
172
+ {% endif %}
173
+ {% if datacontract.servicelevels.support %}
174
+ <div class="grid sm:grid-cols-2" >
175
+ <h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="support">
176
+ Support
177
+ </h2>
178
+ {% if datacontract.servicelevels.support.description %}
179
+ <div class="sm:col-span-1">
180
+ <dt class="text-sm font-medium text-gray-500">Description</dt>
181
+ <dd class="mt-1 text-sm text-gray-900">
182
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.support.description }}</span>
183
+ </dd>
184
+ </div>
185
+ {% endif %}
186
+ {% if datacontract.servicelevels.support.time %}
187
+ <div class="sm:col-span-1">
188
+ <dt class="text-sm font-medium text-gray-500">Time</dt>
189
+ <dd class="mt-1 text-sm text-gray-900">
190
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.support.time }}</span>
191
+ </dd>
192
+ </div>
193
+ {% endif %}
194
+ {% if datacontract.servicelevels.support.responseTime %}
195
+ <div class="sm:col-span-1">
196
+ <dt class="text-sm font-medium text-gray-500">Response Time</dt>
197
+ <dd class="mt-1 text-sm text-gray-900">
198
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.support.responseTime }}</span>
199
+ </dd>
200
+ </div>
201
+ {% endif %}
202
+ </div>
203
+ {% endif %}
204
+ {% if datacontract.servicelevels.backup %}
205
+ <div class="grid sm:grid-cols-2" >
206
+ <h2 class="sm:col-span-2 mt-2 text-base font-semibold leading-6 text-gray-900" id="backup">
207
+ Backup
208
+ </h2>
209
+ {% if datacontract.servicelevels.backup.description %}
210
+ <div class="sm:col-span-1">
211
+ <dt class="text-sm font-medium text-gray-500">Description</dt>
212
+ <dd class="mt-1 text-sm text-gray-900">
213
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.backup.description }}</span>
214
+ </dd>
215
+ </div>
216
+ {% endif %}
217
+ {% if datacontract.servicelevels.backup.internal %}
218
+ <div class="sm:col-span-1">
219
+ <dt class="text-sm font-medium text-gray-500">Interval</dt>
220
+ <dd class="mt-1 text-sm text-gray-900">
221
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.backup.interval }}</span>
222
+ </dd>
223
+ </div>
224
+ {% endif %}
225
+ {% if datacontract.servicelevels.backup.cron %}
226
+ <div class="sm:col-span-1">
227
+ <dt class="text-sm font-medium text-gray-500">Cron</dt>
228
+ <dd class="mt-1 text-sm text-gray-900">
229
+ <span class="whitespace-pre-wrap font-mono">{{ datacontract.servicelevels.backup.cron }}</span>
230
+ </dd>
231
+ </div>
232
+ {% endif %}
233
+ {% if datacontract.servicelevels.backup.recoveryTime %}
234
+ <div class="sm:col-span-1">
235
+ <dt class="text-sm font-medium text-gray-500">Recovery Time</dt>
236
+ <dd class="mt-1 text-sm text-gray-900">
237
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.backup.recoveryTime }}</span>
238
+ </dd>
239
+ </div>
240
+ {% endif %}
241
+ {% if datacontract.servicelevels.backup.recoveryPoint %}
242
+ <div class="sm:col-span-1">
243
+ <dt class="text-sm font-medium text-gray-500">Recovery Point</dt>
244
+ <dd class="mt-1 text-sm text-gray-900">
245
+ <span class="whitespace-pre-wrap">{{ datacontract.servicelevels.backup.recoveryPoint }}</span>
246
+ </dd>
247
+ </div>
248
+ {% endif %}
249
+ </div>
250
+ {% endif %}
251
+ </dl>
252
+ </div>
253
+ </div>
@@ -0,0 +1,51 @@
1
+ <div class="px-4 sm:px-0">
2
+ <h1 class="text-base font-semibold leading-6 text-gray-900" id="terms">Terms</h1>
3
+ <p class="text-sm text-gray-500">Terms and conditions of the data contract</p>
4
+ </div>
5
+ <div class="mt-2 overflow-hidden shadow sm:rounded-lg bg-white">
6
+
7
+ <div class="px-4 py-5 sm:px-6">
8
+
9
+ <dl class="grid grid-cols-1 gap-x-4 gap-y-6 sm:grid-cols-2">
10
+ <div class="sm:col-span-1">
11
+ <dt class="text-sm font-medium text-gray-500">Usage</dt>
12
+ <dd class="mt-1 text-sm text-gray-900" >
13
+ <span class="whitespace-pre-wrap">{{ datacontract.terms.usage }}</span>
14
+ </dd>
15
+ </div>
16
+
17
+ <div class="sm:col-span-1">
18
+ <dt class="text-sm font-medium text-gray-500">Limitations</dt>
19
+ <dd class="mt-1 text-sm text-gray-900" >
20
+ <span class="whitespace-pre-wrap">{{ datacontract.terms.limitations }}</span>
21
+ </dd>
22
+ </div>
23
+
24
+ {% if datacontract.terms.billing %}
25
+ <div class="sm:col-span-1">
26
+ <dt class="text-sm font-medium text-gray-500">Billing</dt>
27
+ <dd class="mt-1 text-sm text-gray-900" >
28
+ <span class="whitespace-pre-wrap">{{ datacontract.terms.billing }}</span>
29
+ </dd>
30
+ </div>
31
+ {% endif %}
32
+
33
+ {% if datacontract.terms.noticePeriod %}
34
+ <div class="sm:col-span-1">
35
+ <dt class="text-sm font-medium text-gray-500">Notice Period</dt>
36
+ <dd class="mt-1 text-sm text-gray-900 flex" >
37
+ <span class="whitespace-pre-wrap">{{ datacontract.terms.noticePeriod }}</span>
38
+ </dd>
39
+ </div>
40
+ {% endif %}
41
+
42
+ {% for key, value in datacontract.terms.model_extra.items() %}
43
+ <div class="sm:col-span-1">
44
+ <dt class="text-sm font-medium text-gray-500">{{ key }}</dt>
45
+ <dd class="mt-1 text-sm text-gray-900">{{ value }}</dd>
46
+ </div>
47
+ {% endfor %}
48
+
49
+ </dl>
50
+ </div>
51
+ </div>
@@ -0,0 +1,25 @@
1
+ <div class="mt-3 flow-root">
2
+ <div class="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
3
+ <div class="inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8">
4
+ <div class="overflow-hidden shadow ring-1 ring-black ring-opacity-5 sm:rounded-lg">
5
+
6
+ <table class="min-w-full divide-y divide-gray-300" id="/definitions/{{ definition_name }}">
7
+ <thead class="bg-gray-50">
8
+ <tr>
9
+ <th scope="colgroup" colspan="3" class="py-2 pl-4 pr-3 text-left font-semibold text-gray-900 sm:pl-6">
10
+ <span>{{ definition_name }}</span>
11
+ <div class="text-sm font-medium text-gray-500">{{ definition.description }}</div>
12
+ </th>
13
+ </tr>
14
+ </thead>
15
+ <tbody class="divide-y divide-gray-200 bg-white">
16
+
17
+ {{ render_partial('partials/model_field.html', nested = False, field_name=definition_name,
18
+ field = definition, level = 0) }}
19
+
20
+ </tbody>
21
+ </table>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </div>