MacroSignage 0.1.dev36__tar.gz → 0.2.1__tar.gz

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 (152) hide show
  1. macrosignage-0.2.1/PKG-INFO +306 -0
  2. macrosignage-0.2.1/README.md +266 -0
  3. macrosignage-0.2.1/pyproject.toml +94 -0
  4. macrosignage-0.2.1/setup.cfg +4 -0
  5. macrosignage-0.2.1/src/MacroSignage.egg-info/PKG-INFO +306 -0
  6. macrosignage-0.2.1/src/MacroSignage.egg-info/SOURCES.txt +112 -0
  7. macrosignage-0.2.1/src/MacroSignage.egg-info/entry_points.txt +2 -0
  8. macrosignage-0.2.1/src/MacroSignage.egg-info/requires.txt +10 -0
  9. macrosignage-0.2.1/src/macrosignage/__init__.py +4 -0
  10. macrosignage-0.2.1/src/macrosignage/app.py +156 -0
  11. macrosignage-0.2.1/src/macrosignage/cli.py +66 -0
  12. macrosignage-0.2.1/src/macrosignage/config.py +178 -0
  13. macrosignage-0.2.1/src/macrosignage/extensions.py +9 -0
  14. macrosignage-0.2.1/src/macrosignage/features/__init__.py +10 -0
  15. macrosignage-0.2.1/src/macrosignage/features/admin/__init__.py +0 -0
  16. macrosignage-0.2.1/src/macrosignage/features/admin/forms.py +98 -0
  17. macrosignage-0.2.1/src/macrosignage/features/admin/models.py +41 -0
  18. macrosignage-0.2.1/src/macrosignage/features/admin/routes.py +260 -0
  19. macrosignage-0.2.1/src/macrosignage/features/admin/services.py +177 -0
  20. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/api_tokens/list.html +117 -0
  21. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/dashboard.html +94 -0
  22. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/database.html +174 -0
  23. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/displays/detail.html +201 -0
  24. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/displays/form.html +126 -0
  25. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/displays/list.html +100 -0
  26. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/fonts/form.html +87 -0
  27. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/fonts/list.html +75 -0
  28. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/logo.html +95 -0
  29. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/media/detail.html +182 -0
  30. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/media/form.html +369 -0
  31. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/media/list.html +106 -0
  32. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/schedules/detail.html +150 -0
  33. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/schedules/form.html +178 -0
  34. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/schedules/list.html +108 -0
  35. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/settings.html +118 -0
  36. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/users/detail.html +55 -0
  37. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/users/form.html +112 -0
  38. macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/users/list.html +83 -0
  39. macrosignage-0.2.1/src/macrosignage/features/api/__init__.py +3 -0
  40. macrosignage-0.2.1/src/macrosignage/features/api/routes.py +491 -0
  41. macrosignage-0.2.1/src/macrosignage/features/api/serializers.py +129 -0
  42. macrosignage-0.2.1/src/macrosignage/features/associations.py +26 -0
  43. macrosignage-0.2.1/src/macrosignage/features/auth/__init__.py +0 -0
  44. macrosignage-0.2.1/src/macrosignage/features/auth/api_token_forms.py +26 -0
  45. macrosignage-0.2.1/src/macrosignage/features/auth/forms.py +110 -0
  46. macrosignage-0.2.1/src/macrosignage/features/auth/models.py +55 -0
  47. macrosignage-0.2.1/src/macrosignage/features/auth/permissions.py +78 -0
  48. macrosignage-0.2.1/src/macrosignage/features/auth/routes.py +282 -0
  49. macrosignage-0.2.1/src/macrosignage/features/auth/services.py +201 -0
  50. macrosignage-0.2.1/src/macrosignage/features/auth/templates/auth/login.html +50 -0
  51. macrosignage-0.2.1/src/macrosignage/features/auth/templates/auth/password_reset_form.html +40 -0
  52. macrosignage-0.2.1/src/macrosignage/features/auth/templates/auth/password_reset_request.html +38 -0
  53. macrosignage-0.2.1/src/macrosignage/features/auth/templates/auth/setup.html +68 -0
  54. macrosignage-0.2.1/src/macrosignage/features/auth/token_routes.py +88 -0
  55. macrosignage-0.2.1/src/macrosignage/features/displays/__init__.py +3 -0
  56. macrosignage-0.2.1/src/macrosignage/features/displays/forms.py +58 -0
  57. macrosignage-0.2.1/src/macrosignage/features/displays/models.py +48 -0
  58. macrosignage-0.2.1/src/macrosignage/features/displays/routes.py +308 -0
  59. macrosignage-0.2.1/src/macrosignage/features/displays/services.py +176 -0
  60. macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/maintenance.html +12 -0
  61. macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/offline.html +12 -0
  62. macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/pair_failed.html +11 -0
  63. macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/player.html +102 -0
  64. macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/unauthorized.html +24 -0
  65. macrosignage-0.2.1/src/macrosignage/features/media/__init__.py +3 -0
  66. macrosignage-0.2.1/src/macrosignage/features/media/forms.py +308 -0
  67. macrosignage-0.2.1/src/macrosignage/features/media/models.py +115 -0
  68. macrosignage-0.2.1/src/macrosignage/features/media/routes.py +207 -0
  69. macrosignage-0.2.1/src/macrosignage/features/media/services.py +185 -0
  70. macrosignage-0.2.1/src/macrosignage/features/schedules/__init__.py +3 -0
  71. macrosignage-0.2.1/src/macrosignage/features/schedules/forms.py +78 -0
  72. macrosignage-0.2.1/src/macrosignage/features/schedules/models.py +45 -0
  73. macrosignage-0.2.1/src/macrosignage/features/schedules/routes.py +111 -0
  74. macrosignage-0.2.1/src/macrosignage/features/schedules/services.py +31 -0
  75. macrosignage-0.2.1/src/macrosignage/static/css/main.css +1683 -0
  76. macrosignage-0.2.1/src/macrosignage/static/css/theme.css +40 -0
  77. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-corner-bl.png +0 -0
  78. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-corner-br.png +0 -0
  79. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-corner-tl.png +0 -0
  80. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-corner-tr.png +0 -0
  81. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-overlay.png +0 -0
  82. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-overlay.webp +0 -0
  83. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-mask.png +0 -0
  84. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-pattern-embedded.svg +8 -0
  85. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-pattern.svg +9 -0
  86. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-tile-1024.png +0 -0
  87. macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-tile-1024.webp +0 -0
  88. macrosignage-0.2.1/src/macrosignage/static/js/display-player.js +171 -0
  89. macrosignage-0.2.1/src/macrosignage/static/js/main.js +74 -0
  90. macrosignage-0.2.1/src/macrosignage/static/vendor/animate/LICENSE +21 -0
  91. macrosignage-0.2.1/src/macrosignage/static/vendor/animate/animate.css +4072 -0
  92. macrosignage-0.2.1/src/macrosignage/static/vendor/animate/animate.min.css +7 -0
  93. macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/LICENSE +21 -0
  94. macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/css/bootstrap.min.css +6 -0
  95. macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
  96. macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
  97. macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/js/bootstrap.bundle.min.js.map +1 -0
  98. macrosignage-0.2.1/src/macrosignage/templates/layouts/_base.html +23 -0
  99. macrosignage-0.2.1/src/macrosignage/templates/layouts/admin.html +137 -0
  100. macrosignage-0.2.1/src/macrosignage/templates/layouts/auth.html +21 -0
  101. macrosignage-0.2.1/src/macrosignage/templates/pages/index.html +76 -0
  102. macrosignage-0.2.1/src/macrosignage/web/__init__.py +0 -0
  103. macrosignage-0.2.1/src/macrosignage/web/routes.py +8 -0
  104. macrosignage-0.2.1/src/macrosignage/web/templates/web/index.html +458 -0
  105. macrosignage-0.2.1/tests/test_admin_dashboard.py +113 -0
  106. macrosignage-0.2.1/tests/test_auth.py +180 -0
  107. macrosignage-0.2.1/tests/test_client_app.py +50 -0
  108. macrosignage-0.2.1/tests/test_config.py +215 -0
  109. macrosignage-0.2.1/tests/test_display_player.py +334 -0
  110. macrosignage-0.2.1/tests/test_slider_media.py +196 -0
  111. macrosignage-0.2.1/tests/test_v05_polish_scale.py +233 -0
  112. MacroSignage-0.1.dev36/.gitignore +0 -248
  113. MacroSignage-0.1.dev36/MANIFEST.in +0 -6
  114. MacroSignage-0.1.dev36/PKG-INFO +0 -18
  115. MacroSignage-0.1.dev36/README.md +0 -1
  116. MacroSignage-0.1.dev36/pyproject.toml +0 -13
  117. MacroSignage-0.1.dev36/requirements.txt +0 -29
  118. MacroSignage-0.1.dev36/setup.cfg +0 -46
  119. MacroSignage-0.1.dev36/src/MacroSignage.egg-info/PKG-INFO +0 -18
  120. MacroSignage-0.1.dev36/src/MacroSignage.egg-info/SOURCES.txt +0 -40
  121. MacroSignage-0.1.dev36/src/MacroSignage.egg-info/requires.txt +0 -8
  122. MacroSignage-0.1.dev36/src/macrosignage/__init__.py +0 -84
  123. MacroSignage-0.1.dev36/src/macrosignage/blueprints/__init__.py +0 -3
  124. MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/__init__.py +0 -123
  125. MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/forms.py +0 -11
  126. MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/models.py +0 -98
  127. MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/display.html +0 -33
  128. MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/display_list.html +0 -57
  129. MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/display_slides.html +0 -149
  130. MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/index.html +0 -21
  131. MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/slides.html +0 -40
  132. MacroSignage-0.1.dev36/src/macrosignage/config.py +0 -32
  133. MacroSignage-0.1.dev36/src/macrosignage/extensions.py +0 -82
  134. MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/animate.css +0 -4367
  135. MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/animate.min.css +0 -9
  136. MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/icons.css +0 -23
  137. MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/icons.min.css +0 -1
  138. MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/main.css +0 -194
  139. MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/main.min.css +0 -7
  140. MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/materialize.css +0 -9297
  141. MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/materialize.min.css +0 -16
  142. MacroSignage-0.1.dev36/src/macrosignage/ui/static/js/main.js +0 -73
  143. MacroSignage-0.1.dev36/src/macrosignage/ui/static/js/main.min.js +0 -1
  144. MacroSignage-0.1.dev36/src/macrosignage/ui/static/js/materialize.js +0 -13094
  145. MacroSignage-0.1.dev36/src/macrosignage/ui/static/js/materialize.min.js +0 -1
  146. MacroSignage-0.1.dev36/src/macrosignage/ui/templates/layouts/base.html +0 -23
  147. MacroSignage-0.1.dev36/src/macrosignage/utils/__init__.py +0 -201
  148. MacroSignage-0.1.dev36/src/macrosignage/utils/sql.py +0 -44
  149. MacroSignage-0.1.dev36/src/wsgi.py +0 -6
  150. {MacroSignage-0.1.dev36 → macrosignage-0.2.1}/LICENSE +0 -0
  151. {MacroSignage-0.1.dev36 → macrosignage-0.2.1}/src/MacroSignage.egg-info/dependency_links.txt +0 -0
  152. {MacroSignage-0.1.dev36 → macrosignage-0.2.1}/src/MacroSignage.egg-info/top_level.txt +0 -0
