litedmin 0.4.0__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 (215) hide show
  1. litedmin/__init__.py +136 -0
  2. litedmin/__main__.py +6 -0
  3. litedmin/backend/__init__.py +1 -0
  4. litedmin/backend/admin/__init__.py +17 -0
  5. litedmin/backend/admin/base.py +902 -0
  6. litedmin/backend/admin/changelist.py +211 -0
  7. litedmin/backend/admin/checks.py +119 -0
  8. litedmin/backend/admin/display_columns.py +221 -0
  9. litedmin/backend/admin/export.py +57 -0
  10. litedmin/backend/admin/formsets.py +299 -0
  11. litedmin/backend/admin/list_projection.py +147 -0
  12. litedmin/backend/admin/mixins.py +75 -0
  13. litedmin/backend/admin/pagination.py +149 -0
  14. litedmin/backend/admin/permissions.py +103 -0
  15. litedmin/backend/admin/scope.py +8 -0
  16. litedmin/backend/api/__init__.py +26 -0
  17. litedmin/backend/api/autocomplete.py +214 -0
  18. litedmin/backend/api/core.py +1017 -0
  19. litedmin/backend/api/endpoints.py +352 -0
  20. litedmin/backend/api/history/__init__.py +11 -0
  21. litedmin/backend/api/history/repository.py +273 -0
  22. litedmin/backend/api/history/service.py +105 -0
  23. litedmin/backend/api/responses.py +67 -0
  24. litedmin/backend/auth/__init__.py +69 -0
  25. litedmin/backend/auth/admin.py +298 -0
  26. litedmin/backend/auth/auth.py +172 -0
  27. litedmin/backend/auth/backends.py +191 -0
  28. litedmin/backend/auth/cookies.py +37 -0
  29. litedmin/backend/auth/csrf.py +99 -0
  30. litedmin/backend/auth/dependencies.py +205 -0
  31. litedmin/backend/auth/gateway_web.py +266 -0
  32. litedmin/backend/auth/hashers.py +186 -0
  33. litedmin/backend/auth/identity.py +118 -0
  34. litedmin/backend/auth/models/__init__.py +75 -0
  35. litedmin/backend/auth/models/registry.py +162 -0
  36. litedmin/backend/auth/models/sqlalchemy/__init__.py +21 -0
  37. litedmin/backend/auth/models/sqlalchemy/base.py +5 -0
  38. litedmin/backend/auth/models/sqlalchemy/builder.py +148 -0
  39. litedmin/backend/auth/models/sqlalchemy/models.py +193 -0
  40. litedmin/backend/auth/models/tortoise/__init__.py +19 -0
  41. litedmin/backend/auth/models/tortoise/builder.py +144 -0
  42. litedmin/backend/auth/models/tortoise/core.py +66 -0
  43. litedmin/backend/auth/models/tortoise/models.py +125 -0
  44. litedmin/backend/auth/permission_service.py +424 -0
  45. litedmin/backend/auth/resolver.py +34 -0
  46. litedmin/backend/auth/session.py +253 -0
  47. litedmin/backend/auth/settings.py +17 -0
  48. litedmin/backend/auth/user_model.py +101 -0
  49. litedmin/backend/auth/utils.py +197 -0
  50. litedmin/backend/core/__init__.py +1 -0
  51. litedmin/backend/core/action.py +91 -0
  52. litedmin/backend/core/config.py +110 -0
  53. litedmin/backend/core/decorators.py +62 -0
  54. litedmin/backend/core/display.py +90 -0
  55. litedmin/backend/core/enums.py +80 -0
  56. litedmin/backend/core/exceptions.py +43 -0
  57. litedmin/backend/core/fields.py +224 -0
  58. litedmin/backend/core/introspection.py +118 -0
  59. litedmin/backend/core/orm_settings.py +42 -0
  60. litedmin/backend/core/request.py +55 -0
  61. litedmin/backend/core/schema_generator.py +895 -0
  62. litedmin/backend/core/site.py +370 -0
  63. litedmin/backend/core/utils.py +162 -0
  64. litedmin/backend/core/widgets.py +100 -0
  65. litedmin/backend/dto/__init__.py +137 -0
  66. litedmin/backend/dto/auth.py +82 -0
  67. litedmin/backend/dto/base.py +39 -0
  68. litedmin/backend/dto/config.py +80 -0
  69. litedmin/backend/dto/permissions.py +19 -0
  70. litedmin/backend/dto/records.py +214 -0
  71. litedmin/backend/dto/requests.py +519 -0
  72. litedmin/backend/dto/responses.py +367 -0
  73. litedmin/backend/integration/__init__.py +56 -0
  74. litedmin/backend/integration/admin_lifecycle.py +136 -0
  75. litedmin/backend/integration/asgi/__init__.py +5 -0
  76. litedmin/backend/integration/asgi/admin.py +307 -0
  77. litedmin/backend/integration/asgi/request.py +43 -0
  78. litedmin/backend/integration/asgi/responses.py +43 -0
  79. litedmin/backend/integration/asgi/routes.py +475 -0
  80. litedmin/backend/integration/asgi/spa.py +71 -0
  81. litedmin/backend/integration/asgi/trailing_slash.py +49 -0
  82. litedmin/backend/integration/csrf_middleware.py +101 -0
  83. litedmin/backend/integration/di/__init__.py +21 -0
  84. litedmin/backend/integration/di/container.py +49 -0
  85. litedmin/backend/integration/di/fastapi_integration.py +45 -0
  86. litedmin/backend/integration/di/providers.py +100 -0
  87. litedmin/backend/integration/fastapi/__init__.py +7 -0
  88. litedmin/backend/integration/fastapi/admin.py +35 -0
  89. litedmin/backend/integration/frontend_paths.py +35 -0
  90. litedmin/backend/integration/handlers.py +168 -0
  91. litedmin/backend/integration/litestar/__init__.py +7 -0
  92. litedmin/backend/integration/litestar/admin.py +40 -0
  93. litedmin/backend/integration/msgspec_support.py +63 -0
  94. litedmin/backend/integration/orm_registry.py +99 -0
  95. litedmin/backend/integration/static.py +50 -0
  96. litedmin/backend/orm/__init__.py +35 -0
  97. litedmin/backend/orm/base.py +130 -0
  98. litedmin/backend/orm/batch.py +42 -0
  99. litedmin/backend/orm/date_filters.py +68 -0
  100. litedmin/backend/orm/pk.py +80 -0
  101. litedmin/backend/orm/protocols.py +144 -0
  102. litedmin/backend/orm/registry.py +156 -0
  103. litedmin/backend/orm/sqlalchemy/__init__.py +50 -0
  104. litedmin/backend/orm/sqlalchemy/adapter.py +8 -0
  105. litedmin/backend/orm/sqlalchemy/admin.py +40 -0
  106. litedmin/backend/orm/sqlalchemy/backend.py +56 -0
  107. litedmin/backend/orm/sqlalchemy/init.py +251 -0
  108. litedmin/backend/orm/sqlalchemy/introspector.py +254 -0
  109. litedmin/backend/orm/sqlalchemy/repository.py +740 -0
  110. litedmin/backend/orm/sqlalchemy/schema_generator.py +15 -0
  111. litedmin/backend/orm/sqlalchemy/session.py +94 -0
  112. litedmin/backend/orm/sqlalchemy/types.py +53 -0
  113. litedmin/backend/orm/tortoise/__init__.py +44 -0
  114. litedmin/backend/orm/tortoise/adapter.py +9 -0
  115. litedmin/backend/orm/tortoise/admin.py +42 -0
  116. litedmin/backend/orm/tortoise/backend.py +56 -0
  117. litedmin/backend/orm/tortoise/init.py +103 -0
  118. litedmin/backend/orm/tortoise/introspector.py +176 -0
  119. litedmin/backend/orm/tortoise/repository.py +284 -0
  120. litedmin/backend/orm/tortoise/schema_generator.py +15 -0
  121. litedmin/backend/orm/tortoise/types.py +81 -0
  122. litedmin/backend/storage/__init__.py +5 -0
  123. litedmin/backend/storage/protocol.py +33 -0
  124. litedmin/cli.py +195 -0
  125. litedmin/py.typed +0 -0
  126. litedmin/static/asset-manifest.json +85 -0
  127. litedmin/static/favicon.ico +0 -0
  128. litedmin/static/index.html +1 -0
  129. litedmin/static/logo192.png +0 -0
  130. litedmin/static/logo512.png +0 -0
  131. litedmin/static/manifest.json +25 -0
  132. litedmin/static/robots.txt +3 -0
  133. litedmin/static/static/css/main.c336e45a.css +2 -0
  134. litedmin/static/static/css/main.c336e45a.css.map +1 -0
  135. litedmin/static/static/js/453.7b4f4f73.chunk.js +2 -0
  136. litedmin/static/static/js/453.7b4f4f73.chunk.js.map +1 -0
  137. litedmin/static/static/js/main.06b3b9a6.js +156 -0
  138. litedmin/static/static/js/main.06b3b9a6.js.LICENSE.txt +91 -0
  139. litedmin/static/static/js/main.06b3b9a6.js.map +1 -0
  140. litedmin/static/static/media/inter-cyrillic-300-normal.ead2b63c30510e752332.woff +0 -0
  141. litedmin/static/static/media/inter-cyrillic-300-normal.f9e5f604a45c00a532f2.woff2 +0 -0
  142. litedmin/static/static/media/inter-cyrillic-400-normal.cb04b2ee2f7d192478b8.woff2 +0 -0
  143. litedmin/static/static/media/inter-cyrillic-400-normal.e2841352dd9512ff455b.woff +0 -0
  144. litedmin/static/static/media/inter-cyrillic-500-normal.b9dcbca183ac93f02061.woff2 +0 -0
  145. litedmin/static/static/media/inter-cyrillic-500-normal.e824ac3c6c579cd0fe85.woff +0 -0
  146. litedmin/static/static/media/inter-cyrillic-600-normal.c556b5d042ebf128e47c.woff +0 -0
  147. litedmin/static/static/media/inter-cyrillic-600-normal.ce60970447cde0dd1582.woff2 +0 -0
  148. litedmin/static/static/media/inter-cyrillic-700-normal.36e9cf9ecc07ac6bce28.woff2 +0 -0
  149. litedmin/static/static/media/inter-cyrillic-700-normal.534fd15b796bf021d0be.woff +0 -0
  150. litedmin/static/static/media/inter-cyrillic-ext-300-normal.04c5d2c480c226920a9b.woff2 +0 -0
  151. litedmin/static/static/media/inter-cyrillic-ext-300-normal.eb97c8e4e9062ed5dfd2.woff +0 -0
  152. litedmin/static/static/media/inter-cyrillic-ext-400-normal.e89451624c6caf35687f.woff +0 -0
  153. litedmin/static/static/media/inter-cyrillic-ext-400-normal.fd1478dcc74de00ee4c0.woff2 +0 -0
  154. litedmin/static/static/media/inter-cyrillic-ext-500-normal.023db878f10be2203b60.woff2 +0 -0
  155. litedmin/static/static/media/inter-cyrillic-ext-500-normal.9160d5ba9e6099f95032.woff +0 -0
  156. litedmin/static/static/media/inter-cyrillic-ext-600-normal.25b7c495f686777a1c08.woff2 +0 -0
  157. litedmin/static/static/media/inter-cyrillic-ext-600-normal.aa900fea9aed1ba3c903.woff +0 -0
  158. litedmin/static/static/media/inter-cyrillic-ext-700-normal.3cf42e401103d3211022.woff +0 -0
  159. litedmin/static/static/media/inter-cyrillic-ext-700-normal.5631f054acb5a33a716a.woff2 +0 -0
  160. litedmin/static/static/media/inter-greek-300-normal.3703eb6abf02d92c4c6d.woff2 +0 -0
  161. litedmin/static/static/media/inter-greek-300-normal.e35098a79e23df5c2282.woff +0 -0
  162. litedmin/static/static/media/inter-greek-400-normal.a42da273bb968bf2058d.woff +0 -0
  163. litedmin/static/static/media/inter-greek-400-normal.a8de720a6f13c66c8a4e.woff2 +0 -0
  164. litedmin/static/static/media/inter-greek-500-normal.0d91a975f010051e7150.woff2 +0 -0
  165. litedmin/static/static/media/inter-greek-500-normal.cbc71955e9956dcd2882.woff +0 -0
  166. litedmin/static/static/media/inter-greek-600-normal.5c46a357ea91911fc65d.woff2 +0 -0
  167. litedmin/static/static/media/inter-greek-600-normal.ba3b8b69a69b0e83d453.woff +0 -0
  168. litedmin/static/static/media/inter-greek-700-normal.f47ebf852d0b0e251a80.woff +0 -0
  169. litedmin/static/static/media/inter-greek-700-normal.f5fbdfc39c2431160896.woff2 +0 -0
  170. litedmin/static/static/media/inter-greek-ext-300-normal.6479663fa09debba7d48.woff +0 -0
  171. litedmin/static/static/media/inter-greek-ext-300-normal.c0dba9f477d8b8e0198f.woff2 +0 -0
  172. litedmin/static/static/media/inter-greek-ext-400-normal.b9e1e89444a313a63b91.woff +0 -0
  173. litedmin/static/static/media/inter-greek-ext-400-normal.f2fa0d9ef98f59d4a75b.woff2 +0 -0
  174. litedmin/static/static/media/inter-greek-ext-500-normal.7f67cfd4832dde0e0494.woff +0 -0
  175. litedmin/static/static/media/inter-greek-ext-500-normal.b187635a3d8a0b90faa0.woff2 +0 -0
  176. litedmin/static/static/media/inter-greek-ext-600-normal.7e7594e0432b84536054.woff +0 -0
  177. litedmin/static/static/media/inter-greek-ext-600-normal.c8a7cddec49294a9e8ba.woff2 +0 -0
  178. litedmin/static/static/media/inter-greek-ext-700-normal.4c7cc2277f187ed0ef37.woff +0 -0
  179. litedmin/static/static/media/inter-greek-ext-700-normal.4cdf2b4e817dade3d4aa.woff2 +0 -0
  180. litedmin/static/static/media/inter-latin-300-normal.6e6082ec285b38897e2f.woff2 +0 -0
  181. litedmin/static/static/media/inter-latin-300-normal.b7ec8f2cad1cc72e39fa.woff +0 -0
  182. litedmin/static/static/media/inter-latin-400-normal.9698cc7dbf147ed363b6.woff2 +0 -0
  183. litedmin/static/static/media/inter-latin-400-normal.b0c8fe9db56dd415a25a.woff +0 -0
  184. litedmin/static/static/media/inter-latin-500-normal.5b7156f802c053798d95.woff2 +0 -0
  185. litedmin/static/static/media/inter-latin-500-normal.f46567788e464ac34d10.woff +0 -0
  186. litedmin/static/static/media/inter-latin-600-normal.28c8f6060760ec1a5d25.woff +0 -0
  187. litedmin/static/static/media/inter-latin-600-normal.9d111139a583baef3053.woff2 +0 -0
  188. litedmin/static/static/media/inter-latin-700-normal.d42de9b25ac31d2a2a8b.woff2 +0 -0
  189. litedmin/static/static/media/inter-latin-700-normal.fc47ca451598e4b97249.woff +0 -0
  190. litedmin/static/static/media/inter-latin-ext-300-normal.1230c922d601129d8b4c.woff +0 -0
  191. litedmin/static/static/media/inter-latin-ext-300-normal.f95a500034ca27bc4af3.woff2 +0 -0
  192. litedmin/static/static/media/inter-latin-ext-400-normal.1c20f7dc20d731a18fcd.woff +0 -0
  193. litedmin/static/static/media/inter-latin-ext-400-normal.3d10c85fbd16969509a2.woff2 +0 -0
  194. litedmin/static/static/media/inter-latin-ext-500-normal.2b8be079a0e965b2f035.woff +0 -0
  195. litedmin/static/static/media/inter-latin-ext-500-normal.667f22c9b36deaea0f54.woff2 +0 -0
  196. litedmin/static/static/media/inter-latin-ext-600-normal.0acb54c755dec53de476.woff +0 -0
  197. litedmin/static/static/media/inter-latin-ext-600-normal.ae5f9691ebe48c908e8c.woff2 +0 -0
  198. litedmin/static/static/media/inter-latin-ext-700-normal.149d81a49bd1ff0e6711.woff +0 -0
  199. litedmin/static/static/media/inter-latin-ext-700-normal.96e3bd6bb1f980376cf1.woff2 +0 -0
  200. litedmin/static/static/media/inter-vietnamese-300-normal.2a4055b17286ecdd503d.woff2 +0 -0
  201. litedmin/static/static/media/inter-vietnamese-300-normal.39c118d908e573021d87.woff +0 -0
  202. litedmin/static/static/media/inter-vietnamese-400-normal.44c9df135eec470b0ab6.woff2 +0 -0
  203. litedmin/static/static/media/inter-vietnamese-400-normal.96f8adc74b63e1a3655f.woff +0 -0
  204. litedmin/static/static/media/inter-vietnamese-500-normal.11aeae6e31a0d8c24c83.woff +0 -0
  205. litedmin/static/static/media/inter-vietnamese-500-normal.63d02ea896a7406849b6.woff2 +0 -0
  206. litedmin/static/static/media/inter-vietnamese-600-normal.6984cf5e8583fac83be3.woff2 +0 -0
  207. litedmin/static/static/media/inter-vietnamese-600-normal.a10931d3a643f48663b9.woff +0 -0
  208. litedmin/static/static/media/inter-vietnamese-700-normal.5b5cd0c77cad23651d04.woff +0 -0
  209. litedmin/static/static/media/inter-vietnamese-700-normal.5d9bfcacc44f345662ff.woff2 +0 -0
  210. litedmin-0.4.0.dist-info/METADATA +302 -0
  211. litedmin-0.4.0.dist-info/RECORD +215 -0
  212. litedmin-0.4.0.dist-info/WHEEL +5 -0
  213. litedmin-0.4.0.dist-info/entry_points.txt +2 -0
  214. litedmin-0.4.0.dist-info/licenses/LICENSE +21 -0
  215. litedmin-0.4.0.dist-info/top_level.txt +1 -0