@@ -0,0 +1,306 @@
1
+ Metadata-Version: 2.4
2
+ Name: MacroSignage
3
+ Version: 0.2.1
4
+ Summary: Web-based Digital Signage System
5
+ Author-email: Javier Baez <baezdevs@gmail.com>
6
+ Maintainer-email: Javier Baez <baezdevs@gmail.com>
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://github.com/BaezFJ/MacroSignage
9
+ Project-URL: Repository, https://github.com/BaezFJ/MacroSignage
10
+ Project-URL: Issues, https://github.com/BaezFJ/MacroSignage/issues
11
+ Project-URL: Changelog, https://github.com/BaezFJ/MacroSignage/releases
12
+ Keywords: dashboard,digital-signage,display-management,flask,signage
13
+ Classifier: Development Status :: 2 - Pre-Alpha
14
+ Classifier: Environment :: Web Environment
15
+ Classifier: Framework :: Flask
16
+ Classifier: Intended Audience :: End Users/Desktop
17
+ Classifier: Intended Audience :: System Administrators
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3 :: Only
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Topic :: Multimedia :: Video :: Display
26
+ Requires-Python: >=3.10
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ Requires-Dist: flask>=3.1.3
30
+ Requires-Dist: flask-login>=0.6.3
31
+ Requires-Dist: flask-wtf>=1.3.0
32
+ Requires-Dist: flask-sqlalchemy>=3.1.1
33
+ Requires-Dist: python-dotenv>=1.2.2
34
+ Requires-Dist: python-slugify>=8.0.4
35
+ Requires-Dist: email-validator>=2.3.0
36
+ Requires-Dist: python-usernames>=1.1.0
37
+ Requires-Dist: flask-migrate>=4.1.0
38
+ Requires-Dist: waitress>=3.0.2
39
+ Dynamic: license-file
40
+
41
+ # MacroSignage
42
+
43
+ [![PyPI version](https://img.shields.io/pypi/v/MacroSignage)](https://pypi.org/project/MacroSignage/)
44
+ [![Python versions](https://img.shields.io/pypi/pyversions/MacroSignage)](https://pypi.org/project/MacroSignage/)
45
+ [![License](https://img.shields.io/github/license/BaezFJ/MacroSignage)](LICENSE)
46
+ <!-- Replace with GitHub Actions badge URL once CI is configured -->
47
+ [![Build](https://img.shields.io/badge/build-pending-lightgrey)]()
48
+
49
+ **A web-based digital signage system built with Flask and Bootstrap.**
50
+
51
+ MacroSignage lets you manage and display digital signage content through a modern browser-based interface. It uses Bootstrap v5.3.8 for responsive styling and Animate.css for smooth transitions.
52
+
53
+ > **Note:** This project is in Pre-Alpha (v0.2.1). APIs and features are subject to change.
54
+
55
+ <!-- TODO: Add screenshot once the dashboard UI is implemented -->
56
+ <!-- ![MacroSignage Screenshot](docs/images/screenshot.png) -->
57
+
58
+ ## Features
59
+
60
+ ### Current
61
+
62
+ - Flask application factory pattern (`create_app`)
63
+ - Bootstrap v5.3.8 CSS and JavaScript integration (vendored)
64
+ - Bootstrap theme overrides with light and dark mode support via CSS custom properties
65
+ - Animate.css for UI transitions (vendored)
66
+ - Jinja2 template inheritance (base + page templates)
67
+ - Admin dashboard with display management CRUD
68
+ - Media library CRUD for images, text, video, HTML, and YouTube media
69
+ - Many-to-many media assignment between displays and media assets
70
+ - Schedule CRUD with active windows, weekday rules, display targets, and media playlists
71
+ - SQLite-backed display persistence with Flask-SQLAlchemy
72
+ - CSRF protection for admin state-changing forms
73
+ - WSGI-ready entry point for production deployment
74
+ - Installable via PyPI (`pip install MacroSignage`)
75
+
76
+ ### Planned
77
+
78
+ - User authentication and session management (Flask-Login)
79
+ - Database migrations (Flask-Migrate)
80
+ - Form handling with CSRF protection (Flask-WTF)
81
+ - Admin dashboard for managing signage content
82
+ - Schedule playback execution
83
+ - Media upload and content rotation
84
+ - REST API for programmatic control
85
+ - Real-time display updates via WebSocket or SSE
86
+
87
+ ## Tech Stack
88
+
89
+ | Layer | Technology | Version |
90
+ |-----------|----------------------------|----------|
91
+ | Backend | Flask | >= 3.1.3 |
92
+ | Auth | Flask-Login | >= 0.6.3 |
93
+ | Forms | Flask-WTF | >= 1.3.0 |
94
+ | ORM | Flask-SQLAlchemy | >= 3.1.1 |
95
+ | WSGI | Waitress | >= 3.0.2 |
96
+ | Frontend | Bootstrap | 5.3.8 |
97
+ | Animation | Animate.css | 4.1.1 |
98
+ | Theme | Bootstrap CSS variables | -- |
99
+ | Language | Python | >= 3.10 |
100
+ | Packaging | setuptools + uv | -- |
101
+
102
+ ## Prerequisites
103
+
104
+ - **Python 3.10 or higher** (3.10, 3.11, 3.12, or 3.13)
105
+ - **uv** (recommended) -- a fast Python package manager. [Install uv](https://docs.astral.sh/uv/getting-started/installation/)
106
+ - Alternatively, **pip** >= 21.0 works for basic installation
107
+ - **Git** (for development from source)
108
+
109
+ ## Installation
110
+
111
+ ### From PyPI
112
+
113
+ ```bash
114
+ pip install MacroSignage
115
+ ```
116
+
117
+ ### From Source
118
+
119
+ ```bash
120
+ # Clone the repository
121
+ git clone https://github.com/BaezFJ/MacroSignage.git
122
+ cd MacroSignage
123
+
124
+ # Create virtual environment and install with uv
125
+ uv venv
126
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
127
+ uv sync --all-groups
128
+
129
+ # Or with pip
130
+ python -m venv .venv
131
+ source .venv/bin/activate
132
+ pip install -e .
133
+ pip install build twine
134
+ ```
135
+
136
+ ## Quick Start
137
+
138
+ 1. **Run the development server:**
139
+
140
+ ```bash
141
+ # Using the MacroSignage CLI
142
+ macrosignage dev
143
+
144
+ # Or using the WSGI entry point
145
+ python wsgi.py
146
+ ```
147
+
148
+ 2. **Open your browser** and navigate to `http://127.0.0.1:5000`
149
+
150
+ ### Production Deployment
151
+
152
+ For production, use the packaged Waitress-backed command:
153
+
154
+ ```bash
155
+ macrosignage prod --host 0.0.0.0 --port 8080
156
+ ```
157
+
158
+ ## Project Structure
159
+
160
+ ```
161
+ MacroSignage/
162
+ ├── src/
163
+ │ └── macrosignage/ # Main application package
164
+ │ ├── __init__.py # App factory (create_app)
165
+ │ ├── static/
166
+ │ │ ├── css/
167
+ │ │ │ └── theme.css # Bootstrap theme overrides
168
+ │ │ ├── js/ # Application JavaScript
169
+ │ │ └── vendor/ # Vendored frontend libraries
170
+ │ │ ├── bootstrap/ # Bootstrap v5.3.8
171
+ │ │ └── animate/ # Animate.css v4.1.1
172
+ │ └── templates/
173
+ │ ├── base.html # Base template (shared layout)
174
+ │ └── pages/
175
+ │ └── index.html # Home page
176
+ ├── wsgi.py # WSGI entry point
177
+ ├── pyproject.toml # Project metadata and dependencies
178
+ ├── uv.lock # Dependency lock file
179
+ ├── LICENSE # MIT License
180
+ └── .gitignore
181
+ ```
182
+
183
+ ## Development
184
+
185
+ ### Running in Development Mode
186
+
187
+ ```bash
188
+ macrosignage dev
189
+ ```
190
+
191
+ The development command enables Flask debug mode by default.
192
+
193
+ ### Building for Distribution
194
+
195
+ ```bash
196
+ python -m build
197
+ ```
198
+
199
+ This creates source and wheel distributions in `dist/`.
200
+
201
+ ### Publishing to PyPI
202
+
203
+ ```bash
204
+ twine upload dist/*
205
+ ```
206
+
207
+ ### Adding Dependencies
208
+
209
+ ```bash
210
+ # Add a runtime dependency
211
+ uv add <package-name>
212
+
213
+ # Add a dev dependency
214
+ uv add --group dev <package-name>
215
+ ```
216
+
217
+ ## Contributing
218
+
219
+ Contributions are welcome! MacroSignage is in early development and there are many areas where help is needed.
220
+
221
+ ### How to Contribute
222
+
223
+ 1. **Fork** the repository
224
+ 2. **Create a feature branch:** `git checkout -b feature/your-feature-name`
225
+ 3. **Make your changes** and ensure the app runs without errors
226
+ 4. **Commit** with a descriptive message
227
+ 5. **Push** to your fork and open a **Pull Request**
228
+
229
+ ### Guidelines
230
+
231
+ - Follow PEP 8 for Python code style
232
+ - Use the Flask application factory pattern when adding new functionality
233
+ - Keep vendored frontend libraries in `src/macrosignage/static/vendor/`
234
+ - Place new templates under appropriate subdirectories in `templates/`
235
+ - Use CSS custom properties from `theme.css` for consistent theming
236
+ - Write descriptive commit messages
237
+
238
+ ## Documentation
239
+
240
+ Expanded documentation is available in [docs/index.md](docs/index.md).
241
+
242
+ ### Areas Looking for Contributions
243
+
244
+ - User authentication system
245
+ - Database models and migrations
246
+ - Admin dashboard UI
247
+ - Test coverage expansion
248
+ - CI/CD pipeline (GitHub Actions)
249
+ - Documentation improvements
250
+
251
+ ## Roadmap
252
+
253
+ ### v0.2.0 -- Foundation
254
+
255
+ - [x] Application configuration system (python-dotenv integration)
256
+ - [x] Database setup with Flask-SQLAlchemy
257
+ - [x] User model and authentication with Flask-Login
258
+ - [x] Form infrastructure with Flask-WTF
259
+ - [x] Basic test suite with pytest
260
+
261
+ ### v0.3.0 -- Core Features
262
+
263
+ - [ ] Admin dashboard layout
264
+ - [ ] Content/media management (upload, organize, delete)
265
+ - [ ] Display/screen registration and management
266
+ - [ ] Content-to-display assignment
267
+
268
+ ### v0.4.0 -- Scheduling and Playback
269
+
270
+ - [ ] Content scheduling (time-based rotation)
271
+ - [ ] Signage display player view (fullscreen, auto-rotation)
272
+ - [ ] Playlist management
273
+
274
+ ### v0.5.0 -- Polish and Scale
275
+
276
+ - [x] REST API
277
+ - [x] Real-time updates (WebSocket or SSE)
278
+ - [x] Multi-user role support (admin, editor, viewer)
279
+ - [x] CI/CD pipeline with GitHub Actions
280
+ - [x] Comprehensive documentation
281
+
282
+ ### v1.0.0 -- Stable Release
283
+
284
+ - [ ] Production-hardened and fully tested
285
+ - [ ] Complete documentation
286
+ - [ ] Deployment guides (Docker, systemd, cloud)
287
+
288
+ ## License
289
+
290
+ This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
291
+
292
+ Copyright (c) 2022 Javier Baez
293
+
294
+ ## Author
295
+
296
+ **Javier Baez**
297
+
298
+ - Email: baezdevs@gmail.com
299
+ - GitHub: [@BaezFJ](https://github.com/BaezFJ)
300
+
301
+ ---
302
+
303
+ **Project Links:**
304
+ [GitHub Repository](https://github.com/BaezFJ/MacroSignage) |
305
+ [PyPI Package](https://pypi.org/project/MacroSignage/) |
306
+ [Issue Tracker](https://github.com/BaezFJ/MacroSignage/issues)
@@ -0,0 +1,266 @@
1
+ # MacroSignage
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/MacroSignage)](https://pypi.org/project/MacroSignage/)
4
+ [![Python versions](https://img.shields.io/pypi/pyversions/MacroSignage)](https://pypi.org/project/MacroSignage/)
5
+ [![License](https://img.shields.io/github/license/BaezFJ/MacroSignage)](LICENSE)
6
+ <!-- Replace with GitHub Actions badge URL once CI is configured -->
7
+ [![Build](https://img.shields.io/badge/build-pending-lightgrey)]()
8
+
9
+ **A web-based digital signage system built with Flask and Bootstrap.**
10
+
11
+ MacroSignage lets you manage and display digital signage content through a modern browser-based interface. It uses Bootstrap v5.3.8 for responsive styling and Animate.css for smooth transitions.
12
+
13
+ > **Note:** This project is in Pre-Alpha (v0.2.1). APIs and features are subject to change.
14
+
15
+ <!-- TODO: Add screenshot once the dashboard UI is implemented -->
16
+ <!-- ![MacroSignage Screenshot](docs/images/screenshot.png) -->
17
+
18
+ ## Features
19
+
20
+ ### Current
21
+
22
+ - Flask application factory pattern (`create_app`)
23
+ - Bootstrap v5.3.8 CSS and JavaScript integration (vendored)
24
+ - Bootstrap theme overrides with light and dark mode support via CSS custom properties
25
+ - Animate.css for UI transitions (vendored)
26
+ - Jinja2 template inheritance (base + page templates)
27
+ - Admin dashboard with display management CRUD
28
+ - Media library CRUD for images, text, video, HTML, and YouTube media
29
+ - Many-to-many media assignment between displays and media assets
30
+ - Schedule CRUD with active windows, weekday rules, display targets, and media playlists
31
+ - SQLite-backed display persistence with Flask-SQLAlchemy
32
+ - CSRF protection for admin state-changing forms
33
+ - WSGI-ready entry point for production deployment
34
+ - Installable via PyPI (`pip install MacroSignage`)
35
+
36
+ ### Planned
37
+
38
+ - User authentication and session management (Flask-Login)
39
+ - Database migrations (Flask-Migrate)
40
+ - Form handling with CSRF protection (Flask-WTF)
41
+ - Admin dashboard for managing signage content
42
+ - Schedule playback execution
43
+ - Media upload and content rotation
44
+ - REST API for programmatic control
45
+ - Real-time display updates via WebSocket or SSE
46
+
47
+ ## Tech Stack
48
+
49
+ | Layer | Technology | Version |
50
+ |-----------|----------------------------|----------|
51
+ | Backend | Flask | >= 3.1.3 |
52
+ | Auth | Flask-Login | >= 0.6.3 |
53
+ | Forms | Flask-WTF | >= 1.3.0 |
54
+ | ORM | Flask-SQLAlchemy | >= 3.1.1 |
55
+ | WSGI | Waitress | >= 3.0.2 |
56
+ | Frontend | Bootstrap | 5.3.8 |
57
+ | Animation | Animate.css | 4.1.1 |
58
+ | Theme | Bootstrap CSS variables | -- |
59
+ | Language | Python | >= 3.10 |
60
+ | Packaging | setuptools + uv | -- |
61
+
62
+ ## Prerequisites
63
+
64
+ - **Python 3.10 or higher** (3.10, 3.11, 3.12, or 3.13)
65
+ - **uv** (recommended) -- a fast Python package manager. [Install uv](https://docs.astral.sh/uv/getting-started/installation/)
66
+ - Alternatively, **pip** >= 21.0 works for basic installation
67
+ - **Git** (for development from source)
68
+
69
+ ## Installation
70
+
71
+ ### From PyPI
72
+
73
+ ```bash
74
+ pip install MacroSignage
75
+ ```
76
+
77
+ ### From Source
78
+
79
+ ```bash
80
+ # Clone the repository
81
+ git clone https://github.com/BaezFJ/MacroSignage.git
82
+ cd MacroSignage
83
+
84
+ # Create virtual environment and install with uv
85
+ uv venv
86
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
87
+ uv sync --all-groups
88
+
89
+ # Or with pip
90
+ python -m venv .venv
91
+ source .venv/bin/activate
92
+ pip install -e .
93
+ pip install build twine
94
+ ```
95
+
96
+ ## Quick Start
97
+
98
+ 1. **Run the development server:**
99
+
100
+ ```bash
101
+ # Using the MacroSignage CLI
102
+ macrosignage dev
103
+
104
+ # Or using the WSGI entry point
105
+ python wsgi.py
106
+ ```
107
+
108
+ 2. **Open your browser** and navigate to `http://127.0.0.1:5000`
109
+
110
+ ### Production Deployment
111
+
112
+ For production, use the packaged Waitress-backed command:
113
+
114
+ ```bash
115
+ macrosignage prod --host 0.0.0.0 --port 8080
116
+ ```
117
+
118
+ ## Project Structure
119
+
120
+ ```
121
+ MacroSignage/
122
+ ├── src/
123
+ │ └── macrosignage/ # Main application package
124
+ │ ├── __init__.py # App factory (create_app)
125
+ │ ├── static/
126
+ │ │ ├── css/
127
+ │ │ │ └── theme.css # Bootstrap theme overrides
128
+ │ │ ├── js/ # Application JavaScript
129
+ │ │ └── vendor/ # Vendored frontend libraries
130
+ │ │ ├── bootstrap/ # Bootstrap v5.3.8
131
+ │ │ └── animate/ # Animate.css v4.1.1
132
+ │ └── templates/
133
+ │ ├── base.html # Base template (shared layout)
134
+ │ └── pages/
135
+ │ └── index.html # Home page
136
+ ├── wsgi.py # WSGI entry point
137
+ ├── pyproject.toml # Project metadata and dependencies
138
+ ├── uv.lock # Dependency lock file
139
+ ├── LICENSE # MIT License
140
+ └── .gitignore
141
+ ```
142
+
143
+ ## Development
144
+
145
+ ### Running in Development Mode
146
+
147
+ ```bash
148
+ macrosignage dev
149
+ ```
150
+
151
+ The development command enables Flask debug mode by default.
152
+
153
+ ### Building for Distribution
154
+
155
+ ```bash
156
+ python -m build
157
+ ```
158
+
159
+ This creates source and wheel distributions in `dist/`.
160
+
161
+ ### Publishing to PyPI
162
+
163
+ ```bash
164
+ twine upload dist/*
165
+ ```
166
+
167
+ ### Adding Dependencies
168
+
169
+ ```bash
170
+ # Add a runtime dependency
171
+ uv add <package-name>
172
+
173
+ # Add a dev dependency
174
+ uv add --group dev <package-name>
175
+ ```
176
+
177
+ ## Contributing
178
+
179
+ Contributions are welcome! MacroSignage is in early development and there are many areas where help is needed.
180
+
181
+ ### How to Contribute
182
+
183
+ 1. **Fork** the repository
184
+ 2. **Create a feature branch:** `git checkout -b feature/your-feature-name`
185
+ 3. **Make your changes** and ensure the app runs without errors
186
+ 4. **Commit** with a descriptive message
187
+ 5. **Push** to your fork and open a **Pull Request**
188
+
189
+ ### Guidelines
190
+
191
+ - Follow PEP 8 for Python code style
192
+ - Use the Flask application factory pattern when adding new functionality
193
+ - Keep vendored frontend libraries in `src/macrosignage/static/vendor/`
194
+ - Place new templates under appropriate subdirectories in `templates/`
195
+ - Use CSS custom properties from `theme.css` for consistent theming
196
+ - Write descriptive commit messages
197
+
198
+ ## Documentation
199
+
200
+ Expanded documentation is available in [docs/index.md](docs/index.md).
201
+
202
+ ### Areas Looking for Contributions
203
+
204
+ - User authentication system
205
+ - Database models and migrations
206
+ - Admin dashboard UI
207
+ - Test coverage expansion
208
+ - CI/CD pipeline (GitHub Actions)
209
+ - Documentation improvements
210
+
211
+ ## Roadmap
212
+
213
+ ### v0.2.0 -- Foundation
214
+
215
+ - [x] Application configuration system (python-dotenv integration)
216
+ - [x] Database setup with Flask-SQLAlchemy
217
+ - [x] User model and authentication with Flask-Login
218
+ - [x] Form infrastructure with Flask-WTF
219
+ - [x] Basic test suite with pytest
220
+
221
+ ### v0.3.0 -- Core Features
222
+
223
+ - [ ] Admin dashboard layout
224
+ - [ ] Content/media management (upload, organize, delete)
225
+ - [ ] Display/screen registration and management
226
+ - [ ] Content-to-display assignment
227
+
228
+ ### v0.4.0 -- Scheduling and Playback
229
+
230
+ - [ ] Content scheduling (time-based rotation)
231
+ - [ ] Signage display player view (fullscreen, auto-rotation)
232
+ - [ ] Playlist management
233
+
234
+ ### v0.5.0 -- Polish and Scale
235
+
236
+ - [x] REST API
237
+ - [x] Real-time updates (WebSocket or SSE)
238
+ - [x] Multi-user role support (admin, editor, viewer)
239
+ - [x] CI/CD pipeline with GitHub Actions
240
+ - [x] Comprehensive documentation
241
+
242
+ ### v1.0.0 -- Stable Release
243
+
244
+ - [ ] Production-hardened and fully tested
245
+ - [ ] Complete documentation
246
+ - [ ] Deployment guides (Docker, systemd, cloud)
247
+
248
+ ## License
249
+
250
+ This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
251
+
252
+ Copyright (c) 2022 Javier Baez
253
+
254
+ ## Author
255
+
256
+ **Javier Baez**
257
+
258
+ - Email: baezdevs@gmail.com
259
+ - GitHub: [@BaezFJ](https://github.com/BaezFJ)
260
+
261
+ ---
262
+
263
+ **Project Links:**
264
+ [GitHub Repository](https://github.com/BaezFJ/MacroSignage) |
265
+ [PyPI Package](https://pypi.org/project/MacroSignage/) |
266
+ [Issue Tracker](https://github.com/BaezFJ/MacroSignage/issues)
@@ -0,0 +1,94 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77.0.3"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "MacroSignage"
7
+ version = "0.2.1"
8
+ description = "Web-based Digital Signage System"
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ license-files = ["LICENSE"]
12
+ requires-python = ">=3.10"
13
+ keywords = [
14
+ "dashboard",
15
+ "digital-signage",
16
+ "display-management",
17
+ "flask",
18
+ "signage",
19
+ ]
20
+ authors = [
21
+ { name = "Javier Baez", email = "baezdevs@gmail.com" },
22
+ ]
23
+ maintainers = [
24
+ { name = "Javier Baez", email = "baezdevs@gmail.com" },
25
+ ]
26
+ classifiers = [
27
+ "Development Status :: 2 - Pre-Alpha",
28
+ "Environment :: Web Environment",
29
+ "Framework :: Flask",
30
+ "Intended Audience :: End Users/Desktop",
31
+ "Intended Audience :: System Administrators",
32
+ "Operating System :: OS Independent",
33
+ "Programming Language :: Python :: 3",
34
+ "Programming Language :: Python :: 3 :: Only",
35
+ "Programming Language :: Python :: 3.10",
36
+ "Programming Language :: Python :: 3.11",
37
+ "Programming Language :: Python :: 3.12",
38
+ "Programming Language :: Python :: 3.13",
39
+ "Topic :: Multimedia :: Video :: Display",
40
+ ]
41
+ dependencies = [
42
+ "flask>=3.1.3",
43
+ "flask-login>=0.6.3",
44
+ "flask-wtf>=1.3.0",
45
+ "flask-sqlalchemy>=3.1.1",
46
+ "python-dotenv>=1.2.2",
47
+ "python-slugify>=8.0.4",
48
+ "email-validator>=2.3.0",
49
+ "python-usernames>=1.1.0",
50
+ "flask-migrate>=4.1.0",
51
+ "waitress>=3.0.2",
52
+ ]
53
+
54
+ [project.urls]
55
+ Homepage = "https://github.com/BaezFJ/MacroSignage"
56
+ Repository = "https://github.com/BaezFJ/MacroSignage"
57
+ Issues = "https://github.com/BaezFJ/MacroSignage/issues"
58
+ Changelog = "https://github.com/BaezFJ/MacroSignage/releases"
59
+
60
+ [project.scripts]
61
+ macrosignage = "macrosignage.cli:main"
62
+
63
+ [dependency-groups]
64
+ dev = [
65
+ "build>=1.5.0",
66
+ "pytest>=8.4.2",
67
+ "twine>=6.2.0",
68
+ ]
69
+
70
+ [tool.pytest.ini_options]
71
+ testpaths = ["tests"]
72
+ pythonpath = ["src"]
73
+
74
+ [tool.setuptools]
75
+ include-package-data = false
76
+
77
+ [tool.setuptools.packages.find]
78
+ where = ["src"]
79
+ exclude = ["tests*"]
80
+ namespaces = false
81
+
82
+ [tool.setuptools.package-data]
83
+ macrosignage = [
84
+ "**/*.html",
85
+ "**/*.css",
86
+ "**/*.js",
87
+ "**/*.map",
88
+ "**/*.json",
89
+ "**/*.png",
90
+ "**/*.jpg",
91
+ "**/*.svg",
92
+ "**/*.webp",
93
+ "**/LICENSE*",
94
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+