litedmin/__init__.py ADDED
@@ -0,0 +1,136 @@
1
+ """
2
+ LiteAdmin — public package entry point.
3
+
4
+ Layout:
5
+ litedmin/backend/ Python framework code
6
+ litedmin/static/ bundled admin UI assets
7
+ frontend/ React sources (repo root, not installed)
8
+
9
+ Optional ORM / framework symbols are resolved lazily via ``__getattr__`` so
10
+ ``pip install litedmin[sqlalchemy]`` does not require tortoise or fastapi.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from typing import Any
16
+
17
+ from litedmin.backend.core.site import AdminSite, default_site
18
+ from litedmin.backend.core.decorators import register
19
+ from litedmin.backend.core.action import action
20
+ from litedmin.backend.core.display import display
21
+ from litedmin.backend.core.fields import FieldRef, Link
22
+ from litedmin.backend.core.widgets import Textarea, WidgetSpec
23
+ from litedmin.backend.storage import StorageBackend, UploadFileLike
24
+ from litedmin.backend.admin import ModelAdmin, InlineModelAdmin, TabularInline, StackedInline
25
+ from litedmin.backend.core.schema_generator import SchemaGenerator, FieldType, WidgetType
26
+ from litedmin.backend.core.introspection import ModelIntrospector
27
+ from litedmin.backend.core.exceptions import (
28
+ LiteAdminError,
29
+ ImproperlyConfigured,
30
+ AlreadyRegistered,
31
+ NotRegistered,
32
+ ObjectDoesNotExist,
33
+ ValidationError,
34
+ ActionNotAllowed,
35
+ PermissionDenied,
36
+ )
37
+ from litedmin.backend.orm.base import AuthModels, BaseORMBackend, ORMType
38
+ from litedmin.backend.orm.registry import BackendRegistry
39
+ from litedmin.backend.orm.protocols import ORMRepositoryProtocol
40
+ from litedmin.backend.api.core import AdminAPI
41
+ from litedmin.backend.api.history import ChangeHistoryService, ChangeHistoryRepository
42
+ from litedmin.backend.core.utils import suppress, SuppressContext
43
+ from litedmin.backend.core.config import AdminConfig, default_config
44
+ from litedmin.backend.core.orm_settings import OrmSettings
45
+
46
+ __version__ = '0.4.0'
47
+
48
+ __all__ = [
49
+ 'AdminSite',
50
+ 'register',
51
+ 'action',
52
+ 'display',
53
+ 'Link',
54
+ 'FieldRef',
55
+ 'Textarea',
56
+ 'WidgetSpec',
57
+ 'default_site',
58
+ 'StorageBackend',
59
+ 'UploadFileLike',
60
+ 'ModelAdmin',
61
+ 'InlineModelAdmin',
62
+ 'TabularInline',
63
+ 'StackedInline',
64
+ 'SchemaGenerator',
65
+ 'FieldType',
66
+ 'WidgetType',
67
+ 'ModelIntrospector',
68
+ 'LiteAdminError',
69
+ 'ImproperlyConfigured',
70
+ 'AlreadyRegistered',
71
+ 'NotRegistered',
72
+ 'ObjectDoesNotExist',
73
+ 'ValidationError',
74
+ 'ActionNotAllowed',
75
+ 'PermissionDenied',
76
+ 'AuthModels',
77
+ 'BackendRegistry',
78
+ 'BaseORMBackend',
79
+ 'TortoiseBackend',
80
+ 'SQLAlchemyBackend',
81
+ 'AdminAPI',
82
+ 'TortoiseSchemaGenerator',
83
+ 'TortoiseIntrospector',
84
+ 'TortoiseAdapter',
85
+ 'SQLAlchemySchemaGenerator',
86
+ 'SQLAlchemyIntrospector',
87
+ 'TortoiseRepository',
88
+ 'SQLAlchemyRepository',
89
+ 'ORMRepositoryProtocol',
90
+ 'ChangeHistoryService',
91
+ 'ChangeHistoryRepository',
92
+ 'suppress',
93
+ 'SuppressContext',
94
+ 'AdminConfig',
95
+ 'OrmSettings',
96
+ 'default_config',
97
+ 'Admin',
98
+ 'ORMType',
99
+ 'init_tortoise_with_litedmin',
100
+ 'close_tortoise',
101
+ 'init_sqlalchemy_with_litedmin',
102
+ 'close_sqlalchemy',
103
+ '__version__',
104
+ ]
105
+
106
+ _LAZY_MAP = {
107
+ 'TortoiseBackend': ('litedmin.backend.orm.tortoise.backend', 'TortoiseBackend'),
108
+ 'SQLAlchemyBackend': ('litedmin.backend.orm.sqlalchemy.backend', 'SQLAlchemyBackend'),
109
+ 'TortoiseRepository': ('litedmin.backend.orm.tortoise.repository', 'TortoiseRepository'),
110
+ 'TortoiseSchemaGenerator': ('litedmin.backend.orm.tortoise.schema_generator', 'TortoiseSchemaGenerator'),
111
+ 'TortoiseIntrospector': ('litedmin.backend.orm.tortoise.introspector', 'TortoiseIntrospector'),
112
+ 'TortoiseAdapter': ('litedmin.backend.orm.tortoise.adapter', 'TortoiseAdapter'),
113
+ 'SQLAlchemyRepository': ('litedmin.backend.orm.sqlalchemy.repository', 'SQLAlchemyRepository'),
114
+ 'SQLAlchemySchemaGenerator': (
115
+ 'litedmin.backend.orm.sqlalchemy.schema_generator',
116
+ 'SQLAlchemySchemaGenerator',
117
+ ),
118
+ 'SQLAlchemyIntrospector': ('litedmin.backend.orm.sqlalchemy.introspector', 'SQLAlchemyIntrospector'),
119
+ 'Admin': ('litedmin.backend.integration.asgi.admin', 'Admin'),
120
+ 'init_tortoise_with_litedmin': ('litedmin.backend.orm.tortoise.init', 'init_tortoise_with_litedmin'),
121
+ 'close_tortoise': ('litedmin.backend.orm.tortoise.init', 'close_tortoise'),
122
+ 'init_sqlalchemy_with_litedmin': (
123
+ 'litedmin.backend.orm.sqlalchemy.init',
124
+ 'init_sqlalchemy_with_litedmin',
125
+ ),
126
+ 'close_sqlalchemy': ('litedmin.backend.orm.sqlalchemy.init', 'close_sqlalchemy'),
127
+ }
128
+
129
+
130
+ def __getattr__(name: str) -> Any:
131
+ target = _LAZY_MAP.get(name)
132
+ if target is None:
133
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
134
+ mod_path, attr = target
135
+ import importlib
136
+ return getattr(importlib.import_module(mod_path), attr)
litedmin/__main__.py ADDED
@@ -0,0 +1,6 @@
1
+ """Allow ``python -m litedmin createsuperuser ...``."""
2
+
3
+ from litedmin.cli import main
4
+
5
+ if __name__ == '__main__':
6
+ main()
@@ -0,0 +1 @@
1
+ """LiteAdmin backend (Python only)."""
@@ -0,0 +1,17 @@
1
+ """
2
+ Admin classes — model admin layer.
3
+ """
4
+
5
+ from litedmin.backend.admin.base import (
6
+ ModelAdmin,
7
+ InlineModelAdmin,
8
+ StackedInline,
9
+ TabularInline
10
+ )
11
+
12
+ __all__ = [
13
+ 'ModelAdmin',
14
+ 'InlineModelAdmin',
15
+ 'StackedInline',
16
+ 'TabularInline',
17
+ ]